Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy')
-rw-r--r--plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/AbstractTreeBrowseStrategy.java31
-rw-r--r--plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/IStrategyBasedContentProvider.java22
-rw-r--r--plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/ProviderBasedBrowseStrategy.java133
-rw-r--r--plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/TreeBrowseStrategy.java41
4 files changed, 227 insertions, 0 deletions
diff --git a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/AbstractTreeBrowseStrategy.java b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/AbstractTreeBrowseStrategy.java
new file mode 100644
index 00000000000..9bae275fa94
--- /dev/null
+++ b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/AbstractTreeBrowseStrategy.java
@@ -0,0 +1,31 @@
+/*****************************************************************************
+ * Copyright (c) 2012 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.widgets.strategy;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.Viewer;
+
+
+public abstract class AbstractTreeBrowseStrategy implements TreeBrowseStrategy {
+
+ public void dispose() {
+ //Nothing
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ //Nothing
+ }
+
+ abstract public void revealSemanticElement(List<?> elementsList);
+
+}
diff --git a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/IStrategyBasedContentProvider.java b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/IStrategyBasedContentProvider.java
new file mode 100644
index 00000000000..47ea97567e7
--- /dev/null
+++ b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/IStrategyBasedContentProvider.java
@@ -0,0 +1,22 @@
+/*****************************************************************************
+ * Copyright (c) 2012 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.widgets.strategy;
+
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+
+
+public interface IStrategyBasedContentProvider extends IStructuredContentProvider {
+
+ public TreeBrowseStrategy getBrowseStrategy();
+
+ public TreeBrowseStrategy getRevealStrategy();
+}
diff --git a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/ProviderBasedBrowseStrategy.java b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/ProviderBasedBrowseStrategy.java
new file mode 100644
index 00000000000..6bab3b7fe21
--- /dev/null
+++ b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/ProviderBasedBrowseStrategy.java
@@ -0,0 +1,133 @@
+/*****************************************************************************
+ * Copyright (c) 2012 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.widgets.strategy;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.papyrus.infra.tools.util.ListHelper;
+import org.eclipse.papyrus.infra.widgets.Activator;
+import org.eclipse.papyrus.infra.widgets.providers.EncapsulatedContentProvider;
+import org.eclipse.papyrus.infra.widgets.providers.IHierarchicContentProvider;
+
+
+public class ProviderBasedBrowseStrategy extends EncapsulatedContentProvider implements TreeBrowseStrategy {
+
+ protected ITreeContentProvider provider;
+
+ protected boolean filterElements = false;
+
+ protected final Map<Object, Boolean> cache = new HashMap<Object, Boolean>();
+
+ protected final Map<Object, Boolean> visibleChildCache = new HashMap<Object, Boolean>();
+
+ public ProviderBasedBrowseStrategy(ITreeContentProvider provider) {
+ setProvider(provider);
+ }
+
+ public ProviderBasedBrowseStrategy() {
+
+ }
+
+ public void setProvider(ITreeContentProvider provider) {
+ encapsulated = provider;
+ this.provider = provider;
+ filterElements = provider instanceof IHierarchicContentProvider;
+ clearCache();
+ }
+
+ @Override
+ public Object[] getChildren(Object parent) {
+ if(provider == null) {
+ Activator.log.warn("The provider has not been initialized");
+ return new Object[0];
+ }
+
+ return filterElements ? getValidChildren(parent, new HashSet<Object>()) : super.getChildren(parent);
+ }
+
+ @Override
+ public boolean hasChildren(Object parent) {
+ //May be expensive
+ return getChildren(parent).length > 0;
+ }
+
+ protected Object[] getValidChildren(Object parent, Set<Object> visitedElements) {
+ List<?> children = ListHelper.asList(super.getChildren(parent));
+ Iterator<?> childrenIterator = children.iterator();
+ while(childrenIterator.hasNext()) {
+ Object child = childrenIterator.next();
+ if(!isValid(child, visitedElements)) {
+ childrenIterator.remove();
+ }
+ }
+
+ return children.toArray();
+ }
+
+ protected boolean isValid(Object containerElement, Set<Object> visitedElements) {
+ if(!cache.containsKey(containerElement)) {
+ boolean isVisible;
+
+ if(browseElement(containerElement)) {
+ isVisible = isValidValue(containerElement) || hasOneVisibleChild(containerElement, visitedElements);
+ } else {
+ isVisible = false;
+ }
+
+ cache.put(containerElement, isVisible);
+ }
+ return cache.get(containerElement);
+ }
+
+ protected boolean browseElement(Object containerElement) {
+ return true;
+ }
+
+ protected boolean hasOneVisibleChild(Object element, Set<Object> visitedElements) {
+ if(!visibleChildCache.containsKey(element)) {
+ boolean result = false;
+ if(visitedElements.add(element)) {
+ for(Object child : super.getChildren(element)) {
+ if(isValid(child, visitedElements)) {
+ result = true;
+ break;
+ }
+ }
+ }
+
+ visibleChildCache.put(element, result);
+ }
+ return visibleChildCache.get(element);
+ }
+
+ public TreePath findPath(Object semanticElement, Object[] rootElements) {
+ return TreePath.EMPTY; //TODO : Naive search
+ }
+
+ protected void clearCache() {
+ cache.clear();
+ visibleChildCache.clear();
+ }
+
+ @Override
+ public void dispose() {
+ super.dispose();
+ clearCache();
+ }
+}
diff --git a/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/TreeBrowseStrategy.java b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/TreeBrowseStrategy.java
new file mode 100644
index 00000000000..2a36a60429c
--- /dev/null
+++ b/plugins/infra/widget/org.eclipse.papyrus.infra.widgets/src/org/eclipse/papyrus/infra/widgets/strategy/TreeBrowseStrategy.java
@@ -0,0 +1,41 @@
+/*****************************************************************************
+ * Copyright (c) 2012 CEA LIST.
+ *
+ * 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:
+ * Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.widgets.strategy;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.TreePath;
+import org.eclipse.papyrus.infra.core.ui.IRevealSemanticElement;
+
+
+/**
+ * An interface to define a strategy for browsing a Tree
+ *
+ * @author Camille Letavernier
+ */
+public interface TreeBrowseStrategy extends ITreeContentProvider, IRevealSemanticElement {
+
+ /**
+ * Finds a path to the given element
+ *
+ * @param element
+ * The semanticElement to find
+ * @parem input
+ * The root Elements
+ * @return
+ * @deprecated See {@link #revealSemanticElement(java.util.List)} instead
+ */
+ @Deprecated
+ public TreePath findPath(Object semanticElement, Object[] roots);
+
+
+
+}

Back to the top