1
2
3
4
5
6
7 package jline;
8
9 /***
10 * A CursorBuffer is a holder for a {@link StringBuffer} that also contains the
11 * current cursor position.
12 *
13 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
14 */
15 public class CursorBuffer {
16 public int cursor = 0;
17
18 StringBuffer buffer = new StringBuffer();
19
20 private boolean overtyping = false;
21
22 public int length() {
23 return buffer.length();
24 }
25
26 public char current() {
27 if (cursor <= 0) {
28 return 0;
29 }
30
31 return buffer.charAt(cursor - 1);
32 }
33
34 public boolean clearBuffer() {
35 if (buffer.length() == 0) {
36 return false;
37 }
38
39 buffer.delete(0, buffer.length());
40 cursor = 0;
41 return true;
42 }
43
44 /***
45 * Write the specific character into the buffer, setting the cursor position
46 * ahead one. The text may overwrite or insert based on the current setting
47 * of isOvertyping().
48 *
49 * @param c
50 * the character to insert
51 */
52 public void write(final char c) {
53 buffer.insert(cursor++, c);
54 if (isOvertyping() && cursor < buffer.length()) {
55 buffer.deleteCharAt(cursor);
56 }
57 }
58
59 /***
60 * Insert the specified {@link String} into the buffer, setting the cursor
61 * to the end of the insertion point.
62 *
63 * @param str
64 * the String to insert. Must not be null.
65 */
66 public void write(final String str) {
67 if (buffer.length() == 0) {
68 buffer.append(str);
69 } else {
70 buffer.insert(cursor, str);
71 }
72
73 cursor += str.length();
74
75 if (isOvertyping() && cursor < buffer.length()) {
76 buffer.delete(cursor, (cursor + str.length()));
77 }
78 }
79
80 public String toString() {
81 return buffer.toString();
82 }
83
84 public boolean isOvertyping() {
85 return overtyping;
86 }
87
88 public void setOvertyping(boolean b) {
89 overtyping = b;
90 }
91
92 public StringBuffer getBuffer() {
93 return buffer;
94 }
95
96 public void setBuffer(StringBuffer buffer) {
97 buffer.setLength(0);
98 buffer.append(this.buffer.toString());
99
100 this.buffer = buffer;
101 }
102
103
104 }