APIdia Launch Partner
Top Description Fields Constructors Methods
javax.swing

public Class SizeSequence

extends Object
Class Inheritance

A SizeSequence object efficiently maintains an ordered list of sizes and corresponding positions. One situation for which SizeSequence might be appropriate is in a component that displays multiple rows of unequal size. In this case, a single SizeSequence object could be used to track the heights and Y positions of all rows.

Another example would be a multi-column component, such as a JTable, in which the column sizes are not all equal. The JTable might use a single SizeSequence object to store the widths and X positions of all the columns. The JTable could then use the SizeSequence object to find the column corresponding to a certain position. The JTable could update the SizeSequence object whenever one or more column sizes changed.

The following figure shows the relationship between size and position data for a multi-column component.

The first item begins at position 0, the second at the position equal
to the size of the previous item, and so on.

In the figure, the first index (0) corresponds to the first column, the second index (1) to the second column, and so on. The first column's position starts at 0, and the column occupies size0 pixels, where size0 is the value returned by getSize(0). Thus, the first column ends at size0 - 1. The second column then begins at the position size0 and occupies size1 (getSize(1)) pixels.

Note that a SizeSequence object simply represents intervals along an axis. In our examples, the intervals represent height or width in pixels. However, any other unit of measure (for example, time in days) could be just as valid.

Implementation Notes

Normally when storing the size and position of entries, one would choose between storing the sizes or storing their positions instead. The two common operations that are needed during rendering are: getIndex(position) and setSize(index, size). Whichever choice of internal format is made one of these operations is costly when the number of entries becomes large. If sizes are stored, finding the index of the entry that encloses a particular position is linear in the number of entries. If positions are stored instead, setting the size of an entry at a particular index requires updating the positions of the affected entries, which is also a linear calculation.

Like the above techniques this class holds an array of N integers internally but uses a hybrid encoding, which is halfway between the size-based and positional-based approaches. The result is a data structure that takes the same space to store the information but can perform most operations in Log(N) time instead of O(N), where N is the number of entries in the list.

Two operations that remain O(N) in the number of entries are the insertEntries and removeEntries methods, both of which are implemented by converting the internal array to a set of integer sizes, copying it into the new array, and then reforming the hybrid representation in place.

Author
Philip Milne
Since
1.3

Field Summary

Modifier and TypeField and Description
private int[]
a

private static int[]

Constructor Summary

AccessConstructor and Description
public
SizeSequence()

Creates a new SizeSequence object that contains no entries.

public
SizeSequence(int
the number of sizes to track
numEntries
)

Creates a new SizeSequence object that contains the specified number of entries, all initialized to have size 0.

public
SizeSequence(int
the number of sizes to track
numEntries
,
int
the initial value of each size
value
)

Creates a new SizeSequence object that contains the specified number of entries, all initialized to have size value.

public
SizeSequence(int[]
the array of sizes to be contained in the SizeSequence
sizes
)

Creates a new SizeSequence object that contains the specified sizes.

Method Summary

Modifier and TypeMethod and Description
private void
changeSize(int from, int to, int index, int delta)

public int

Returns:

the index of the entry that occupies the specified position
getIndex
(int
the position of the entry
position
)

Returns the index of the entry that corresponds to the specified position.

private int
getIndex(int from, int to, int position)

public int

Returns:

the starting position of the specified entry
getPosition
(int
the index of the entry whose position is desired
index
)

Returns the start position for the specified entry.

private int
getPosition(int from, int to, int index)

public int

Returns:

the size of the entry
getSize
(int
the index corresponding to the entry
index
)

Returns the size of the specified entry.

public int[]

Returns:

a new array containing the sizes in this object
getSizes
()

Returns the size of all entries.

private int
getSizes(int from, int to, int[] sizes)

public void
insertEntries(int
the index to be assigned to the first entry in the group
start
,
int
the number of entries in the group
length
,
int
the size to be assigned to each new entry
value
)

Adds a contiguous group of entries to this SizeSequence.

public void
removeEntries(int
the index of the first entry to be removed
start
,
int
the number of entries to be removed
length
)

Removes a contiguous group of entries from this SizeSequence.

public void
setSize(int
the index corresponding to the entry
index
,
int
the size of the entry
size
)

Sets the size of the specified entry.

pack-priv void
setSizes(int length, int size)

Resets the size sequence to contain length items all with a size of size.

private int
setSizes(int from, int to, int size)

public void
setSizes(int[]
the array of sizes to be contained in this SizeSequence
sizes
)

Resets this SizeSequence object, using the data in the sizes argument.

private int
setSizes(int from, int to, int[] sizes)

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

aback to summary
private int[] a
emptyArrayback to summary
private static int[] emptyArray

Constructor Detail

SizeSequenceback to summary
public SizeSequence()

Creates a new SizeSequence object that contains no entries. To add entries, you can use insertEntries or setSizes.

See Also
insertEntries, setSizes(int[])
SizeSequenceback to summary
public SizeSequence(int numEntries)

Creates a new SizeSequence object that contains the specified number of entries, all initialized to have size 0.

Parameters
numEntries:int

the number of sizes to track

Exceptions
NegativeArraySizeException:
if numEntries < 0
SizeSequenceback to summary
public SizeSequence(int numEntries, int value)

Creates a new SizeSequence object that contains the specified number of entries, all initialized to have size value.

Parameters
numEntries:int

the number of sizes to track

value:int

the initial value of each size

SizeSequenceback to summary
public SizeSequence(int[] sizes)

Creates a new SizeSequence object that contains the specified sizes.

Parameters
sizes:int[]

the array of sizes to be contained in the SizeSequence

Method Detail

changeSizeback to summary
private void changeSize(int from, int to, int index, int delta)
getIndexback to summary
public int getIndex(int position)

Returns the index of the entry that corresponds to the specified position. For example, getIndex(0) is 0, since the first entry always starts at position 0.

Parameters
position:int

the position of the entry

Returns:int

the index of the entry that occupies the specified position

getIndexback to summary
private int getIndex(int from, int to, int position)
getPositionback to summary
public int getPosition(int index)

Returns the start position for the specified entry. For example, getPosition(0) returns 0, getPosition(1) is equal to getSize(0), getPosition(2) is equal to getSize(0) + getSize(1), and so on.

Note that if index is greater than length the value returned may be meaningless.

Parameters
index:int

the index of the entry whose position is desired

Returns:int

the starting position of the specified entry

getPositionback to summary
private int getPosition(int from, int to, int index)
getSizeback to summary
public int getSize(int index)

Returns the size of the specified entry. If index is out of the range (0 <= index < getSizes().length) the behavior is unspecified.

Parameters
index:int

the index corresponding to the entry

Returns:int

the size of the entry

getSizesback to summary
public int[] getSizes()

Returns the size of all entries.

Returns:int[]

a new array containing the sizes in this object

getSizesback to summary
private int getSizes(int from, int to, int[] sizes)
insertEntriesback to summary
public void insertEntries(int start, int length, int value)

Adds a contiguous group of entries to this SizeSequence. Note that the values of start and length must satisfy the following conditions: (0 <= start < getSizes().length) AND (length >= 0). If these conditions are not met, the behavior is unspecified and an exception may be thrown.

Parameters
start:int

the index to be assigned to the first entry in the group

length:int

the number of entries in the group

value:int

the size to be assigned to each new entry

Exceptions
ArrayIndexOutOfBoundsException:
if the parameters are outside of the range: (0 <= start < (getSizes().length)) AND (length >= 0)
removeEntriesback to summary
public void removeEntries(int start, int length)

Removes a contiguous group of entries from this SizeSequence. Note that the values of start and length must satisfy the following conditions: (0 <= start < getSizes().length) AND (length >= 0). If these conditions are not met, the behavior is unspecified and an exception may be thrown.

Parameters
start:int

the index of the first entry to be removed

length:int

the number of entries to be removed

setSizeback to summary
public void setSize(int index, int size)

Sets the size of the specified entry. Note that if the value of index does not fall in the range: (0 <= index < getSizes().length) the behavior is unspecified.

Parameters
index:int

the index corresponding to the entry

size:int

the size of the entry

setSizesback to summary
pack-priv void setSizes(int length, int size)

Resets the size sequence to contain length items all with a size of size.

setSizesback to summary
private int setSizes(int from, int to, int size)
setSizesback to summary
public void setSizes(int[] sizes)

Resets this SizeSequence object, using the data in the sizes argument. This method reinitializes this object so that it contains as many entries as the sizes array. Each entry's size is initialized to the value of the corresponding item in sizes.

Parameters
sizes:int[]

the array of sizes to be contained in this SizeSequence

setSizesback to summary
private int setSizes(int from, int to, int[] sizes)