-/**
+/*
* Jexer - Java Text User Interface
*
- * License: LGPLv3 or later
- *
- * This module is licensed under the GNU Lesser General Public License
- * Version 3. Please see the file "COPYING" in this directory for more
- * information about the GNU Lesser General Public License Version 3.
+ * The MIT License (MIT)
*
- * Copyright (C) 2015 Kevin Lamonte
+ * Copyright (C) 2017 Kevin Lamonte
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 3 of
- * the License, or (at your option) any later version.
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
*
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * General Public License for more details.
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
*
- * You should have received a copy of the GNU Lesser General Public
- * License along with this program; if not, see
- * http://www.gnu.org/licenses/, or write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
*
* @author Kevin Lamonte [kevin.lamonte@gmail.com]
* @version 1
/**
* When true, logical != physical.
*/
- protected boolean dirty;
+ protected volatile boolean dirty;
+
+ /**
+ * Get dirty flag.
+ *
+ * @return if true, the logical screen is not in sync with the physical
+ * screen
+ */
+ public final boolean isDirty() {
+ return dirty;
+ }
/**
* Set if the user explicitly wants to redraw everything starting with a
dirty = true;
logical[X][Y].setForeColor(attr.getForeColor());
logical[X][Y].setBackColor(attr.getBackColor());
- logical[X][Y].setBold(attr.getBold());
- logical[X][Y].setBlink(attr.getBlink());
- logical[X][Y].setReverse(attr.getReverse());
- logical[X][Y].setUnderline(attr.getUnderline());
- logical[X][Y].setProtect(attr.getProtect());
+ logical[X][Y].setBold(attr.isBold());
+ logical[X][Y].setBlink(attr.isBlink());
+ logical[X][Y].setReverse(attr.isReverse());
+ logical[X][Y].setUnderline(attr.isUnderline());
+ logical[X][Y].setProtect(attr.isProtect());
}
}
* @param attr attributes to use (bold, foreColor, backColor)
*/
public final void putAll(final char ch, final CellAttributes attr) {
+
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
putCharXY(x, y, ch, attr);
logical[X][Y].setChar(ch);
logical[X][Y].setForeColor(attr.getForeColor());
logical[X][Y].setBackColor(attr.getBackColor());
- logical[X][Y].setBold(attr.getBold());
- logical[X][Y].setBlink(attr.getBlink());
- logical[X][Y].setReverse(attr.getReverse());
- logical[X][Y].setUnderline(attr.getUnderline());
- logical[X][Y].setProtect(attr.getProtect());
+ logical[X][Y].setBold(attr.isBold());
+ logical[X][Y].setBlink(attr.isBlink());
+ logical[X][Y].setReverse(attr.isReverse());
+ logical[X][Y].setUnderline(attr.isUnderline());
+ logical[X][Y].setProtect(attr.isProtect());
}
}
* @param ch character to draw
*/
public final void putCharXY(final int x, final int y, final char ch) {
+
if ((x < clipLeft)
|| (x >= clipRight)
|| (y < clipTop)
* @param str string to draw
* @param attr attributes to use (bold, foreColor, backColor)
*/
- public final void putStrXY(final int x, final int y, final String str,
+ public final void putStringXY(final int x, final int y, final String str,
final CellAttributes attr) {
int i = x;
* @param y row coordinate. 0 is the top-most row.
* @param str string to draw
*/
- public final void putStrXY(final int x, final int y, final String str) {
+ public final void putStringXY(final int x, final int y, final String str) {
+
int i = x;
for (int j = 0; j < str.length(); j++) {
char ch = str.charAt(j);
* @param width new width
* @param height new height
*/
- private void reallocate(final int width, final int height) {
+ private synchronized void reallocate(final int width, final int height) {
if (logical != null) {
for (int row = 0; row < this.height; row++) {
for (int col = 0; col < this.width; col++) {
*
* @param width new screen width
*/
- public final void setWidth(final int width) {
+ public final synchronized void setWidth(final int width) {
reallocate(width, this.height);
}
*
* @param height new screen height
*/
- public final void setHeight(final int height) {
+ public final synchronized void setHeight(final int height) {
reallocate(this.width, height);
}
*
* @return current screen height
*/
- public final int getHeight() {
+ public final synchronized int getHeight() {
return this.height;
}
*
* @return current screen width
*/
- public final int getWidth() {
+ public final synchronized int getWidth() {
return this.width;
}
* Reset screen to not-bold, white-on-black. Also flushes the offset and
* clip variables.
*/
- public final void reset() {
+ public final synchronized void reset() {
dirty = true;
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
}
/**
- * Force the screen to be fully cleared and redrawn on the next flush().
+ * Clear the logical screen.
*/
public final void clear() {
reset();
}
+ /**
+ * Clear the physical screen.
+ */
+ public final void clearPhysical() {
+ dirty = true;
+ for (int row = 0; row < height; row++) {
+ for (int col = 0; col < width; col++) {
+ physical[col][row].reset();
+ }
+ }
+ }
+
/**
* Draw a box with a border and empty background.
*
final CellAttributes border, final CellAttributes background,
final int borderType, final boolean shadow) {
- int boxTop = top;
- int boxLeft = left;
int boxWidth = right - left;
int boxHeight = bottom - top;