Changed license to Creative Commons Zero (CC0).
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / gui / textEditorComponent / TextLine.java
1 /*
2  * Sixth 3D engine. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  *
5 *
6  */
7
8 package eu.svjatoslav.sixth.e3d.gui.textEditorComponent;
9
10 import java.util.ArrayList;
11 import java.util.List;
12
13 public class TextLine {
14
15     private List<Character> chars = new ArrayList<>();
16
17     public TextLine() {
18     }
19
20     public TextLine(final List<Character> value) {
21         chars = value;
22         pack();
23     }
24
25     public TextLine(final String value) {
26         setValue(value);
27     }
28
29     public void addIdent(final int amount) {
30         if (isEmpty())
31             return;
32
33         for (int i = 0; i < amount; i++)
34             chars.add(0, new Character(' '));
35     }
36
37     public String copySubString(final int from, final int until) {
38         final StringBuilder result = new StringBuilder();
39
40         ensureLength(until);
41
42         for (int i = from; i < until; i++)
43             result.append(chars.remove(from).value);
44
45         pack();
46         return result.toString();
47     }
48
49     public void cutFromBeginning(int charactersToCut) {
50
51         if (charactersToCut > chars.size())
52             charactersToCut = chars.size();
53
54         if (charactersToCut == 0)
55             return;
56
57         chars = chars.subList(charactersToCut, chars.size());
58     }
59
60     public String cutSubString(final int from, final int until) {
61         final StringBuilder result = new StringBuilder();
62
63         final List<Character> reminder = new ArrayList<>();
64
65         ensureLength(until);
66
67         for (int i = 0; i < chars.size(); i++)
68             if ((i >= from) && (i < until))
69                 result.append(chars.get(i).value);
70             else
71                 reminder.add(chars.get(i));
72
73         chars = reminder;
74
75         pack();
76         return result.toString();
77     }
78
79     public void cutUntilEnd(final int col) {
80         if (col >= chars.size())
81             return;
82
83         chars = chars.subList(0, col);
84     }
85
86     private void ensureLength(final int length) {
87         while (chars.size() < length)
88             chars.add(new Character(' '));
89     }
90
91     public char getCharForLocation(final int col) {
92
93         if (col >= chars.size())
94             return ' ';
95
96         return chars.get(col).value;
97     }
98
99     public List<Character> getChars() {
100         return chars;
101     }
102
103     public int getIdent() {
104         if (isEmpty())
105             return 0;
106
107         for (int i = 0; i < chars.size(); i++)
108             if (chars.get(i).hasValue())
109                 return i;
110
111         throw new RuntimeException("This code shall never execute");
112     }
113
114     public int getLength() {
115         return chars.size();
116     }
117
118     public TextLine getSubLine(final int from, final int until) {
119         final List<Character> result = new ArrayList<>();
120
121         for (int i = from; i < until; i++) {
122             if (i >= chars.size())
123                 break;
124             result.add(chars.get(i));
125         }
126
127         return new TextLine(result);
128     }
129
130     public String getSubString(final int from, final int until) {
131         final StringBuilder result = new StringBuilder();
132
133         for (int i = from; i < until; i++)
134             result.append(getCharForLocation(i));
135
136         return result.toString();
137     }
138
139     public void insertCharacter(final int col, final char value) {
140         ensureLength(col);
141         chars.add(col, new Character(value));
142         pack();
143     }
144
145     public void insertString(final int col, final String value) {
146         ensureLength(col);
147         int i = 0;
148         for (final char c : value.toCharArray()) {
149             chars.add(col + i, new Character(c));
150             i++;
151         }
152         pack();
153     }
154
155     public void insertTextLine(final int col, final TextLine textLine) {
156         ensureLength(col);
157         int i = 0;
158         for (final Character c : textLine.getChars()) {
159             chars.add(col + i, c);
160             i++;
161         }
162         pack();
163     }
164
165     public boolean isEmpty() {
166         return chars.isEmpty();
167     }
168
169     private void pack() {
170         int newLength = 0;
171
172         for (int i = chars.size() - 1; i >= 0; i--)
173             if (chars.get(i).hasValue()) {
174                 newLength = i + 1;
175                 break;
176             }
177
178         if (newLength == chars.size())
179             return;
180
181         chars = chars.subList(0, newLength);
182     }
183
184     public void removeCharacter(final int col) {
185         if (col >= chars.size())
186             return;
187
188         chars.remove(col);
189     }
190
191     public void setValue(final String string) {
192         chars.clear();
193         for (final char c : string.toCharArray())
194             chars.add(new Character(c));
195
196         pack();
197     }
198
199     @Override
200     public String toString() {
201         final StringBuilder buffer = new StringBuilder();
202
203         for (final Character character : chars)
204             buffer.append(character.value);
205
206         return buffer.toString();
207     }
208
209 }