Commit | Line | Data |
---|---|---|
cd92b0ba KL |
1 | /* |
2 | * Jexer - Java Text User Interface | |
3 | * | |
4 | * The MIT License (MIT) | |
5 | * | |
6 | * Copyright (C) 2017 Kevin Lamonte | |
7 | * | |
8 | * Permission is hereby granted, free of charge, to any person obtaining a | |
9 | * copy of this software and associated documentation files (the "Software"), | |
10 | * to deal in the Software without restriction, including without limitation | |
11 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | |
12 | * and/or sell copies of the Software, and to permit persons to whom the | |
13 | * Software is furnished to do so, subject to the following conditions: | |
14 | * | |
15 | * The above copyright notice and this permission notice shall be included in | |
16 | * all copies or substantial portions of the Software. | |
17 | * | |
18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
20 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |
21 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
22 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |
23 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
24 | * DEALINGS IN THE SOFTWARE. | |
25 | * | |
26 | * @author Kevin Lamonte [kevin.lamonte@gmail.com] | |
27 | * @version 1 | |
28 | */ | |
29 | package jexer.teditor; | |
30 | ||
31 | import java.util.ArrayList; | |
32 | import java.util.List; | |
33 | ||
cd92b0ba | 34 | /** |
12b55d76 KL |
35 | * A Line represents a single line of text on the screen, as a collection of |
36 | * words. | |
cd92b0ba | 37 | */ |
12b55d76 | 38 | public class Line { |
cd92b0ba KL |
39 | |
40 | /** | |
12b55d76 | 41 | * The list of words. |
cd92b0ba | 42 | */ |
12b55d76 | 43 | private ArrayList<Word> words = new ArrayList<Word>(); |
cd92b0ba KL |
44 | |
45 | /** | |
12b55d76 | 46 | * The current cursor position on this line. |
cd92b0ba | 47 | */ |
12b55d76 | 48 | private int cursorX; |
cd92b0ba KL |
49 | |
50 | /** | |
12b55d76 | 51 | * The current word that the cursor position is in. |
cd92b0ba | 52 | */ |
12b55d76 | 53 | private Word currentWord; |
cd92b0ba KL |
54 | |
55 | /** | |
12b55d76 | 56 | * We use getDisplayLength() a lot, so cache the value. |
cd92b0ba | 57 | */ |
12b55d76 | 58 | private int displayLength = -1; |
cd92b0ba KL |
59 | |
60 | /** | |
12b55d76 | 61 | * Get a (shallow) copy of the list of words. |
cd92b0ba | 62 | * |
12b55d76 | 63 | * @return the list of words |
cd92b0ba | 64 | */ |
12b55d76 KL |
65 | public List<Word> getWords() { |
66 | return new ArrayList<Word>(words); | |
cd92b0ba KL |
67 | } |
68 | ||
69 | /** | |
12b55d76 | 70 | * Get the on-screen display length. |
cd92b0ba | 71 | * |
12b55d76 | 72 | * @return the number of cells needed to display this line |
cd92b0ba | 73 | */ |
12b55d76 KL |
74 | public int getDisplayLength() { |
75 | if (displayLength != -1) { | |
76 | return displayLength; | |
cd92b0ba | 77 | } |
12b55d76 KL |
78 | int n = 0; |
79 | for (Word word: words) { | |
80 | n += word.getDisplayLength(); | |
cd92b0ba | 81 | } |
12b55d76 KL |
82 | displayLength = n; |
83 | return displayLength; | |
cd92b0ba KL |
84 | } |
85 | ||
86 | /** | |
12b55d76 | 87 | * Construct a new Line from an existing text string. |
cd92b0ba | 88 | * |
12b55d76 KL |
89 | * @param str the text string |
90 | */ | |
91 | public Line(final String str) { | |
92 | currentWord = new Word(); | |
93 | words.add(currentWord); | |
94 | for (int i = 0; i < str.length(); i++) { | |
95 | char ch = str.charAt(i); | |
96 | Word newWord = currentWord.addChar(ch); | |
97 | if (newWord != currentWord) { | |
98 | words.add(newWord); | |
99 | currentWord = newWord; | |
100 | } | |
cd92b0ba | 101 | } |
cd92b0ba KL |
102 | } |
103 | ||
104 | /** | |
12b55d76 | 105 | * Decrement the cursor by one. If at the first column, do nothing. |
cd92b0ba | 106 | */ |
12b55d76 KL |
107 | public void left() { |
108 | if (cursorX == 0) { | |
109 | return; | |
cd92b0ba | 110 | } |
12b55d76 | 111 | // TODO |
cd92b0ba KL |
112 | } |
113 | ||
114 | /** | |
12b55d76 | 115 | * Increment the cursor by one. If at the last column, do nothing. |
cd92b0ba | 116 | */ |
12b55d76 KL |
117 | public void right() { |
118 | if (cursorX == getDisplayLength() - 1) { | |
119 | return; | |
cd92b0ba | 120 | } |
12b55d76 | 121 | // TODO |
cd92b0ba KL |
122 | } |
123 | ||
124 | /** | |
12b55d76 | 125 | * Go to the first column of this line. |
cd92b0ba | 126 | */ |
12b55d76 KL |
127 | public void home() { |
128 | // TODO | |
cd92b0ba KL |
129 | } |
130 | ||
131 | /** | |
12b55d76 | 132 | * Go to the last column of this line. |
cd92b0ba | 133 | */ |
12b55d76 KL |
134 | public void end() { |
135 | // TODO | |
cd92b0ba KL |
136 | } |
137 | ||
138 | /** | |
12b55d76 | 139 | * Delete the character under the cursor. |
cd92b0ba | 140 | */ |
12b55d76 KL |
141 | public void del() { |
142 | // TODO | |
cd92b0ba KL |
143 | } |
144 | ||
145 | /** | |
12b55d76 | 146 | * Delete the character immediately preceeding the cursor. |
cd92b0ba | 147 | */ |
12b55d76 KL |
148 | public void backspace() { |
149 | // TODO | |
cd92b0ba KL |
150 | } |
151 | ||
152 | /** | |
12b55d76 KL |
153 | * Replace or insert a character at the cursor, depending on overwrite |
154 | * flag. | |
cd92b0ba | 155 | * |
12b55d76 | 156 | * @param ch the character to replace or insert |
cd92b0ba | 157 | */ |
12b55d76 KL |
158 | public void addChar(final char ch) { |
159 | // TODO | |
cd92b0ba KL |
160 | } |
161 | ||
162 | } |