Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPawel Piech2009-09-25 22:44:00 +0000
committerPawel Piech2009-09-25 22:44:00 +0000
commit819f593395137640fa5faf8124751f93e40a4f78 (patch)
tree9a3d789a87b8bdeea91966a550f88e0e4a94d548 /org.eclipse.debug.ui
parent66c6f5f8b5a34ba152ed2e08b166a9a167967a31 (diff)
downloadeclipse.platform.debug-819f593395137640fa5faf8124751f93e40a4f78.tar.gz
eclipse.platform.debug-819f593395137640fa5faf8124751f93e40a4f78.tar.xz
eclipse.platform.debug-819f593395137640fa5faf8124751f93e40a4f78.zip
Bug 241336 - [flexible hierarchy] IModelProxyFactory.createModelProxy() should take the full path to element.
Diffstat (limited to 'org.eclipse.debug.ui')
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java109
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java1
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java16
-rw-r--r--org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxyFactory2.java48
4 files changed, 151 insertions, 23 deletions
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java
index c61ddad00..ff8e90bbd 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ModelContentProvider.java
@@ -45,6 +45,7 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory2;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdate;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IViewerUpdateListener;
@@ -73,7 +74,20 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi
*/
private boolean fSuppressModelControlRequests = false;
- private Map fModelProxies = new LinkedHashMap(); // model proxy by element
+ /**
+ * Map tree paths to model proxy responsible for element
+ *
+ * Used to install different model proxy instances for one element depending on the tree path.
+ */
+ private Map fTreeModelProxies = new HashMap(); // tree model proxy by element tree path
+
+ /**
+ * Map element to model proxy responsible for it.
+ *
+ * Used to install a single model proxy which is responsible
+ * for all instances of an element in the model tree.
+ */
+ private Map fModelProxies = new HashMap(); // model proxy by element
/**
* Map of nodes that have been filtered from the viewer.
@@ -273,7 +287,7 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi
cancelSubtreeUpdates(TreePath.EMPTY);
fTransform.clear();
if (newInput != null) {
- installModelProxy(newInput);
+ installModelProxy(newInput, TreePath.EMPTY);
restoreViewerState(newInput);
}
}
@@ -757,8 +771,12 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi
*
* @param element
*/
- protected synchronized void disposeModelProxy(Object element) {
- IModelProxy proxy = (IModelProxy) fModelProxies.remove(element);
+ protected synchronized void disposeModelProxy(TreePath path) {
+ IModelProxy proxy = (IModelProxy) fTreeModelProxies.remove(path);
+ if (proxy != null) {
+ proxy.dispose();
+ }
+ proxy = (IModelProxy) fModelProxies.remove(path.getLastSegment());
if (proxy != null) {
proxy.dispose();
}
@@ -774,19 +792,36 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi
proxy.dispose();
}
fModelProxies.clear();
+
+ updatePolicies = fTreeModelProxies.values().iterator();
+ while (updatePolicies.hasNext()) {
+ IModelProxy proxy = (IModelProxy) updatePolicies.next();
+ proxy.dispose();
+ }
+ fTreeModelProxies.clear();
}
protected synchronized IModelProxy[] getModelProxies() {
- return (IModelProxy[])fModelProxies.values().toArray(new IModelProxy[fModelProxies.size()]);
+ IModelProxy[] proxies = new IModelProxy[fTreeModelProxies.size() + fModelProxies.size()];
+ fTreeModelProxies.values().toArray(proxies);
+ System.arraycopy(fModelProxies.values().toArray(), 0, proxies, fModelProxies.size(), fModelProxies.size());
+ return proxies;
}
protected synchronized IModelProxy getElementProxy(TreePath path) {
- for (int i = path.getSegmentCount() - 1; i >= 0; i--) {
- IModelProxy proxy = (IModelProxy)fModelProxies.get(path.getSegment(i));
+ while (path != null) {
+ IModelProxy proxy = (IModelProxy)fTreeModelProxies.get(path);
if (proxy != null) {
return proxy;
}
- }
+
+ proxy = (IModelProxy)fModelProxies.get(path.getLastSegment());
+ if (proxy != null) {
+ return proxy;
+ }
+
+ path = path.getParentPath();
+ }
return null;
}
@@ -797,14 +832,30 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi
* @param element
* element to install an update policy for
*/
- protected synchronized void installModelProxy(Object element) {
- if (!fModelProxies.containsKey(element)) {
- IModelProxyFactory modelProxyFactory = ViewerAdapterService.getModelProxyFactory(element);
- if (modelProxyFactory != null) {
- final IModelProxy proxy = modelProxyFactory.createModelProxy(
- element, getPresentationContext());
+ protected synchronized void installModelProxy(Object input, TreePath path) {
+ if (!fTreeModelProxies.containsKey(path) && !fModelProxies.containsKey(path.getLastSegment())) {
+ Object element = path.getSegmentCount() != 0 ? path.getLastSegment() : input;
+ IModelProxy proxy = null;
+ IModelProxyFactory2 modelProxyFactory2 = ViewerAdapterService.getModelProxyFactory2(element);
+ if (modelProxyFactory2 != null) {
+ proxy = modelProxyFactory2.createTreeModelProxy(input, path, getPresentationContext());
+ if (proxy != null) {
+ fTreeModelProxies.put(path, proxy);
+ }
+ }
+ if (proxy == null) {
+ IModelProxyFactory modelProxyFactory = ViewerAdapterService.getModelProxyFactory(element);
+ if (modelProxyFactory != null) {
+ proxy = modelProxyFactory.createModelProxy(element, getPresentationContext());
+ if (proxy != null) {
+ fModelProxies.put(element, proxy);
+ }
+ }
+ }
+
+ if (proxy != null) {
+ final IModelProxy finalProxy = proxy;
if (proxy != null) {
- fModelProxies.put(element, proxy);
Job job = new Job("Model Proxy installed notification job") {//$NON-NLS-1$
protected IStatus run(IProgressMonitor monitor) {
if (!monitor.isCanceled()) {
@@ -816,10 +867,10 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi
viewer = (Viewer)getViewer();
}
}
- if (context != null && !proxy.isDisposed()) {
- proxy.init(context);
- proxy.addModelChangedListener(ModelContentProvider.this);
- proxy.installed(viewer);
+ if (context != null && !finalProxy.isDisposed()) {
+ finalProxy.init(context);
+ finalProxy.addModelChangedListener(ModelContentProvider.this);
+ finalProxy.installed(viewer);
}
}
return Status.OK_STATUS;
@@ -975,14 +1026,30 @@ abstract class ModelContentProvider implements IContentProvider, IModelChangedLi
protected abstract void handleReveal(IModelDelta delta);
protected void handleInstall(IModelDelta delta) {
- installModelProxy(delta.getElement());
+ installModelProxy(getViewer().getInput(), getFullTreePath(delta));
}
protected void handleUninstall(IModelDelta delta) {
- disposeModelProxy(delta.getElement());
+ disposeModelProxy(getFullTreePath(delta));
}
/**
+ * Returns a tree path for the node including the root element.
+ *
+ * @param node
+ * model delta
+ * @return corresponding tree path
+ */
+ protected TreePath getFullTreePath(IModelDelta node) {
+ ArrayList list = new ArrayList();
+ while (node.getParentDelta() != null) {
+ list.add(0, node.getElement());
+ node = node.getParentDelta();
+ }
+ return new TreePath(list.toArray());
+ }
+
+ /**
* Returns a tree path for the node, *not* including the root element.
*
* @param node
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java
index 0c550e8ba..07041e627 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/TreeModelContentProvider.java
@@ -107,6 +107,7 @@ public class TreeModelContentProvider extends ModelContentProvider implements IT
System.out.println("handleAdd(" + delta.getElement() + ") viewIndex: " + viewCount + " modelIndex: " + modelIndex); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
getViewer().setChildCount(parentPath, viewCount);
+ getViewer().autoExpand(parentPath);
int viewIndex = modelToViewIndex(parentPath, modelIndex);
getViewer().replace(parentPath, viewIndex, element);
TreePath childPath = parentPath.createChildPath(element);
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java
index 7f4a82268..539e806c4 100644
--- a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/ViewerAdapterService.java
@@ -18,6 +18,7 @@ import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementEditor;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementLabelProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IElementMementoProvider;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory;
+import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxyFactory2;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicy;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelSelectionPolicyFactory;
import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
@@ -72,7 +73,7 @@ public class ViewerAdapterService {
}
/**
- * Returns the model proxy factory for the given element or
+ * Returns the model proxy factory for the given element or
* <code>null</code> if none.
*
* @param element element to retrieve adapter for
@@ -81,7 +82,18 @@ public class ViewerAdapterService {
public static IModelProxyFactory getModelProxyFactory(Object element) {
return (IModelProxyFactory)getAdapter(element, IModelProxyFactory.class);
}
-
+
+ /**
+ * Returns the model proxy factory v.2 for the given element or
+ * <code>null</code> if none.
+ *
+ * @param element element to retrieve adapter for
+ * @return model proxy factory or <code>null</code>
+ */
+ public static IModelProxyFactory2 getModelProxyFactory2(Object element) {
+ return (IModelProxyFactory2)getAdapter(element, IModelProxyFactory2.class);
+ }
+
/**
* Returns the memento provider for the given element or
* <code>null</code> if none.
diff --git a/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxyFactory2.java b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxyFactory2.java
new file mode 100644
index 000000000..2bbd8114e
--- /dev/null
+++ b/org.eclipse.debug.ui/ui/org/eclipse/debug/internal/ui/viewers/model/provisional/IModelProxyFactory2.java
@@ -0,0 +1,48 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Freescale Semiconductor 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:
+ * Freescale Semiconductor - initial API and implementation � Bug 241336
+ *******************************************************************************/
+package org.eclipse.debug.internal.ui.viewers.model.provisional;
+
+import org.eclipse.jface.viewers.TreePath;
+
+/**
+ * A model proxy factory creates model proxies for elements based on
+ * specific presentation contexts. A model proxy factory is provided for
+ * a model element by registering a model proxy factory adapter for
+ * an element.
+ * <p>
+ * This interface is an alternative to the {@link IModelProxyFactory}
+ * interface. Unlike its predecessor <code>IModelProxyFactory2</code> allows
+ * the full path to the tree element to be specified when creating an
+ * <code>IModelProxy<code> instance. Using the full patch allows models to
+ * provide proper model deltas even if the root element of this proxy is at
+ * variable or unknown location in the viewer.
+ * </p>
+ * <p>
+ * Clients may implement this interface.
+ * </p>
+ * @see IModelProxyFactory
+ * @see IModelProxy
+ * @see IModelDelta
+ *
+ * @since 3.6
+ */
+public interface IModelProxyFactory2 {
+ /**
+ * Creates and returns a model proxy for the given element in the specified
+ * context or <code>null</code> if none.
+ *
+ * @param input viewer input context
+ * @param path to model element to create a model proxy for
+ * @param context presentation context
+ * @return model proxy or <code>null</code>
+ */
+ public IModelProxy createTreeModelProxy(Object input, TreePath path, IPresentationContext context);
+}

Back to the top