Line.java 2.85 KB
package pad.prac1;

import java.util.Observable;

public class Line extends Observable
{
	private String line;
	private int cursorPosition;
	private int writeMode;
	private Console console;
	
	public Line(Console cons)
	{
		console = cons;
		line = "";
		writeMode = EditableBufferedReader.INSERT;
		cursorPosition = 1;
		addObserver(console);
	}
	
	public int length()
	{
		return line.length();
	}
	
	public int getCursorPosition()
	{
		return cursorPosition;
	}
	
	public void toggleMode()
	{
		writeMode = 1 - writeMode;
	}
	
	private void sendCommand(int type, int value)
	{
		setChanged();
		notifyObservers(new Command(type,value));
	}
	
	private void sendCommand(int type)
	{
		setChanged();
		notifyObservers(new Command(type));
	}
	
	private void insertCharAt(char c, int pos)
	{
		if(pos == 0)
		{
			String s = "";
			s += c;
			line = s + line;
		}
		else if(pos == line.length())
		{
			line += c;
		}
		else
		{
			String s = "";
			s += c;
			line = line.substring(0, pos).concat(s).concat(line.substring(pos,line.length()));
		}
	}
	
	private void removeCharAt(int pos)
	{
		if(pos >= 0)
		{
			if(pos == 0)
			{
				line = line.substring(1);
			}
			else if(pos == line.length()-1)
			{
				line = line.substring(0, line.length()-1);
			}
			else
			{
				line = line.substring(0, pos).concat(line.substring(pos+1,line.length()));
			}
		}
	}
	
	public void addChar(char c)
	{
		if(c == EditableBufferedReader.RETURN_KEY)
		{
			insertCharAt((char)EditableBufferedReader.LINE_FEED,cursorPosition-1);
			sendCommand(Command.INSERT_CHAR,EditableBufferedReader.LINE_FEED);
			sendCommand(Command.INSERT_CHAR,EditableBufferedReader.RETURN_KEY);
			cursorPosition++;
			return;
		}
		switch(writeMode)
		{
			case EditableBufferedReader.INSERT:
				sendCommand(Command.INSERT_CHAR,(int)c);
				insertCharAt(c, cursorPosition-1);
				cursorPosition++;
				break;
				
			case EditableBufferedReader.OVERWRITE:
				if(cursorPosition != line.length()+1)
				{
					removeCharAt(cursorPosition-1);
					sendCommand(Command.DELETE_CHAR);
				}
				sendCommand(Command.INSERT_CHAR,(int)c);
				insertCharAt(c, cursorPosition-1);
				cursorPosition++;
			break;
		}
	}
	
	public void delChar(int mode)
	{
		switch(mode)
		{
			case EditableBufferedReader.DEL_BACKWARD:
				if(cursorPosition != 1)
				{
					sendCommand(Command.MOVE_CURSOR,cursorPosition-1);
					sendCommand(Command.DELETE_CHAR);
					removeCharAt(cursorPosition-2);
					cursorPosition--;
				}
			break;
			case EditableBufferedReader.DEL_FORWARD:
				if(cursorPosition != (line.length()+1))
				{
					removeCharAt(cursorPosition-1);
					sendCommand(Command.DELETE_CHAR,1);
				}
			break;
		}
	}
	
	public void setCursorTo(int pos)
	{
		if((pos <= line.length()+1) && (pos >= 1) && (pos != cursorPosition))
		{
			sendCommand(Command.MOVE_CURSOR,pos);
			cursorPosition = pos;
		}
	}
	
	public String toString()
	{
		return line;
	}
	
}