javax.swing.text

Class GapContent

Implemented Interfaces:
AbstractDocument.Content, Serializable

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<T>
getPositionsInRange(Vector<T> 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<T> 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, extends Object> getClass, finalize, hashCode, notify, notifyAll, toString, wait, wait, wait

Constructor Details

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 Details

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)
            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

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)
            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

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<T> getPositionsInRange(Vector<T> 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)
            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
Throws:
BadLocationException - if where or where + len are no valid locations in the buffer

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

length

public int length()
Returns the length of the content.
Specified by:
length in interface AbstractDocument.Content
Returns:
the length of the content

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

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<T> 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 -

GapContent.java -- Copyright (C) 2002, 2004, 2005, 2006 Free Software Foundation, Inc. This file is part of GNU Classpath. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version.