lk-wip
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/INavigatorContentProvider.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/INavigatorContentProvider.java
deleted file mode 100644
index c67158b..0000000
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/INavigatorContentProvider.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ui.views.navigator;
-
-/**
- */
-public interface INavigatorContentProvider {
- /**
- * Returns the child elements of the given parent element.
- * <p>
- * The difference between this method and <code>IStructuredContentProvider.getElements</code>
- * is that <code>getElements</code> is called to obtain the
- * tree viewer's root elements, whereas <code>getChildren</code> is used
- * to obtain the children of a given parent element in the tree (including a root).
- * </p>
- * The result is not modified by the viewer.
- *
- * @param parentElement the parent element
- * @return an array of child elements
- */
- public Object[] getChildren(Object parentElement);
- /**
- * Returns the parent for the given element, or <code>null</code>
- * indicating that the parent can't be computed.
- * In this case the tree-structured viewer can't expand
- * a given node correctly if requested.
- *
- * @param element the element
- * @return the parent element, or <code>null</code> if it
- * has none or if the parent cannot be computed
- */
- public Object getParent(Object element);
- /**
- * Returns whether the given element has children.
- * <p>
- * Intended as an optimization for when the viewer does not
- * need the actual children. Clients may be able to implement
- * this more efficiently than <code>getChildren</code>.
- * </p>
- *
- * @param element the element
- * @return <code>true</code> if the given element has children,
- * and <code>false</code> if it has no children
- */
- public boolean hasChildren(Object element);
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/NavigatorContentProvider.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/NavigatorContentProvider.java
index 97b16d7..d7f802f 100644
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/NavigatorContentProvider.java
+++ b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/NavigatorContentProvider.java
@@ -10,10 +10,12 @@
*******************************************************************************/
package org.eclipse.ui.views.navigator;
-import org.eclipse.core.resources.*;
-import org.eclipse.core.runtime.*;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.widgets.Control;
+import org.eclipse.core.internal.resources.WorkspaceRoot;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.ui.INavigatorTreeContentProvider;
import org.eclipse.ui.internal.ActionExpression;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.registry.NavigatorContentDescriptor;
@@ -34,44 +36,34 @@
partId = navigator.getSite().getId();
this.navigator = navigator;
}
-public Object[] getChildren(Object element) {
+protected IWorkbenchAdapter getAdapter(Object o) {
+ if (!(o instanceof IAdaptable)) {
+ return null;
+ }
+ return (IWorkbenchAdapter)((IAdaptable)o).getAdapter(IWorkbenchAdapter.class);
+}
+protected INavigatorTreeContentProvider getContentProvider(Object element) {
NavigatorContentDescriptor[] descriptors = registry.getDescriptors(partId);
- Object[] elements = new Object[0];
- NavigatorContentDescriptor defaultContentDescriptor = null;
- NavigatorContentDescriptor contentDescriptor = null;
- int priority = 0;
-
for (int i = 0; i < descriptors.length; i++) {
NavigatorContentDescriptor descriptor = descriptors[i];
ActionExpression enablement = descriptor.getEnableExpression();
-
- if (enablement == null)
- defaultContentDescriptor = descriptor;
- else
- if (enablement.isEnabledFor(element) && descriptor.getPriority() > priority) {
- priority = descriptor.getPriority();
- contentDescriptor = descriptor;
+ if (enablement != null) {
+ if (enablement.isEnabledFor(element)) {
+ NavigatorContentDescriptor contentDescriptor = descriptor;
+ return contentDescriptor.createContentProvider();
+ }
}
}
- if (contentDescriptor == null)
- contentDescriptor = defaultContentDescriptor;
-
- if (contentDescriptor != null) {
- elements = contentDescriptor.createContentProvider().getChildren(element);
- setContentName(element, contentDescriptor.getName());
+ Object parentElement = getParent(element);
+ if (parentElement instanceof WorkspaceRoot) {
+ return new ProjectContentProvider();
+ } else {
+ return getContentProvider(parentElement);
}
- return elements;
}
-private IProject getProject(Object element) {
- IProject project = null;
- if (element instanceof IProject) {
- project = (IProject) element;
- }
- else
- if (element instanceof IAdaptable) {
- project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);
- }
- return project;
+public Object[] getChildren(Object element) {
+ INavigatorTreeContentProvider contentProvider = getContentProvider(element);
+ return contentProvider.getChildren(element);
}
private IResource getResource(Object element) {
IResource resource = null;
@@ -88,16 +80,32 @@
* Method declared on IStructuredContentProvider.
*/
public Object[] getElements(Object element) {
- ITreeContentProvider contentProvider = registry.getRootContentProvider(partId);
+ INavigatorTreeContentProvider contentProvider = registry.getRootContentProvider(partId);
Object[] elements = contentProvider.getElements(element);
- ITreeContentProvider[] subContentProviders = registry.getSubContentProviders(partId);
- for (int i=0; i<subContentProviders.length; i++) {
- ITreeContentProvider subContentProvider = subContentProviders[i];
- // if delete enabled
- // if replace enabled
- // if add enabled
+
+ Object[] newElements = new Object[elements.length];
+ NavigatorContentDescriptor[] descriptors = registry.getDescriptors(partId);
+ for (int i=0; i<elements.length; i++) {
+ Object childElement = elements[i];
+ setContentName(childElement, registry.getRootContentDescriptor(partId).getName());
+ newElements[i] = childElement;
+ for (int j = 0; j < descriptors.length; j++) {
+ NavigatorContentDescriptor descriptor = descriptors[j];
+ ActionExpression enablement = descriptor.getEnableExpression();
+ if (enablement != null) {
+ if (enablement.isEnabledFor(childElement)) {
+ NavigatorContentDescriptor contentDescriptor = descriptor;
+ Object replacementElement = contentDescriptor.createContentProvider().getReplacementElement(element, childElement);
+ if (replacementElement != null) {
+ setContentName(replacementElement, contentDescriptor.getName());
+ newElements[i]=replacementElement;
+ }
+ }
+ }
+ }
}
- return elements;
+
+ return newElements;
}
public Object getParent(Object element) {
IWorkbenchAdapter adapter = getAdapter(element);
diff --git a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/ProjectContentProvider.java b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/ProjectContentProvider.java
index 2843e20..2f9e460 100644
--- a/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/ProjectContentProvider.java
+++ b/bundles/org.eclipse.ui.views/src/org/eclipse/ui/views/navigator/ProjectContentProvider.java
@@ -10,232 +10,18 @@
*******************************************************************************/
package org.eclipse.ui.views.navigator;
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.viewers.AbstractTreeViewer;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.model.IWorkbenchAdapter;
+import org.eclipse.ui.INavigatorTreeContentProvider;
+import org.eclipse.ui.model.WorkbenchContentProvider;
/**
* Provides tree contents for objects that have the IWorkbenchAdapter
* adapter registered.
*/
-public class ProjectContentProvider implements ITreeContentProvider, IResourceChangeListener {
+public class ProjectContentProvider extends WorkbenchContentProvider implements INavigatorTreeContentProvider {
protected Viewer viewer;
-/* (non-Javadoc)
- * Method declared on IContentProvider.
- */
-public void dispose() {
- if (viewer != null) {
- Object obj = viewer.getInput();
- if (obj instanceof IWorkspace) {
- IWorkspace workspace = (IWorkspace) obj;
- workspace.removeResourceChangeListener(this);
- } else
- if (obj instanceof IContainer) {
- IWorkspace workspace = ((IContainer) obj).getWorkspace();
- workspace.removeResourceChangeListener(this);
- }
- }
-}
-/**
- * Returns the implementation of IWorkbenchAdapter for the given
- * object. Returns null if the adapter is not defined or the
- * object is not adaptable.
- */
-protected IWorkbenchAdapter getAdapter(Object o) {
- if (!(o instanceof IAdaptable)) {
- return null;
- }
- return (IWorkbenchAdapter)((IAdaptable)o).getAdapter(IWorkbenchAdapter.class);
-}
-/* (non-Javadoc)
- * Method declared on ITreeContentProvider.
- */
-public Object[] getChildren(Object element) {
- return new Object[0];
-}
-/* (non-Javadoc)
- * Method declared on IStructuredContentProvider.
- */
-public Object[] getElements(Object element) {
- IWorkbenchAdapter adapter;
-
- adapter = getAdapter(getInput(element));
- if (adapter != null) {
- return adapter.getChildren(element);
- }
- return new Object[0];
-}
-IAdaptable getInput(Object element) {
- IResource resource = null;
-
- if (element instanceof IResource) {
- resource = (IResource) element;
- } else if (element instanceof IAdaptable){
- resource = (IResource) ((IAdaptable) element).getAdapter(IResource.class);
- }
- if (resource != null) {
- switch (resource.getType()) {
- case IResource.FILE :
- return resource.getParent();
- case IResource.FOLDER :
- case IResource.PROJECT :
- case IResource.ROOT :
- return (IContainer) resource;
- default :
- // Unknown resource type. Fall through.
- break;
- }
- }
- return ResourcesPlugin.getWorkspace().getRoot();
-}
-/* (non-Javadoc)
- * Method declared on ITreeContentProvider.
- */
-public Object getParent(Object element) {
- IWorkbenchAdapter adapter = getAdapter(element);
- if (adapter != null) {
- return adapter.getParent(element);
- }
+public Object getReplacementElement(Object parentElement, Object element) {
return null;
}
-/* (non-Javadoc)
- * Method declared on ITreeContentProvider.
- */
-public boolean hasChildren(Object element) {
- return false;
-}
-/* (non-Javadoc)
- * Method declared on IContentProvider.
- */
-public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
- this.viewer = viewer;
- IWorkspace oldWorkspace = null;
- IWorkspace newWorkspace = null;
- if (oldInput instanceof IWorkspace) {
- oldWorkspace = (IWorkspace) oldInput;
- }
- else if (oldInput instanceof IContainer) {
- oldWorkspace = ((IContainer) oldInput).getWorkspace();
- }
- if (newInput instanceof IWorkspace) {
- newWorkspace = (IWorkspace) newInput;
- } else if (newInput instanceof IContainer) {
- newWorkspace = ((IContainer) newInput).getWorkspace();
- }
- if (oldWorkspace != newWorkspace) {
- if (oldWorkspace != null) {
- oldWorkspace.removeResourceChangeListener(this);
- }
- if (newWorkspace != null) {
- newWorkspace.addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
- }
- }
-}
-/**
- * Process a resource delta.
- */
-protected void processDelta(IResourceDelta delta) {
- // This method runs inside a syncExec. The widget may have been destroyed
- // by the time this is run. Check for this and do nothing if so.
- Control ctrl = viewer.getControl();
- if (ctrl == null || ctrl.isDisposed())
- return;
-
- // Get the affected resource
- IResource resource = delta.getResource();
-
- // If any children have changed type, just do a full refresh of this parent,
- // since a simple update on such children won't work,
- // and trying to map the change to a remove and add is too dicey.
- // The case is: folder A renamed to existing file B, answering yes to overwrite B.
- IResourceDelta[] affectedChildren =
- delta.getAffectedChildren(IResourceDelta.CHANGED);
- for (int i = 0; i < affectedChildren.length; i++) {
- if ((affectedChildren[i].getFlags() & IResourceDelta.TYPE) != 0) {
- ((StructuredViewer) viewer).refresh(resource);
- return;
- }
- }
-
- // Check the flags for changes the Navigator cares about.
- // See ResourceLabelProvider for the aspects it cares about.
- // Notice we don't care about F_CONTENT or F_MARKERS currently.
- int changeFlags = delta.getFlags();
- if ((changeFlags
- & (IResourceDelta.OPEN | IResourceDelta.SYNC))
- != 0) {
- ((StructuredViewer) viewer).update(resource, null);
- }
- // Replacing a resource may affect its label and its children
- if ((changeFlags & IResourceDelta.REPLACED) != 0) {
- ((StructuredViewer) viewer).refresh(resource, true);
- return;
- }
-
- // Handle changed children .
- for (int i = 0; i < affectedChildren.length; i++) {
- processDelta(affectedChildren[i]);
- }
-
- // Process removals before additions, to avoid multiple equal elements in the viewer.
-
- // Handle removed children. Issue one update for all removals.
- affectedChildren = delta.getAffectedChildren(IResourceDelta.REMOVED);
- if (affectedChildren.length > 0) {
- Object[] affected = new Object[affectedChildren.length];
- for (int i = 0; i < affectedChildren.length; i++)
- affected[i] = affectedChildren[i].getResource();
- if (viewer instanceof AbstractTreeViewer) {
- ((AbstractTreeViewer) viewer).remove(affected);
- } else {
- ((StructuredViewer) viewer).refresh(resource);
- }
- }
-
- // Handle added children. Issue one update for all insertions.
- affectedChildren = delta.getAffectedChildren(IResourceDelta.ADDED);
- if (affectedChildren.length > 0) {
- Object[] affected = new Object[affectedChildren.length];
- for (int i = 0; i < affectedChildren.length; i++)
- affected[i] = affectedChildren[i].getResource();
- if (viewer instanceof AbstractTreeViewer) {
- ((AbstractTreeViewer) viewer).add(resource, affected);
- }
- else {
- ((StructuredViewer) viewer).refresh(resource);
- }
- }
-}
-/**
- * The workbench has changed. Process the delta and issue updates to the viewer,
- * inside the UI thread.
- *
- * @see IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
- */
-public void resourceChanged(final IResourceChangeEvent event) {
- final IResourceDelta delta = event.getDelta();
- Control ctrl = viewer.getControl();
- if (ctrl != null && !ctrl.isDisposed()) {
- // Do a sync exec, not an async exec, since the resource delta
- // must be traversed in this method. It is destroyed
- // when this method returns.
- ctrl.getDisplay().syncExec(new Runnable() {
- public void run() {
- processDelta(delta);
- }
- });
- }
-}
}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/INavigatorTreeContentProvider.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/INavigatorTreeContentProvider.java
new file mode 100644
index 0000000..8b8c3a4
--- /dev/null
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/INavigatorTreeContentProvider.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui;
+
+import org.eclipse.jface.viewers.ITreeContentProvider;
+
+/**
+ */
+public interface INavigatorTreeContentProvider extends ITreeContentProvider {
+ public Object getReplacementElement(Object parentElement, Object element);
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorAbstractContentDescriptor.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorAbstractContentDescriptor.java
index b174764..16deb5a 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorAbstractContentDescriptor.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorAbstractContentDescriptor.java
@@ -14,7 +14,7 @@
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.ui.INavigatorTreeContentProvider;
import org.eclipse.ui.WorkbenchException;
import org.eclipse.ui.internal.WorkbenchPlugin;
@@ -32,6 +32,7 @@
private String className;
private IConfigurationElement configElement;
private ArrayList subContentDescriptors = new ArrayList();
+ private INavigatorTreeContentProvider contentProvider = null;
/**
* Creates a descriptor from a configuration element.
@@ -46,16 +47,16 @@
protected void addSubContentDescriptor(NavigatorContentDescriptor descriptor) {
subContentDescriptors.add(descriptor);
}
- public ITreeContentProvider createContentProvider() {
- Object contentProvider = null;
+ public INavigatorTreeContentProvider createContentProvider() {
+ if (contentProvider != null) return contentProvider;
try {
- contentProvider = WorkbenchPlugin.createExtension(configElement, ATT_CLASS);
+ contentProvider = (INavigatorTreeContentProvider)WorkbenchPlugin.createExtension(configElement, ATT_CLASS);
} catch (CoreException exception) {
WorkbenchPlugin.log("Unable to create content provider: " + //$NON-NLS-1$
className, exception.getStatus());
}
- return (ITreeContentProvider) contentProvider;
+ return contentProvider;
}
/**
*/
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorDescriptor.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorDescriptor.java
index 65e6dc0..4bb3ab6 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorDescriptor.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorDescriptor.java
@@ -11,7 +11,7 @@
package org.eclipse.ui.internal.registry;
import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.ui.INavigatorTreeContentProvider;
import org.eclipse.ui.WorkbenchException;
/**
@@ -46,7 +46,7 @@
public NavigatorRootContentDescriptor getRootContentDescriptor() {
return rootContentDescriptor;
}
-public ITreeContentProvider getContentProvider() {
+public INavigatorTreeContentProvider getContentProvider() {
return contentDescriptor.createContentProvider();
}
/**
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorRegistry.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorRegistry.java
index 36e182a..39d78ae 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorRegistry.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/registry/NavigatorRegistry.java
@@ -10,9 +10,12 @@
*******************************************************************************/
package org.eclipse.ui.internal.registry;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.ui.INavigatorTreeContentProvider;
/**
*/
@@ -47,27 +50,30 @@
if (rootDescriptor != null) return rootDescriptor.findContentDescriptor(contentProviderId);
return null;
}
-public ITreeContentProvider getRootContentProvider(String partId) {
+public NavigatorRootContentDescriptor getRootContentDescriptor(String partId) {
+ return (NavigatorRootContentDescriptor) rootContentDescriptors.get(partId);
+}
+public INavigatorTreeContentProvider getRootContentProvider(String partId) {
NavigatorRootContentDescriptor rootDescriptor = (NavigatorRootContentDescriptor) rootContentDescriptors.get(partId);
if (rootDescriptor != null)
return rootDescriptor.createContentProvider();
return null;
}
-public ITreeContentProvider[] getSubContentProviders(String viewTargetId, String contentProviderId) {
+public INavigatorTreeContentProvider[] getSubContentProviders(String viewTargetId, String contentProviderId) {
NavigatorAbstractContentDescriptor contentDescriptor = findContentDescriptor(viewTargetId, contentProviderId);
return getSubContentProviders(contentDescriptor);
}
-public ITreeContentProvider[] getSubContentProviders(String viewTargetId) {
+public INavigatorTreeContentProvider[] getSubContentProviders(String viewTargetId) {
NavigatorAbstractContentDescriptor rootContentDescriptor = (NavigatorAbstractContentDescriptor)rootContentDescriptors.get(viewTargetId);
return getSubContentProviders(rootContentDescriptor);
}
-protected ITreeContentProvider[] getSubContentProviders(NavigatorAbstractContentDescriptor contentDescriptor) {
+protected INavigatorTreeContentProvider[] getSubContentProviders(NavigatorAbstractContentDescriptor contentDescriptor) {
ArrayList list = contentDescriptor.getSubContentDescriptors();
- ITreeContentProvider[] providers = new ITreeContentProvider[list.size()];
+ INavigatorTreeContentProvider[] providers = new INavigatorTreeContentProvider[list.size()];
for (int i=0; i<list.size(); i++) {
NavigatorContentDescriptor descriptor = (NavigatorContentDescriptor)list.get(i);
- ITreeContentProvider provider = descriptor.createContentProvider();
+ INavigatorTreeContentProvider provider = descriptor.createContentProvider();
providers[i] = provider;
}
return providers;