Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ContainerCheckedTreeViewer.java')
-rw-r--r--bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ContainerCheckedTreeViewer.java306
1 files changed, 0 insertions, 306 deletions
diff --git a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ContainerCheckedTreeViewer.java b/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ContainerCheckedTreeViewer.java
deleted file mode 100644
index fef8274d3..000000000
--- a/bundles/org.eclipse.equinox.p2.ui/src/org/eclipse/equinox/internal/p2/ui/dialogs/ContainerCheckedTreeViewer.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.equinox.internal.p2.ui.dialogs;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import org.eclipse.equinox.internal.p2.ui.model.QueriedElement;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.widgets.*;
-
-/**
- * Copy of ContainerCheckedTreeViewer which is specialized for use
- * with DeferredFetchFilteredTree. Originally copied from
- * org.eclipse.ui.dialogs and altered to achieve the following:
- *
- * (1)checking a parent will expand it when we know it's a long
- * running operation that involves a placeholder.
-* The modified method is doCheckStateChanged().
-*
- * (2)when preserving selection, we do not want the check state
- * to be rippled through the child and parent nodes.
- * Since we know that preservingSelection(Runnable) isn't working
- * properly, no need to do a bunch of work here.
- * The added methods is preservingSelection(Runnable).
- * Modified methods are updateChildrenItems(TreeItem parent) and
- * updateParentItems(TreeItem parent).
- *
- * (3)we correct the problem with preservingSelection(Runnable) by
- * remembering the check state and restoring it after a refresh. We
- * fire a check state event so clients monitoring the selection will know
- * what's going on. Added methods are internalRefresh(Object, boolean),
- * saveCheckedState(), restoreCheckedState(), and
- * fireCheckStateChanged(Object, boolean). That last method is public
- * so that DeferredFetchFilteredTree can do the same thing when it
- * remembers selections.
- *
- * This class does not correct the general problem reported in
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=170521
- * That is handled by preserving selections additively in
- * DeferredFetchFilteredTree. This class simply provides the API
- * needed by that class and manages the parent state according to the
- * children.
- */
-public class ContainerCheckedTreeViewer extends CheckboxTreeViewer {
-
- private boolean rippleCheckMarks = true;
- private ArrayList<Object> savedCheckState;
-
- /**
- * Constructor for ContainerCheckedTreeViewer.
- * @see CheckboxTreeViewer#CheckboxTreeViewer(Composite)
- */
- public ContainerCheckedTreeViewer(Composite parent) {
- super(parent);
- initViewer();
- }
-
- /**
- * Constructor for ContainerCheckedTreeViewer.
- * @see CheckboxTreeViewer#CheckboxTreeViewer(Composite,int)
- */
- public ContainerCheckedTreeViewer(Composite parent, int style) {
- super(parent, style);
- initViewer();
- }
-
- /**
- * Constructor for ContainerCheckedTreeViewer.
- * @see CheckboxTreeViewer#CheckboxTreeViewer(Tree)
- */
- public ContainerCheckedTreeViewer(Tree tree) {
- super(tree);
- initViewer();
- }
-
- private void initViewer() {
- setUseHashlookup(true);
- addCheckStateListener(new ICheckStateListener() {
- public void checkStateChanged(CheckStateChangedEvent event) {
- doCheckStateChanged(event.getElement());
- }
- });
- addTreeListener(new ITreeViewerListener() {
- public void treeCollapsed(TreeExpansionEvent event) {
- }
-
- public void treeExpanded(TreeExpansionEvent event) {
- Widget item = findItem(event.getElement());
- if (item instanceof TreeItem) {
- initializeItem((TreeItem) item);
- }
- }
- });
- }
-
- /**
- * Update element after a checkstate change.
- * @param element
- */
- protected void doCheckStateChanged(Object element) {
- Widget item = findItem(element);
- if (item instanceof TreeItem) {
- TreeItem treeItem = (TreeItem) item;
- treeItem.setGrayed(false);
- // BEGIN MODIFICATION OF COPIED CLASS
- if (element instanceof QueriedElement && treeItem.getChecked()) {
- if (!((QueriedElement) element).hasQueryable()) {
- // We have checked an element that will take some time
- // to get its children. Use this opportunity to auto-expand
- // the tree so that the check mark is not misleading. Don't
- // update the check state because it will just be a pending
- // placeholder.
- expandToLevel(element, 1);
- return;
- }
- }
- // END MODIFICATION OF COPIED CLASS
- updateChildrenItems(treeItem);
- updateParentItems(treeItem.getParentItem());
- }
- }
-
- /**
- * The item has expanded. Updates the checked state of its children.
- */
- private void initializeItem(TreeItem item) {
- if (item.getChecked() && !item.getGrayed()) {
- updateChildrenItems(item);
- }
- }
-
- /**
- * Updates the check state of all created children
- */
- // MODIFIED to ignore parent state when in the middle of a
- // selection preserving refresh.
- private void updateChildrenItems(TreeItem parent) {
- // We are in the middle of preserving selections, don't
- // update any children according to parent
- if (!rippleCheckMarks)
- return;
- Item[] children = getChildren(parent);
- boolean state = parent.getChecked();
- for (int i = 0; i < children.length; i++) {
- TreeItem curr = (TreeItem) children[i];
- if (curr.getData() != null && ((curr.getChecked() != state) || curr.getGrayed())) {
- curr.setChecked(state);
- curr.setGrayed(false);
- updateChildrenItems(curr);
- }
- }
- }
-
- /**
- * Updates the check / gray state of all parent items
- */
- private void updateParentItems(TreeItem item) {
- // We are in the middle of preserving selections, don't
- // update any parents according to children
- if (!rippleCheckMarks)
- return;
- if (item != null) {
- Item[] children = getChildren(item);
- boolean containsChecked = false;
- boolean containsUnchecked = false;
- for (int i = 0; i < children.length; i++) {
- TreeItem curr = (TreeItem) children[i];
- containsChecked |= curr.getChecked();
- containsUnchecked |= (!curr.getChecked() || curr.getGrayed());
- }
- item.setChecked(containsChecked);
- item.setGrayed(containsChecked && containsUnchecked);
- updateParentItems(item.getParentItem());
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.ICheckable#setChecked(java.lang.Object, boolean)
- */
- public boolean setChecked(Object element, boolean state) {
- if (super.setChecked(element, state)) {
- doCheckStateChanged(element);
- return true;
- }
- return false;
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.CheckboxTreeViewer#setCheckedElements(java.lang.Object[])
- */
- public void setCheckedElements(Object[] elements) {
- super.setCheckedElements(elements);
- for (int i = 0; i < elements.length; i++) {
- doCheckStateChanged(elements[i]);
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.AbstractTreeViewer#setExpanded(org.eclipse.swt.widgets.Item, boolean)
- */
- protected void setExpanded(Item item, boolean expand) {
- super.setExpanded(item, expand);
- if (expand && item instanceof TreeItem) {
- initializeItem((TreeItem) item);
- }
- }
-
- /* (non-Javadoc)
- * @see org.eclipse.jface.viewers.CheckboxTreeViewer#getCheckedElements()
- */
- public Object[] getCheckedElements() {
- Object[] checked = super.getCheckedElements();
- // add all items that are children of a checked node but not created yet
- ArrayList<Object> result = new ArrayList<Object>();
- for (int i = 0; i < checked.length; i++) {
- Object curr = checked[i];
- result.add(curr);
- Widget item = findItem(curr);
- if (item != null) {
- Item[] children = getChildren(item);
- // check if contains the dummy node
- if (children.length == 1 && children[0].getData() == null) {
- // not yet created
- collectChildren(curr, result);
- }
- }
- }
- return result.toArray();
- }
-
- /**
- * Recursively add the filtered children of element to the result.
- * @param element
- * @param result
- */
- private void collectChildren(Object element, ArrayList<Object> result) {
- Object[] filteredChildren = getFilteredChildren(element);
- for (int i = 0; i < filteredChildren.length; i++) {
- Object curr = filteredChildren[i];
- result.add(curr);
- collectChildren(curr, result);
- }
- }
-
- // The super implementation doesn't really work because the
- // non-expanded items are not holding their real elements yet.
- // Yet the code that records the checked state uses the
- // elements to remember what checkmarks should be restored.
- // The result is that non-expanded elements are not up to date
- // and if anything in there should have been checked, it
- // won't be. The best we can do is at least turn off all the
- // rippling checks that happen during this method since we are going
- // to reset all the checkmarks anyway.
- protected void preservingSelection(Runnable updateCode) {
- rippleCheckMarks = false;
- super.preservingSelection(updateCode);
- rippleCheckMarks = true;
- }
-
- protected void internalRefresh(Object element, boolean updateLabels) {
- saveCheckedState();
- super.internalRefresh(element, updateLabels);
- restoreCheckedState();
- }
-
- // We only remember the leaves. This is specific to our
- // use case, not necessarily a good idea for fixing the general
- // problem.
- private void saveCheckedState() {
- Object[] checked = getCheckedElements();
- savedCheckState = new ArrayList<Object>(checked.length);
- for (int i = 0; i < checked.length; i++)
- if (!isExpandable(checked[i]) && !getGrayed(checked[i]))
- savedCheckState.add(checked[i]);
- }
-
- // Now we restore checked state.
- private void restoreCheckedState() {
- setCheckedElements(new Object[0]);
- setGrayedElements(new Object[0]);
- Object element = null;
- // We are assuming that once a leaf, always a leaf.
- Iterator<Object> iter = savedCheckState.iterator();
- while (iter.hasNext()) {
- element = iter.next();
- setChecked(element, true);
- }
- // Listeners need to know something changed.
- if (element != null)
- fireCheckStateChanged(element, true);
- }
-
- // This method is public so that the DeferredFetchFilteredTree can also
- // call it.
- public void fireCheckStateChanged(Object element, boolean state) {
- fireCheckStateChanged(new CheckStateChangedEvent(this, element, state));
- }
-}

Back to the top