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.LINE_FEED) { sendCommand(Command.NEWLINE); insertCharAt(c, cursorPosition-1); cursorPosition++; } else { 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; } }