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 }