|
1
|
package pad.prac1;
|
|
2
3
4
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
|
|
5
|
import java.util.Scanner;
|
|
6
7
8
9
|
public class EditableBufferedReader extends BufferedReader
{
|
|
10
11
12
13
|
/*
* MODE DEFINITIONS
*/
|
|
14
15
16
17
|
public static final int DEL_BACKWARD = 0;
public static final int DEL_FORWARD = 1;
public static final int INSERT = 0;
public static final int OVERWRITE = 1;
|
|
18
19
20
21
22
23
|
/*
* TYPE DEFINITIONS
*/
public static final int ESCAPE_SEQUENCE = 0;
|
|
24
25
|
public static final int PRINTABLE = 1;
public static final int NON_PRINTABLE = 2;
|
|
26
27
|
/* KEY DEFINITIONS
|
|
28
|
*
|
|
29
30
31
32
33
34
35
36
37
38
39
|
* ESC (0x1B) starts an escape sequence
* ESC+[+C (0x1B 0x5B 0x43) Cursor Forward
* ESC+[+D (0x1B 0x5B 0x44) Cursor Backward
* ESC+[+2+~ (0x1B 0x5B 0x32 0x7E) Insert
* ESC+[+3+~ (0x1B 0x5B 0x33 0x7E) Delete forward
* ESC+O+H (0x1B 0x4F 0x48) Home
* ESC+O+F (0x1B 0x4F 0x46) End
*/
public static final int RETURN_KEY = 0x0D;
public static final int BACKSPACE = 0x08;
|
|
40
|
public static final int BACKSPACE_DEL = 0x7F;
|
|
41
42
|
public static final int ESC = 0x1B;
public static final int ESC_SEQ = 0x5B;
|
|
43
44
|
public static final int FORWARD = 0x43;
public static final int BACKWARD = 0x44;
|
|
45
|
public static final int GOTO = 0x48;
|
|
46
|
public static final int DEL = 0x33;
|
|
47
48
49
50
|
public static final int TILDE = 0x7E;
public static final int HOME_END = 0x4F;
public static final int HOME = 0x48;
public static final int END = 0x46;
|
|
51
52
53
|
public static final int INSERT_KEY = 0x32;
public static final int INS_SPACE = 0x40;
public static final int DEL_CHAR = 0x50;
|
|
54
55
|
public static final int EOF = 0x04;
public static final int LINE_FEED = 0x0A;
|
|
56
|
|
|
57
58
59
|
private Console console = new Console();
private Line line = new Line(console);
private boolean endOfFile = false;
|
|
60
|
|
|
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
public EditableBufferedReader(Reader in)
{
super(in);
}
public EditableBufferedReader(Reader in, int sz)
{
super(in,sz);
}
private void setRaw() throws IOException, InterruptedException
{
String[] cmd = {"/bin/sh", "-c", "stty raw -echo </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();
}
private void unsetRaw() throws IOException, InterruptedException
{
String[] cmd = {"/bin/sh", "-c", "stty -raw echo </dev/tty"};
Runtime.getRuntime().exec(cmd).waitFor();
}
|
|
83
|
private void parseKey() throws IOException
|
|
84
|
{
|
|
85
|
Scanner scanner = new Scanner(System.in);
|
|
86
|
if(scanner.findWithinHorizon("(\\033)?", 0).length() > 0)
|
|
87
|
{
|
|
88
89
|
scanner.skip("(\\033)?");
if(scanner.findWithinHorizon("(\\[)?", 0).length() > 0)
|
|
90
|
{
|
|
91
92
93
94
95
96
97
98
99
100
|
scanner.skip("(\\[)?");
int character = (int)scanner.findWithinHorizon("(?s).{1}", 0).charAt(0);
switch(character)
{
case FORWARD:
line.setCursorTo(line.getCursorPosition()+1);
break;
case BACKWARD:
line.setCursorTo(line.getCursorPosition()-1);
|
|
101
102
|
break;
|
|
103
104
|
case DEL:
line.delChar(DEL_FORWARD);
|
|
105
|
break;
|
|
106
107
108
|
case INSERT_KEY:
line.toggleMode();
|
|
109
|
break;
|
|
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
}
return;
}
else if(scanner.findWithinHorizon("O?", 0).length() > 0)
{
scanner.skip("O?");
int character = (int)scanner.findWithinHorizon("(?s).{1}", 0).charAt(0);
switch(character)
{
case HOME:
line.setCursorTo(1);
break;
case END:
line.setCursorTo(line.length()+1);
break;
}
return;
|
|
128
129
|
}
}
|
|
130
|
else
|
|
131
|
{
|
|
132
|
int character = (int)scanner.findWithinHorizon("(?s).{1}", 0).charAt(0);
|
|
133
|
switch(character)
|
|
134
135
136
|
{
case EOF:
endOfFile = true;
|
|
137
138
|
break;
|
|
139
140
141
|
case BACKSPACE:
case BACKSPACE_DEL:
line.delChar(DEL_BACKWARD);
|
|
142
|
break;
|
|
143
144
145
146
147
|
case RETURN_KEY:
character = LINE_FEED;
default:
line.addChar((char)character);
|
|
148
|
break;
|
|
149
150
|
}
return;
|
|
151
|
}
|
|
152
153
|
}
|
|
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
public int read() throws IOException
{
return super.read();
}
public String readLine()
{
try
{
setRaw();
}
catch (Exception e)
{
System.out.println("Couldn't set terminal in raw mode");
return "";
}
|
|
170
|
try
|
|
171
|
{
|
|
172
|
while(!endOfFile)
|
|
173
|
{
|
|
174
|
parseKey();
|
|
175
176
|
}
}
|
|
177
178
179
180
181
|
catch(Exception e)
{
System.out.println("Error reading line");
return "";
}
|
|
182
183
184
185
186
187
188
189
190
|
try
{
unsetRaw();
}
catch (Exception e)
{
System.out.println("Couldn't unset raw mode");
return "";
}
|
|
191
|
System.out.println("");
|
|
192
|
return line.toString();
|
|
193
194
|
}
}
|
|
195
196
197
198
199
200
201
202
203
|
/* TO-DO
*
* up/down keys (needs text to work)
* pgup pgdown keys (goesto penultima linea visible)
* cursor keys skip final \n on a line
* careful if overwrite mode and final character is \n
*/
|