Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 34491 Details for
Bug 127261
[Common Navigator] Add support for ITreePathContent/LabelProvider
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
Here's the patch
patch127261.txt (text/plain), 21.49 KB, created by
Michael Valenta
on 2006-02-10 09:57:16 EST
(
hide
)
Description:
Here's the patch
Filename:
MIME Type:
Creator:
Michael Valenta
Created:
2006-02-10 09:57:16 EST
Size:
21.49 KB
patch
obsolete
>### Eclipse Workspace Patch 1.0 >#P org.eclipse.ui.navigator >Index: src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateTreeContentProvider.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateTreeContentProvider.java,v >retrieving revision 1.3 >diff -u -r1.3 SafeDelegateTreeContentProvider.java >--- src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateTreeContentProvider.java 9 Feb 2006 22:38:02 -0000 1.3 >+++ src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateTreeContentProvider.java 10 Feb 2006 14:55:37 -0000 >@@ -10,24 +10,19 @@ > *******************************************************************************/ > package org.eclipse.ui.internal.navigator.extensions; > >+import java.util.ArrayList; > import java.util.Set; > >-import org.eclipse.jface.viewers.ITreeContentProvider; >-import org.eclipse.jface.viewers.Viewer; >+import org.eclipse.jface.viewers.*; > import org.eclipse.ui.IMemento; > import org.eclipse.ui.internal.navigator.NavigatorContentService; >-import org.eclipse.ui.navigator.ICommonContentExtensionSite; >-import org.eclipse.ui.navigator.ICommonContentProvider; >-import org.eclipse.ui.navigator.IMementoAware; >-import org.eclipse.ui.navigator.IPipelinedTreeContentProvider; >-import org.eclipse.ui.navigator.PipelinedShapeModification; >-import org.eclipse.ui.navigator.PipelinedViewerUpdate; >+import org.eclipse.ui.navigator.*; > > /** > * @since 3.2 > */ > public class SafeDelegateTreeContentProvider implements >- IPipelinedTreeContentProvider { >+ IPipelinedTreeContentProvider, ITreePathContentProvider { > > private final ITreeContentProvider contentProvider; > >@@ -35,6 +30,8 @@ > > private NavigatorContentDescriptor descriptor; > >+ private Viewer viewer; >+ > SafeDelegateTreeContentProvider(ITreeContentProvider aContentProvider, > NavigatorContentDescriptor aDescriptor, > NavigatorContentService theContentService) { >@@ -61,6 +58,10 @@ > } > > public Object[] getChildren(Object aParentElement) { >+ if (aParentElement instanceof TreePath) { >+ TreePath tp = (TreePath) aParentElement; >+ return getChildren(tp); >+ } > Object[] children = contentProvider.getChildren(aParentElement); > contentService.rememberContribution(descriptor, children); > return children; >@@ -90,6 +91,7 @@ > } > > public void inputChanged(Viewer aViewer, Object anOldInput, Object aNewInput) { >+ viewer = aViewer; > contentProvider.inputChanged(aViewer, anOldInput, aNewInput); > } > >@@ -212,4 +214,54 @@ > return false; > } > >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ITreePathContentProvider#getChildren(org.eclipse.jface.viewers.TreePath) >+ */ >+ public Object[] getChildren(TreePath parentPath) { >+ if (contentProvider instanceof ITreePathContentProvider) { >+ ITreePathContentProvider tpcp = (ITreePathContentProvider) contentProvider; >+ Object[] children = tpcp.getChildren(parentPath); >+ contentService.rememberContribution(descriptor, children); >+ return children; >+ } >+ return getChildren(parentPath.getLastSegment()); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ITreePathContentProvider#hasChildren(org.eclipse.jface.viewers.TreePath) >+ */ >+ public boolean hasChildren(TreePath path) { >+ if (contentProvider instanceof ITreePathContentProvider) { >+ ITreePathContentProvider tpcp = (ITreePathContentProvider) contentProvider; >+ return tpcp.hasChildren(path); >+ } >+ return hasChildren(path.getLastSegment()); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ITreePathContentProvider#getParents(java.lang.Object) >+ */ >+ public TreePath[] getParents(Object element) { >+ if (contentProvider instanceof ITreePathContentProvider) { >+ ITreePathContentProvider tpcp = (ITreePathContentProvider) contentProvider; >+ return tpcp.getParents(element); >+ } >+ ArrayList segments = new ArrayList(); >+ Object parent = element; >+ do { >+ parent = contentProvider.getParent(parent); >+ if (parent != null && parent != viewer.getInput()) >+ segments.add(parent); >+ } while (parent != null && parent != viewer.getInput()); >+ if (!segments.isEmpty()) { >+ // Loop backwards over the array to create the path. >+ TreePath path = TreePath.EMPTY; >+ for (int j = segments.size() - 1; j >=0; j--) { >+ path = path.createChildPath(segments.get(j)); >+ } >+ return new TreePath[] { path }; >+ } >+ return new TreePath[0]; >+ } >+ > } >Index: src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateCommonLabelProvider.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateCommonLabelProvider.java,v >retrieving revision 1.2 >diff -u -r1.2 SafeDelegateCommonLabelProvider.java >--- src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateCommonLabelProvider.java 9 Feb 2006 22:38:02 -0000 1.2 >+++ src/org/eclipse/ui/internal/navigator/extensions/SafeDelegateCommonLabelProvider.java 10 Feb 2006 14:55:37 -0000 >@@ -10,8 +10,7 @@ > *******************************************************************************/ > package org.eclipse.ui.internal.navigator.extensions; > >-import org.eclipse.jface.viewers.ILabelProvider; >-import org.eclipse.jface.viewers.ILabelProviderListener; >+import org.eclipse.jface.viewers.*; > import org.eclipse.swt.graphics.Image; > import org.eclipse.ui.IMemento; > import org.eclipse.ui.navigator.ICommonContentExtensionSite; >@@ -21,7 +20,7 @@ > * > * @since 3.2 > */ >-public class SafeDelegateCommonLabelProvider implements ICommonLabelProvider { >+public class SafeDelegateCommonLabelProvider implements ICommonLabelProvider, ITreePathLabelProvider { > > private final ILabelProvider delegateLabelProvider; > >@@ -124,4 +123,17 @@ > public void saveState(IMemento aMemento) { > > } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ITreePathLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath) >+ */ >+ public void updateLabel(ViewerLabel label, TreePath elementPath) { >+ if (delegateLabelProvider instanceof ITreePathLabelProvider) { >+ ITreePathLabelProvider tplp = (ITreePathLabelProvider) delegateLabelProvider; >+ tplp.updateLabel(label, elementPath); >+ } else { >+ label.setImage(getImage(elementPath.getLastSegment())); >+ label.setText(getText(elementPath.getLastSegment())); >+ } >+ } > } >Index: src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java,v >retrieving revision 1.3 >diff -u -r1.3 NavigatorContentServiceContentProvider.java >--- src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java 9 Feb 2006 22:38:02 -0000 1.3 >+++ src/org/eclipse/ui/internal/navigator/NavigatorContentServiceContentProvider.java 10 Feb 2006 14:55:36 -0000 >@@ -10,19 +10,13 @@ > *******************************************************************************/ > package org.eclipse.ui.internal.navigator; > >-import java.util.Arrays; >-import java.util.HashSet; >-import java.util.Iterator; >-import java.util.Set; >+import java.util.*; > >-import org.eclipse.jface.viewers.ITreeContentProvider; >-import org.eclipse.jface.viewers.Viewer; >+import org.eclipse.jface.viewers.*; > import org.eclipse.osgi.util.NLS; > import org.eclipse.ui.internal.navigator.extensions.NavigatorContentExtension; > import org.eclipse.ui.internal.navigator.extensions.OverridePolicy; >-import org.eclipse.ui.navigator.CommonViewer; >-import org.eclipse.ui.navigator.INavigatorContentDescriptor; >-import org.eclipse.ui.navigator.IPipelinedTreeContentProvider; >+import org.eclipse.ui.navigator.*; > > /** > * <p> >@@ -54,7 +48,7 @@ > * > */ > public class NavigatorContentServiceContentProvider implements >- ITreeContentProvider { >+ ITreeContentProvider, ITreePathContentProvider { > > private static final Object[] NO_CHILDREN = new Object[0]; > >@@ -62,6 +56,8 @@ > > private final boolean isContentServiceSelfManaged; > >+ private Viewer viewer; >+ > /** > * <p> > * Creates a cached {@link NavigatorContentService} from the given >@@ -210,6 +206,11 @@ > * @see org.eclipse.jface.viewers.ITreeContentProvider#getChildren(java.lang.Object) > */ > public synchronized Object[] getChildren(Object aParentElement) { >+ return internalGetChildren(aParentElement); >+ } >+ >+ private Object[] internalGetChildren(Object aParentElementOrPath) { >+ Object aParentElement = internalAsElement(aParentElementOrPath); > Set enabledExtensions = contentService > .findContentExtensionsByTriggerPoint(aParentElement); > if (enabledExtensions.size() == 0) >@@ -227,12 +228,13 @@ > enabledExtensions)) { > > contributedChildren = foundExtension.internalGetContentProvider() >- .getChildren(aParentElement); >+ .getChildren(aParentElementOrPath); > > overridingExtensions = foundExtension > .getOverridingExtensionsForTriggerPoint(aParentElement); > > if (overridingExtensions.length > 0) { >+ // TODO: could pass tree path through pipeline > contributedChildren = pipelineChildren(aParentElement, > overridingExtensions, > new HashSet(Arrays.asList(contributedChildren))) >@@ -274,7 +276,7 @@ > * Query each of <code>theOverridingExtensions</code> for children, and > * then pipe them through the Pipeline content provider. > * >- * @param aParent >+ * @param aParentOrPath > * The parent element in the tree > * @param theOverridingExtensions > * The set of overriding extensions that should participate in >@@ -284,7 +286,7 @@ > * modifiable) > * @return The set of children to return to the viewer > */ >- private Set pipelineChildren(Object aParent, >+ private Set pipelineChildren(Object aParentOrPath, > NavigatorContentExtension[] theOverridingExtensions, > Set theCurrentChildren) { > IPipelinedTreeContentProvider pipelinedContentProvider; >@@ -295,12 +297,12 @@ > if (theOverridingExtensions[i].getContentProvider() instanceof IPipelinedTreeContentProvider) { > pipelinedContentProvider = (IPipelinedTreeContentProvider) theOverridingExtensions[i] > .getContentProvider(); >- pipelinedContentProvider.getPipelinedChildren(aParent, >+ pipelinedContentProvider.getPipelinedChildren(aParentOrPath, > pipelinedChildren); > overridingExtensions = theOverridingExtensions[i] >- .getOverridingExtensionsForTriggerPoint(aParent); >+ .getOverridingExtensionsForTriggerPoint(aParentOrPath); > if (overridingExtensions.length > 0) >- pipelinedChildren = pipelineChildren(aParent, >+ pipelinedChildren = pipelineChildren(aParentOrPath, > overridingExtensions, pipelinedChildren); > } > } >@@ -564,7 +566,223 @@ > */ > public synchronized void inputChanged(Viewer aViewer, Object anOldInput, > Object aNewInput) { >+ viewer = aViewer; > contentService.updateService(aViewer, anOldInput, aNewInput); > } > >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ITreePathContentProvider#getChildren(org.eclipse.jface.viewers.TreePath) >+ */ >+ public Object[] getChildren(TreePath parentPath) { >+ return internalGetChildren(parentPath); >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ITreePathContentProvider#hasChildren(org.eclipse.jface.viewers.TreePath) >+ */ >+ public boolean hasChildren(TreePath path) { >+ Object anElement = internalAsElement(path); >+ Set resultInstances = contentService >+ .findContentExtensionsByTriggerPoint(anElement); >+ >+ NavigatorContentExtension ext; >+ for (Iterator itr = resultInstances.iterator(); itr.hasNext();) { >+ ext = (NavigatorContentExtension) itr.next(); >+ if (!ext.isLoaded()) >+ return true; >+ ITreeContentProvider cp = ext.internalGetContentProvider(); >+ if (cp instanceof ITreePathContentProvider) { >+ ITreePathContentProvider tpcp = (ITreePathContentProvider) cp; >+ if (tpcp.hasChildren(path)) { >+ return true; >+ } >+ } else if (cp.hasChildren(anElement)) >+ return true; >+ } >+ >+ return false; >+ } >+ >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ITreePathContentProvider#getParents(java.lang.Object) >+ */ >+ public TreePath[] getParents(Object anElement) { >+ Set extensions = contentService >+ .findContentExtensionsWithPossibleChild(anElement); >+ >+ Set result = new HashSet(); >+ NavigatorContentExtension foundExtension; >+ NavigatorContentExtension[] overridingExtensions; >+ for (Iterator itr = extensions.iterator(); itr.hasNext();) { >+ foundExtension = (NavigatorContentExtension) itr.next(); >+ try { >+ >+ if (!shouldDeferToOverridePath(foundExtension.getDescriptor(), >+ extensions)) { >+ >+ // We know the content provider is a SafeDelegateTreeContentProvider >+ // which implements ITreePathContentProvider >+ ITreeContentProvider tcp = foundExtension.internalGetContentProvider(); >+ if (tcp instanceof ITreePathContentProvider) { >+ ITreePathContentProvider tpcp = (ITreePathContentProvider) tcp; >+ TreePath[] parents = tpcp.getParents(anElement); >+ Set parentPaths = asSet(parents); >+ overridingExtensions = foundExtension >+ .getOverridingExtensionsForPossibleChild(anElement); >+ if (overridingExtensions.length > 0) { >+ parentPaths = pipelineParents(anElement, >+ overridingExtensions, parentPaths); >+ } >+ result.addAll(parentPaths); >+ } >+ } >+ } catch (RuntimeException re) { >+ NavigatorPlugin >+ .logError( >+ 0, >+ NLS >+ .bind( >+ CommonNavigatorMessages.Could_not_provide_children_for_element, >+ new Object[] { foundExtension >+ .getDescriptor() >+ .getId() }), re); >+ } catch (Error e) { >+ NavigatorPlugin >+ .logError( >+ 0, >+ NLS >+ .bind( >+ CommonNavigatorMessages.Could_not_provide_children_for_element, >+ new Object[] { foundExtension >+ .getDescriptor() >+ .getId() }), e); >+ >+ } >+ } >+ >+ return (TreePath[]) result.toArray(new TreePath[result.size()]); >+ } >+ >+ /** >+ * Return the objects as a set. >+ * @param objects the objects >+ * @return a set that contains the objects >+ */ >+ private Set asSet(Object[] objects) { >+ Set parentPaths = new HashSet(); >+ parentPaths.addAll(Arrays.asList(objects)); >+ return parentPaths; >+ } >+ >+ /** >+ * Query each of <code>theOverridingExtensions</code> for in order >+ * to adjust the parent paths of the contributor of the element. >+ * >+ * TODO: This method would be cleaner if TreePaths were added to the pipeline API. >+ * >+ * @param anInputElement >+ * The input element in the tree >+ * @param theOverridingExtensions >+ * The set of overriding extensions that should participate in >+ * the pipeline chain >+ * @param theParentPaths >+ * The current elements to return to the viewer (should be >+ * modifiable) >+ * @return The set of elements to return to the viewer >+ */ >+ private Set pipelineParents(Object anInputElement, >+ NavigatorContentExtension[] theOverridingExtensions, >+ Set theParentPaths) { >+ IPipelinedTreeContentProvider pipelinedContentProvider; >+ NavigatorContentExtension[] overridingExtensions; >+ for (int i = 0; i < theOverridingExtensions.length; i++) { >+ >+ if (theOverridingExtensions[i].getContentProvider() instanceof IPipelinedTreeContentProvider) { >+ pipelinedContentProvider = (IPipelinedTreeContentProvider) theOverridingExtensions[i] >+ .getContentProvider(); >+ >+ Set adjustedParentPaths = new HashSet(); >+ if (theParentPaths.isEmpty()) { >+ // Need to handle the case where the content provider doesn't >+ // known the parent but the pipeline does >+ Object aSuggestedParent = pipelinedContentProvider.getPipelinedParent( >+ anInputElement, null); >+ if (aSuggestedParent != null) { >+ Collection newPaths = getPathsForElement(pipelinedContentProvider, aSuggestedParent); >+ adjustedParentPaths.add(newPaths); >+ } >+ } else { >+ Set pipedParents = new HashSet(); >+ for (Iterator iter = theParentPaths.iterator(); iter.hasNext();) { >+ TreePath parentPath = (TreePath) iter.next(); >+ Object parentElement = internalAsElement(parentPath); >+ >+ // We only want to pipe a parent once even if it is the tail of multiple paths >+ if (!pipedParents.contains(parentElement)) { >+ pipedParents.add(parentElement); >+ // Push the parent through the pipeline >+ Object aSuggestedParent = pipelinedContentProvider.getPipelinedParent( >+ anInputElement, parentElement); >+ // If the parent was modified, get the new path >+ if (aSuggestedParent != parentElement) { >+ Collection newPaths = getPathsForElement(pipelinedContentProvider, aSuggestedParent); >+ adjustedParentPaths.add(newPaths); >+ } else { >+ adjustedParentPaths.add(parentPath); >+ } >+ } >+ } >+ } >+ overridingExtensions = theOverridingExtensions[i] >+ .getOverridingExtensionsForTriggerPoint(anInputElement); >+ if (overridingExtensions.length > 0) >+ adjustedParentPaths = pipelineParents(anInputElement, >+ overridingExtensions, adjustedParentPaths); >+ theParentPaths = adjustedParentPaths; >+ } >+ } >+ return theParentPaths; >+ } >+ >+ /** >+ * Return all the potential paths for the given element from the given >+ * content provider. This is done by getting the parent paths of >+ * the element and then appending he element to these paths. >+ * @param aContentProvider the content povider >+ * @param anElement the element >+ * @return the tree path fo the given element >+ */ >+ private Collection getPathsForElement(ITreeContentProvider aContentProvider, Object anElement) { >+ List result = new ArrayList(); >+ if (aContentProvider instanceof ITreePathContentProvider) { >+ ITreePathContentProvider tpcp = (ITreePathContentProvider) aContentProvider; >+ TreePath[] paths = tpcp.getParents(anElement); >+ for (int i = 0; i < paths.length; i++) { >+ TreePath path = paths[i]; >+ result.add(path.createChildPath(anElement)); >+ } >+ } else { >+ // We should never get here since SafeDelegateTreeContentProvider is an ITreePathContentProvider >+ result.add(TreePath.EMPTY.createChildPath(anElement)); >+ } >+ return result; >+ } >+ >+ /** >+ * Get the element from an element or tree path argument. >+ * @param parentElementOrPath the element or tree path >+ * @return the element >+ */ >+ private Object internalAsElement(Object parentElementOrPath) { >+ if (parentElementOrPath instanceof TreePath) { >+ TreePath tp = (TreePath) parentElementOrPath; >+ if (tp.getSegmentCount() > 0) { >+ return tp.getLastSegment(); >+ } >+ // If the path is empty, the parent element is the root >+ return viewer.getInput(); >+ } >+ return parentElementOrPath; >+ } >+ > } >Index: src/org/eclipse/ui/internal/navigator/NavigatorContentServiceLabelProvider.java >=================================================================== >RCS file: /cvsroot/eclipse/org.eclipse.ui.navigator/src/org/eclipse/ui/internal/navigator/NavigatorContentServiceLabelProvider.java,v >retrieving revision 1.1 >diff -u -r1.1 NavigatorContentServiceLabelProvider.java >--- src/org/eclipse/ui/internal/navigator/NavigatorContentServiceLabelProvider.java 6 Feb 2006 22:23:24 -0000 1.1 >+++ src/org/eclipse/ui/internal/navigator/NavigatorContentServiceLabelProvider.java 10 Feb 2006 14:55:37 -0000 >@@ -14,10 +14,7 @@ > import org.eclipse.core.commands.common.EventManager; > import org.eclipse.core.runtime.Platform; > import org.eclipse.jface.util.SafeRunnable; >-import org.eclipse.jface.viewers.ILabelDecorator; >-import org.eclipse.jface.viewers.ILabelProvider; >-import org.eclipse.jface.viewers.ILabelProviderListener; >-import org.eclipse.jface.viewers.LabelProviderChangedEvent; >+import org.eclipse.jface.viewers.*; > import org.eclipse.swt.graphics.Image; > import org.eclipse.ui.PlatformUI; > import org.eclipse.ui.navigator.CommonViewer; >@@ -50,7 +47,7 @@ > * @see org.eclipse.ui.internal.navigator.NavigatorContentServiceContentProvider > */ > public class NavigatorContentServiceLabelProvider extends EventManager >- implements ILabelProvider { >+ implements ILabelProvider, ITreePathLabelProvider { > > private final ILabelDecorator decorator; > private final NavigatorContentService contentService; >@@ -201,4 +198,22 @@ > } > } > >+ /* (non-Javadoc) >+ * @see org.eclipse.jface.viewers.ITreePathLabelProvider#updateLabel(org.eclipse.jface.viewers.ViewerLabel, org.eclipse.jface.viewers.TreePath) >+ */ >+ public void updateLabel(ViewerLabel label, TreePath elementPath) { >+ ILabelProvider[] labelProviders = contentService.findRelevantLabelProviders(elementPath.getLastSegment()); >+ Image image = null; >+ for (int i = 0; i < labelProviders.length && image == null; i++) { >+ ILabelProvider labelProvider = labelProviders[i]; >+ if (labelProvider instanceof ITreePathLabelProvider) { >+ ITreePathLabelProvider tplp = (ITreePathLabelProvider) labelProvider; >+ ((ITreePathLabelProvider)tplp).updateLabel(label, elementPath); >+ } else { >+ label.setImage(getImage(elementPath.getLastSegment())); >+ label.setText(getText(elementPath.getLastSegment())); >+ } >+ } >+ } >+ > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 127261
:
34491
|
35299