#49 reduce use of synchronized
[nikiroo-utils.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();
107 chars[i].setTo(attr);
108 }
109 }
110
111 // ------------------------------------------------------------------------
112 // DisplayLine ------------------------------------------------------------
113 // ------------------------------------------------------------------------
114
115 /**
116 * Get the Cell at a specific column.
117 *
118 * @param idx the character index
119 * @return the Cell
120 */
121 public Cell charAt(final int idx) {
122 return chars[idx];
123 }
124
125 /**
126 * Get the length of this line.
127 *
128 * @return line length
129 */
130 public int length() {
131 return chars.length;
132 }
133
134 /**
135 * Get double width flag.
136 *
137 * @return double width
138 */
139 public boolean isDoubleWidth() {
140 return doubleWidth;
141 }
142
143 /**
144 * Set double width flag.
145 *
146 * @param doubleWidth new value for double width flag
147 */
148 public void setDoubleWidth(final boolean doubleWidth) {
149 this.doubleWidth = doubleWidth;
150 }
151
152 /**
153 * Get double height flag.
154 *
155 * @return double height
156 */
157 public int getDoubleHeight() {
158 return doubleHeight;
159 }
160
161 /**
162 * Set double height flag.
163 *
164 * @param doubleHeight new value for double height flag
165 */
166 public void setDoubleHeight(final int doubleHeight) {
167 this.doubleHeight = doubleHeight;
168 }
169
170 /**
171 * Get reverse video flag.
172 *
173 * @return reverse video
174 */
175 public boolean isReverseColor() {
176 return reverseColor;
177 }
178
179 /**
180 * Set double-height flag.
181 *
182 * @param reverseColor new value for reverse video flag
183 */
184 public void setReverseColor(final boolean reverseColor) {
185 this.reverseColor = reverseColor;
186 }
187
188 /**
189 * Insert a character at the specified position.
190 *
191 * @param idx the character index
192 * @param newCell the new Cell
193 */
194 public void insert(final int idx, final Cell newCell) {
195 System.arraycopy(chars, idx, chars, idx + 1, chars.length - idx - 1);
196 chars[idx] = new Cell();
197 chars[idx].setTo(newCell);
198 }
199
200 /**
201 * Replace character at the specified position.
202 *
203 * @param idx the character index
204 * @param newCell the new Cell
205 */
206 public void replace(final int idx, final Cell newCell) {
207 chars[idx].setTo(newCell);
208 }
209
210 /**
211 * Set the Cell at the specified position to the blank (reset).
212 *
213 * @param idx the character index
214 */
215 public void setBlank(final int idx) {
216 chars[idx].reset();
217 }
218
219 /**
220 * Set the character (just the char, not the attributes) at the specified
221 * position to ch.
222 *
223 * @param idx the character index
224 * @param ch the new char
225 */
226 public void setChar(final int idx, final char ch) {
227 chars[idx].setChar(ch);
228 }
229
230 /**
231 * Set the attributes (just the attributes, not the char) at the
232 * specified position to attr.
233 *
234 * @param idx the character index
235 * @param attr the new attributes
236 */
237 public void setAttr(final int idx, final CellAttributes attr) {
238 chars[idx].setAttr(attr);
239 }
240
241 /**
242 * Delete character at the specified position, filling in the new
243 * character on the right with newCell.
244 *
245 * @param idx the character index
246 * @param newCell the new Cell
247 */
248 public void delete(final int idx, final Cell newCell) {
249 System.arraycopy(chars, idx + 1, chars, idx, chars.length - idx - 1);
250 chars[chars.length - 1] = new Cell();
251 chars[chars.length - 1].setTo(newCell);
252 }
253
254 }