javax.swing.text
Class GapContent

java.lang.Object
  extended by javax.swing.text.GapContent
All Implemented Interfaces:
Serializable, AbstractDocument.Content

public class GapContent
extends Object
implements AbstractDocument.Content, Serializable

This implementation of AbstractDocument.Content uses a gapped buffer. This takes advantage of the fact that text area content is mostly inserted sequentially. The buffer is a char array that maintains a gap at the current insertion point. If characters a inserted at gap boundaries, the cost is minimal (simple array access). The array only has to be shifted around when the insertion point moves (then the gap also moves and one array copy is necessary) or when the gap is filled up and the buffer has to be enlarged.

See Also:
Serialized Form

Constructor Summary
GapContent()
          Creates a new GapContent object.
GapContent(int size)
          Creates a new GapContent object with a specified initial size.
 
Method Summary
protected  Object allocateArray(int size)
          Allocates an array of the specified length that can then be used as buffer.
 Position createPosition(int offset)
          Creates and returns a mark at the specified position.
protected  Object getArray()
          Returns the allocated buffer array.
protected  int getArrayLength()
          Returns the length of the allocated buffer array.
 void getChars(int where, int len, Segment txt)
          Fetches a piece of content and stores it in a Segment object.
protected  int getGapEnd()
          Returns the end index of the gap within the buffer array.
protected  int getGapStart()
          Returns the start index of the gap within the buffer array.
protected  Vector getPositionsInRange(Vector v, int offset, int length)
          Returns all Positions that are in the range specified by offset and length within the buffer array.
 String getString(int where, int len)
          Returns a piece of content as String.
 UndoableEdit insertString(int where, String str)
          Inserts a string at the specified position.
 int length()
          Returns the length of the content.
 UndoableEdit remove(int where, int nitems)
          Removes a piece of content at th specified position.
protected  void replace(int position, int rmSize, Object addItems, int addSize)
          Replaces a portion of the storage with the specified items.
protected  void resetMarksAtZero()
          Resets all Position that have an offset of 0, to also have an array index of 0.
protected  void shiftEnd(int newSize)
          Enlarges the gap.
protected  void shiftGap(int newGapStart)
          Shifts the gap to the specified position.
protected  void shiftGapEndUp(int newGapEnd)
          Shifts the gap end upwards.
protected  void shiftGapStartDown(int newGapStart)
          Shifts the gap start downwards.
protected  void updateUndoPositions(Vector positions, int offset, int length)
          Resets the positions in the specified range to their original offset after a undo operation is performed.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

GapContent

public GapContent()
Creates a new GapContent object.


GapContent

public GapContent(int size)
Creates a new GapContent object with a specified initial size.

Parameters:
size - the initial size of the buffer
Method Detail

allocateArray

protected Object allocateArray(int size)
Allocates an array of the specified length that can then be used as buffer.

Parameters:
size - the size of the array to be allocated
Returns:
the allocated array

getArrayLength

protected int getArrayLength()
Returns the length of the allocated buffer array.

Returns:
the length of the allocated buffer array

length

public int length()
Returns the length of the content.

Specified by:
length in interface AbstractDocument.Content
Returns:
the length of the content

insertString

public UndoableEdit insertString(int where,
                                 String str)
                          throws BadLocationException
Inserts a string at the specified position.

Specified by:
insertString in interface AbstractDocument.Content
Parameters:
where - the position where the string is inserted
str - the string that is to be inserted
Returns:
an UndoableEdit object
Throws:
BadLocationException - if where is not a valid location in the buffer

remove

public UndoableEdit remove(int where,
                           int nitems)
                    throws BadLocationException
Removes a piece of content at th specified position.

Specified by:
remove in interface AbstractDocument.Content
Parameters:
where - the position where the content is to be removed
nitems - number of characters to be removed
Returns:
an UndoableEdit object
Throws:
BadLocationException - if where is not a valid location in the buffer

getString

public String getString(int where,
                        int len)
                 throws BadLocationException
Returns a piece of content as String.

Specified by:
getString in interface AbstractDocument.Content
Parameters:
where - the start location of the fragment
len - the length of the fragment
Returns:
the requested fragment
Throws:
BadLocationException - if where or where + len are no valid locations in the buffer

getChars

public void getChars(int where,
                     int len,
                     Segment txt)
              throws BadLocationException
Fetches a piece of content and stores it in a Segment object. If the requested piece of text spans the gap, the content is copied into a new array. If it doesn't then it is contiguous and the actual content store is returned.

Specified by:
getChars in interface AbstractDocument.Content
Parameters:
where - the start location of the fragment
len - the length of the fragment
txt - the Segment object to store the fragment in
Throws:
BadLocationException - if where or where + len are no valid locations in the buffer

createPosition

public Position createPosition(int offset)
                        throws BadLocationException
Creates and returns a mark at the specified position.

Specified by:
createPosition in interface AbstractDocument.Content
Parameters:
offset - the position at which to create the mark
Returns:
the create Position object for the mark
Throws:
BadLocationException - if the offset is not a valid position in the buffer

shiftEnd

protected void shiftEnd(int newSize)
Enlarges the gap. This allocates a new bigger buffer array, copy the segment before the gap as it is and the segment after the gap at the end of the new buffer array. This does change the gapEnd mark but not the gapStart mark.

Parameters:
newSize - the new size of the gap

shiftGap

protected void shiftGap(int newGapStart)
Shifts the gap to the specified position.

Parameters:
newGapStart - the new start position of the gap

shiftGapStartDown

protected void shiftGapStartDown(int newGapStart)
Shifts the gap start downwards. This does not affect the content of the buffer. This only updates the gap start and all the marks that are between the old gap start and the new gap start. They all are squeezed to the start of the gap, because their location has been removed.

Parameters:
newGapStart - the new gap start

shiftGapEndUp

protected void shiftGapEndUp(int newGapEnd)
Shifts the gap end upwards. This does not affect the content of the buffer. This only updates the gap end and all the marks that are between the old gap end and the new end start. They all are squeezed to the end of the gap, because their location has been removed.

Parameters:
newGapEnd - the new gap start

getArray

protected final Object getArray()
Returns the allocated buffer array.

Returns:
the allocated buffer array

replace

protected void replace(int position,
                       int rmSize,
                       Object addItems,
                       int addSize)
Replaces a portion of the storage with the specified items.

Parameters:
position - the position at which to remove items
rmSize - the number of items to remove
addItems - the items to add at location
addSize - the number of items to add

getGapStart

protected final int getGapStart()
Returns the start index of the gap within the buffer array.

Returns:
the start index of the gap within the buffer array

getGapEnd

protected final int getGapEnd()
Returns the end index of the gap within the buffer array.

Returns:
the end index of the gap within the buffer array

getPositionsInRange

protected Vector getPositionsInRange(Vector v,
                                     int offset,
                                     int length)
Returns all Positions that are in the range specified by offset and length within the buffer array.

Parameters:
v - the vector to use; if null, a new Vector is allocated
offset - the start offset of the range to search
length - the length of the range to search
Returns:
the positions within the specified range

resetMarksAtZero

protected void resetMarksAtZero()
Resets all Position that have an offset of 0, to also have an array index of 0. This might be necessary after a call to shiftGap(0), since then the marks at offset 0 get shifted to gapEnd.


updateUndoPositions

protected void updateUndoPositions(Vector positions,
                                   int offset,
                                   int length)
Resets the positions in the specified range to their original offset after a undo operation is performed. For example, after removing some content, the positions in the removed range will all be set to one offset. This method restores the positions to their original offsets after an undo.

Parameters:
positions - the positions to update
offset -
length -