|
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
|
* ESC (0x1B) Starts an escape sequence
|
|
30
|
* ESC+[+C (0x1B 0x5B 0x43) Cursor Forward
|
|
31
|
* ESC+[+D (0x1B 0x5B 0x44) Cursor Backward
|
|
32
33
34
35
|
* 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
|
|
36
37
38
39
|
*/
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 UP = 0x41;
public static final int DOWN = 0x42;
|
|
45
46
|
public static final int FORWARD = 0x43;
public static final int BACKWARD = 0x44;
|
|
47
|
public static final int GOTO = 0x48;
|
|
48
|
public static final int DEL = 0x33;
|
|
49
50
51
52
|
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;
|
|
53
54
55
|
public static final int INSERT_KEY = 0x32;
public static final int INS_SPACE = 0x40;
public static final int DEL_CHAR = 0x50;
|
|
56
57
|
public static final int EOF = 0x04;
public static final int LINE_FEED = 0x0A;
|
|
58
|
|
|
59
60
61
|
private Console console = new Console();
private Line line = new Line(console);
private boolean endOfFile = false;
|
|
62
|
|
|
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
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();
}
|
|
85
|
private void parseKey() throws IOException
|
|
86
|
{
|
|
87
|
Scanner scanner = new Scanner(System.in);
|
|
88
|
if(scanner.findWithinHorizon("(\\033)?", 0).length() > 0)
|
|
89
|
{
|
|
90
91
|
scanner.skip("(\\033)?");
if(scanner.findWithinHorizon("(\\[)?", 0).length() > 0)
|
|
92
|
{
|
|
93
94
95
96
97
98
99
100
101
102
|
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);
|
|
103
104
|
break;
|
|
105
106
|
case DEL:
line.delChar(DEL_FORWARD);
|
|
107
|
break;
|
|
108
109
110
|
case INSERT_KEY:
line.toggleMode();
|
|
111
|
break;
|
|
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
}
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;
|
|
130
131
|
}
}
|
|
132
|
else
|
|
133
|
{
|
|
134
|
int character = (int)scanner.findWithinHorizon("(?s).{1}", 0).charAt(0);
|
|
135
|
switch(character)
|
|
136
137
138
139
|
{
case BACKSPACE:
case BACKSPACE_DEL:
line.delChar(DEL_BACKWARD);
|
|
140
|
break;
|
|
141
|
|
|
142
|
case EOF:
|
|
143
|
case RETURN_KEY:
|
|
144
145
|
endOfFile = true;
break;
|
|
146
147
|
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
|
catch(Exception e)
{
|
|
179
|
e.printStackTrace();
|
|
180
181
182
|
System.out.println("Error reading line");
return "";
}
|
|
183
184
185
186
187
188
189
190
191
|
try
{
unsetRaw();
}
catch (Exception e)
{
System.out.println("Couldn't unset raw mode");
return "";
}
|
|
192
|
System.out.println("");
|
|
193
|
return line.toString();
|
|
194
|
}
|
|
195
|
}
|