Method from javax.swing.tree.DefaultTreeSelectionModel Detail: |
public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
if (changeSupport == null) {
changeSupport = new SwingPropertyChangeSupport(this);
}
changeSupport.addPropertyChangeListener(listener);
}
|
public void addSelectionPath(TreePath path) {
if(path != null) {
TreePath[] toAdd = new TreePath[1];
toAdd[0] = path;
addSelectionPaths(toAdd);
}
}
Adds path to the current selection. If path is not currently
in the selection the TreeSelectionListeners are notified. This has
no effect if path is null. |
public void addSelectionPaths(TreePath[] paths) {
int newPathLength = ((paths == null) ? 0 : paths.length);
if(newPathLength > 0) {
if(selectionMode == TreeSelectionModel.SINGLE_TREE_SELECTION) {
setSelectionPaths(paths);
}
else if(selectionMode == TreeSelectionModel.
CONTIGUOUS_TREE_SELECTION && !canPathsBeAdded(paths)) {
if(arePathsContiguous(paths)) {
setSelectionPaths(paths);
}
else {
TreePath[] newPaths = new TreePath[1];
newPaths[0] = paths[0];
setSelectionPaths(newPaths);
}
}
else {
int counter, validCount;
int oldCount;
TreePath beginLeadPath = leadPath;
Vector< PathPlaceHolder > cPaths = null;
if(selection == null)
oldCount = 0;
else
oldCount = selection.length;
/* Determine the paths that aren't currently in the
selection. */
lastPaths.clear();
for(counter = 0, validCount = 0; counter < newPathLength;
counter++) {
if(paths[counter] != null) {
if (uniquePaths.get(paths[counter]) == null) {
validCount++;
if(cPaths == null)
cPaths = new Vector< PathPlaceHolder >();
cPaths.addElement(new PathPlaceHolder
(paths[counter], true));
uniquePaths.put(paths[counter], Boolean.TRUE);
lastPaths.put(paths[counter], Boolean.TRUE);
}
leadPath = paths[counter];
}
}
if(leadPath == null) {
leadPath = beginLeadPath;
}
if(validCount > 0) {
TreePath newSelection[] = new TreePath[oldCount +
validCount];
/* And build the new selection. */
if(oldCount > 0)
System.arraycopy(selection, 0, newSelection, 0,
oldCount);
if(validCount != paths.length) {
/* Some of the paths in paths are already in
the selection. */
Enumeration< TreePath > newPaths = lastPaths.keys();
counter = oldCount;
while (newPaths.hasMoreElements()) {
newSelection[counter++] = newPaths.nextElement();
}
}
else {
System.arraycopy(paths, 0, newSelection, oldCount,
validCount);
}
selection = newSelection;
insureUniqueness();
updateLeadIndex();
resetRowSelection();
notifyPathChange(cPaths, beginLeadPath);
}
else
leadPath = beginLeadPath;
lastPaths.clear();
}
}
}
Adds paths to the current selection. If any of the paths in
paths are not currently in the selection the TreeSelectionListeners
are notified. This has
no effect if paths is null.
The lead path is set to the last element in paths .
If the selection mode is CONTIGUOUS_TREE_SELECTION ,
and adding the new paths would make the selection discontiguous.
Then two things can result: if the TreePaths in paths
are contiguous, then the selection becomes these TreePaths,
otherwise the TreePaths aren't contiguous and the selection becomes
the first TreePath in paths . |
public void addTreeSelectionListener(TreeSelectionListener x) {
listenerList.add(TreeSelectionListener.class, x);
}
Adds x to the list of listeners that are notified each time the
set of selected TreePaths changes. |
protected boolean arePathsContiguous(TreePath[] paths) {
if(rowMapper == null || paths.length < 2)
return true;
else {
BitSet bitSet = new BitSet(32);
int anIndex, counter, min;
int pathCount = paths.length;
int validCount = 0;
TreePath[] tempPath = new TreePath[1];
tempPath[0] = paths[0];
min = rowMapper.getRowsForPaths(tempPath)[0];
for(counter = 0; counter < pathCount; counter++) {
if(paths[counter] != null) {
tempPath[0] = paths[counter];
int[] rows = rowMapper.getRowsForPaths(tempPath);
if (rows == null) {
return false;
}
anIndex = rows[0];
if(anIndex == -1 || anIndex < (min - pathCount) ||
anIndex > (min + pathCount))
return false;
if(anIndex < min)
min = anIndex;
if(!bitSet.get(anIndex)) {
bitSet.set(anIndex);
validCount++;
}
}
}
int maxCounter = validCount + min;
for(counter = min; counter < maxCounter; counter++)
if(!bitSet.get(counter))
return false;
}
return true;
}
Returns true if the paths are contiguous,
or this object has no RowMapper. |
protected boolean canPathsBeAdded(TreePath[] paths) {
if(paths == null || paths.length == 0 || rowMapper == null ||
selection == null || selectionMode ==
TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION)
return true;
else {
BitSet bitSet = new BitSet();
DefaultListSelectionModel lModel = listSelectionModel;
int anIndex;
int counter;
int min = lModel.getMinSelectionIndex();
int max = lModel.getMaxSelectionIndex();
TreePath[] tempPath = new TreePath[1];
if(min != -1) {
for(counter = min; counter < = max; counter++) {
if(lModel.isSelectedIndex(counter))
bitSet.set(counter);
}
}
else {
tempPath[0] = paths[0];
min = max = rowMapper.getRowsForPaths(tempPath)[0];
}
for(counter = paths.length - 1; counter >= 0; counter--) {
if(paths[counter] != null) {
tempPath[0] = paths[counter];
int[] rows = rowMapper.getRowsForPaths(tempPath);
if (rows == null) {
return false;
}
anIndex = rows[0];
min = Math.min(anIndex, min);
max = Math.max(anIndex, max);
if(anIndex == -1)
return false;
bitSet.set(anIndex);
}
}
for(counter = min; counter < = max; counter++)
if(!bitSet.get(counter))
return false;
}
return true;
}
Used to test if a particular set of TreePath s can
be added. This will return true if paths is null (or
empty), or this object has no RowMapper, or nothing is currently selected,
or the selection mode is DISCONTIGUOUS_TREE_SELECTION , or
adding the paths to the current selection still results in a
contiguous set of TreePath s. |
protected boolean canPathsBeRemoved(TreePath[] paths) {
if(rowMapper == null || selection == null ||
selectionMode == TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION)
return true;
else {
BitSet bitSet = new BitSet();
int counter;
int pathCount = paths.length;
int anIndex;
int min = -1;
int validCount = 0;
TreePath[] tempPath = new TreePath[1];
int[] rows;
/* Determine the rows for the removed entries. */
lastPaths.clear();
for (counter = 0; counter < pathCount; counter++) {
if (paths[counter] != null) {
lastPaths.put(paths[counter], Boolean.TRUE);
}
}
for(counter = selection.length - 1; counter >= 0; counter--) {
if(lastPaths.get(selection[counter]) == null) {
tempPath[0] = selection[counter];
rows = rowMapper.getRowsForPaths(tempPath);
if(rows != null && rows[0] != -1 && !bitSet.get(rows[0])) {
validCount++;
if(min == -1)
min = rows[0];
else
min = Math.min(min, rows[0]);
bitSet.set(rows[0]);
}
}
}
lastPaths.clear();
/* Make sure they are contiguous. */
if(validCount > 1) {
for(counter = min + validCount - 1; counter >= min;
counter--)
if(!bitSet.get(counter))
return false;
}
}
return true;
}
Returns true if the paths can be removed without breaking the
continuity of the model.
This is rather expensive. |
public void clearSelection() {
if (selection != null && selection.length > 0) {
int selSize = selection.length;
boolean[] newness = new boolean[selSize];
for(int counter = 0; counter < selSize; counter++)
newness[counter] = false;
TreeSelectionEvent event = new TreeSelectionEvent
(this, selection, newness, leadPath, null);
leadPath = null;
leadIndex = leadRow = -1;
uniquePaths.clear();
selection = null;
resetRowSelection();
fireValueChanged(event);
}
}
Empties the current selection. If this represents a change in the
current selection, the selection listeners are notified. |
public Object clone() throws CloneNotSupportedException {
DefaultTreeSelectionModel clone = (DefaultTreeSelectionModel)
super.clone();
clone.changeSupport = null;
if(selection != null) {
int selLength = selection.length;
clone.selection = new TreePath[selLength];
System.arraycopy(selection, 0, clone.selection, 0, selLength);
}
clone.listenerList = new EventListenerList();
clone.listSelectionModel = (DefaultListSelectionModel)
listSelectionModel.clone();
clone.uniquePaths = new Hashtable< TreePath, Boolean >();
clone.lastPaths = new Hashtable< TreePath, Boolean >();
clone.tempPaths = new TreePath[1];
return clone;
}
Returns a clone of this object with the same selection.
This method does not duplicate
selection listeners and property listeners. |
protected void fireValueChanged(TreeSelectionEvent e) {
// Guaranteed to return a non-null array
Object[] listeners = listenerList.getListenerList();
// TreeSelectionEvent e = null;
// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i >=0; i-=2) {
if (listeners[i]==TreeSelectionListener.class) {
// Lazily create the event:
// if (e == null)
// e = new ListSelectionEvent(this, firstIndex, lastIndex);
((TreeSelectionListener)listeners[i+1]).valueChanged(e);
}
}
}
Notifies all listeners that are registered for
tree selection events on this object. |
public TreePath getLeadSelectionPath() {
return leadPath;
}
Returns the last path that was added. This may differ from the
leadSelectionPath property maintained by the JTree. |
public int getLeadSelectionRow() {
return leadRow;
}
Returns the lead selection index. That is the last index that was
added. |
public T[] getListeners(Class<T> listenerType) {
return listenerList.getListeners(listenerType);
}
Returns an array of all the objects currently registered
as FooListener s
upon this model.
FooListener s are registered using the
addFooListener method.
You can specify the listenerType argument
with a class literal,
such as
FooListener.class .
For example, you can query a
DefaultTreeSelectionModel m
for its tree selection listeners with the following code:
TreeSelectionListener[] tsls = (TreeSelectionListener[])(m.getListeners(TreeSelectionListener.class));
If no such listeners exist, this method returns an empty array. |
public int getMaxSelectionRow() {
return listSelectionModel.getMaxSelectionIndex();
}
Returns the largest value obtained from the RowMapper for the
current set of selected TreePaths. If nothing is selected,
or there is no RowMapper, this will return -1. |
public int getMinSelectionRow() {
return listSelectionModel.getMinSelectionIndex();
}
Returns the smallest value obtained from the RowMapper for the
current set of selected TreePaths. If nothing is selected,
or there is no RowMapper, this will return -1. |
public PropertyChangeListener[] getPropertyChangeListeners() {
if (changeSupport == null) {
return new PropertyChangeListener[0];
}
return changeSupport.getPropertyChangeListeners();
}
Returns an array of all the property change listeners
registered on this DefaultTreeSelectionModel . |
public RowMapper getRowMapper() {
return rowMapper;
}
Returns the RowMapper instance that is able to map a TreePath to a
row. |
public int getSelectionCount() {
return (selection == null) ? 0 : selection.length;
}
Returns the number of paths that are selected. |
public int getSelectionMode() {
return selectionMode;
}
Returns the selection mode, one of SINGLE_TREE_SELECTION ,
DISCONTIGUOUS_TREE_SELECTION or
CONTIGUOUS_TREE_SELECTION . |
public TreePath getSelectionPath() {
if (selection != null && selection.length > 0) {
return selection[0];
}
return null;
}
Returns the first path in the selection. This is useful if there
if only one item currently selected. |
public TreePath[] getSelectionPaths() {
if(selection != null) {
int pathSize = selection.length;
TreePath[] result = new TreePath[pathSize];
System.arraycopy(selection, 0, result, 0, pathSize);
return result;
}
return new TreePath[0];
}
|
public int[] getSelectionRows() {
// This is currently rather expensive. Needs
// to be better support from ListSelectionModel to speed this up.
if (rowMapper != null && selection != null && selection.length > 0) {
int[] rows = rowMapper.getRowsForPaths(selection);
if (rows != null) {
int invisCount = 0;
for (int counter = rows.length - 1; counter >= 0; counter--) {
if (rows[counter] == -1) {
invisCount++;
}
}
if (invisCount > 0) {
if (invisCount == rows.length) {
rows = null;
}
else {
int[] tempRows = new int[rows.length - invisCount];
for (int counter = rows.length - 1, visCounter = 0;
counter >= 0; counter--) {
if (rows[counter] != -1) {
tempRows[visCounter++] = rows[counter];
}
}
rows = tempRows;
}
}
}
return rows;
}
return new int[0];
}
Returns the selection in terms of rows. There is not
necessarily a one-to-one mapping between the {@code TreePath}s
returned from {@code getSelectionPaths} and this method. In
particular, if a {@code TreePath} is not viewable (the {@code
RowMapper} returns {@code -1} for the row corresponding to the
{@code TreePath}), then the corresponding row is not included
in the returned array. For example, if the selection consists
of two paths, {@code A} and {@code B}, with {@code A} at row
{@code 10}, and {@code B} not currently viewable, then this method
returns an array with the single entry {@code 10}. |
public TreeSelectionListener[] getTreeSelectionListeners() {
return listenerList.getListeners(TreeSelectionListener.class);
}
Returns an array of all the tree selection listeners
registered on this model. |
protected void insureRowContinuity() {
if(selectionMode == TreeSelectionModel.CONTIGUOUS_TREE_SELECTION &&
selection != null && rowMapper != null) {
DefaultListSelectionModel lModel = listSelectionModel;
int min = lModel.getMinSelectionIndex();
if(min != -1) {
for(int counter = min,
maxCounter = lModel.getMaxSelectionIndex();
counter < = maxCounter; counter++) {
if(!lModel.isSelectedIndex(counter)) {
if(counter == min) {
clearSelection();
}
else {
TreePath[] newSel = new TreePath[counter - min];
int selectionIndex[] = rowMapper.getRowsForPaths(selection);
// find the actual selection pathes corresponded to the
// rows of the new selection
for (int i = 0; i < selectionIndex.length; i++) {
if (selectionIndex[i]< counter) {
newSel[selectionIndex[i]-min] = selection[i];
}
}
setSelectionPaths(newSel);
break;
}
}
}
}
}
else if(selectionMode == TreeSelectionModel.SINGLE_TREE_SELECTION &&
selection != null && selection.length > 1) {
setSelectionPath(selection[0]);
}
}
Makes sure the currently selected TreePath s are valid
for the current selection mode.
If the selection mode is CONTIGUOUS_TREE_SELECTION
and a RowMapper exists, this will make sure all
the rows are contiguous, that is, when sorted all the rows are
in order with no gaps.
If the selection isn't contiguous, the selection is
reset to contain the first set, when sorted, of contiguous rows.
If the selection mode is SINGLE_TREE_SELECTION and
more than one TreePath is selected, the selection is reset to
contain the first path currently selected. |
protected void insureUniqueness() {
}
This method is obsolete and its implementation is now a noop. It's
still called by setSelectionPaths and addSelectionPaths, but only
for backwards compatability. |
public boolean isPathSelected(TreePath path) {
return (path != null) ? (uniquePaths.get(path) != null) : false;
}
Returns true if the path, path ,
is in the current selection. |
public boolean isRowSelected(int row) {
return listSelectionModel.isSelectedIndex(row);
}
Returns true if the row identified by row is selected. |
public boolean isSelectionEmpty() {
return (selection == null || selection.length == 0);
}
Returns true if the selection is currently empty. |
protected void notifyPathChange(Vector changedPaths,
TreePath oldLeadSelection) {
int cPathCount = changedPaths.size();
boolean[] newness = new boolean[cPathCount];
TreePath[] paths = new TreePath[cPathCount];
PathPlaceHolder placeholder;
for(int counter = 0; counter < cPathCount; counter++) {
placeholder = (PathPlaceHolder) changedPaths.elementAt(counter);
newness[counter] = placeholder.isNew;
paths[counter] = placeholder.path;
}
TreeSelectionEvent event = new TreeSelectionEvent
(this, paths, newness, oldLeadSelection, leadPath);
fireValueChanged(event);
} Deprecated! As - of JDK version 1.7
Notifies listeners of a change in path. changePaths should contain
instances of PathPlaceHolder. |
public synchronized void removePropertyChangeListener(PropertyChangeListener listener) {
if (changeSupport == null) {
return;
}
changeSupport.removePropertyChangeListener(listener);
}
Removes a PropertyChangeListener from the listener list.
This removes a PropertyChangeListener that was registered
for all properties. |
public void removeSelectionPath(TreePath path) {
if(path != null) {
TreePath[] rPath = new TreePath[1];
rPath[0] = path;
removeSelectionPaths(rPath);
}
}
Removes path from the selection. If path is in the selection
The TreeSelectionListeners are notified. This has no effect if
path is null. |
public void removeSelectionPaths(TreePath[] paths) {
if (paths != null && selection != null && paths.length > 0) {
if(!canPathsBeRemoved(paths)) {
/* Could probably do something more interesting here! */
clearSelection();
}
else {
Vector< PathPlaceHolder > pathsToRemove = null;
/* Find the paths that can be removed. */
for (int removeCounter = paths.length - 1; removeCounter >= 0;
removeCounter--) {
if(paths[removeCounter] != null) {
if (uniquePaths.get(paths[removeCounter]) != null) {
if(pathsToRemove == null)
pathsToRemove = new Vector< PathPlaceHolder >(paths.length);
uniquePaths.remove(paths[removeCounter]);
pathsToRemove.addElement(new PathPlaceHolder
(paths[removeCounter], false));
}
}
}
if(pathsToRemove != null) {
int removeCount = pathsToRemove.size();
TreePath beginLeadPath = leadPath;
if(removeCount == selection.length) {
selection = null;
}
else {
Enumeration< TreePath > pEnum = uniquePaths.keys();
int validCount = 0;
selection = new TreePath[selection.length -
removeCount];
while (pEnum.hasMoreElements()) {
selection[validCount++] = pEnum.nextElement();
}
}
if (leadPath != null &&
uniquePaths.get(leadPath) == null) {
if (selection != null) {
leadPath = selection[selection.length - 1];
}
else {
leadPath = null;
}
}
else if (selection != null) {
leadPath = selection[selection.length - 1];
}
else {
leadPath = null;
}
updateLeadIndex();
resetRowSelection();
notifyPathChange(pathsToRemove, beginLeadPath);
}
}
}
}
Removes paths from the selection. If any of the paths in paths
are in the selection the TreeSelectionListeners are notified.
This has no effect if paths is null. |
public void removeTreeSelectionListener(TreeSelectionListener x) {
listenerList.remove(TreeSelectionListener.class, x);
}
Removes x from the list of listeners that are notified each time
the set of selected TreePaths changes. |
public void resetRowSelection() {
listSelectionModel.clearSelection();
if(selection != null && rowMapper != null) {
int aRow;
int validCount = 0;
int[] rows = rowMapper.getRowsForPaths(selection);
for(int counter = 0, maxCounter = selection.length;
counter < maxCounter; counter++) {
aRow = rows[counter];
if(aRow != -1) {
listSelectionModel.addSelectionInterval(aRow, aRow);
}
}
if(leadIndex != -1 && rows != null) {
leadRow = rows[leadIndex];
}
else if (leadPath != null) {
// Lead selection path doesn't have to be in the selection.
tempPaths[0] = leadPath;
rows = rowMapper.getRowsForPaths(tempPaths);
leadRow = (rows != null) ? rows[0] : -1;
}
else {
leadRow = -1;
}
insureRowContinuity();
}
else
leadRow = -1;
}
Updates this object's mapping from TreePath to rows. This should
be invoked when the mapping from TreePaths to integers has changed
(for example, a node has been expanded).
You do not normally have to call this, JTree and its associated
Listeners will invoke this for you. If you are implementing your own
View class, then you will have to invoke this.
This will invoke insureRowContinuity to make sure
the currently selected TreePaths are still valid based on the
selection mode. |
public void setRowMapper(RowMapper newMapper) {
rowMapper = newMapper;
resetRowSelection();
}
Sets the RowMapper instance. This instance is used to determine
the row for a particular TreePath. |
public void setSelectionMode(int mode) {
int oldMode = selectionMode;
selectionMode = mode;
if(selectionMode != TreeSelectionModel.SINGLE_TREE_SELECTION &&
selectionMode != TreeSelectionModel.CONTIGUOUS_TREE_SELECTION &&
selectionMode != TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION)
selectionMode = TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION;
if(oldMode != selectionMode && changeSupport != null)
changeSupport.firePropertyChange(SELECTION_MODE_PROPERTY,
Integer.valueOf(oldMode),
Integer.valueOf(selectionMode));
}
Sets the selection model, which must be one of SINGLE_TREE_SELECTION,
CONTIGUOUS_TREE_SELECTION or DISCONTIGUOUS_TREE_SELECTION. If mode
is not one of the defined value,
DISCONTIGUOUS_TREE_SELECTION is assumed.
This may change the selection if the current selection is not valid
for the new mode. For example, if three TreePaths are
selected when the mode is changed to SINGLE_TREE_SELECTION ,
only one TreePath will remain selected. It is up to the particular
implementation to decide what TreePath remains selected.
Setting the mode to something other than the defined types will
result in the mode becoming DISCONTIGUOUS_TREE_SELECTION . |
public void setSelectionPath(TreePath path) {
if(path == null)
setSelectionPaths(null);
else {
TreePath[] newPaths = new TreePath[1];
newPaths[0] = path;
setSelectionPaths(newPaths);
}
}
Sets the selection to path. If this represents a change, then
the TreeSelectionListeners are notified. If path is
null, this has the same effect as invoking clearSelection . |
public void setSelectionPaths(TreePath[] pPaths) {
int newCount, newCounter, oldCount, oldCounter;
TreePath[] paths = pPaths;
if(paths == null)
newCount = 0;
else
newCount = paths.length;
if(selection == null)
oldCount = 0;
else
oldCount = selection.length;
if((newCount + oldCount) != 0) {
if(selectionMode == TreeSelectionModel.SINGLE_TREE_SELECTION) {
/* If single selection and more than one path, only allow
first. */
if(newCount > 1) {
paths = new TreePath[1];
paths[0] = pPaths[0];
newCount = 1;
}
}
else if(selectionMode ==
TreeSelectionModel.CONTIGUOUS_TREE_SELECTION) {
/* If contiguous selection and paths aren't contiguous,
only select the first path item. */
if(newCount > 0 && !arePathsContiguous(paths)) {
paths = new TreePath[1];
paths[0] = pPaths[0];
newCount = 1;
}
}
TreePath beginLeadPath = leadPath;
Vector< PathPlaceHolder > cPaths = new Vector< PathPlaceHolder >(newCount + oldCount);
List< TreePath > newSelectionAsList =
new ArrayList< TreePath >(newCount);
lastPaths.clear();
leadPath = null;
/* Find the paths that are new. */
for(newCounter = 0; newCounter < newCount; newCounter++) {
TreePath path = paths[newCounter];
if (path != null && lastPaths.get(path) == null) {
lastPaths.put(path, Boolean.TRUE);
if (uniquePaths.get(path) == null) {
cPaths.addElement(new PathPlaceHolder(path, true));
}
leadPath = path;
newSelectionAsList.add(path);
}
}
TreePath[] newSelection = newSelectionAsList.toArray(
new TreePath[newSelectionAsList.size()]);
/* Get the paths that were selected but no longer selected. */
for(oldCounter = 0; oldCounter < oldCount; oldCounter++)
if(selection[oldCounter] != null &&
lastPaths.get(selection[oldCounter]) == null)
cPaths.addElement(new PathPlaceHolder
(selection[oldCounter], false));
selection = newSelection;
Hashtable< TreePath, Boolean > tempHT = uniquePaths;
uniquePaths = lastPaths;
lastPaths = tempHT;
lastPaths.clear();
// No reason to do this now, but will still call it.
insureUniqueness();
updateLeadIndex();
resetRowSelection();
/* Notify of the change. */
if(cPaths.size() > 0)
notifyPathChange(cPaths, beginLeadPath);
}
}
Sets the selection. Whether the supplied paths are taken as the
new selection depends upon the selection mode. If the supplied
array is {@code null}, or empty, the selection is cleared. If
the selection mode is {@code SINGLE_TREE_SELECTION}, only the
first path in {@code pPaths} is used. If the selection
mode is {@code CONTIGUOUS_TREE_SELECTION} and the supplied paths
are not contiguous, then only the first path in {@code pPaths} is
used. If the selection mode is
{@code DISCONTIGUOUS_TREE_SELECTION}, then all paths are used.
All {@code null} paths in {@code pPaths} are ignored.
If this represents a change, all registered {@code
TreeSelectionListener}s are notified.
The lead path is set to the last unique path.
The paths returned from {@code getSelectionPaths} are in the same
order as those supplied to this method. |
public String toString() {
int selCount = getSelectionCount();
StringBuffer retBuffer = new StringBuffer();
int[] rows;
if(rowMapper != null)
rows = rowMapper.getRowsForPaths(selection);
else
rows = null;
retBuffer.append(getClass().getName() + " " + hashCode() + " [ ");
for(int counter = 0; counter < selCount; counter++) {
if(rows != null)
retBuffer.append(selection[counter].toString() + "@" +
Integer.toString(rows[counter])+ " ");
else
retBuffer.append(selection[counter].toString() + " ");
}
retBuffer.append("]");
return retBuffer.toString();
}
Returns a string that displays and identifies this
object's properties. |
protected void updateLeadIndex() {
if(leadPath != null) {
if(selection == null) {
leadPath = null;
leadIndex = leadRow = -1;
}
else {
leadRow = leadIndex = -1;
for(int counter = selection.length - 1; counter >= 0;
counter--) {
// Can use == here since we know leadPath came from
// selection
if(selection[counter] == leadPath) {
leadIndex = counter;
break;
}
}
}
}
else {
leadIndex = -1;
}
}
Updates the leadIndex instance variable. |