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    }