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