package pad.prac1; import java.util.Observable; import java.util.Observer; import java.util.Scanner; import java.util.regex.Pattern; public class Console implements Observer { private Coordinate currentXY; //private int numRows; private int numCols; public Console() { currentXY = new Coordinate(0,0); } public void moveCursorTo(int pos, int currentPos, int length) { updateTermSize(); updateCurrentPos(); if(pos > currentPos) { while((pos-currentPos) >= numCols) { currentPos += numCols - currentXY.x()+1; System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print((char)EditableBufferedReader.DOWN); currentXY.setY(currentXY.y()+1); System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print(numCols-1); System.out.print((char)EditableBufferedReader.BACKWARD); currentXY.setX(1); } if(pos > currentPos) { System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print(pos - currentPos); System.out.print((char)EditableBufferedReader.FORWARD); } } else if(pos < currentPos) { System.err.println(currentPos); System.err.println(pos); System.err.println(currentXY); while((currentPos-pos) >= currentXY.x()) { currentPos -= currentXY.x(); System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print((char)EditableBufferedReader.UP); currentXY.setY(currentXY.y()-1); System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print(numCols); System.out.print((char)EditableBufferedReader.FORWARD); currentXY.setX(numCols); } if(pos < currentPos) { System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print(currentPos-pos); System.out.print((char)EditableBufferedReader.BACKWARD); } } } public void updateCurrentPos() { Coordinate pos = getCurrentPos(); currentXY.setY(pos.y()); currentXY.setX(pos.x()); } public void updateTermSize() { System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print("18t"); Pattern pattern = Pattern.compile("8;(\\d+);(\\d+)"); Scanner scanner = new Scanner(System.in); scanner.findWithinHorizon(pattern,0); numCols = Integer.parseInt(scanner.match().group(2)); //numRows = Integer.parseInt(scanner.match().group(1)); } public Coordinate getCurrentPos() { System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print("6n"); Pattern pattern = Pattern.compile("(\\d+);(\\d+)"); Scanner scanner = new Scanner(System.in); scanner.findWithinHorizon(pattern,0); int x = Integer.parseInt(scanner.match().group(2)); int y = Integer.parseInt(scanner.match().group(1)); return new Coordinate(x,y); } private void insertSpace() { System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print((char)EditableBufferedReader.INS_SPACE); } private void delChar() { System.out.print((char)EditableBufferedReader.ESC); System.out.print((char)EditableBufferedReader.ESC_SEQ); System.out.print((char)EditableBufferedReader.DEL_CHAR); } public void addChar(char c, Line line) { if(line.getCursorPosition() != line.length()+1) { insertSpace(); } System.out.print(c); } public void update(Observable obs, Object arg) { Line line = (Line)obs; Command cmd = (Command)arg; switch(cmd.getType()) { case Command.INSERT_CHAR: addChar((char)cmd.getValue(),line); break; case Command.DELETE_CHAR: delChar(); break; case Command.MOVE_CURSOR: moveCursorTo(cmd.getValue(),line.getCursorPosition(),line.length()); break; } } }