javax.swing.text

Class GapContent

public class GapContent extends Object implements AbstractDocument.Content, Serializable

This implementation of {@link 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.
Constructor Summary
GapContent()
Creates a new GapContent object.
GapContent(int size)
Creates a new GapContent object with a specified initial size.
Method Summary
protected ObjectallocateArray(int size)
Allocates an array of the specified length that can then be used as buffer.
PositioncreatePosition(int offset)
Creates and returns a mark at the specified position.
protected ObjectgetArray()
Returns the allocated buffer array.
protected intgetArrayLength()
Returns the length of the allocated buffer array.
voidgetChars(int where, int len, Segment txt)
Fetches a piece of content and stores it in a {@link Segment} object.
protected intgetGapEnd()
Returns the end index of the gap within the buffer array.
protected intgetGapStart()
Returns the start index of the gap within the buffer array.
protected VectorgetPositionsInRange(Vector v, int offset, int length)
Returns all Positions that are in the range specified by offset and length within the buffer array.
StringgetString(int where, int len)
Returns a piece of content as String.
UndoableEditinsertString(int where, String str)
Inserts a string at the specified position.
intlength()
Returns the length of the content.
UndoableEditremove(int where, int nitems)
Removes a piece of content at th specified position.
protected voidreplace(int position, int rmSize, Object addItems, int addSize)
Replaces a portion of the storage with the specified items.
protected voidresetMarksAtZero()
Resets all Position that have an offset of 0, to also have an array index of 0.
protected voidshiftEnd(int newSize)
Enlarges the gap.
protected voidshiftGap(int newGapStart)
Shifts the gap to the specified position.
protected voidshiftGapEndUp(int newGapEnd)
Shifts the gap end upwards.
protected voidshiftGapStartDown(int newGapStart)
Shifts the gap start downwards.
protected voidupdateUndoPositions(Vector positions, int offset, int length)
Resets the positions in the specified range to their original offset after a undo operation is performed.

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

createPosition

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

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

getArray

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

Returns: the allocated buffer array

getArrayLength

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

Returns: the length of the allocated buffer array

getChars

public void getChars(int where, int len, Segment txt)
Fetches a piece of content and stores it in a {@link 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.

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

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

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

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

getString

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

Parameters: where the start location of the fragment len the length of the fragment

Throws: BadLocationException if where or where + len are no valid locations in the buffer

insertString

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

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

length

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

Returns: the length of the content

remove

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

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

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

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.

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

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

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

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