001: /*
002: * This is free software, licensed under the Gnu Public License (GPL)
003: * get a copy from <http://www.gnu.org/licenses/gpl.html>
004: * $Id: CancelWriter.java,v 1.2 2005/04/27 14:37:15 hzeller Exp $
005: * author: Henner Zeller <H.Zeller@acm.org>
006: */
007: package henplus.view.util;
008:
009: import henplus.OutputDevice;
010:
011: /**
012: * Little utility that allows to write a string to the
013: * screen and cancel it afterwards (with Backspaces). Will only
014: * write, if the Output is indeed a terminal.
015: */
016: public final class CancelWriter {
017: private final static String BACKSPACE = "\b";
018:
019: private final OutputDevice _out;
020: private final boolean _doWrite;
021:
022: /** the string that has been written. 'null', if
023: * nothing has been written or it is cancelled
024: */
025: private String _writtenString;
026:
027: public CancelWriter(OutputDevice out) {
028: _out = out;
029: _doWrite = _out.isTerminal();
030: _writtenString = null;
031: }
032:
033: /**
034: * returns, wether this cancel writer will print
035: * anything. Depends on the fact, that the output
036: * is a terminal.
037: */
038: public boolean isPrinting() {
039: return _doWrite;
040: }
041:
042: /**
043: * returns, if this cancel writer has any cancellable
044: * output.
045: */
046: public boolean hasCancellableOutput() {
047: return _writtenString != null;
048: }
049:
050: /**
051: * Print message to screen. Cancel out any previous
052: * message. If the output is no terminal, do not
053: * write anything.
054: * @param str string to print. Must not be null.
055: */
056: public void print(String str) {
057: if (!_doWrite)
058: return;
059: int charCount = cancel(false);
060: _out.print(str);
061: _writtenString = str;
062:
063: /* wipe the difference between the previous
064: * message and this one */
065: final int lenDiff = charCount - str.length();
066: if (lenDiff > 0) {
067: writeChars(lenDiff, " ");
068: writeChars(lenDiff, BACKSPACE);
069: }
070: _out.flush();
071: }
072:
073: /**
074: * cancel out the written string and wipe it
075: * with spaces.
076: */
077: public int cancel() {
078: return cancel(true);
079: }
080:
081: /**
082: * cancel the output.
083: * @param wipeOut 'true', if the written characters
084: * should be wiped out with spaces. Otherwise,
085: * the cursor is placed at the beginning of
086: * the string without wiping.
087: * @return number of characters cancelled.
088: */
089: public int cancel(boolean wipeOut) {
090: if (_writtenString == null)
091: return 0;
092: final int backspaceCount = _writtenString.length();
093: writeChars(backspaceCount, BACKSPACE);
094: if (wipeOut) {
095: writeChars(backspaceCount, " ");
096: writeChars(backspaceCount, BACKSPACE);
097: _out.flush();
098: }
099: _writtenString = null;
100: return backspaceCount;
101: }
102:
103: private void writeChars(int count, String str) {
104: for (int i = 0; i < count; ++i) {
105: _out.print(str);
106: }
107: }
108: }
|