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 */
007package 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 */
015public 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}