001    /**
002     *      jline - Java console input library
003     *      Copyright (c) 2002-2006, Marc Prud'hommeaux <mwp1@cornell.edu>
004     *      All rights reserved.
005     *
006     *      Redistribution and use in source and binary forms, with or
007     *      without modification, are permitted provided that the following
008     *      conditions are met:
009     *
010     *      Redistributions of source code must retain the above copyright
011     *      notice, this list of conditions and the following disclaimer.
012     *
013     *      Redistributions in binary form must reproduce the above copyright
014     *      notice, this list of conditions and the following disclaimer
015     *      in the documentation and/or other materials provided with
016     *      the distribution.
017     *
018     *      Neither the name of JLine nor the names of its contributors
019     *      may be used to endorse or promote products derived from this
020     *      software without specific prior written permission.
021     *
022     *      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
023     *      "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
024     *      BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
025     *      AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
026     *      EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
027     *      FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
028     *      OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
029     *      PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
030     *      DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
031     *      AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
032     *      LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
033     *      IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
034     *      OF THE POSSIBILITY OF SUCH DAMAGE.
035     */
036    package jline;
037    
038    /**
039     *  A CursorBuffer is a holder for a {@link StringBuffer} that
040     *  also contains the current cursor position.
041     *
042     *  @author  <a href="mailto:mwp1@cornell.edu">Marc Prud'hommeaux</a>
043     */
044    public class CursorBuffer
045    {
046            public int cursor = 0;
047            public final StringBuffer buffer = new StringBuffer ();
048    
049    
050            public int length ()
051            {
052                    return buffer.length ();
053            }
054    
055    
056            public char current ()
057            {
058                    if (cursor <= 0)
059                            return 0;
060    
061                    return buffer.charAt (cursor - 1);
062            }
063    
064    
065            /**
066             *  Insert the specific character into the buffer, setting the
067             *  cursor position ahead one.
068             *
069             *  @param  c  the character to insert
070             */
071            public void insert (final char c)
072            {
073                    buffer.insert (cursor++, c);
074            }
075    
076    
077            /**
078             *  Insert the specified {@link String} into the buffer, setting
079             *  the cursor to the end of the insertion point.
080             *
081             *  @param  str  the String to insert. Must not be null.
082             */
083            public void insert (final String str)
084            {
085                    if (buffer.length () == 0)
086                            buffer.append (str);
087                    else
088                            buffer.insert (cursor, str);
089    
090                    cursor += str.length ();
091            }
092    
093    
094            public String toString ()
095            {
096                    return buffer.toString ();
097            }
098    }