Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java')
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java2580
1 files changed, 1290 insertions, 1290 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java
index fba0d7806..830bdf862 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/InternalVirtualTreeModelViewer.java
@@ -68,245 +68,245 @@ import org.eclipse.ui.IMemento;
*/
@SuppressWarnings("deprecation")
public class InternalVirtualTreeModelViewer extends Viewer
- implements IVirtualItemListener,
- org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer,
- IInternalTreeModelViewer
+ implements IVirtualItemListener,
+ org.eclipse.debug.internal.ui.viewers.model.ITreeModelViewer,
+ IInternalTreeModelViewer
{
- /**
- * Memento type for the visible columns for a presentation context.
- * A memento is created for each column presentation keyed by column number
- */
- private static final String VISIBLE_COLUMNS = "VISIBLE_COLUMNS"; //$NON-NLS-1$
-
- /**
- * Memento type for whether columns are visible for a presentation context.
- * Booleans are keyed by column presentation id
- */
- private static final String SHOW_COLUMNS = "SHOW_COLUMNS"; //$NON-NLS-1$
- /**
- * Memento key for the number of visible columns in a VISIBLE_COLUMNS memento
- * or for the width of a column
- */
- private static final String SIZE = "SIZE"; //$NON-NLS-1$
- /**
- * Memento key prefix a visible column
- */
- private static final String COLUMN = "COLUMN"; //$NON-NLS-1$
-
- /**
- * Item's tree path cache
- */
- private static final String TREE_PATH_KEY = "TREE_PATH_KEY"; //$NON-NLS-1$
-
- /**
- * Viewer filters currently configured for viewer.
- */
- private ViewerFilter[] fFilters = new ViewerFilter[0];
-
- /**
- * The display that this virtual tree viewer is associated with. It is used
- * for access to the UI thread.
- */
- private Display fDisplay;
-
- /**
- * The object that allows the model to identify what this view
- * is presenting.
- */
- private IPresentationContext fContext;
-
- /**
- * Input into the viewer.
- */
- private Object fInput;
-
- /**
- * The tree of items in this viewer.
- */
- private VirtualTree fTree;
-
- /**
- * Mapping of data elements in the tree to the items that hold them. The
- * tree may contain the same element in several places, so the map values
- * are lists.
- */
+ /**
+ * Memento type for the visible columns for a presentation context.
+ * A memento is created for each column presentation keyed by column number
+ */
+ private static final String VISIBLE_COLUMNS = "VISIBLE_COLUMNS"; //$NON-NLS-1$
+
+ /**
+ * Memento type for whether columns are visible for a presentation context.
+ * Booleans are keyed by column presentation id
+ */
+ private static final String SHOW_COLUMNS = "SHOW_COLUMNS"; //$NON-NLS-1$
+ /**
+ * Memento key for the number of visible columns in a VISIBLE_COLUMNS memento
+ * or for the width of a column
+ */
+ private static final String SIZE = "SIZE"; //$NON-NLS-1$
+ /**
+ * Memento key prefix a visible column
+ */
+ private static final String COLUMN = "COLUMN"; //$NON-NLS-1$
+
+ /**
+ * Item's tree path cache
+ */
+ private static final String TREE_PATH_KEY = "TREE_PATH_KEY"; //$NON-NLS-1$
+
+ /**
+ * Viewer filters currently configured for viewer.
+ */
+ private ViewerFilter[] fFilters = new ViewerFilter[0];
+
+ /**
+ * The display that this virtual tree viewer is associated with. It is used
+ * for access to the UI thread.
+ */
+ private Display fDisplay;
+
+ /**
+ * The object that allows the model to identify what this view
+ * is presenting.
+ */
+ private IPresentationContext fContext;
+
+ /**
+ * Input into the viewer.
+ */
+ private Object fInput;
+
+ /**
+ * The tree of items in this viewer.
+ */
+ private VirtualTree fTree;
+
+ /**
+ * Mapping of data elements in the tree to the items that hold them. The
+ * tree may contain the same element in several places, so the map values
+ * are lists.
+ */
private Map<Object, List<VirtualItem>> fItemsMap = new HashMap<>();
- /**
- * Whether to notify the content provider when an element is unmapped.
- * Used to suppress the notification during an associate operation.
- */
- private boolean fNotifyUnmap = true;
-
- /**
- * The label provider, must be the tree model provider.
- */
- private TreeModelLabelProvider fLabelProvider;
-
- /**
- * The content provider must be a tree model provider.
- */
- private TreeModelContentProvider fContentProvider;
-
- /**
- * Flag indicating whether the viewer is currently executing an operation
- * at the end of which the selection will be restored.
- */
- private boolean fPreservingSelecction;
-
- /**
- * Flag indicating that the selection should not be restored at the end
- * of a preserving-selection operation.
- */
- private boolean fRestoreSelection;
-
- /**
- * Level to which the tree should automatically expand elements.
- * <code>-1<code> indicates that all levels shoudl be expanded.
- */
- private int fAutoExpandToLevel = 0;
-
- /**
- * Current column presentation or <code>null</code>
- */
- private IColumnPresentation fColumnPresentation = null;
-
- /**
- * Map of columns presentation id to its visible columns id's (String[])
- * When a columns presentation is not in the map, default settings are used.
- */
+ /**
+ * Whether to notify the content provider when an element is unmapped.
+ * Used to suppress the notification during an associate operation.
+ */
+ private boolean fNotifyUnmap = true;
+
+ /**
+ * The label provider, must be the tree model provider.
+ */
+ private TreeModelLabelProvider fLabelProvider;
+
+ /**
+ * The content provider must be a tree model provider.
+ */
+ private TreeModelContentProvider fContentProvider;
+
+ /**
+ * Flag indicating whether the viewer is currently executing an operation
+ * at the end of which the selection will be restored.
+ */
+ private boolean fPreservingSelecction;
+
+ /**
+ * Flag indicating that the selection should not be restored at the end
+ * of a preserving-selection operation.
+ */
+ private boolean fRestoreSelection;
+
+ /**
+ * Level to which the tree should automatically expand elements.
+ * <code>-1<code> indicates that all levels shoudl be expanded.
+ */
+ private int fAutoExpandToLevel = 0;
+
+ /**
+ * Current column presentation or <code>null</code>
+ */
+ private IColumnPresentation fColumnPresentation = null;
+
+ /**
+ * Map of columns presentation id to its visible columns id's (String[])
+ * When a columns presentation is not in the map, default settings are used.
+ */
private Map<String, String[]> fVisibleColumns = new HashMap<>();
- /**
- * Map of column presentation id to whether columns should be displayed
- * for that presentation (the user can toggle columns on/off when a
- * presentation is optional.
- */
+ /**
+ * Map of column presentation id to whether columns should be displayed
+ * for that presentation (the user can toggle columns on/off when a
+ * presentation is optional.
+ */
private Map<String, Boolean> fShowColumns = new HashMap<>();
- /**
- * Runnable for validating the virtual tree. It is scheduled to run in the
- * UI thread whenever a tree validation is requested.
- */
- private Runnable fValidateRunnable;
+ /**
+ * Runnable for validating the virtual tree. It is scheduled to run in the
+ * UI thread whenever a tree validation is requested.
+ */
+ private Runnable fValidateRunnable;
- public InternalVirtualTreeModelViewer(Display display, int style, IPresentationContext context, IVirtualItemValidator itemValidator) {
- fDisplay = display;
- fContext = context;
- fTree = new VirtualTree(style, itemValidator);
- fTree.addItemListener(this);
+ public InternalVirtualTreeModelViewer(Display display, int style, IPresentationContext context, IVirtualItemValidator itemValidator) {
+ fDisplay = display;
+ fContext = context;
+ fTree = new VirtualTree(style, itemValidator);
+ fTree.addItemListener(this);
- fContentProvider = new TreeModelContentProvider();
- fLabelProvider = new TreeModelLabelProvider(this);
+ fContentProvider = new TreeModelContentProvider();
+ fLabelProvider = new TreeModelLabelProvider(this);
- if ((style & SWT.POP_UP) != 0) {
- getContentProvider().setModelDeltaMask(~ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS);
- }
- }
+ if ((style & SWT.POP_UP) != 0) {
+ getContentProvider().setModelDeltaMask(~ITreeModelContentProvider.CONTROL_MODEL_DELTA_FLAGS);
+ }
+ }
- @Override
+ @Override
public Object getInput() {
- return fInput;
- }
+ return fInput;
+ }
- @Override
+ @Override
public Control getControl() {
- // The virtual viewer does not have an SWT control associated with it.
- // Fortunately this method is not used by the base Viewer class.
- return null;
- }
+ // The virtual viewer does not have an SWT control associated with it.
+ // Fortunately this method is not used by the base Viewer class.
+ return null;
+ }
- @Override
+ @Override
public Display getDisplay() {
- return fDisplay;
- }
+ return fDisplay;
+ }
- @Override
+ @Override
public void setInput(Object input) {
- Object oldInput = fInput;
- getContentProvider().inputChanged(this, oldInput, input);
- fItemsMap.clear();
- fTree.clearAll();
- fInput = input;
- mapElement(fInput, getTree());
- getContentProvider().postInputChanged(this, oldInput , input);
- fTree.setData(fInput);
- fTree.setSelection(EMPTY_ITEMS_ARRAY);
- inputChanged(fInput, oldInput);
- refresh();
- }
-
- @Override
+ Object oldInput = fInput;
+ getContentProvider().inputChanged(this, oldInput, input);
+ fItemsMap.clear();
+ fTree.clearAll();
+ fInput = input;
+ mapElement(fInput, getTree());
+ getContentProvider().postInputChanged(this, oldInput , input);
+ fTree.setData(fInput);
+ fTree.setSelection(EMPTY_ITEMS_ARRAY);
+ inputChanged(fInput, oldInput);
+ refresh();
+ }
+
+ @Override
public void replace(Object parentElementOrTreePath, final int index, Object element) {
- VirtualItem[] selectedItems = fTree.getSelection();
- TreeSelection selection = (TreeSelection) getSelection();
- VirtualItem[] itemsToDisassociate;
- if (parentElementOrTreePath instanceof TreePath) {
- TreePath elementPath = ((TreePath) parentElementOrTreePath).createChildPath(element);
- itemsToDisassociate = findItems(elementPath);
- } else {
- itemsToDisassociate = findItems(element);
- }
-
- VirtualItem[] parentItems = findItems(parentElementOrTreePath);
- for (int i = 0; i < parentItems.length; i++) {
- VirtualItem parentItem = parentItems[i];
- if (index < parentItem.getItemCount()) {
- VirtualItem item = parentItem.getItem(new Index(index));
- selection = adjustSelectionForReplace(selectedItems, selection, item, element, parentItem.getData());
- // disassociate any different item that represents the
- // same element under the same parent (the tree)
- for (int j = 0; j < itemsToDisassociate.length; j++) {
- VirtualItem itemToDisassociate = itemsToDisassociate[j];
- if (itemToDisassociate != item && itemsToDisassociate[j].getParent() == parentItem) {
- disassociate(itemToDisassociate);
- itemToDisassociate.getParent().clear(itemToDisassociate.getIndex());
- }
- }
- //Object oldData = item.getData();
- associate(element, item);
- doUpdate(item);
- VirtualItem[] children = item.getItems();
- for (int j = 0; j < children.length; j++) {
- children[j].setNeedsDataUpdate();
- }
- }
- }
- // Restore the selection if we are not already in a nested
- // preservingSelection:
- if (!fPreservingSelecction) {
- internalSetSelection(selection, false);
- // send out notification if old and new differ
- ISelection newSelection = getSelection();
- if (!newSelection.equals(selection)) {
- handleInvalidSelection(selection, newSelection);
- }
- }
- validate();
- }
-
- public VirtualTree getTree() {
- return fTree;
- }
-
- @Override
+ VirtualItem[] selectedItems = fTree.getSelection();
+ TreeSelection selection = (TreeSelection) getSelection();
+ VirtualItem[] itemsToDisassociate;
+ if (parentElementOrTreePath instanceof TreePath) {
+ TreePath elementPath = ((TreePath) parentElementOrTreePath).createChildPath(element);
+ itemsToDisassociate = findItems(elementPath);
+ } else {
+ itemsToDisassociate = findItems(element);
+ }
+
+ VirtualItem[] parentItems = findItems(parentElementOrTreePath);
+ for (int i = 0; i < parentItems.length; i++) {
+ VirtualItem parentItem = parentItems[i];
+ if (index < parentItem.getItemCount()) {
+ VirtualItem item = parentItem.getItem(new Index(index));
+ selection = adjustSelectionForReplace(selectedItems, selection, item, element, parentItem.getData());
+ // disassociate any different item that represents the
+ // same element under the same parent (the tree)
+ for (int j = 0; j < itemsToDisassociate.length; j++) {
+ VirtualItem itemToDisassociate = itemsToDisassociate[j];
+ if (itemToDisassociate != item && itemsToDisassociate[j].getParent() == parentItem) {
+ disassociate(itemToDisassociate);
+ itemToDisassociate.getParent().clear(itemToDisassociate.getIndex());
+ }
+ }
+ //Object oldData = item.getData();
+ associate(element, item);
+ doUpdate(item);
+ VirtualItem[] children = item.getItems();
+ for (int j = 0; j < children.length; j++) {
+ children[j].setNeedsDataUpdate();
+ }
+ }
+ }
+ // Restore the selection if we are not already in a nested
+ // preservingSelection:
+ if (!fPreservingSelecction) {
+ internalSetSelection(selection, false);
+ // send out notification if old and new differ
+ ISelection newSelection = getSelection();
+ if (!newSelection.equals(selection)) {
+ handleInvalidSelection(selection, newSelection);
+ }
+ }
+ validate();
+ }
+
+ public VirtualTree getTree() {
+ return fTree;
+ }
+
+ @Override
public void insert(Object parentOrTreePath, Object element, int position) {
- if (parentOrTreePath instanceof TreePath) {
- VirtualItem parentItem = findItem((TreePath) parentOrTreePath);
- if (parentItem != null) {
- VirtualItem item = parentItem.addItem(position);
- item.setData(element);
- mapElement(element, item);
- doUpdate(item);
- }
- } else {
- // TODO: Implement insert() for element
- }
- validate();
- }
-
- @Override
+ if (parentOrTreePath instanceof TreePath) {
+ VirtualItem parentItem = findItem((TreePath) parentOrTreePath);
+ if (parentItem != null) {
+ VirtualItem item = parentItem.addItem(position);
+ item.setData(element);
+ mapElement(element, item);
+ doUpdate(item);
+ }
+ } else {
+ // TODO: Implement insert() for element
+ }
+ validate();
+ }
+
+ @Override
public void remove(final Object parentOrTreePath, final int index) {
final List<TreePath> oldSelection = new LinkedList<>(Arrays.asList(((TreeSelection) getSelection()).getPaths()));
preservingSelection(() -> {
@@ -351,50 +351,50 @@ public class InternalVirtualTreeModelViewer extends Viewer
}
}
});
- }
+ }
- @Override
+ @Override
public void remove(Object elementOrPath) {
- if (elementOrPath.equals(getInput()) || TreePath.EMPTY.equals(elementOrPath)) {
- setInput(null);
- return;
- }
-
- VirtualItem[] items = findItems(elementOrPath);
- if (items.length > 0) {
- for (int j = 0; j < items.length; j++) {
- disassociate(items[j]);
- items[j].getParent().remove(items[j].getIndex());
- }
- }
- }
-
- private TreeSelection adjustSelectionForReplace(VirtualItem[] selectedItems, TreeSelection selection,
- VirtualItem item, Object element, Object parentElement)
- {
- if (item.getData() != null || selectedItems.length == selection.size() || parentElement == null) {
- // Don't do anything - we are not seeing an instance of bug 185673
- return selection;
- }
- for (int i = 0; i < selectedItems.length; i++) {
- if (item == selectedItems[i]) {
- // The current item was selected, but its data is null.
- // The data will be replaced by the given element, so to keep
- // it selected, we have to add it to the selection.
- TreePath[] originalPaths = selection.getPaths();
- int length = originalPaths.length;
- TreePath[] paths = new TreePath[length + 1];
- System.arraycopy(originalPaths, 0, paths, 0, length);
- // set the element temporarily so that we can call getTreePathFromItem
- item.setData(element);
- paths[length] = getTreePathFromItem(item);
- item.setData(null);
- return new TreeSelection(paths, selection.getElementComparer());
- }
- }
- // The item was not selected, return the given selection
- return selection;
- }
+ if (elementOrPath.equals(getInput()) || TreePath.EMPTY.equals(elementOrPath)) {
+ setInput(null);
+ return;
+ }
+
+ VirtualItem[] items = findItems(elementOrPath);
+ if (items.length > 0) {
+ for (int j = 0; j < items.length; j++) {
+ disassociate(items[j]);
+ items[j].getParent().remove(items[j].getIndex());
+ }
+ }
+ }
+
+ private TreeSelection adjustSelectionForReplace(VirtualItem[] selectedItems, TreeSelection selection,
+ VirtualItem item, Object element, Object parentElement)
+ {
+ if (item.getData() != null || selectedItems.length == selection.size() || parentElement == null) {
+ // Don't do anything - we are not seeing an instance of bug 185673
+ return selection;
+ }
+ for (int i = 0; i < selectedItems.length; i++) {
+ if (item == selectedItems[i]) {
+ // The current item was selected, but its data is null.
+ // The data will be replaced by the given element, so to keep
+ // it selected, we have to add it to the selection.
+ TreePath[] originalPaths = selection.getPaths();
+ int length = originalPaths.length;
+ TreePath[] paths = new TreePath[length + 1];
+ System.arraycopy(originalPaths, 0, paths, 0, length);
+ // set the element temporarily so that we can call getTreePathFromItem
+ item.setData(element);
+ paths[length] = getTreePathFromItem(item);
+ item.setData(null);
+ return new TreeSelection(paths, selection.getElementComparer());
+ }
+ }
+ // The item was not selected, return the given selection
+ return selection;
+ }
// private VirtualTreeSelection adjustSelectionForReplace(VirtualTreeSelection selection, VirtualItem item,
// Object element, Object parentElement)
@@ -449,181 +449,181 @@ public class InternalVirtualTreeModelViewer extends Viewer
// }
- @Override
+ @Override
public void reveal(TreePath path, final int index) {
- VirtualItem parentItem = findItem(path);
- if (parentItem != null && parentItem.getItemCount() >= index) {
- VirtualItem revealItem = parentItem.getItem(new Index(index));
- getTree().showItem(revealItem);
- getTree().validate();
- }
- // TODO: implement reveal()
- }
-
- @Override
+ VirtualItem parentItem = findItem(path);
+ if (parentItem != null && parentItem.getItemCount() >= index) {
+ VirtualItem revealItem = parentItem.getItem(new Index(index));
+ getTree().showItem(revealItem);
+ getTree().validate();
+ }
+ // TODO: implement reveal()
+ }
+
+ @Override
public int findElementIndex(TreePath parentPath, Object element) {
- VirtualItem parentItem = findItem(parentPath);
- if (parentItem != null) {
- VirtualItem item = parentItem.findItem(element);
- if (item != null) {
- return item.getIndex().intValue();
- }
- }
- return -1;
- }
-
- @Override
+ VirtualItem parentItem = findItem(parentPath);
+ if (parentItem != null) {
+ VirtualItem item = parentItem.findItem(element);
+ if (item != null) {
+ return item.getIndex().intValue();
+ }
+ }
+ return -1;
+ }
+
+ @Override
public boolean getElementChildrenRealized(TreePath parentPath) {
- VirtualItem parentItem = findItem(parentPath);
- if (parentItem != null) {
- return !parentItem.childrenNeedDataUpdate();
- }
- return true;
- }
+ VirtualItem parentItem = findItem(parentPath);
+ if (parentItem != null) {
+ return !parentItem.childrenNeedDataUpdate();
+ }
+ return true;
+ }
- private ITreeModelLabelProvider getLabelProvider() {
- return fLabelProvider;
- }
+ private ITreeModelLabelProvider getLabelProvider() {
+ return fLabelProvider;
+ }
- private ITreeModelContentProvider getContentProvider() {
- return fContentProvider;
- }
+ private ITreeModelContentProvider getContentProvider() {
+ return fContentProvider;
+ }
- public static int ALL_LEVELS = -1;
+ public static int ALL_LEVELS = -1;
- @Override
+ @Override
public void refresh() {
- refresh(fTree);
- validate();
- }
+ refresh(fTree);
+ validate();
+ }
- @Override
+ @Override
public void refresh(Object element) {
- VirtualItem[] items = findItems(element);
- for (int i = 0; i < items.length; i++) {
- refresh(items[i]);
- validate();
- }
- }
-
- private void refresh(VirtualItem item) {
- getContentProvider().preserveState(getTreePathFromItem(item));
-
- if (!item.needsDataUpdate()) {
- if (item.getParent() != null) {
- item.setNeedsLabelUpdate();
- virtualLazyUpdateHasChildren(item);
- }
-
- VirtualItem[] items = item.getItems();
- for (int i = 0; i < items.length; i++) {
- items[i].setNeedsDataUpdate();
- }
- }
- refreshStruct(item);
- }
-
- private void refreshStruct(VirtualItem item) {
- boolean expanded = false;
- if (item.getParent() == null) {
- // root item
- virtualLazyUpdateChildCount(item);
- expanded = true;
- } else {
- if (item.getExpanded()) {
- virtualLazyUpdateData(item);
- expanded = true;
- }
- }
-
- VirtualItem[] items = item.getItems();
- for (int i = 0; i < items.length; i++) {
- if (expanded) {
- refreshStruct(items[i]);
- } else {
- item.clear(new VirtualItem.Index(i));
- }
- }
- }
-
- private void validate() {
- if (fValidateRunnable == null) {
+ VirtualItem[] items = findItems(element);
+ for (int i = 0; i < items.length; i++) {
+ refresh(items[i]);
+ validate();
+ }
+ }
+
+ private void refresh(VirtualItem item) {
+ getContentProvider().preserveState(getTreePathFromItem(item));
+
+ if (!item.needsDataUpdate()) {
+ if (item.getParent() != null) {
+ item.setNeedsLabelUpdate();
+ virtualLazyUpdateHasChildren(item);
+ }
+
+ VirtualItem[] items = item.getItems();
+ for (int i = 0; i < items.length; i++) {
+ items[i].setNeedsDataUpdate();
+ }
+ }
+ refreshStruct(item);
+ }
+
+ private void refreshStruct(VirtualItem item) {
+ boolean expanded = false;
+ if (item.getParent() == null) {
+ // root item
+ virtualLazyUpdateChildCount(item);
+ expanded = true;
+ } else {
+ if (item.getExpanded()) {
+ virtualLazyUpdateData(item);
+ expanded = true;
+ }
+ }
+
+ VirtualItem[] items = item.getItems();
+ for (int i = 0; i < items.length; i++) {
+ if (expanded) {
+ refreshStruct(items[i]);
+ } else {
+ item.clear(new VirtualItem.Index(i));
+ }
+ }
+ }
+
+ private void validate() {
+ if (fValidateRunnable == null) {
fValidateRunnable = () -> {
if (!fTree.isDisposed()) {
fValidateRunnable = null;
fTree.validate();
}
};
- getDisplay().asyncExec(fValidateRunnable);
- }
- }
+ getDisplay().asyncExec(fValidateRunnable);
+ }
+ }
- @Override
+ @Override
protected void inputChanged(Object input, Object oldInput) {
- resetColumns(input);
- }
+ resetColumns(input);
+ }
- @Override
+ @Override
public int getAutoExpandLevel() {
- return fAutoExpandToLevel;
- }
+ return fAutoExpandToLevel;
+ }
- @Override
+ @Override
public void setAutoExpandLevel(int level) {
- fAutoExpandToLevel = level;
- }
+ fAutoExpandToLevel = level;
+ }
- public VirtualItem findItem(TreePath path) {
- if (path.getSegmentCount() == 0) {
- return fTree;
- }
+ public VirtualItem findItem(TreePath path) {
+ if (path.getSegmentCount() == 0) {
+ return fTree;
+ }
List<VirtualItem> itemsList = fItemsMap.get(path.getLastSegment());
- if (itemsList != null) {
+ if (itemsList != null) {
for (VirtualItem item : itemsList) {
if (path.equals(getTreePathFromItem(item))) {
return item;
- }
- }
- }
-
- return null;
- }
-
- static private final VirtualItem[] EMPTY_ITEMS_ARRAY = new VirtualItem[0];
-
- public VirtualItem[] findItems(Object elementOrTreePath) {
- Object element = elementOrTreePath;
- if (elementOrTreePath instanceof TreePath) {
- TreePath path = (TreePath)elementOrTreePath;
- if (path.getSegmentCount() == 0) {
- return new VirtualItem[] { getTree() };
- }
- element = path.getLastSegment();
- }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ static private final VirtualItem[] EMPTY_ITEMS_ARRAY = new VirtualItem[0];
+
+ public VirtualItem[] findItems(Object elementOrTreePath) {
+ Object element = elementOrTreePath;
+ if (elementOrTreePath instanceof TreePath) {
+ TreePath path = (TreePath)elementOrTreePath;
+ if (path.getSegmentCount() == 0) {
+ return new VirtualItem[] { getTree() };
+ }
+ element = path.getLastSegment();
+ }
List<VirtualItem> itemsList = fItemsMap.get(element);
- if (itemsList == null) {
- return EMPTY_ITEMS_ARRAY;
- } else {
- return itemsList.toArray(new VirtualItem[itemsList.size()]);
- }
- }
-
- @Override
+ if (itemsList == null) {
+ return EMPTY_ITEMS_ARRAY;
+ } else {
+ return itemsList.toArray(new VirtualItem[itemsList.size()]);
+ }
+ }
+
+ @Override
public void setElementData(TreePath path, int numColumns, String[] labels, ImageDescriptor[] images,
- FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds) {
- VirtualItem item = findItem(path);
- if (item != null) {
- item.setData(VirtualItem.LABEL_KEY, labels);
- item.setData(VirtualItem.IMAGE_KEY, images);
- item.setData(VirtualItem.FOREGROUND_KEY, foregrounds);
- item.setData(VirtualItem.BACKGROUND_KEY, backgrounds);
- item.setData(VirtualItem.FONT_KEY, fontDatas);
- }
- }
-
- @Override
+ FontData[] fontDatas, RGB[] foregrounds, RGB[] backgrounds) {
+ VirtualItem item = findItem(path);
+ if (item != null) {
+ item.setData(VirtualItem.LABEL_KEY, labels);
+ item.setData(VirtualItem.IMAGE_KEY, images);
+ item.setData(VirtualItem.FOREGROUND_KEY, foregrounds);
+ item.setData(VirtualItem.BACKGROUND_KEY, backgrounds);
+ item.setData(VirtualItem.FONT_KEY, fontDatas);
+ }
+ }
+
+ @Override
public void setChildCount(final Object elementOrTreePath, final int count) {
preservingSelection(() -> {
VirtualItem[] items = findItems(elementOrTreePath);
@@ -638,10 +638,10 @@ public class InternalVirtualTreeModelViewer extends Viewer
items[i].setItemCount(count);
}
});
- validate();
- }
+ validate();
+ }
- @Override
+ @Override
public void setHasChildren(final Object elementOrTreePath, final boolean hasChildren) {
preservingSelection(() -> {
VirtualItem[] items = findItems(elementOrTreePath);
@@ -667,962 +667,962 @@ public class InternalVirtualTreeModelViewer extends Viewer
}
}
});
- }
+ }
- @Override
+ @Override
public boolean getHasChildren(Object elementOrTreePath) {
- VirtualItem[] items = findItems(elementOrTreePath);
- if (items.length > 0) {
- return items[0].hasItems();
- }
- return false;
- }
-
- private void virtualLazyUpdateHasChildren(VirtualItem item) {
- TreePath treePath;
- treePath = getTreePathFromItem(item);
- item.clearNeedsCountUpdate();
- getContentProvider().updateHasChildren(treePath);
- }
-
- private void virtualLazyUpdateChildCount(VirtualItem item) {
- item.clearNeedsCountUpdate();
- getContentProvider().updateChildCount(getTreePathFromItem(item), item.getItemCount());
- }
-
- private void virtualLazyUpdateData(VirtualItem item) {
- item.clearNeedsDataUpdate();
- getContentProvider().updateElement(getTreePathFromItem(item.getParent()), item.getIndex().intValue());
- }
-
- private void virtualLazyUpdateLabel(VirtualItem item) {
- item.clearNeedsLabelUpdate();
- if ( !getLabelProvider().update(getTreePathFromItem(item)) ) {
- if (item.getData() instanceof String) {
- item.setData(VirtualItem.LABEL_KEY, new String[] { (String)item.getData() } );
- }
- }
- }
-
- private TreePath getTreePathFromItem(VirtualItem item) {
+ VirtualItem[] items = findItems(elementOrTreePath);
+ if (items.length > 0) {
+ return items[0].hasItems();
+ }
+ return false;
+ }
+
+ private void virtualLazyUpdateHasChildren(VirtualItem item) {
+ TreePath treePath;
+ treePath = getTreePathFromItem(item);
+ item.clearNeedsCountUpdate();
+ getContentProvider().updateHasChildren(treePath);
+ }
+
+ private void virtualLazyUpdateChildCount(VirtualItem item) {
+ item.clearNeedsCountUpdate();
+ getContentProvider().updateChildCount(getTreePathFromItem(item), item.getItemCount());
+ }
+
+ private void virtualLazyUpdateData(VirtualItem item) {
+ item.clearNeedsDataUpdate();
+ getContentProvider().updateElement(getTreePathFromItem(item.getParent()), item.getIndex().intValue());
+ }
+
+ private void virtualLazyUpdateLabel(VirtualItem item) {
+ item.clearNeedsLabelUpdate();
+ if ( !getLabelProvider().update(getTreePathFromItem(item)) ) {
+ if (item.getData() instanceof String) {
+ item.setData(VirtualItem.LABEL_KEY, new String[] { (String)item.getData() } );
+ }
+ }
+ }
+
+ private TreePath getTreePathFromItem(VirtualItem item) {
List<Object> segments = new LinkedList<>();
- while (item.getParent() != null) {
- segments.add(0, item.getData());
- item = item.getParent();
- }
- return new TreePath(segments.toArray());
- }
-
- private void unmapElement(Object element, VirtualItem item) {
- if (fNotifyUnmap) {
- // TODO: should we update the filter with the "new non-identical element"?
- IContentProvider provider = getContentProvider();
- if (provider instanceof TreeModelContentProvider) {
- ((TreeModelContentProvider) provider).unmapPath((TreePath) item.getData(TREE_PATH_KEY));
- }
- }
+ while (item.getParent() != null) {
+ segments.add(0, item.getData());
+ item = item.getParent();
+ }
+ return new TreePath(segments.toArray());
+ }
+
+ private void unmapElement(Object element, VirtualItem item) {
+ if (fNotifyUnmap) {
+ // TODO: should we update the filter with the "new non-identical element"?
+ IContentProvider provider = getContentProvider();
+ if (provider instanceof TreeModelContentProvider) {
+ ((TreeModelContentProvider) provider).unmapPath((TreePath) item.getData(TREE_PATH_KEY));
+ }
+ }
List<VirtualItem> itemsList = fItemsMap.get(element);
- if (itemsList != null) {
- itemsList.remove(item);
- if (itemsList.isEmpty()) {
- fItemsMap.remove(element);
- }
- }
- }
-
- private void mapElement(Object element, VirtualItem item) {
- // Get the items set for given element, if it doesn't exist, create it.
- // When retrieving the set, also remove it from the map, it will be
- // re-inserted to make sure that the new instance of element is used
- // in case the element has changed but the elment is equal to the old
- // one.
+ if (itemsList != null) {
+ itemsList.remove(item);
+ if (itemsList.isEmpty()) {
+ fItemsMap.remove(element);
+ }
+ }
+ }
+
+ private void mapElement(Object element, VirtualItem item) {
+ // Get the items set for given element, if it doesn't exist, create it.
+ // When retrieving the set, also remove it from the map, it will be
+ // re-inserted to make sure that the new instance of element is used
+ // in case the element has changed but the elment is equal to the old
+ // one.
List<VirtualItem> itemsList = fItemsMap.remove(element);
- if (itemsList == null) {
+ if (itemsList == null) {
itemsList = new ArrayList<>(1);
- }
+ }
- if (!itemsList.contains(item)) {
- itemsList.add(item);
- }
+ if (!itemsList.contains(item)) {
+ itemsList.add(item);
+ }
- // Insert the set back into the map.
- fItemsMap.put(element, itemsList);
+ // Insert the set back into the map.
+ fItemsMap.put(element, itemsList);
- item.setData(TREE_PATH_KEY, getTreePathFromItem(item));
- }
+ item.setData(TREE_PATH_KEY, getTreePathFromItem(item));
+ }
- @Override
+ @Override
public void revealed(VirtualItem item) {
- if (item.needsDataUpdate()) {
- virtualLazyUpdateData(item);
- } else if (item.getData() != null) {
- if (item.needsLabelUpdate()) {
- virtualLazyUpdateLabel(item);
- }
- if (item.needsCountUpdate() && item.getExpanded()) {
- virtualLazyUpdateChildCount(item);
- }
- }
- }
-
- @Override
+ if (item.needsDataUpdate()) {
+ virtualLazyUpdateData(item);
+ } else if (item.getData() != null) {
+ if (item.needsLabelUpdate()) {
+ virtualLazyUpdateLabel(item);
+ }
+ if (item.needsCountUpdate() && item.getExpanded()) {
+ virtualLazyUpdateChildCount(item);
+ }
+ }
+ }
+
+ @Override
public void disposed(VirtualItem item) {
- if (!fTree.isDisposed()) {
- Object data = item.getData();
- if (data != null) {
- unmapElement(data, item);
- }
- }
- }
-
- private void associate(Object element, VirtualItem item) {
- Object data = item.getData();
- if (data != null && data != element && data.equals(element)) {
- // elements are equal but not identical
- // -> being removed from map, but should not change filters
- try {
- fNotifyUnmap = false;
- doAssociate(element, item);
- } finally {
- fNotifyUnmap = true;
- }
- } else {
- doAssociate(element, item);
- }
-
- }
-
- private void doAssociate(Object element, VirtualItem item) {
- Object data = item.getData();
- if (data != null && data != element && data.equals(element)) {
- // workaround for PR 1FV62BT
- // assumption: elements are equal but not identical
- // -> remove from map but don't touch children
- unmapElement(data, item);
- item.setData(element);
- mapElement(element, item);
- } else {
- // recursively disassociate all
- if (data != element) {
- if (data != null) {
- unmapElement(element, item);
- disassociate(item);
- }
- item.setData(element);
- }
- // Always map the element, even if data == element,
- // since unmapAllElements() can leave the map inconsistent
- // See bug 2741 for details.
- mapElement(element, item);
- }
- }
-
- private void disassociate(VirtualItem item) {
- unmapElement(item.getData(), item);
-
- // Clear the map before we clear the data
- item.setData(null);
-
- // Disassociate the children
- VirtualItem[] items = item.getItems();
- for (int i = 0; i < items.length; i++) {
- if (items[i].getData() != null) {
- disassociate(items[i]);
- }
- }
- }
-
- @Override
+ if (!fTree.isDisposed()) {
+ Object data = item.getData();
+ if (data != null) {
+ unmapElement(data, item);
+ }
+ }
+ }
+
+ private void associate(Object element, VirtualItem item) {
+ Object data = item.getData();
+ if (data != null && data != element && data.equals(element)) {
+ // elements are equal but not identical
+ // -> being removed from map, but should not change filters
+ try {
+ fNotifyUnmap = false;
+ doAssociate(element, item);
+ } finally {
+ fNotifyUnmap = true;
+ }
+ } else {
+ doAssociate(element, item);
+ }
+
+ }
+
+ private void doAssociate(Object element, VirtualItem item) {
+ Object data = item.getData();
+ if (data != null && data != element && data.equals(element)) {
+ // workaround for PR 1FV62BT
+ // assumption: elements are equal but not identical
+ // -> remove from map but don't touch children
+ unmapElement(data, item);
+ item.setData(element);
+ mapElement(element, item);
+ } else {
+ // recursively disassociate all
+ if (data != element) {
+ if (data != null) {
+ unmapElement(element, item);
+ disassociate(item);
+ }
+ item.setData(element);
+ }
+ // Always map the element, even if data == element,
+ // since unmapAllElements() can leave the map inconsistent
+ // See bug 2741 for details.
+ mapElement(element, item);
+ }
+ }
+
+ private void disassociate(VirtualItem item) {
+ unmapElement(item.getData(), item);
+
+ // Clear the map before we clear the data
+ item.setData(null);
+
+ // Disassociate the children
+ VirtualItem[] items = item.getItems();
+ for (int i = 0; i < items.length; i++) {
+ if (items[i].getData() != null) {
+ disassociate(items[i]);
+ }
+ }
+ }
+
+ @Override
public void setSelection(ISelection selection, boolean reveal) {
- setSelection(selection, reveal, false);
- }
+ setSelection(selection, reveal, false);
+ }
- @Override
+ @Override
public void setSelection(ISelection selection, boolean reveal, boolean force) {
- trySelection(selection, reveal, force);
- }
+ trySelection(selection, reveal, force);
+ }
- @Override
+ @Override
public boolean trySelection(ISelection selection, boolean reveal, boolean force) {
- if (!force && !overrideSelection(getSelection(), selection)) {
- return false;
- }
-
- if (!fPreservingSelecction) {
- internalSetSelection(selection, reveal);
- fireSelectionChanged(new SelectionChangedEvent(this, selection));
- } else {
- fRestoreSelection = false;
- internalSetSelection(selection, reveal);
- }
- return true;
- }
-
- private void internalSetSelection(ISelection selection, boolean reveal) {
- if (selection instanceof ITreeSelection) {
- TreePath[] paths = ((ITreeSelection) selection).getPaths();
+ if (!force && !overrideSelection(getSelection(), selection)) {
+ return false;
+ }
+
+ if (!fPreservingSelecction) {
+ internalSetSelection(selection, reveal);
+ fireSelectionChanged(new SelectionChangedEvent(this, selection));
+ } else {
+ fRestoreSelection = false;
+ internalSetSelection(selection, reveal);
+ }
+ return true;
+ }
+
+ private void internalSetSelection(ISelection selection, boolean reveal) {
+ if (selection instanceof ITreeSelection) {
+ TreePath[] paths = ((ITreeSelection) selection).getPaths();
List<VirtualItem> newSelection = new ArrayList<>(paths.length);
- for (int i = 0; i < paths.length; ++i) {
- // Use internalExpand since item may not yet be created. See
- // 1G6B1AR.
- VirtualItem item = findItem(paths[i]);
- if (item != null) {
- newSelection.add(item);
- }
- }
- fTree.setSelection(newSelection.toArray(new VirtualItem[newSelection.size()]));
-
- // Although setting the selection in the control should reveal it,
- // setSelection may be a no-op if the selection is unchanged,
- // so explicitly reveal items in the selection here.
- // See bug 100565 for more details.
- if (reveal && newSelection.size() > 0) {
- // Iterate backwards so the first item in the list
- // is the one guaranteed to be visible
- for (int i = (newSelection.size() - 1); i >= 0; i--) {
- fTree.showItem(newSelection.get(i));
- }
- }
- } else {
- fTree.setSelection(EMPTY_ITEMS_ARRAY);
- }
-
- // Make sure that the new selection is properly revealed.
- validate();
- }
-
- @Override
+ for (int i = 0; i < paths.length; ++i) {
+ // Use internalExpand since item may not yet be created. See
+ // 1G6B1AR.
+ VirtualItem item = findItem(paths[i]);
+ if (item != null) {
+ newSelection.add(item);
+ }
+ }
+ fTree.setSelection(newSelection.toArray(new VirtualItem[newSelection.size()]));
+
+ // Although setting the selection in the control should reveal it,
+ // setSelection may be a no-op if the selection is unchanged,
+ // so explicitly reveal items in the selection here.
+ // See bug 100565 for more details.
+ if (reveal && newSelection.size() > 0) {
+ // Iterate backwards so the first item in the list
+ // is the one guaranteed to be visible
+ for (int i = (newSelection.size() - 1); i >= 0; i--) {
+ fTree.showItem(newSelection.get(i));
+ }
+ }
+ } else {
+ fTree.setSelection(EMPTY_ITEMS_ARRAY);
+ }
+
+ // Make sure that the new selection is properly revealed.
+ validate();
+ }
+
+ @Override
public void update(Object element) {
- VirtualItem[] items = findItems(element);
- for (int i = 0; i < items.length; i++) {
- doUpdate(items[i]);
- }
- }
-
- public void doUpdate(VirtualItem item) {
- item.setNeedsLabelUpdate();
- validate();
- }
-
- @Override
+ VirtualItem[] items = findItems(element);
+ for (int i = 0; i < items.length; i++) {
+ doUpdate(items[i]);
+ }
+ }
+
+ public void doUpdate(VirtualItem item) {
+ item.setNeedsLabelUpdate();
+ validate();
+ }
+
+ @Override
public ISelection getSelection() {
- if (fTree.isDisposed()) {
- return TreeSelection.EMPTY;
- }
- VirtualItem[] items = fTree.getSelection();
+ if (fTree.isDisposed()) {
+ return TreeSelection.EMPTY;
+ }
+ VirtualItem[] items = fTree.getSelection();
ArrayList<TreePath> list = new ArrayList<>(items.length);
Map<VirtualItem, TreePath> map = new LinkedHashMap<>(items.length * 4 / 3);
- for (int i = 0; i < items.length; i++) {
- TreePath path = null;
- if (items[i].getData() != null) {
- path = getTreePathFromItem(items[i]);
- list.add(path);
- }
- map.put(items[i], path);
- }
- return new TreeSelection(list.toArray(new TreePath[list.size()]));
- }
-
- private void preservingSelection(Runnable updateCode) {
-
- ISelection oldSelection = null;
- try {
- // preserve selection
- oldSelection = getSelection();
- fPreservingSelecction = fRestoreSelection = true;
-
- // perform the update
- updateCode.run();
-
- } finally {
- fPreservingSelecction = false;
-
- // restore selection
- if (fRestoreSelection) {
- internalSetSelection(oldSelection, false);
- }
-
- // send out notification if old and new differ
- ISelection newSelection = getSelection();
- if (!newSelection.equals(oldSelection)) {
- handleInvalidSelection(oldSelection, newSelection);
- }
- }
- }
-
- @Override
+ for (int i = 0; i < items.length; i++) {
+ TreePath path = null;
+ if (items[i].getData() != null) {
+ path = getTreePathFromItem(items[i]);
+ list.add(path);
+ }
+ map.put(items[i], path);
+ }
+ return new TreeSelection(list.toArray(new TreePath[list.size()]));
+ }
+
+ private void preservingSelection(Runnable updateCode) {
+
+ ISelection oldSelection = null;
+ try {
+ // preserve selection
+ oldSelection = getSelection();
+ fPreservingSelecction = fRestoreSelection = true;
+
+ // perform the update
+ updateCode.run();
+
+ } finally {
+ fPreservingSelecction = false;
+
+ // restore selection
+ if (fRestoreSelection) {
+ internalSetSelection(oldSelection, false);
+ }
+
+ // send out notification if old and new differ
+ ISelection newSelection = getSelection();
+ if (!newSelection.equals(oldSelection)) {
+ handleInvalidSelection(oldSelection, newSelection);
+ }
+ }
+ }
+
+ @Override
public void expandToLevel(Object elementOrTreePath, int level) {
- VirtualItem[] items = findItems(elementOrTreePath);
- if (items.length > 0) {
- expandToLevel(items[0], level);
- }
- validate();
- }
-
- @Override
+ VirtualItem[] items = findItems(elementOrTreePath);
+ if (items.length > 0) {
+ expandToLevel(items[0], level);
+ }
+ validate();
+ }
+
+ @Override
public void setExpandedState(Object elementOrTreePath, boolean expanded) {
- VirtualItem[] items = findItems(elementOrTreePath);
- for (int i = 0; i < items.length; i++) {
- items[i].setExpanded(expanded);
- }
- validate();
- }
-
- @Override
+ VirtualItem[] items = findItems(elementOrTreePath);
+ for (int i = 0; i < items.length; i++) {
+ items[i].setExpanded(expanded);
+ }
+ validate();
+ }
+
+ @Override
public boolean getExpandedState(Object elementOrTreePath) {
- VirtualItem[] items = findItems(elementOrTreePath);
- if (items.length > 0) {
- return items[0].getExpanded();
- }
- return false;
- }
-
- private void expandToLevel(VirtualItem item, int level) {
- if (level == ALL_LEVELS || level > 0) {
- if (!item.hasItems()) {
- return;
- }
-
- item.setExpanded(true);
-
- if (item.getData() == null) {
- virtualLazyUpdateData(item);
- // Cannot expand children if data is null.
- return;
- }
-
- if (level == ALL_LEVELS || level > 1) {
- VirtualItem[] children = item.getItems();
- int newLevel = (level == ALL_LEVELS ? ALL_LEVELS
- : level - 1);
- for (int i = 0; i < children.length; i++) {
- expandToLevel(children[i], newLevel);
- }
- }
- }
- }
-
- private void handleInvalidSelection(ISelection selection, ISelection newSelection) {
- IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(selection, getPresentationContext());
- if (selectionPolicy != null) {
- while (!selection.equals(newSelection)) {
- ISelection temp = newSelection;
- selection = selectionPolicy.replaceInvalidSelection(selection, newSelection);
- if (selection == null) {
- selection = TreeSelection.EMPTY;
- }
- if (!temp.equals(selection)) {
- internalSetSelection(selection, false);
- newSelection = getSelection();
- } else {
- break;
- }
- }
- }
-
- fireSelectionChanged(new SelectionChangedEvent(this, newSelection));
- }
-
- /**
- * Returns whether the candidate selection should override the current
- * selection.
- *
- * @param current Current selection in viewer
- * @param candidate New potential selection requested by model.
- * @return true if candidate selection should be set to viewer.
- */
- @Override
+ VirtualItem[] items = findItems(elementOrTreePath);
+ if (items.length > 0) {
+ return items[0].getExpanded();
+ }
+ return false;
+ }
+
+ private void expandToLevel(VirtualItem item, int level) {
+ if (level == ALL_LEVELS || level > 0) {
+ if (!item.hasItems()) {
+ return;
+ }
+
+ item.setExpanded(true);
+
+ if (item.getData() == null) {
+ virtualLazyUpdateData(item);
+ // Cannot expand children if data is null.
+ return;
+ }
+
+ if (level == ALL_LEVELS || level > 1) {
+ VirtualItem[] children = item.getItems();
+ int newLevel = (level == ALL_LEVELS ? ALL_LEVELS
+ : level - 1);
+ for (int i = 0; i < children.length; i++) {
+ expandToLevel(children[i], newLevel);
+ }
+ }
+ }
+ }
+
+ private void handleInvalidSelection(ISelection selection, ISelection newSelection) {
+ IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(selection, getPresentationContext());
+ if (selectionPolicy != null) {
+ while (!selection.equals(newSelection)) {
+ ISelection temp = newSelection;
+ selection = selectionPolicy.replaceInvalidSelection(selection, newSelection);
+ if (selection == null) {
+ selection = TreeSelection.EMPTY;
+ }
+ if (!temp.equals(selection)) {
+ internalSetSelection(selection, false);
+ newSelection = getSelection();
+ } else {
+ break;
+ }
+ }
+ }
+
+ fireSelectionChanged(new SelectionChangedEvent(this, newSelection));
+ }
+
+ /**
+ * Returns whether the candidate selection should override the current
+ * selection.
+ *
+ * @param current Current selection in viewer
+ * @param candidate New potential selection requested by model.
+ * @return true if candidate selection should be set to viewer.
+ */
+ @Override
public boolean overrideSelection(ISelection current, ISelection candidate) {
- IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(current, getPresentationContext());
- if (selectionPolicy == null) {
- return true;
- }
- if (selectionPolicy.contains(candidate, getPresentationContext())) {
- return selectionPolicy.overrides(current, candidate, getPresentationContext());
- }
- return !selectionPolicy.isSticky(current, getPresentationContext());
- }
-
- @Override
+ IModelSelectionPolicy selectionPolicy = ViewerAdapterService.getSelectionPolicy(current, getPresentationContext());
+ if (selectionPolicy == null) {
+ return true;
+ }
+ if (selectionPolicy.contains(candidate, getPresentationContext())) {
+ return selectionPolicy.overrides(current, candidate, getPresentationContext());
+ }
+ return !selectionPolicy.isSticky(current, getPresentationContext());
+ }
+
+ @Override
public ViewerFilter[] getFilters() {
- return fFilters;
- }
+ return fFilters;
+ }
- @Override
+ @Override
public void addFilter(ViewerFilter filter) {
- ViewerFilter[] newFilters = new ViewerFilter[fFilters.length + 1];
- System.arraycopy(fFilters, 0, newFilters, 0, fFilters.length);
- newFilters[fFilters.length] = filter;
- fFilters = newFilters;
- }
+ ViewerFilter[] newFilters = new ViewerFilter[fFilters.length + 1];
+ System.arraycopy(fFilters, 0, newFilters, 0, fFilters.length);
+ newFilters[fFilters.length] = filter;
+ fFilters = newFilters;
+ }
- @Override
+ @Override
public void setFilters(ViewerFilter... filters) {
- fFilters = filters;
- }
-
- public void dispose() {
- if (fColumnPresentation != null) {
- fColumnPresentation.dispose();
- }
-
- if (fContentProvider != null) {
- fContentProvider.dispose();
- fContentProvider = null;
- }
- if (fLabelProvider != null) {
- fLabelProvider.dispose();
- fLabelProvider = null;
- }
-
- fTree.removeItemListener(this);
- fTree.dispose();
- }
-
- /**
- * Returns this viewer's presentation context.
- *
- * @return presentation context
- */
- @Override
+ fFilters = filters;
+ }
+
+ public void dispose() {
+ if (fColumnPresentation != null) {
+ fColumnPresentation.dispose();
+ }
+
+ if (fContentProvider != null) {
+ fContentProvider.dispose();
+ fContentProvider = null;
+ }
+ if (fLabelProvider != null) {
+ fLabelProvider.dispose();
+ fLabelProvider = null;
+ }
+
+ fTree.removeItemListener(this);
+ fTree.dispose();
+ }
+
+ /**
+ * Returns this viewer's presentation context.
+ *
+ * @return presentation context
+ */
+ @Override
public IPresentationContext getPresentationContext() {
- return fContext;
- }
-
- /**
- * Configures the columns for the given viewer input.
- *
- * @param input new viewer input
- */
- private void resetColumns(Object input) {
- if (input != null) {
- // only change columns if the input is non-null (persist when empty)
- IColumnPresentationFactory factory = ViewerAdapterService.getColumnPresentationFactory(input);
- PresentationContext context = (PresentationContext) getPresentationContext();
- String type = null;
- if (factory != null) {
- type = factory.getColumnPresentationId(context, input);
- }
- if (type != null && factory != null) {
- if (fColumnPresentation != null) {
- if (!fColumnPresentation.getId().equals(type)) {
- // dispose old, create new
- fColumnPresentation.dispose();
- fColumnPresentation = null;
- }
- }
- if (fColumnPresentation == null) {
- fColumnPresentation = factory.createColumnPresentation(context, input);
- if (fColumnPresentation != null) {
- fColumnPresentation.init(context);
- configureColumns();
- }
- }
- } else {
- if (fColumnPresentation != null) {
- fColumnPresentation.dispose();
- fColumnPresentation = null;
- configureColumns();
- }
- }
- }
- }
-
- /**
- * Configures the columns based on the current settings.
- */
- protected void configureColumns() {
- if (fColumnPresentation != null) {
- IColumnPresentation build = null;
- if (isShowColumns(fColumnPresentation.getId())) {
- build = fColumnPresentation;
- }
- buildColumns(build);
- } else {
- // get rid of columns
- buildColumns(null);
- }
- }
-
- /**
- * Toggles columns on/off for the current column presentation, if any.
- *
- * @param show whether to show columns if the current input supports
- * columns
- */
- public void setShowColumns(boolean show) {
- if (show) {
- if (!isShowColumns()) {
- fShowColumns.remove(fColumnPresentation.getId());
- }
- } else {
- if (isShowColumns()){
- fShowColumns.put(fColumnPresentation.getId(), Boolean.FALSE);
- }
- }
- refreshColumns();
- }
-
- /**
- * Refreshes the columns in the view, based on the viewer input.
- */
- protected void refreshColumns() {
- configureColumns();
- refresh();
- }
-
- /**
- * @return Returns true if columns are being displayed currently.
- */
- public boolean isShowColumns() {
- if (fColumnPresentation != null) {
- return isShowColumns(fColumnPresentation.getId());
- }
- return false;
- }
-
- /**
- * Returns whether columns can be toggled on/off for the current input.
- *
- * @return whether columns can be toggled on/off for the current input
- */
- public boolean canToggleColumns() {
- return fColumnPresentation != null && fColumnPresentation.isOptional();
- }
-
- protected boolean isShowColumns(String columnPresentationId) {
- Boolean bool = fShowColumns.get(columnPresentationId);
- if (bool == null) {
- return true;
- }
- return bool.booleanValue();
- }
-
- /**
- * Creates new columns for the given presentation.
- *
- * @param presentation presentation context to build columns for.
- */
- protected void buildColumns(IColumnPresentation presentation) {
- PresentationContext presentationContext = (PresentationContext) getPresentationContext();
- if (presentation != null) {
- presentationContext.setColumns(getVisibleColumns());
- } else {
- presentationContext.setColumns(null);
- }
- }
-
- /**
- * Returns identifiers of the visible columns in this viewer, or <code>null</code>
- * if there is currently no column presentation.
- *
- * @return visible columns or <code>null</code>
- */
- @Override
+ return fContext;
+ }
+
+ /**
+ * Configures the columns for the given viewer input.
+ *
+ * @param input new viewer input
+ */
+ private void resetColumns(Object input) {
+ if (input != null) {
+ // only change columns if the input is non-null (persist when empty)
+ IColumnPresentationFactory factory = ViewerAdapterService.getColumnPresentationFactory(input);
+ PresentationContext context = (PresentationContext) getPresentationContext();
+ String type = null;
+ if (factory != null) {
+ type = factory.getColumnPresentationId(context, input);
+ }
+ if (type != null && factory != null) {
+ if (fColumnPresentation != null) {
+ if (!fColumnPresentation.getId().equals(type)) {
+ // dispose old, create new
+ fColumnPresentation.dispose();
+ fColumnPresentation = null;
+ }
+ }
+ if (fColumnPresentation == null) {
+ fColumnPresentation = factory.createColumnPresentation(context, input);
+ if (fColumnPresentation != null) {
+ fColumnPresentation.init(context);
+ configureColumns();
+ }
+ }
+ } else {
+ if (fColumnPresentation != null) {
+ fColumnPresentation.dispose();
+ fColumnPresentation = null;
+ configureColumns();
+ }
+ }
+ }
+ }
+
+ /**
+ * Configures the columns based on the current settings.
+ */
+ protected void configureColumns() {
+ if (fColumnPresentation != null) {
+ IColumnPresentation build = null;
+ if (isShowColumns(fColumnPresentation.getId())) {
+ build = fColumnPresentation;
+ }
+ buildColumns(build);
+ } else {
+ // get rid of columns
+ buildColumns(null);
+ }
+ }
+
+ /**
+ * Toggles columns on/off for the current column presentation, if any.
+ *
+ * @param show whether to show columns if the current input supports
+ * columns
+ */
+ public void setShowColumns(boolean show) {
+ if (show) {
+ if (!isShowColumns()) {
+ fShowColumns.remove(fColumnPresentation.getId());
+ }
+ } else {
+ if (isShowColumns()){
+ fShowColumns.put(fColumnPresentation.getId(), Boolean.FALSE);
+ }
+ }
+ refreshColumns();
+ }
+
+ /**
+ * Refreshes the columns in the view, based on the viewer input.
+ */
+ protected void refreshColumns() {
+ configureColumns();
+ refresh();
+ }
+
+ /**
+ * @return Returns true if columns are being displayed currently.
+ */
+ public boolean isShowColumns() {
+ if (fColumnPresentation != null) {
+ return isShowColumns(fColumnPresentation.getId());
+ }
+ return false;
+ }
+
+ /**
+ * Returns whether columns can be toggled on/off for the current input.
+ *
+ * @return whether columns can be toggled on/off for the current input
+ */
+ public boolean canToggleColumns() {
+ return fColumnPresentation != null && fColumnPresentation.isOptional();
+ }
+
+ protected boolean isShowColumns(String columnPresentationId) {
+ Boolean bool = fShowColumns.get(columnPresentationId);
+ if (bool == null) {
+ return true;
+ }
+ return bool.booleanValue();
+ }
+
+ /**
+ * Creates new columns for the given presentation.
+ *
+ * @param presentation presentation context to build columns for.
+ */
+ protected void buildColumns(IColumnPresentation presentation) {
+ PresentationContext presentationContext = (PresentationContext) getPresentationContext();
+ if (presentation != null) {
+ presentationContext.setColumns(getVisibleColumns());
+ } else {
+ presentationContext.setColumns(null);
+ }
+ }
+
+ /**
+ * Returns identifiers of the visible columns in this viewer, or <code>null</code>
+ * if there is currently no column presentation.
+ *
+ * @return visible columns or <code>null</code>
+ */
+ @Override
public String[] getVisibleColumns() {
- if (isShowColumns()) {
- IColumnPresentation presentation = getColumnPresentation();
- if (presentation != null) {
- String[] columns = fVisibleColumns.get(presentation.getId());
- if (columns == null) {
- return presentation.getInitialColumns();
- }
- return columns;
- }
- }
- return null;
- }
-
- /**
- * Sets the id's of visible columns, or <code>null</code> to set default columns.
- * Only affects the current column presentation.
- *
- * @param ids visible columns
- */
- public void setVisibleColumns(String[] ids) {
- if (ids != null && ids.length == 0) {
- ids = null;
- }
- IColumnPresentation presentation = getColumnPresentation();
- if (presentation != null) {
- fVisibleColumns.remove(presentation.getId());
- if (ids != null) {
- // put back in table if not default
- String[] columns = presentation.getInitialColumns();
- if (columns.length == ids.length) {
- for (int i = 0; i < columns.length; i++) {
- if (!ids[i].equals(columns[i])) {
- fVisibleColumns.put(presentation.getId(), ids);
- break;
- }
- }
- } else {
- fVisibleColumns.put(presentation.getId(), ids);
- }
- }
- PresentationContext presentationContext = (PresentationContext) getPresentationContext();
- presentationContext.setColumns(getVisibleColumns());
- refreshColumns();
- }
- }
-
- /**
- * Returns the current column presentation for this viewer, or <code>null</code>
- * if none.
- *
- * @return column presentation or <code>null</code>
- */
- public IColumnPresentation getColumnPresentation() {
- return fColumnPresentation;
- }
-
- /**
- * Save viewer state into the given memento.
- *
- * @param memento Memento to write state to.
- */
- public void saveState(IMemento memento) {
- if (!fShowColumns.isEmpty()) {
+ if (isShowColumns()) {
+ IColumnPresentation presentation = getColumnPresentation();
+ if (presentation != null) {
+ String[] columns = fVisibleColumns.get(presentation.getId());
+ if (columns == null) {
+ return presentation.getInitialColumns();
+ }
+ return columns;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Sets the id's of visible columns, or <code>null</code> to set default columns.
+ * Only affects the current column presentation.
+ *
+ * @param ids visible columns
+ */
+ public void setVisibleColumns(String[] ids) {
+ if (ids != null && ids.length == 0) {
+ ids = null;
+ }
+ IColumnPresentation presentation = getColumnPresentation();
+ if (presentation != null) {
+ fVisibleColumns.remove(presentation.getId());
+ if (ids != null) {
+ // put back in table if not default
+ String[] columns = presentation.getInitialColumns();
+ if (columns.length == ids.length) {
+ for (int i = 0; i < columns.length; i++) {
+ if (!ids[i].equals(columns[i])) {
+ fVisibleColumns.put(presentation.getId(), ids);
+ break;
+ }
+ }
+ } else {
+ fVisibleColumns.put(presentation.getId(), ids);
+ }
+ }
+ PresentationContext presentationContext = (PresentationContext) getPresentationContext();
+ presentationContext.setColumns(getVisibleColumns());
+ refreshColumns();
+ }
+ }
+
+ /**
+ * Returns the current column presentation for this viewer, or <code>null</code>
+ * if none.
+ *
+ * @return column presentation or <code>null</code>
+ */
+ public IColumnPresentation getColumnPresentation() {
+ return fColumnPresentation;
+ }
+
+ /**
+ * Save viewer state into the given memento.
+ *
+ * @param memento Memento to write state to.
+ */
+ public void saveState(IMemento memento) {
+ if (!fShowColumns.isEmpty()) {
for (Entry<String, Boolean> entry : fShowColumns.entrySet()) {
- IMemento sizes = memento.createChild(SHOW_COLUMNS, entry.getKey());
- sizes.putString(SHOW_COLUMNS, entry.getValue().toString());
- }
- }
- if (!fVisibleColumns.isEmpty()) {
+ IMemento sizes = memento.createChild(SHOW_COLUMNS, entry.getKey());
+ sizes.putString(SHOW_COLUMNS, entry.getValue().toString());
+ }
+ }
+ if (!fVisibleColumns.isEmpty()) {
for (Entry<String, String[]> entry : fVisibleColumns.entrySet()) {
IMemento visible = memento.createChild(VISIBLE_COLUMNS, entry.getKey());
- String[] columns = entry.getValue();
- visible.putInteger(SIZE, columns.length);
- for (int i = 0; i < columns.length; i++) {
- visible.putString(COLUMN+Integer.toString(i), columns[i]);
- }
- }
- }
- // save presentation context properties
- IPresentationContext context = getPresentationContext();
- if (context instanceof PresentationContext) {
- PresentationContext pc = (PresentationContext) context;
- pc.saveProperites(memento);
-
- }
- }
-
- /**
- * Initializes viewer state from the memento
- *
- * @param memento Memento to read state from.
- */
- public void initState(IMemento memento) {
- IMemento[] mementos = memento.getChildren(SHOW_COLUMNS);
- for (int i = 0; i < mementos.length; i++) {
- IMemento child = mementos[i];
- String id = child.getID();
- Boolean bool = Boolean.valueOf(child.getString(SHOW_COLUMNS));
- if (!bool.booleanValue()) {
- fShowColumns.put(id, bool);
- }
- }
- mementos = memento.getChildren(VISIBLE_COLUMNS);
- for (int i = 0; i < mementos.length; i++) {
- IMemento child = mementos[i];
- String id = child.getID();
- Integer integer = child.getInteger(SIZE);
- if (integer != null) {
- int length = integer.intValue();
- String[] columns = new String[length];
- for (int j = 0; j < length; j++) {
- columns[j] = child.getString(COLUMN+Integer.toString(j));
- }
- fVisibleColumns.put(id, columns);
- }
- }
- // restore presentation context properties
- // save presentation context properties
- IPresentationContext context = getPresentationContext();
- if (context instanceof PresentationContext) {
- PresentationContext pc = (PresentationContext) context;
- pc.initProperties(memento);
- }
- }
-
- @Override
+ String[] columns = entry.getValue();
+ visible.putInteger(SIZE, columns.length);
+ for (int i = 0; i < columns.length; i++) {
+ visible.putString(COLUMN+Integer.toString(i), columns[i]);
+ }
+ }
+ }
+ // save presentation context properties
+ IPresentationContext context = getPresentationContext();
+ if (context instanceof PresentationContext) {
+ PresentationContext pc = (PresentationContext) context;
+ pc.saveProperites(memento);
+
+ }
+ }
+
+ /**
+ * Initializes viewer state from the memento
+ *
+ * @param memento Memento to read state from.
+ */
+ public void initState(IMemento memento) {
+ IMemento[] mementos = memento.getChildren(SHOW_COLUMNS);
+ for (int i = 0; i < mementos.length; i++) {
+ IMemento child = mementos[i];
+ String id = child.getID();
+ Boolean bool = Boolean.valueOf(child.getString(SHOW_COLUMNS));
+ if (!bool.booleanValue()) {
+ fShowColumns.put(id, bool);
+ }
+ }
+ mementos = memento.getChildren(VISIBLE_COLUMNS);
+ for (int i = 0; i < mementos.length; i++) {
+ IMemento child = mementos[i];
+ String id = child.getID();
+ Integer integer = child.getInteger(SIZE);
+ if (integer != null) {
+ int length = integer.intValue();
+ String[] columns = new String[length];
+ for (int j = 0; j < length; j++) {
+ columns[j] = child.getString(COLUMN+Integer.toString(j));
+ }
+ fVisibleColumns.put(id, columns);
+ }
+ }
+ // restore presentation context properties
+ // save presentation context properties
+ IPresentationContext context = getPresentationContext();
+ if (context instanceof PresentationContext) {
+ PresentationContext pc = (PresentationContext) context;
+ pc.initProperties(memento);
+ }
+ }
+
+ @Override
public void addViewerUpdateListener(IViewerUpdateListener listener) {
- getContentProvider().addViewerUpdateListener(listener);
- }
+ getContentProvider().addViewerUpdateListener(listener);
+ }
- @Override
+ @Override
public void removeViewerUpdateListener(IViewerUpdateListener listener) {
- ITreeModelContentProvider cp = getContentProvider();
- if (cp != null) {
- cp.removeViewerUpdateListener(listener);
- }
- }
+ ITreeModelContentProvider cp = getContentProvider();
+ if (cp != null) {
+ cp.removeViewerUpdateListener(listener);
+ }
+ }
- @Override
+ @Override
public void addModelChangedListener(IModelChangedListener listener) {
- getContentProvider().addModelChangedListener(listener);
- }
+ getContentProvider().addModelChangedListener(listener);
+ }
- @Override
+ @Override
public void removeModelChangedListener(IModelChangedListener listener) {
- ITreeModelContentProvider cp = getContentProvider();
- if (cp != null) {
- cp.removeModelChangedListener(listener);
- }
- }
+ ITreeModelContentProvider cp = getContentProvider();
+ if (cp != null) {
+ cp.removeModelChangedListener(listener);
+ }
+ }
- @Override
+ @Override
public void addStateUpdateListener(IStateUpdateListener listener) {
- getContentProvider().addStateUpdateListener(listener);
- }
+ getContentProvider().addStateUpdateListener(listener);
+ }
- @Override
+ @Override
public void removeStateUpdateListener(IStateUpdateListener listener) {
- ITreeModelContentProvider cp = getContentProvider();
- if (cp != null) {
- cp.removeStateUpdateListener(listener);
- }
- }
+ ITreeModelContentProvider cp = getContentProvider();
+ if (cp != null) {
+ cp.removeStateUpdateListener(listener);
+ }
+ }
@Override
public void addLabelUpdateListener(ILabelUpdateListener listener) {
- getLabelProvider().addLabelUpdateListener(listener);
- }
+ getLabelProvider().addLabelUpdateListener(listener);
+ }
- @Override
+ @Override
public void removeLabelUpdateListener(ILabelUpdateListener listener) {
- getLabelProvider().removeLabelUpdateListener(listener);
- }
-
- /**
- * Performs auto expand on an element at the specified path if the auto expand
- * level dictates the element should be expanded.
- *
- * @param elementPath tree path to element to consider for expansion
- */
- @Override
+ getLabelProvider().removeLabelUpdateListener(listener);
+ }
+
+ /**
+ * Performs auto expand on an element at the specified path if the auto expand
+ * level dictates the element should be expanded.
+ *
+ * @param elementPath tree path to element to consider for expansion
+ */
+ @Override
public void autoExpand(TreePath elementPath) {
- int level = getAutoExpandLevel();
- if (level > 0 || level == org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer.ALL_LEVELS) {
- if (level == org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer.ALL_LEVELS || level > elementPath.getSegmentCount()) {
- expandToLevel(elementPath, 1);
- }
- }
- }
-
- @Override
+ int level = getAutoExpandLevel();
+ if (level > 0 || level == org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer.ALL_LEVELS) {
+ if (level == org.eclipse.debug.internal.ui.viewers.model.provisional.ITreeModelViewer.ALL_LEVELS || level > elementPath.getSegmentCount()) {
+ expandToLevel(elementPath, 1);
+ }
+ }
+ }
+
+ @Override
public int getChildCount(TreePath path) {
- int childCount = -1;
- VirtualItem[] items = findItems(path);
- if (items.length > 0) {
- childCount = items[0].getItemCount();
- // Mimic the jface viewer behavior which returns 1 for child count
- // for an item that has children but is not yet expanded.
- // Return 0, if we do not know if the item has children.
- if (childCount == -1) {
- childCount = items[0].hasItems() ? 1 : 0;
- }
- }
- return childCount;
- }
-
- @Override
+ int childCount = -1;
+ VirtualItem[] items = findItems(path);
+ if (items.length > 0) {
+ childCount = items[0].getItemCount();
+ // Mimic the jface viewer behavior which returns 1 for child count
+ // for an item that has children but is not yet expanded.
+ // Return 0, if we do not know if the item has children.
+ if (childCount == -1) {
+ childCount = items[0].hasItems() ? 1 : 0;
+ }
+ }
+ return childCount;
+ }
+
+ @Override
public Object getChildElement(TreePath path, int index) {
- VirtualItem[] items = findItems(path);
- if (items.length > 0) {
- if (index < items[0].getItemCount()) {
- return items[0].getItem(new VirtualItem.Index(index)).getData();
- }
- }
- return null;
- }
-
- @Override
+ VirtualItem[] items = findItems(path);
+ if (items.length > 0) {
+ if (index < items[0].getItemCount()) {
+ return items[0].getItem(new VirtualItem.Index(index)).getData();
+ }
+ }
+ return null;
+ }
+
+ @Override
public TreePath getTopElementPath() {
- return null;
- }
+ return null;
+ }
- @Override
+ @Override
public boolean saveElementState(TreePath path, ModelDelta delta, int flagsToSave) {
- VirtualTree tree = getTree();
- VirtualItem[] selection = tree.getSelection();
+ VirtualTree tree = getTree();
+ VirtualItem[] selection = tree.getSelection();
Set<VirtualItem> set = new HashSet<>();
- for (int i = 0; i < selection.length; i++) {
- set.add(selection[i]);
- }
-
- VirtualItem[] items = null;
- VirtualItem parent = findItem(path);
-
- if (parent != null) {
- delta.setChildCount(((TreeModelContentProvider)getContentProvider()).viewToModelCount(path, parent.getItemCount()));
- if (parent.getExpanded()) {
- if ((flagsToSave & IModelDelta.EXPAND) != 0) {
- delta.setFlags(delta.getFlags() | IModelDelta.EXPAND);
- }
- } else if ((flagsToSave & IModelDelta.COLLAPSE) != 0 && parent.hasItems()){
- delta.setFlags(delta.getFlags() | IModelDelta.COLLAPSE);
- }
-
- if (set.contains(parent) && (flagsToSave & IModelDelta.SELECT) != 0) {
- delta.setFlags(delta.getFlags() | IModelDelta.SELECT);
- }
-
- items = parent.getItems();
- for (int i = 0; i < items.length; i++) {
- doSaveElementState(path, delta, items[i], set, flagsToSave);
- }
- return true;
- } else {
- return false;
- }
- }
+ for (int i = 0; i < selection.length; i++) {
+ set.add(selection[i]);
+ }
+
+ VirtualItem[] items = null;
+ VirtualItem parent = findItem(path);
+
+ if (parent != null) {
+ delta.setChildCount(((TreeModelContentProvider)getContentProvider()).viewToModelCount(path, parent.getItemCount()));
+ if (parent.getExpanded()) {
+ if ((flagsToSave & IModelDelta.EXPAND) != 0) {
+ delta.setFlags(delta.getFlags() | IModelDelta.EXPAND);
+ }
+ } else if ((flagsToSave & IModelDelta.COLLAPSE) != 0 && parent.hasItems()){
+ delta.setFlags(delta.getFlags() | IModelDelta.COLLAPSE);
+ }
+
+ if (set.contains(parent) && (flagsToSave & IModelDelta.SELECT) != 0) {
+ delta.setFlags(delta.getFlags() | IModelDelta.SELECT);
+ }
+
+ items = parent.getItems();
+ for (int i = 0; i < items.length; i++) {
+ doSaveElementState(path, delta, items[i], set, flagsToSave);
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
private void doSaveElementState(TreePath parentPath, ModelDelta delta, VirtualItem item, Collection<VirtualItem> set, int flagsToSave) {
- Object element = item.getData();
- if (element != null) {
- boolean expanded = item.getExpanded();
- boolean selected = set.contains(item);
- int flags = IModelDelta.NO_CHANGE;
- if (expanded && (flagsToSave & IModelDelta.EXPAND) != 0) {
- flags = flags | IModelDelta.EXPAND;
- }
- if (!expanded && (flagsToSave & IModelDelta.COLLAPSE) != 0 && item.hasItems()){
- flags = flags | IModelDelta.COLLAPSE;
- }
- if (selected && (flagsToSave & IModelDelta.SELECT) != 0) {
- flags = flags | IModelDelta.SELECT;
- }
- if (expanded || flags != IModelDelta.NO_CHANGE) {
- int modelIndex = ((TreeModelContentProvider)getContentProvider()).viewToModelIndex(parentPath, item.getIndex().intValue());
- TreePath elementPath = parentPath.createChildPath(element);
- int numChildren = ((TreeModelContentProvider)getContentProvider()).viewToModelCount(elementPath, item.getItemCount());
- ModelDelta childDelta = delta.addNode(element, modelIndex, flags, numChildren);
- if (expanded) {
- VirtualItem[] items = item.getItems();
- for (int i = 0; i < items.length; i++) {
- doSaveElementState(elementPath, childDelta, items[i], set, flagsToSave);
- }
- }
- }
- }
- }
-
- @Override
+ Object element = item.getData();
+ if (element != null) {
+ boolean expanded = item.getExpanded();
+ boolean selected = set.contains(item);
+ int flags = IModelDelta.NO_CHANGE;
+ if (expanded && (flagsToSave & IModelDelta.EXPAND) != 0) {
+ flags = flags | IModelDelta.EXPAND;
+ }
+ if (!expanded && (flagsToSave & IModelDelta.COLLAPSE) != 0 && item.hasItems()){
+ flags = flags | IModelDelta.COLLAPSE;
+ }
+ if (selected && (flagsToSave & IModelDelta.SELECT) != 0) {
+ flags = flags | IModelDelta.SELECT;
+ }
+ if (expanded || flags != IModelDelta.NO_CHANGE) {
+ int modelIndex = ((TreeModelContentProvider)getContentProvider()).viewToModelIndex(parentPath, item.getIndex().intValue());
+ TreePath elementPath = parentPath.createChildPath(element);
+ int numChildren = ((TreeModelContentProvider)getContentProvider()).viewToModelCount(elementPath, item.getItemCount());
+ ModelDelta childDelta = delta.addNode(element, modelIndex, flags, numChildren);
+ if (expanded) {
+ VirtualItem[] items = item.getItems();
+ for (int i = 0; i < items.length; i++) {
+ doSaveElementState(elementPath, childDelta, items[i], set, flagsToSave);
+ }
+ }
+ }
+ }
+ }
+
+ @Override
public void updateViewer(IModelDelta delta) {
- getContentProvider().updateModel(delta, ITreeModelContentProvider.ALL_MODEL_DELTA_FLAGS);
- }
+ getContentProvider().updateModel(delta, ITreeModelContentProvider.ALL_MODEL_DELTA_FLAGS);
+ }
- @Override
+ @Override
public ViewerLabel getElementLabel(TreePath path, String columnId) {
- if (path.getSegmentCount() == 0) {
- return null;
- }
-
- int columnIdx = -1;
- String[] visibleColumns = getVisibleColumns();
- if (columnId != null && visibleColumns != null) {
- int i = 0;
- for (i = 0; i < visibleColumns.length; i++) {
- if (columnId.equals(getVisibleColumns()[i])) {
- columnIdx = i;
- break;
- }
- }
- if (i == visibleColumns.length) {
- return null;
- }
- } else {
- columnIdx = 0;
- }
- VirtualItem item = findItem(path);
-
- if (item != null) {
- ViewerLabel label = new ViewerLabel(getText(item, columnIdx), getImage(item, columnIdx));
- label.setFont(getFont(item, columnIdx));
- label.setBackground(getBackground(item, columnIdx));
- label.setForeground(getForeground(item, columnIdx));
- return label;
- }
- return null;
- }
-
- @Override
+ if (path.getSegmentCount() == 0) {
+ return null;
+ }
+
+ int columnIdx = -1;
+ String[] visibleColumns = getVisibleColumns();
+ if (columnId != null && visibleColumns != null) {
+ int i = 0;
+ for (i = 0; i < visibleColumns.length; i++) {
+ if (columnId.equals(getVisibleColumns()[i])) {
+ columnIdx = i;
+ break;
+ }
+ }
+ if (i == visibleColumns.length) {
+ return null;
+ }
+ } else {
+ columnIdx = 0;
+ }
+ VirtualItem item = findItem(path);
+
+ if (item != null) {
+ ViewerLabel label = new ViewerLabel(getText(item, columnIdx), getImage(item, columnIdx));
+ label.setFont(getFont(item, columnIdx));
+ label.setBackground(getBackground(item, columnIdx));
+ label.setForeground(getForeground(item, columnIdx));
+ return label;
+ }
+ return null;
+ }
+
+ @Override
public TreePath[] getElementPaths(Object element) {
- VirtualItem[] items = findItems(element);
- TreePath[] paths = new TreePath[items.length];
- for (int i = 0; i < items.length; i++) {
- paths[i] = getTreePathFromItem(items[i]);
- }
- return paths;
- }
-
-
- public String getText(VirtualItem item, int columnIdx) {
- String[] texts = (String[])item.getData(VirtualItem.LABEL_KEY);
- if (texts != null && texts.length > columnIdx) {
- return texts[columnIdx];
- }
- return null;
- }
-
- public Image getImage(VirtualItem item, int columnIdx) {
- ImageDescriptor[] imageDescriptors = (ImageDescriptor[]) item.getData(VirtualItem.IMAGE_KEY);
- if (imageDescriptors != null && imageDescriptors.length > columnIdx) {
- return getLabelProvider().getImage(imageDescriptors[columnIdx]);
- }
- return null;
- }
-
- public Font getFont(VirtualItem item, int columnIdx) {
- FontData[] fontDatas = (FontData[]) item.getData(VirtualItem.FONT_KEY);
- if (fontDatas != null) {
- return getLabelProvider().getFont(fontDatas[columnIdx]);
- }
- return null;
- }
-
- public Color getForeground(VirtualItem item, int columnIdx) {
- RGB[] rgbs = (RGB[]) item.getData(VirtualItem.FOREGROUND_KEY);
- if (rgbs != null) {
- return getLabelProvider().getColor(rgbs[columnIdx]);
- }
- return null;
- }
-
- public Color getBackground(VirtualItem item, int columnIdx) {
- RGB[] rgbs = (RGB[]) item.getData(VirtualItem.BACKGROUND_KEY);
- if (rgbs != null) {
- return getLabelProvider().getColor(rgbs[columnIdx]);
- }
- return null;
- }
-
- @Override
+ VirtualItem[] items = findItems(element);
+ TreePath[] paths = new TreePath[items.length];
+ for (int i = 0; i < items.length; i++) {
+ paths[i] = getTreePathFromItem(items[i]);
+ }
+ return paths;
+ }
+
+
+ public String getText(VirtualItem item, int columnIdx) {
+ String[] texts = (String[])item.getData(VirtualItem.LABEL_KEY);
+ if (texts != null && texts.length > columnIdx) {
+ return texts[columnIdx];
+ }
+ return null;
+ }
+
+ public Image getImage(VirtualItem item, int columnIdx) {
+ ImageDescriptor[] imageDescriptors = (ImageDescriptor[]) item.getData(VirtualItem.IMAGE_KEY);
+ if (imageDescriptors != null && imageDescriptors.length > columnIdx) {
+ return getLabelProvider().getImage(imageDescriptors[columnIdx]);
+ }
+ return null;
+ }
+
+ public Font getFont(VirtualItem item, int columnIdx) {
+ FontData[] fontDatas = (FontData[]) item.getData(VirtualItem.FONT_KEY);
+ if (fontDatas != null) {
+ return getLabelProvider().getFont(fontDatas[columnIdx]);
+ }
+ return null;
+ }
+
+ public Color getForeground(VirtualItem item, int columnIdx) {
+ RGB[] rgbs = (RGB[]) item.getData(VirtualItem.FOREGROUND_KEY);
+ if (rgbs != null) {
+ return getLabelProvider().getColor(rgbs[columnIdx]);
+ }
+ return null;
+ }
+
+ public Color getBackground(VirtualItem item, int columnIdx) {
+ RGB[] rgbs = (RGB[]) item.getData(VirtualItem.BACKGROUND_KEY);
+ if (rgbs != null) {
+ return getLabelProvider().getColor(rgbs[columnIdx]);
+ }
+ return null;
+ }
+
+ @Override
public void clearSelectionQuiet() {
- getTree().setSelection(EMPTY_ITEMS_ARRAY);
- }
+ getTree().setSelection(EMPTY_ITEMS_ARRAY);
+ }
- @Override
+ @Override
public boolean getElementChecked(TreePath path) {
- // Not supported
- return false;
- }
+ // Not supported
+ return false;
+ }
- @Override
+ @Override
public boolean getElementGrayed(TreePath path) {
- // Not supported
- return false;
- }
+ // Not supported
+ return false;
+ }
- @Override
+ @Override
public void setElementChecked(TreePath path, boolean checked, boolean grayed) {
- // Not supported
- }
+ // Not supported
+ }
- @Override
+ @Override
public String toString() {
- return getTree().toString();
- }
+ return getTree().toString();
+ }
}

Back to the top