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