diff options
author | Pawel Piech | 2009-09-25 22:44:00 +0000 |
---|---|---|
committer | Pawel Piech | 2009-09-25 22:44:00 +0000 |
commit | 819f593395137640fa5faf8124751f93e40a4f78 (patch) | |
tree | 9a3d789a87b8bdeea91966a550f88e0e4a94d548 /org.eclipse.debug.ui | |
parent | 66c6f5f8b5a34ba152ed2e08b166a9a167967a31 (diff) | |
download | eclipse.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')
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);
+}
|