Commit a59076a2a42feb0ad4bb232bf8e507dc3e85cd17

Authored by Imanol-Mikel Barba Sabariego
1 parent de88d7ee

git-svn-id: svn://imanolbarba.net/PAD@11 c2ee353e-ed0d-4329-bf56-03aec153487f

readline/bin/pad/prac1/Console.class
No preview for this file type
readline/bin/pad/prac1/EditableBufferedReader.class
No preview for this file type
readline/src/pad/prac1/Console.java
@@ -2,25 +2,41 @@ package pad.prac1; @@ -2,25 +2,41 @@ package pad.prac1;
2 2
3 import java.util.Observable; 3 import java.util.Observable;
4 import java.util.Observer; 4 import java.util.Observer;
  5 +import java.util.Scanner;
  6 +import java.util.regex.Pattern;
5 7
6 public class Console implements Observer 8 public class Console implements Observer
7 { 9 {
8 - public void moveCursorTo(int pos, int currentPos, int length) 10 + private int currentCol;
  11 + private int currentRow;
  12 +
  13 + public void updateCurrentPos()
9 { 14 {
10 - if(pos > currentPos)  
11 - {  
12 - System.out.print((char)EditableBufferedReader.ESC);  
13 - System.out.print((char)EditableBufferedReader.ESC_SEQ);  
14 - System.out.print(pos - currentPos);  
15 - System.out.print((char)EditableBufferedReader.FORWARD);  
16 - }  
17 - else if(pos < currentPos)  
18 - {  
19 - System.out.print((char)EditableBufferedReader.ESC);  
20 - System.out.print((char)EditableBufferedReader.ESC_SEQ);  
21 - System.out.print(currentPos-pos);  
22 - System.out.print((char)EditableBufferedReader.BACKWARD);  
23 - } 15 + Coordinate pos = getCurrentPos();
  16 + currentCol = pos.x();
  17 + currentRow = pos.y();
  18 + }
  19 +
  20 + public Coordinate getCurrentPos()
  21 + {
  22 + System.out.print((char)EditableBufferedReader.ESC);
  23 + System.out.print((char)EditableBufferedReader.ESC_SEQ);
  24 + System.out.print("6n");
  25 + Pattern pattern = Pattern.compile("(\\d*);(\\d*)");
  26 + Scanner scanner = new Scanner(System.in);
  27 + scanner.findWithinHorizon(pattern,0);
  28 + return new Coordinate(Integer.parseInt(scanner.match().group(2)),
  29 + Integer.parseInt(scanner.match().group(1)));
  30 + }
  31 +
  32 + public void moveCursorTo(Coordinate xy)
  33 + {
  34 + System.out.print((char)EditableBufferedReader.ESC);
  35 + System.out.print((char)EditableBufferedReader.ESC_SEQ);
  36 + System.out.print(xy.y());
  37 + System.out.print(';');
  38 + System.out.print(xy.x());
  39 + System.out.print((char)EditableBufferedReader.GOTO);
24 } 40 }
25 41
26 private void insertSpace() 42 private void insertSpace()
@@ -48,6 +64,7 @@ public class Console implements Observer @@ -48,6 +64,7 @@ public class Console implements Observer
48 64
49 public void update(Observable obs, Object arg) 65 public void update(Observable obs, Object arg)
50 { 66 {
  67 + updateCurrentPos();
51 Line line = (Line)obs; 68 Line line = (Line)obs;
52 Command cmd = (Command)arg; 69 Command cmd = (Command)arg;
53 switch(cmd.getType()) 70 switch(cmd.getType())
@@ -61,7 +78,9 @@ public class Console implements Observer @@ -61,7 +78,9 @@ public class Console implements Observer
61 break; 78 break;
62 79
63 case Command.MOVE_CURSOR: 80 case Command.MOVE_CURSOR:
64 - moveCursorTo(cmd.getValue(),line.getCursorPosition(),line.length()); 81 + Coordinate xy = new Coordinate(cmd.getValue(),currentRow);
  82 + //Gestionar si excede el numero de columnas con modulos y asi
  83 + moveCursorTo(xy);
65 break; 84 break;
66 } 85 }
67 } 86 }
readline/src/pad/prac1/EditableBufferedReader.java
1 package pad.prac1; 1 package pad.prac1;
2 import java.io.*; 2 import java.io.*;
  3 +import java.util.Scanner;
  4 +import java.util.regex.Pattern;
3 5
4 6
5 public class EditableBufferedReader extends BufferedReader 7 public class EditableBufferedReader extends BufferedReader
@@ -39,6 +41,7 @@ public class EditableBufferedReader extends BufferedReader @@ -39,6 +41,7 @@ public class EditableBufferedReader extends BufferedReader
39 public static final int ESC_SEQ = 0x5B; 41 public static final int ESC_SEQ = 0x5B;
40 public static final int FORWARD = 0x43; 42 public static final int FORWARD = 0x43;
41 public static final int BACKWARD = 0x44; 43 public static final int BACKWARD = 0x44;
  44 + public static final int GOTO = 0x48;
42 public static final int DEL = 0x33; 45 public static final int DEL = 0x33;
43 public static final int TILDE = 0x7E; 46 public static final int TILDE = 0x7E;
44 public static final int HOME_END = 0x4F; 47 public static final int HOME_END = 0x4F;
@@ -76,21 +79,77 @@ public class EditableBufferedReader extends BufferedReader @@ -76,21 +79,77 @@ public class EditableBufferedReader extends BufferedReader
76 Runtime.getRuntime().exec(cmd).waitFor(); 79 Runtime.getRuntime().exec(cmd).waitFor();
77 } 80 }
78 81
79 - private int parseKey(int key) 82 + private void parseKey() throws IOException
80 { 83 {
81 - if(key < 0x20) 84 + Pattern pattern;
  85 + Scanner scanner = new Scanner(System.in);
  86 + pattern = Pattern.compile("(.{1})");
  87 + if(scanner.findWithinHorizon(pattern,0) != null)
82 { 88 {
83 - if(key == ESC) 89 + int character = (int)scanner.match().group(1).charAt(0);
  90 + if(character >= 0x20 || character == EOF || character == BACKSPACE || character == RETURN_KEY)
84 { 91 {
85 - return ESCAPE_SEQUENCE;  
86 - }  
87 - else if((key == BACKSPACE) || (key == RETURN_KEY) || (key == EOF))  
88 - {  
89 - return PRINTABLE; 92 + switch(character)
  93 + {
  94 + case EOF:
  95 + endOfFile = true;
  96 + break;
  97 +
  98 + case BACKSPACE:
  99 + case BACKSPACE_DEL:
  100 + line.delChar(DEL_BACKWARD);
  101 + break;
  102 +
  103 + case RETURN_KEY:
  104 + character = LINE_FEED;
  105 + default:
  106 + line.addChar((char)character);
  107 + break;
  108 + }
  109 + return;
90 } 110 }
91 - return NON_PRINTABLE;  
92 } 111 }
93 - return PRINTABLE; 112 + pattern = Pattern.compile("\\^\\[\\[(.{1}).*");
  113 + if(scanner.findWithinHorizon(pattern,3) != null) //escape sequence
  114 + {
  115 + int character = scanner.match().group(1).charAt(0);
  116 + switch(character)
  117 + {
  118 + case FORWARD:
  119 + line.setCursorTo(line.getCursorPosition()+1);
  120 + break;
  121 +
  122 + case BACKWARD:
  123 + line.setCursorTo(line.getCursorPosition()-1);
  124 + break;
  125 +
  126 + case DEL:
  127 + line.delChar(DEL_FORWARD);
  128 + break;
  129 +
  130 + case INSERT_KEY:
  131 + line.toggleMode();
  132 + break;
  133 + }
  134 + return;
  135 + }
  136 + pattern = Pattern.compile("\\^\\[O(\\w{1})");
  137 + if(scanner.findWithinHorizon(pattern,3) != null) //HOME or END
  138 + {
  139 +
  140 + int character = (int)scanner.match().group(1).charAt(0);
  141 + switch(character)
  142 + {
  143 + case HOME:
  144 + line.setCursorTo(1);
  145 + break;
  146 +
  147 + case END:
  148 + line.setCursorTo(line.length()+1);
  149 + break;
  150 + }
  151 + return;
  152 + }
94 } 153 }
95 154
96 public int read() throws IOException 155 public int read() throws IOException
@@ -109,90 +168,18 @@ public class EditableBufferedReader extends BufferedReader @@ -109,90 +168,18 @@ public class EditableBufferedReader extends BufferedReader
109 System.out.println("Couldn't set terminal in raw mode"); 168 System.out.println("Couldn't set terminal in raw mode");
110 return ""; 169 return "";
111 } 170 }
112 - while(!endOfFile) 171 + try
113 { 172 {
114 - try 173 + while(!endOfFile)
115 { 174 {
116 - int character = read();  
117 - //System.err.print((String)(Integer.toHexString(character) + " ").toUpperCase());  
118 - switch(parseKey(character))  
119 - {  
120 - case ESCAPE_SEQUENCE:  
121 - switch(read())  
122 - {  
123 - case ESC_SEQ:  
124 - switch(read())  
125 - {  
126 - case FORWARD:  
127 - line.setCursorTo(line.getCursorPosition()+1);  
128 - break;  
129 -  
130 - case BACKWARD:  
131 - line.setCursorTo(line.getCursorPosition()-1);  
132 - break;  
133 -  
134 - case DEL:  
135 - if(read() == TILDE)  
136 - {  
137 - line.delChar(DEL_FORWARD);  
138 - }  
139 - break;  
140 -  
141 - case INSERT_KEY:  
142 - if(read() == TILDE)  
143 - {  
144 - line.toggleMode();  
145 - }  
146 - break;  
147 - }  
148 - break;  
149 -  
150 - case HOME_END:  
151 - switch(read())  
152 - {  
153 - case HOME:  
154 - line.setCursorTo(1);  
155 - break;  
156 -  
157 - case END:  
158 - line.setCursorTo(line.length()+1);  
159 - break;  
160 - }  
161 - break;  
162 - }  
163 - break;  
164 -  
165 - case PRINTABLE:  
166 - switch(character)  
167 - {  
168 - case EOF:  
169 - endOfFile = true;  
170 - break;  
171 -  
172 - case BACKSPACE:  
173 - case BACKSPACE_DEL:  
174 - line.delChar(DEL_BACKWARD);  
175 - break;  
176 -  
177 - case RETURN_KEY:  
178 - character = LINE_FEED;  
179 - default:  
180 - line.addChar((char)character);  
181 - break;  
182 - }  
183 - break;  
184 -  
185 - case NON_PRINTABLE:  
186 - //ignore  
187 - break;  
188 - }  
189 - }  
190 - catch (IOException e)  
191 - {  
192 - System.out.println("Error reading line");  
193 - break; 175 + parseKey();
194 } 176 }
195 } 177 }
  178 + catch(Exception e)
  179 + {
  180 + System.out.println("Error reading line");
  181 + return "";
  182 + }
196 try 183 try
197 { 184 {
198 unsetRaw(); 185 unsetRaw();