view src/remoteeditor/editors/REPTextImpl2.java @ 193:3133040ee4f4

(no commit message)
author one
date Wed, 31 Dec 2008 15:06:22 +0900
parents
children 4c6f7c6a2180
line wrap: on
line source

package remoteeditor.editors;

import java.util.LinkedList;
import java.util.List;

import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.DocumentEvent;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.IDocumentListener;
import org.eclipse.swt.widgets.Display;

public class REPTextImpl2 implements REPText, IDocumentListener {
	
	private IDocument document;
	private Display display;
	private String BR = System.getProperty("line.separator");
	private List<REPTextListener> textListenerList;
	private boolean myInput = false;

	public REPTextImpl2(IDocument document, Display display){
		this.document = document; 
		this.display = display;
		textListenerList = new LinkedList<REPTextListener>();
		document.addDocumentListener(this);
	}

	public String delete(int lineno) {
		int d = lineno - document.getNumberOfLines();
		for(int i = 0; i <= d; i++){
			increaseLine();
		}
		
		String deleted = getLineText(lineno);
		try {
			final int length = document.getLineLength(lineno);
			final int offset = document.getLineOffset(lineno);
			edit(offset, length, "");
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
		return deleted;
	}

	public void insert(int lineno, String text) {
		int d = lineno - document.getNumberOfLines();
		for(int i = 0; i <= d; i++){
			increaseLine();
		}
		
		try {
			final int offset = document.getLineOffset(lineno);
			final String changedText = text + BR;
			edit(offset, 0, changedText);
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
	}

	private void increaseLine() {
		edit(document.getLength(), 0, BR);
	}

	private void edit(final int offset, final int length, final String text) {
		display.syncExec(new Runnable(){
			public void run(){
				try {
					myInput = true;
					document.replace(offset, length, text);
					myInput = false;
				} catch (BadLocationException e) {
					e.printStackTrace();
				}
			}
		});
	}

	public List<String> list() {
		LinkedList<String> list = new LinkedList<String>();
		int lines = document.getNumberOfLines();
		for(int i = 0; i < lines; i++){
			String text = getLineText(i);
			list.add(text);
		}
		return list;
	}
	
	private String getLineText(int lineno){
		int offset = 0;
		int length = 0;
		String text = null;
		try {
			offset = document.getLineOffset(lineno);
			length = document.getLineLength(lineno);
			String tmp = document.get(offset, length);
			text = tmp.replace(BR, "");
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
		return text;
	}

	public void documentAboutToBeChanged(DocumentEvent event) {
		if(myInput) return;
		int offset = event.getOffset();
		int length = event.getLength();
		
		try {
			int startLine = document.getLineOfOffset(offset);
			int endLine = document.getLineOfOffset(offset + length);
			for(int i = startLine; i <= endLine; i++){
				String text = getLineText(i);
				for(REPTextListener listener : textListenerList){
					listener.textDeleted(new REPTextEvent(i, text));
				}
			}
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
		
	}

	public void documentChanged(DocumentEvent event) {
		if(myInput) return;
		int offset = event.getOffset();
		int length = event.getText().length();
		
		try {
			int startLine = document.getLineOfOffset(offset);
			int endLine = document.getLineOfOffset(offset + length);
			for(int i = startLine; i <= endLine; i++){
				String text = getLineText(i);
				for(REPTextListener listener : textListenerList){
					listener.textInserted(new REPTextEvent(i, text));
				}
			}
		} catch (BadLocationException e) {
			e.printStackTrace();
		}
		
	}

	public synchronized void addTextListener(REPTextListener listener) {
		Logger.print(listener);
		textListenerList.add(listener);
	}

	public String get(int lineno) {
		return getLineText(lineno);
	}

	public int size() {
		return document.getNumberOfLines();
	}

}