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 }