All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.wings.text.DefaultDocument Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2000,2005 wingS development team.
 *
 * This file is part of wingS (http://wingsframework.org).
 *
 * wingS is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License
 * as published by the Free Software Foundation; either version 2.1
 * of the License, or (at your option) any later version.
 *
 * Please see COPYING for the complete licence.
 */
package org.wings.text;

import org.wings.event.SDocumentEvent;
import org.wings.event.SDocumentListener;
import org.wings.util.EditTranscriptGenerator;

import javax.swing.event.DocumentEvent;
import javax.swing.event.EventListenerList;
import javax.swing.text.BadLocationException;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

/**
 * @author hengels
 */
public class DefaultDocument implements SDocument {
    private final StringBuilder buffer = new StringBuilder();
    private EventListenerList listeners = null;

    /**
     * Indicates if we should fire event immediately when they arise,
     * or if we should collect them for a later delivery
     */
    private boolean delayEvents = false;

    /**
     * All delayed events are stored here
     */
    protected final ArrayList delayedEvents = new ArrayList(5);

    public DefaultDocument() {
    }

    public DefaultDocument(String text) {
        buffer.append(text);
    }

    @Override
    public void setText(String text) {
        String origText = buffer.toString();
        if (origText.equals(text)) {
            return;
        }
        buffer.setLength(0);
        if (text != null){
            buffer.append(text);
        }
        if((listeners == null) || (listeners.getListenerCount() > 0)){
            // If there are any document listeners: Generate document change events!
            List actions = EditTranscriptGenerator.generateEvents(origText, text);

            // and fire them!
            fireChangeUpdate(0, buffer.length());
            for (Object action : actions) {
                DocumentEvent de = (DocumentEvent) action;
                if (de.getType().equals(DocumentEvent.EventType.INSERT)) {
                    fireInsertUpdate(de.getOffset(), de.getLength());
                } else if (de.getType().equals(DocumentEvent.EventType.REMOVE)) {
                    fireRemoveUpdate(de.getOffset(), de.getLength());
                }
            }
        }
    }

    @Override
    public String getText() {
        return buffer.length() == 0 ? "" : buffer.toString();
    }

    @Override
    public String getText(int offset, int length) throws BadLocationException {
        try {
            return buffer.substring(offset, length);
        } catch (IndexOutOfBoundsException e) {
            throw new BadLocationException(e.getMessage(), offset);
        }
    }

    @Override
    public int getLength() {
        return buffer.length();
    }

    @Override
    public void remove(int offset, int length) throws BadLocationException {
        if (length == 0) {
            return;
        }
        try {
            buffer.delete(offset, offset + length);
            fireRemoveUpdate(offset, length);
        } catch (IndexOutOfBoundsException e) {
            throw new BadLocationException(e.getMessage(), offset);
        }
    }

    @Override
    public void insert(int offset, String string) throws BadLocationException {
        if (string == null || string.length() == 0) {
            return;
        }
        try {
            buffer.insert(offset, string);
            fireInsertUpdate(offset, string.length());
        } catch (IndexOutOfBoundsException e) {
            throw new BadLocationException(e.getMessage(), offset);
        }
    }

    @Override
    public SDocumentListener[] getDocumentListeners() {
    	if (listeners != null) {
            return (SDocumentListener[]) listeners.getListeners(SDocumentListener.class);
        } else {
            return (SDocumentListener[]) Array.newInstance(SDocumentListener.class, 0);
        }
	}

	@Override
    public void addDocumentListener(SDocumentListener listener) {
        if (listeners == null)
            listeners = new EventListenerList();
        listeners.add(SDocumentListener.class, listener);
    }

    @Override
    public void removeDocumentListener(SDocumentListener listener) {
        if (listeners == null)
            return;
        listeners.remove(SDocumentListener.class, listener);
    }

    protected void fireInsertUpdate(int offset, int length) {
    	SDocumentEvent e = new SDocumentEvent(this, offset, length, SDocumentEvent.INSERT);

		if (delayEvents) {
			delayedEvents.add(e);
		} else {
			if (listeners == null || listeners.getListenerCount() == 0)
				return;

			Object[] listeners = this.listeners.getListenerList();
			for (int i = listeners.length - 2; i >= 0; i -= 2) {
				((SDocumentListener) listeners[i + 1]).insertUpdate(e);
			}
		}
    }

    protected void fireRemoveUpdate(int offset, int length) {
    	SDocumentEvent e = new SDocumentEvent(this, offset, length, SDocumentEvent.REMOVE);

		if (delayEvents) {
			delayedEvents.add(e);
		} else {
			if (listeners == null || listeners.getListenerCount() == 0)
				return;

			Object[] listeners = this.listeners.getListenerList();
			for (int i = listeners.length - 2; i >= 0; i -= 2) {
				((SDocumentListener) listeners[i + 1]).removeUpdate(e);
			}
		}
    }

    protected void fireChangeUpdate(int offset, int length) {
    	SDocumentEvent e = new SDocumentEvent(this, offset, length, SDocumentEvent.CHANGE);

    	if (delayEvents) {
    		delayedEvents.add(e);
		} else {
			if (listeners == null || listeners.getListenerCount() == 0)
				return;

			Object[] listeners = this.listeners.getListenerList();
			for (int i = listeners.length - 2; i >= 0; i -= 2) {
				((SDocumentListener) listeners[i + 1]).changedUpdate(e);
			}
		}
    }

	@Override
    public boolean getDelayEvents() {
		return delayEvents;
	}

	@Override
    public void setDelayEvents(boolean b) {
		delayEvents = b;
	}

	@Override
    public void fireDelayedIntermediateEvents() {
        for (Object delayedEvent : delayedEvents) {
            SDocumentEvent e = (SDocumentEvent) delayedEvent;

            switch (e.getType()) {
                case SDocumentEvent.INSERT:
                    fireInsertUpdate(e.getOffset(), e.getLength());
                case SDocumentEvent.REMOVE:
                    fireRemoveUpdate(e.getOffset(), e.getLength());
                case SDocumentEvent.CHANGE:
                    fireChangeUpdate(e.getOffset(), e.getLength());
            }
        }
		delayedEvents.clear();
	}

	@Override
    public void fireDelayedFinalEvents() {

	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy