87e6952fb515447b43500395d40cb8e80d0c919b
[fanfix.git] / src / jexer / tterminal / DisplayLine.java
1 /*
2 * Jexer - Java Text User Interface
3 *
4 * The MIT License (MIT)
5 *
6 * Copyright (C) 2019 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.tterminal;
30
31 import jexer.bits.Cell;
32 import jexer.bits.CellAttributes;
33
34 /**
35 * This represents a single line of the display buffer.
36 */
37 public class DisplayLine {
38
39 // ------------------------------------------------------------------------
40 // Constants --------------------------------------------------------------
41 // ------------------------------------------------------------------------
42
43 /**
44 * Maximum line length.
45 */
46 private static final int MAX_LINE_LENGTH = 256;
47
48 // ------------------------------------------------------------------------
49 // Variables --------------------------------------------------------------
50 // ------------------------------------------------------------------------
51
52 /**
53 * The characters/attributes of the line.
54 */
55 private Cell [] chars;
56
57 /**
58 * Double-width line flag.
59 */
60 private boolean doubleWidth = false;
61
62 /**
63 * Double height line flag. Valid values are:
64 *
65 * <p><pre>
66 * 0 = single height
67 * 1 = top half double height
68 * 2 = bottom half double height
69 * </pre>
70 */
71 private int doubleHeight = 0;
72
73 /**
74 * DECSCNM - reverse video. We copy the flag to the line so that
75 * reverse-mode scrollback lines still show inverted colors correctly.
76 */
77 private boolean reverseColor = false;
78
79 // ------------------------------------------------------------------------
80 // Constructors -----------------------------------------------------------
81 // ------------------------------------------------------------------------
82
83 /**
84 * Public constructor makes a duplicate (deep copy).
85 *
86 * @param line the line to duplicate
87 */
88 public DisplayLine(final DisplayLine line) {
89 chars = new Cell[MAX_LINE_LENGTH];
90 for (int i = 0; i < chars.length; i++) {
91 chars[i] = new Cell(line.chars[i]);
92 }
93 doubleWidth = line.doubleWidth;
94 doubleHeight = line.doubleHeight;
95 reverseColor = line.reverseColor;
96 }
97
98 /**
99 * Public constructor sets everything to drawing attributes.
100 *
101 * @param attr current drawing attributes
102 */
103 public DisplayLine(final CellAttributes attr) {
104 chars = new Cell[MAX_LINE_LENGTH];
105 for (int i = 0; i < chars.length; i++) {
106 chars[i] = new Cell(attr);
107 }
108 }
109
110 // ------------------------------------------------------------------------
111 // DisplayLine ------------------------------------------------------------
112 // ------------------------------------------------------------------------
113
114 /**
115 * Get the Cell at a specific column.
116 *
117 * @param idx the character index
118 * @return the Cell
119 */
120 public Cell charAt(final int idx) {
121 return chars[idx];
122 }
123
124 /**
125 * Get the length of this line.
126 *
127 * @return line length
128 */
129 public int length() {
130 return chars.length;
131 }
132
133 /**
134 * Get double width flag.
135 *
136 * @return double width
137 */
138 public boolean isDoubleWidth() {
139 return doubleWidth;
140 }
141
142 /**
143 * Set double width flag.
144 *
145 * @param doubleWidth new value for double width flag
146 */
147 public void setDoubleWidth(final boolean doubleWidth) {
148 this.doubleWidth = doubleWidth;
149 }
150
151 /**
152 * Get double height flag.
153 *
154 * @return double height
155 */
156 public int getDoubleHeight() {
157 return doubleHeight;
158 }
159
160 /**
161 * Set double height flag.
162 *
163 * @param doubleHeight new value for double height flag
164 */
165 public void setDoubleHeight(final int doubleHeight) {
166 this.doubleHeight = doubleHeight;
167 }
168
169 /**
170 * Get reverse video flag.
171 *
172 * @return reverse video
173 */
174 public boolean isReverseColor() {
175 return reverseColor;
176 }
177
178 /**
179 * Set double-height flag.
180 *
181 * @param reverseColor new value for reverse video flag
182 */
183 public void setReverseColor(final boolean reverseColor) {
184 this.reverseColor = reverseColor;
185 }
186
187 /**
188 * Insert a character at the specified position.
189 *
190 * @param idx the character index
191 * @param newCell the new Cell
192 */
193 public void insert(final int idx, final Cell newCell) {
194 System.arraycopy(chars, idx, chars, idx + 1, chars.length - idx - 1);
195 chars[idx] = new Cell(newCell);
196 }
197
198 /**
199 * Replace character at the specified position.
200 *
201 * @param idx the character index
202 * @param newCell the new Cell
203 */
204 public void replace(final int idx, final Cell newCell) {
205 chars[idx].setTo(newCell);
206 }
207
208 /**
209 * Set the Cell at the specified position to the blank (reset).
210 *
211 * @param idx the character index
212 */
213 public void setBlank(final int idx) {
214 chars[idx].reset();
215 }
216
217 /**
218 * Set the character (just the char, not the attributes) at the specified
219 * position to ch.
220 *
221 * @param idx the character index
222 * @param ch the new char
223 */
224 public void setChar(final int idx, final int ch) {
225 chars[idx].setChar(ch);
226 }
227
228 /**
229 * Set the attributes (just the attributes, not the char) at the
230 * specified position to attr.
231 *
232 * @param idx the character index
233 * @param attr the new attributes
234 */
235 public void setAttr(final int idx, final CellAttributes attr) {
236 chars[idx].setAttr(attr);
237 }
238
239 /**
240 * Delete character at the specified position, filling in the new
241 * character on the right with newCell.
242 *
243 * @param idx the character index
244 * @param newCell the new Cell
245 */
246 public void delete(final int idx, final Cell newCell) {
247 System.arraycopy(chars, idx + 1, chars, idx, chars.length - idx - 1);
248 chars[chars.length - 1] = new Cell(newCell);
249 }
250
251 /**
252 * Determine if line contains image data.
253 *
254 * @return true if the line has image data
255 */
256 public boolean isImage() {
257 for (int i = 0; i < chars.length; i++) {
258 if (chars[i].isImage()) {
259 return true;
260 }
261 }
262 return false;
263 }
264
265 /**
266 * Clear image data from line.
267 */
268 public void clearImages() {
269 for (int i = 0; i < chars.length; i++) {
270 if (chars[i].isImage()) {
271 chars[i].reset();
272 }
273 }
274 }
275
276 }