Commit 25fd54b02f38247159c81fae679becf77e977f10
1 parent
ff06f381
git-svn-id: svn://imanolbarba.net/PAD@5 c2ee353e-ed0d-4329-bf56-03aec153487f
Showing
2 changed files
with
129 additions
and
101 deletions
readline/bin/pad/prac1/EditableBufferedReader.class
No preview for this file type
readline/src/pad/prac1/EditableBufferedReader.java
@@ -8,18 +8,18 @@ public class EditableBufferedReader extends BufferedReader | @@ -8,18 +8,18 @@ public class EditableBufferedReader extends BufferedReader | ||
8 | * MODE DEFINITIONS | 8 | * MODE DEFINITIONS |
9 | */ | 9 | */ |
10 | 10 | ||
11 | - public static final int INSERT = 0; | ||
12 | - public static final int OVERWRITE = 1; | ||
13 | - public static final int DEL_BACKWARD = 0; | ||
14 | - public static final int DEL_FORWARD = 1; | 11 | + public static final int DEL_BACKWARD = 0; |
12 | + public static final int DEL_FORWARD = 1; | ||
13 | + public static final int INSERT = 0; | ||
14 | + public static final int OVERWRITE = 1; | ||
15 | 15 | ||
16 | /* | 16 | /* |
17 | * TYPE DEFINITIONS | 17 | * TYPE DEFINITIONS |
18 | */ | 18 | */ |
19 | 19 | ||
20 | public static final int ESCAPE_SEQUENCE = 0; | 20 | public static final int ESCAPE_SEQUENCE = 0; |
21 | - public static final int PRINTABLE = 1; | ||
22 | - public static final int NON_PRINTABLE = 2; | 21 | + public static final int PRINTABLE = 1; |
22 | + public static final int NON_PRINTABLE = 2; | ||
23 | 23 | ||
24 | /* KEY DEFINITIONS | 24 | /* KEY DEFINITIONS |
25 | * ESC (0x1B) starts an escape sequence | 25 | * ESC (0x1B) starts an escape sequence |
@@ -33,25 +33,24 @@ public class EditableBufferedReader extends BufferedReader | @@ -33,25 +33,24 @@ public class EditableBufferedReader extends BufferedReader | ||
33 | 33 | ||
34 | public static final int RETURN_KEY = 0x0D; | 34 | public static final int RETURN_KEY = 0x0D; |
35 | public static final int BACKSPACE = 0x08; | 35 | public static final int BACKSPACE = 0x08; |
36 | - public static final int BACKSPACE_DEL = 0x7B; | 36 | + public static final int BACKSPACE_DEL = 0x7F; |
37 | public static final int ESC = 0x1B; | 37 | public static final int ESC = 0x1B; |
38 | public static final int ESC_SEQ = 0x5B; | 38 | public static final int ESC_SEQ = 0x5B; |
39 | - public static final int FORWARD_C = 0x43; | ||
40 | - public static final int BACKWARD_D = 0x44; | ||
41 | - public static final int DEL_3 = 0x33; | 39 | + public static final int FORWARD = 0x43; |
40 | + public static final int BACKWARD = 0x44; | ||
41 | + public static final int DEL = 0x33; | ||
42 | public static final int TILDE = 0x7E; | 42 | public static final int TILDE = 0x7E; |
43 | public static final int HOME_END = 0x4F; | 43 | public static final int HOME_END = 0x4F; |
44 | public static final int HOME = 0x48; | 44 | public static final int HOME = 0x48; |
45 | public static final int END = 0x46; | 45 | public static final int END = 0x46; |
46 | - public static final int INSERT_2 = 0x32; | ||
47 | - | ||
48 | - private String line = ""; | ||
49 | - private int lineLength = 0; | ||
50 | - private int cursorPosition = 1; | ||
51 | - private boolean returnKey = false; | ||
52 | - private int writeMode = INSERT; | ||
53 | - | 46 | + public static final int INSERT_KEY = 0x32; |
47 | + public static final int INS_SPACE = 0x40; | ||
48 | + public static final int DEL_CHAR = 0x50; | ||
49 | + public static final int NUM_0 = 0x30; | ||
54 | 50 | ||
51 | + private Line line = new Line(); | ||
52 | + private boolean returnKey = false; | ||
53 | + | ||
55 | public EditableBufferedReader(Reader in) | 54 | public EditableBufferedReader(Reader in) |
56 | { | 55 | { |
57 | super(in); | 56 | super(in); |
@@ -76,76 +75,104 @@ public class EditableBufferedReader extends BufferedReader | @@ -76,76 +75,104 @@ public class EditableBufferedReader extends BufferedReader | ||
76 | 75 | ||
77 | private int parseKey(int key) | 76 | private int parseKey(int key) |
78 | { | 77 | { |
79 | - //TO IMPLEMENT BOTH MODES | 78 | + if(key < 0x20) |
79 | + { | ||
80 | + if(key == ESC) | ||
81 | + { | ||
82 | + return ESCAPE_SEQUENCE; | ||
83 | + } | ||
84 | + else if((key == BACKSPACE) || (key == RETURN_KEY)) | ||
85 | + { | ||
86 | + return PRINTABLE; | ||
87 | + } | ||
88 | + return NON_PRINTABLE; | ||
89 | + } | ||
80 | return PRINTABLE; | 90 | return PRINTABLE; |
81 | } | 91 | } |
82 | 92 | ||
83 | - public void addChar(char character) | 93 | + public void addChar(char c) |
84 | { | 94 | { |
85 | - //switch writemode | ||
86 | - //if insert | ||
87 | - //print space | ||
88 | - //moveto cursorPosition-1 | ||
89 | - //print char | ||
90 | - //add to string | ||
91 | - //update string length | ||
92 | - //update cursor position | ||
93 | - //if overwrite | ||
94 | - //just print char | ||
95 | - //add to string | ||
96 | - //update string length | ||
97 | - //update cursor position | 95 | + switch(line.getMode()) |
96 | + { | ||
97 | + case INSERT: | ||
98 | + if(line.getCursorPosition() != line.length()+1) | ||
99 | + { | ||
100 | + insertSpace(); | ||
101 | + } | ||
102 | + System.out.print(c); | ||
103 | + line.insertCharAt(c, line.getCursorPosition()-1); | ||
104 | + line.setCursorPosition(line.getCursorPosition()+1); | ||
105 | + break; | ||
106 | + | ||
107 | + case OVERWRITE: | ||
108 | + if(line.getCursorPosition() != line.length()+1) | ||
109 | + { | ||
110 | + line.removeCharAt(line.getCursorPosition()-1); | ||
111 | + } | ||
112 | + System.out.print(c); | ||
113 | + line.insertCharAt(c, line.getCursorPosition()-1); | ||
114 | + line.setCursorPosition(line.getCursorPosition()+1); | ||
115 | + break; | ||
116 | + } | ||
98 | } | 117 | } |
99 | 118 | ||
100 | public void delChar(int mode) | 119 | public void delChar(int mode) |
101 | { | 120 | { |
102 | - //switch mode | ||
103 | - //if back | ||
104 | - //del char using backspace | ||
105 | - //remove char from line string | ||
106 | - //update cursor position | ||
107 | - //update line length | ||
108 | - //if forward | ||
109 | - //moveto cursorPosition+1 | ||
110 | - //del char using backspace | ||
111 | - //remove char from line string | ||
112 | - //update line length | 121 | + switch(mode) |
122 | + { | ||
123 | + case DEL_BACKWARD: | ||
124 | + if(line.getCursorPosition() != 1) | ||
125 | + { | ||
126 | + System.out.print((char)BACKSPACE); | ||
127 | + deleteCharacter(); | ||
128 | + line.removeCharAt(line.getCursorPosition()-2); | ||
129 | + line.setCursorPosition(line.getCursorPosition()-1); | ||
130 | + } | ||
131 | + break; | ||
132 | + case DEL_FORWARD: | ||
133 | + if(line.getCursorPosition() != (line.length()+1)) | ||
134 | + { | ||
135 | + line.removeCharAt(line.getCursorPosition()-1); | ||
136 | + deleteCharacter(); | ||
137 | + } | ||
138 | + break; | ||
139 | + } | ||
113 | } | 140 | } |
114 | 141 | ||
115 | - private void moveCursorForward() | 142 | + private void insertSpace() |
116 | { | 143 | { |
117 | System.out.print((char)ESC); | 144 | System.out.print((char)ESC); |
118 | System.out.print((char)ESC_SEQ); | 145 | System.out.print((char)ESC_SEQ); |
119 | - System.out.print((char)FORWARD_C); | 146 | + System.out.print((char)INS_SPACE); |
120 | } | 147 | } |
121 | 148 | ||
122 | - private void moveCursorBackward() | 149 | + private void deleteCharacter() |
123 | { | 150 | { |
124 | System.out.print((char)ESC); | 151 | System.out.print((char)ESC); |
125 | System.out.print((char)ESC_SEQ); | 152 | System.out.print((char)ESC_SEQ); |
126 | - System.out.print((char)BACKWARD_D); | 153 | + System.out.print((char)DEL_CHAR); |
127 | } | 154 | } |
128 | 155 | ||
129 | public void moveCursorTo(int pos) | 156 | public void moveCursorTo(int pos) |
130 | { | 157 | { |
131 | - if((pos <= lineLength) && (pos >= 1)) | 158 | + if((pos <= line.length()+1) && (pos >= 1)) |
132 | { | 159 | { |
133 | - if(pos > cursorPosition) | 160 | + if(pos > line.getCursorPosition()) |
134 | { | 161 | { |
135 | - for(int i = 0; i < (pos - cursorPosition); i++) | ||
136 | - { | ||
137 | - moveCursorForward(); | ||
138 | - } | 162 | + System.out.print((char)ESC); |
163 | + System.out.print((char)ESC_SEQ); | ||
164 | + System.out.print((char)(NUM_0+pos-line.getCursorPosition())); | ||
165 | + System.out.print((char)FORWARD); | ||
139 | } | 166 | } |
140 | 167 | ||
141 | - else if(pos < cursorPosition) | 168 | + else if(pos < line.getCursorPosition()) |
142 | { | 169 | { |
143 | - for(int i = 0; i < (cursorPosition - pos); i++) | ||
144 | - { | ||
145 | - moveCursorBackward(); | ||
146 | - } | 170 | + System.out.print((char)ESC); |
171 | + System.out.print((char)ESC_SEQ); | ||
172 | + System.out.print((char)(NUM_0-pos+line.getCursorPosition())); | ||
173 | + System.out.print((char)BACKWARD); | ||
147 | } | 174 | } |
148 | - cursorPosition = pos; | 175 | + line.setCursorPosition(pos); |
149 | } | 176 | } |
150 | } | 177 | } |
151 | 178 | ||
@@ -170,79 +197,80 @@ public class EditableBufferedReader extends BufferedReader | @@ -170,79 +197,80 @@ public class EditableBufferedReader extends BufferedReader | ||
170 | try | 197 | try |
171 | { | 198 | { |
172 | int character = read(); | 199 | int character = read(); |
173 | - System.out.println("\n\n" + character + "\n"); | ||
174 | switch(parseKey(character)) | 200 | switch(parseKey(character)) |
175 | { | 201 | { |
176 | case ESCAPE_SEQUENCE: | 202 | case ESCAPE_SEQUENCE: |
177 | - if(read() == ESC_SEQ) | 203 | + switch(read()) |
178 | { | 204 | { |
179 | - switch(read()) | ||
180 | - { | ||
181 | - case FORWARD_C: | ||
182 | - moveCursorTo(cursorPosition+1); | 205 | + case ESC_SEQ: |
206 | + switch(read()) | ||
207 | + { | ||
208 | + case FORWARD: | ||
209 | + moveCursorTo(line.getCursorPosition()+1); | ||
210 | + break; | ||
211 | + | ||
212 | + case BACKWARD: | ||
213 | + moveCursorTo(line.getCursorPosition()-1); | ||
183 | break; | 214 | break; |
184 | 215 | ||
185 | - case BACKWARD_D: | ||
186 | - moveCursorTo(cursorPosition-1); | 216 | + case DEL: |
217 | + if(read() == TILDE) | ||
218 | + { | ||
219 | + delChar(DEL_FORWARD); | ||
220 | + } | ||
187 | break; | 221 | break; |
188 | - | ||
189 | - case DEL_3: | ||
190 | - if(read() == TILDE) | ||
191 | - { | ||
192 | - delChar(DEL_FORWARD); | ||
193 | - } | 222 | + |
223 | + case INSERT_KEY: | ||
224 | + if(read() == TILDE) | ||
225 | + { | ||
226 | + line.toggleMode(); | ||
227 | + } | ||
194 | break; | 228 | break; |
195 | - | ||
196 | - case INSERT_2: | ||
197 | - if(read() == TILDE) | ||
198 | - { | ||
199 | - writeMode = 1-writeMode; | ||
200 | - } | 229 | + } |
230 | + break; | ||
231 | + | ||
232 | + case HOME_END: | ||
233 | + switch(read()) | ||
234 | + { | ||
235 | + case HOME: | ||
236 | + moveCursorTo(1); | ||
201 | break; | 237 | break; |
202 | - | ||
203 | - case HOME_END: | ||
204 | - switch(read()) | ||
205 | - { | ||
206 | - case HOME: | ||
207 | - moveCursorTo(1); | ||
208 | - break; | ||
209 | - | ||
210 | - case END: | ||
211 | - moveCursorTo(lineLength+1); | ||
212 | - break; | ||
213 | - } | 238 | + |
239 | + case END: | ||
240 | + moveCursorTo(line.length()+1); | ||
214 | break; | 241 | break; |
215 | - } | 242 | + } |
243 | + break; | ||
216 | } | 244 | } |
217 | - break; | 245 | + break; |
218 | 246 | ||
219 | case PRINTABLE: | 247 | case PRINTABLE: |
220 | switch(character) | 248 | switch(character) |
221 | { | 249 | { |
222 | case RETURN_KEY: | 250 | case RETURN_KEY: |
223 | returnKey = true; | 251 | returnKey = true; |
224 | - break; | 252 | + break; |
225 | 253 | ||
226 | case BACKSPACE: | 254 | case BACKSPACE: |
227 | case BACKSPACE_DEL: | 255 | case BACKSPACE_DEL: |
228 | delChar(DEL_BACKWARD); | 256 | delChar(DEL_BACKWARD); |
229 | - break; | 257 | + break; |
230 | 258 | ||
231 | default: | 259 | default: |
232 | addChar((char)character); | 260 | addChar((char)character); |
233 | - break; | 261 | + break; |
234 | } | 262 | } |
235 | - break; | 263 | + break; |
236 | 264 | ||
237 | case NON_PRINTABLE: | 265 | case NON_PRINTABLE: |
238 | //ignore | 266 | //ignore |
239 | - break; | 267 | + break; |
240 | } | 268 | } |
241 | 269 | ||
242 | } | 270 | } |
243 | catch (IOException e) | 271 | catch (IOException e) |
244 | { | 272 | { |
245 | - System.out.println("Couldn't unset raw mode"); | 273 | + System.out.println("Error reading line"); |
246 | break; | 274 | break; |
247 | } | 275 | } |
248 | } | 276 | } |
@@ -256,6 +284,6 @@ public class EditableBufferedReader extends BufferedReader | @@ -256,6 +284,6 @@ public class EditableBufferedReader extends BufferedReader | ||
256 | return ""; | 284 | return ""; |
257 | } | 285 | } |
258 | System.out.println(""); | 286 | System.out.println(""); |
259 | - return line; | 287 | + return line.toString(); |
260 | } | 288 | } |
261 | } | 289 | } |