/** * Sets which elements are grayed in this viewer's tree. The given list contains the elements that * are to be grayed; all other elements are to be ungrayed. * * <p>This method is typically used when restoring the interesting state of a viewer captured by * an earlier call to <code>getGrayedElements</code>. * * @param elements the array of grayed elements * @see #getGrayedElements */ public void setGrayedElements(Object[] elements) { assertElementsNotNull(elements); CustomHashtable grayedElements = newHashtable(elements.length * 2 + 1); for (int i = 0; i < elements.length; ++i) { Object element = elements[i]; // Ensure item exists for element internalExpand(element, false); grayedElements.put(element, element); } Control tree = getControl(); tree.setRedraw(false); internalSetGrayed(grayedElements, tree); tree.setRedraw(true); }
/** * Applies the checked and grayed states of the given widget and its descendents. * * @param checked a set of elements (element type: <code>Object</code>) * @param grayed a set of elements (element type: <code>Object</code>) * @param widget the widget */ private void applyState(CustomHashtable checked, CustomHashtable grayed, Widget widget) { Item[] items = getChildren(widget); for (int i = 0; i < items.length; i++) { Item item = items[i]; if (item instanceof TreeItem) { Object data = item.getData(); if (data != null) { TreeItem ti = (TreeItem) item; ti.setChecked(checked.containsKey(data)); ti.setGrayed(grayed.containsKey(data)); } } applyState(checked, grayed, item); } }
/** * Gathers the checked and grayed states of the given widget and its descendents. * * @param checked a writable set of elements (element type: <code>Object</code>) * @param grayed a writable set of elements (element type: <code>Object</code>) * @param widget the widget */ private void gatherState(CustomHashtable checked, CustomHashtable grayed, Widget widget) { Item[] items = getChildren(widget); for (int i = 0; i < items.length; i++) { Item item = items[i]; if (item instanceof TreeItem) { Object data = item.getData(); if (data != null) { TreeItem ti = (TreeItem) item; if (ti.getChecked()) { checked.put(data, data); } if (ti.getGrayed()) { grayed.put(data, data); } } } gatherState(checked, grayed, item); } }
@Override public void remove(Object[] elements) { assertElementsNotNull(elements); if (checkBusy()) return; if (elements.length == 0) { return; } // deselect any items that are being removed, see bug 97786 boolean deselectedItems = false; Object elementToBeRemoved = null; CustomHashtable elementsToBeRemoved = null; if (elements.length == 1) { elementToBeRemoved = elements[0]; } else { elementsToBeRemoved = new CustomHashtable(getComparer()); for (Object element : elements) { elementsToBeRemoved.put(element, element); } } int[] selectionIndices = doGetSelectionIndices(); for (int index : selectionIndices) { Item item = doGetItem(index); Object data = item.getData(); if (data != null) { if ((elementsToBeRemoved != null && elementsToBeRemoved.containsKey(data)) || equals(elementToBeRemoved, data)) { table.deselect(index); deselectedItems = true; } } } super.remove(elements); if (deselectedItems) { ISelection sel = getSelection(); updateSelection(sel); firePostSelectionChanged(new SelectionChangedEvent(this, sel)); } }
private InitializeData(TreePath[] paths, IElementComparer comparer) { this.paths = new TreePath[paths.length]; System.arraycopy(paths, 0, this.paths, 0, paths.length); element2TreePaths = new CustomHashtable(comparer); int size = paths.length; selection = new ArrayList(size); for (int i = 0; i < size; i++) { Object lastSegment = paths[i].getLastSegment(); Object mapped = element2TreePaths.get(lastSegment); if (mapped == null) { selection.add(lastSegment); element2TreePaths.put(lastSegment, paths[i]); } else if (mapped instanceof List) { ((List) mapped).add(paths[i]); } else { List newMapped = new ArrayList(2); newMapped.add(mapped); newMapped.add(paths[i]); element2TreePaths.put(lastSegment, newMapped); } } }
/** * Sets the grayed state of all items to correspond to the given set of grayed elements. * * @param grayedElements the set (element type: <code>Object</code>) of elements which are grayed * @param widget the widget */ private void internalSetGrayed(CustomHashtable grayedElements, Widget widget) { Item[] items = getChildren(widget); for (int i = 0; i < items.length; i++) { TreeItem item = (TreeItem) items[i]; Object data = item.getData(); if (data != null) { boolean grayed = grayedElements.containsKey(data); if (grayed != item.getGrayed()) { item.setGrayed(grayed); } } internalSetGrayed(grayedElements, item); } }
public TreePath[] getPathsFor(Object element) { Object value = element2TreePaths == null ? null : element2TreePaths.get(element); if (value == null) { return EMPTY_TREE_PATHS; } else if (value instanceof TreePath) { return new TreePath[] {(TreePath) value}; } else if (value instanceof List) { List l = (List) value; return (TreePath[]) l.toArray(new TreePath[l.size()]); } else { // should not happen: Assert.isTrue(false, "Unhandled case"); // $NON-NLS-1$ return null; } }
/** * Returns the element comparer passed in when the tree selection has been created or <code>null * </code> if no comparer has been provided. * * @return the element comparer or <code>null</code> * @since 3.2 */ public IElementComparer getElementComparer() { if (element2TreePaths == null) return null; return element2TreePaths.getComparer(); }