001 /*
002 * Copyright (c) 2002-2007, Marc Prud'hommeaux. All rights reserved.
003 *
004 * This software is distributable under the BSD license. See the terms of the
005 * BSD license in the documentation provided with this software.
006 */
007 package jline;
008
009 /**
010 * A CursorBuffer is a holder for a {@link StringBuffer} that also contains the
011 * current cursor position.
012 *
013 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
014 */
015 public class CursorBuffer {
016 public int cursor = 0;
017
018 StringBuffer buffer = new StringBuffer();
019
020 private boolean overtyping = false;
021
022 public int length() {
023 return buffer.length();
024 }
025
026 public char current() {
027 if (cursor <= 0) {
028 return 0;
029 }
030
031 return buffer.charAt(cursor - 1);
032 }
033
034 public boolean clearBuffer() {
035 if (buffer.length() == 0) {
036 return false;
037 }
038
039 buffer.delete(0, buffer.length());
040 cursor = 0;
041 return true;
042 }
043
044 /**
045 * Write the specific character into the buffer, setting the cursor position
046 * ahead one. The text may overwrite or insert based on the current setting
047 * of isOvertyping().
048 *
049 * @param c
050 * the character to insert
051 */
052 public void write(final char c) {
053 buffer.insert(cursor++, c);
054 if (isOvertyping() && cursor < buffer.length()) {
055 buffer.deleteCharAt(cursor);
056 }
057 }
058
059 /**
060 * Insert the specified {@link String} into the buffer, setting the cursor
061 * to the end of the insertion point.
062 *
063 * @param str
064 * the String to insert. Must not be null.
065 */
066 public void write(final String str) {
067 if (buffer.length() == 0) {
068 buffer.append(str);
069 } else {
070 buffer.insert(cursor, str);
071 }
072
073 cursor += str.length();
074
075 if (isOvertyping() && cursor < buffer.length()) {
076 buffer.delete(cursor, (cursor + str.length()));
077 }
078 }
079
080 public String toString() {
081 return buffer.toString();
082 }
083
084 public boolean isOvertyping() {
085 return overtyping;
086 }
087
088 public void setOvertyping(boolean b) {
089 overtyping = b;
090 }
091
092 public StringBuffer getBuffer() {
093 return buffer;
094 }
095
096 public void setBuffer(StringBuffer buffer) {
097 buffer.setLength(0);
098 buffer.append(this.buffer.toString());
099
100 this.buffer = buffer;
101 }
102
103
104 }