1 /* 2 * Copyright (c) 2002-2012, the original author or authors. 3 * 4 * This software is distributable under the BSD license. See the terms of the 5 * BSD license in the documentation provided with this software. 6 * 7 * http://www.opensource.org/licenses/bsd-license.php 8 */ 9 package jline.console; 10 11 import static jline.internal.Preconditions.checkNotNull; 12 13 /** 14 * A holder for a {@link StringBuilder} that also contains the current cursor position. 15 * 16 * @author <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a> 17 * @author <a href="mailto:jason@planet57.com">Jason Dillon</a> 18 * @since 2.0 19 */ 20 public class CursorBuffer 21 { 22 private boolean overTyping = false; 23 24 public int cursor = 0; 25 26 public final StringBuilder buffer = new StringBuilder(); 27 28 public CursorBuffer copy () { 29 CursorBuffer that = new CursorBuffer(); 30 that.overTyping = this.overTyping; 31 that.cursor = this.cursor; 32 that.buffer.append (this.toString()); 33 34 return that; 35 } 36 37 public boolean isOverTyping() { 38 return overTyping; 39 } 40 41 public void setOverTyping(final boolean b) { 42 overTyping = b; 43 } 44 45 public int length() { 46 return buffer.length(); 47 } 48 49 public char nextChar() { 50 if (cursor == buffer.length()) { 51 return 0; 52 } else { 53 return buffer.charAt(cursor); 54 } 55 } 56 57 public char current() { 58 if (cursor <= 0) { 59 return 0; 60 } 61 62 return buffer.charAt(cursor - 1); 63 } 64 65 /** 66 * Write the specific character into the buffer, setting the cursor position 67 * ahead one. The text may overwrite or insert based on the current setting 68 * of {@link #isOverTyping}. 69 * 70 * @param c the character to insert 71 */ 72 public void write(final char c) { 73 buffer.insert(cursor++, c); 74 if (isOverTyping() && cursor < buffer.length()) { 75 buffer.deleteCharAt(cursor); 76 } 77 } 78 79 /** 80 * Insert the specified chars into the buffer, setting the cursor to the end of the insertion point. 81 */ 82 public void write(final CharSequence str) { 83 checkNotNull(str); 84 85 if (buffer.length() == 0) { 86 buffer.append(str); 87 } 88 else { 89 buffer.insert(cursor, str); 90 } 91 92 cursor += str.length(); 93 94 if (isOverTyping() && cursor < buffer.length()) { 95 buffer.delete(cursor, (cursor + str.length())); 96 } 97 } 98 99 public boolean clear() { 100 if (buffer.length() == 0) { 101 return false; 102 } 103 104 buffer.delete(0, buffer.length()); 105 cursor = 0; 106 return true; 107 } 108 109 public String upToCursor() { 110 if (cursor <= 0) { 111 return ""; 112 } 113 114 return buffer.substring(0, cursor); 115 } 116 117 @Override 118 public String toString() { 119 return buffer.toString(); 120 } 121 }