diff options
author | Eike Stepper | 2015-02-26 17:26:31 +0000 |
---|---|---|
committer | Eike Stepper | 2015-02-26 17:26:31 +0000 |
commit | 4086386f0adefc75154c6b24ac21da81703d0ba2 (patch) | |
tree | 959d330b1721361fae3c156e421b081b7915f3c6 | |
parent | 4437bef7a2489a7e2adc8a3ed94f56a61cfb0a6b (diff) | |
download | cdo-4086386f0adefc75154c6b24ac21da81703d0ba2.tar.gz cdo-4086386f0adefc75154c6b24ac21da81703d0ba2.tar.xz cdo-4086386f0adefc75154c6b24ac21da81703d0ba2.zip |
[458349] Consolidate UI
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=458349
16 files changed, 972 insertions, 287 deletions
diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/.settings/.api_filters b/plugins/org.eclipse.emf.cdo.explorer.ui/.settings/.api_filters new file mode 100644 index 0000000000..fb5a265ed5 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/.settings/.api_filters @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<component id="org.eclipse.emf.cdo.explorer.ui" version="2"> + <resource path="src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/NewActionProvider.java" type="org.eclipse.emf.cdo.explorer.ui.checkouts.actions.NewActionProvider"> + <filter id="574664731"> + <message_arguments> + <message_argument value="org.eclipse.emf.cdo.explorer.ui.checkouts.actions.NewActionProvider.init(ICommonActionExtensionSite)"/> + <message_argument value="IWizardRegistry"/> + </message_arguments> + </filter> + </resource> +</component> diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml b/plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml index 5ac0788540..42b87ea0ca 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/plugin.xml @@ -647,5 +647,5 @@ </command> </menuContribution> </extension> - + </plugin> diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/ObjectListController.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/ObjectListController.java index 3b77e9f0d5..fb175dcbb4 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/ObjectListController.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/ObjectListController.java @@ -13,6 +13,7 @@ package org.eclipse.emf.cdo.explorer.ui; import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.explorer.ui.bundle.OM; +import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutContentProvider; import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutLabelProvider; import org.eclipse.net4j.util.ui.views.ItemProvider; @@ -44,7 +45,9 @@ import java.util.concurrent.atomic.AtomicBoolean; */ public class ObjectListController { - private final LabelProvider labelProvider = new LabelProvider(); + private final CDOCheckoutContentProvider contentProvider = new CDOCheckoutContentProvider(); + + private final LabelProvider labelProvider = new LabelProvider(contentProvider); private final AtomicBoolean refreshing = new AtomicBoolean(); @@ -85,11 +88,15 @@ public class ObjectListController public void configure(final TreeViewer treeViewer) { + Control control = treeViewer.getControl(); + contentProvider.disposeWith(control); + + // The contentProvider field just makes the labelProvider happy. treeViewer.setContentProvider(new ContentProvider()); treeViewer.setLabelProvider(new DecoratingStyledCellLabelProvider(labelProvider, new LabelDecorator(), null)); treeViewer.setInput(wrappers); - treeViewer.getControl().getDisplay().asyncExec(new Runnable() + control.getDisplay().asyncExec(new Runnable() { public void run() { @@ -301,8 +308,9 @@ public class ObjectListController */ private static final class LabelProvider extends CDOCheckoutLabelProvider { - public LabelProvider() + public LabelProvider(CDOCheckoutContentProvider contentProvider) { + super(contentProvider); } @Override diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutContentProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutContentProvider.java index 5cbb846ecc..6a89b605d4 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutContentProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutContentProvider.java @@ -27,7 +27,6 @@ import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckoutManager.CheckoutOpenEve import org.eclipse.emf.cdo.explorer.ui.ViewerUtil; import org.eclipse.emf.cdo.explorer.ui.bundle.OM; import org.eclipse.emf.cdo.explorer.ui.checkouts.actions.OpenWithActionProvider; -import org.eclipse.emf.cdo.internal.ui.editor.CDOEditor; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision; import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionCache; import org.eclipse.emf.cdo.util.CDOUtil; @@ -39,16 +38,12 @@ import org.eclipse.net4j.util.event.IListener; import org.eclipse.net4j.util.ui.UIUtil; import org.eclipse.emf.common.notify.Adapter; -import org.eclipse.emf.common.notify.Notification; import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; import org.eclipse.emf.edit.provider.ITreeItemContentProvider; import org.eclipse.emf.edit.provider.ItemProviderAdapter; -import org.eclipse.emf.edit.provider.ViewerNotification; -import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; import org.eclipse.emf.spi.cdo.FSMUtil; import org.eclipse.emf.spi.cdo.InternalCDOObject; import org.eclipse.emf.spi.cdo.InternalCDOView; @@ -61,21 +56,29 @@ import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.IOpenListener; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; +import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.OpenEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.StructuredViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; +import org.eclipse.swt.events.DisposeEvent; +import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.TreeItem; +import org.eclipse.ui.IMemento; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IViewReference; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.navigator.CommonViewer; +import org.eclipse.ui.navigator.ICommonContentExtensionSite; +import org.eclipse.ui.navigator.ICommonContentProvider; import org.eclipse.ui.part.IPage; +import org.eclipse.ui.views.properties.IPropertySource; +import org.eclipse.ui.views.properties.IPropertySourceProvider; import org.eclipse.ui.views.properties.PropertySheet; import org.eclipse.ui.views.properties.PropertySheetPage; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; @@ -83,6 +86,7 @@ import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -93,8 +97,10 @@ import java.util.concurrent.ConcurrentHashMap; /** * @author Eike Stepper */ -public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider implements IOpenListener +public class CDOCheckoutContentProvider implements ICommonContentProvider, IPropertySourceProvider, IOpenListener { + private static final Map<String, CDOCheckoutContentProvider> INSTANCES = new HashMap<String, CDOCheckoutContentProvider>(); + private static final Set<Object> LOADING_OBJECTS = new HashSet<Object>(); private static final Method GET_CHILDREN_FEATURES_METHOD = getMethod(ItemProviderAdapter.class, @@ -104,8 +110,6 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im private static final CDOCheckoutManager CHECKOUT_MANAGER = CDOExplorerUtil.getCheckoutManager(); - private static CDOCheckoutContentProvider instance; - private final IListener checkoutManagerListener = new IListener() { public void notifyEvent(IEvent event) @@ -229,11 +233,13 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im } }; + private final CDOCheckoutStateManager stateManager = new CDOCheckoutStateManager(this); + private final Map<CDOCheckout, CDOCheckout> openingCheckouts = new ConcurrentHashMap<CDOCheckout, CDOCheckout>(); private final Map<Object, Object[]> childrenCache = new ConcurrentHashMap<Object, Object[]>(); - private final ComposedAdapterFactory adapterFactory; + private String viewerID; private TreeViewer viewer; @@ -241,26 +247,57 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im public CDOCheckoutContentProvider() { - super(null); - - adapterFactory = CDOEditor.createAdapterFactory(true); - setAdapterFactory(adapterFactory); + } + public void init(ICommonContentExtensionSite config) + { + viewerID = config.getService().getViewerId(); + INSTANCES.put(viewerID, this); CHECKOUT_MANAGER.addListener(checkoutManagerListener); - instance = this; } - @Override - public void dispose() + public void saveState(IMemento aMemento) + { + // Do nothing. + } + + public void restoreState(IMemento aMemento) { - instance = null; - super.dispose(); + // Do nothing. + } + public void dispose() + { CHECKOUT_MANAGER.removeListener(checkoutManagerListener); - adapterFactory.dispose(); + INSTANCES.remove(viewerID); + } + + public void disposeWith(Control control) + { + control.addDisposeListener(new DisposeListener() + { + public void widgetDisposed(DisposeEvent e) + { + dispose(); + } + }); + } + + public final CDOCheckoutStateManager getStateManager() + { + return stateManager; + } + + public final TreeViewer getViewer() + { + return viewer; + } + + public final Object getInput() + { + return input; } - @Override public void inputChanged(Viewer newViewer, Object oldInput, Object newInput) { TreeViewer newTreeViewer = null; @@ -285,11 +322,9 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im } input = newInput; - - super.inputChanged(newTreeViewer, oldInput, newInput); + stateManager.inputChanged(newTreeViewer, oldInput, newInput); } - @Override public boolean hasChildren(Object object) { if (object == input) @@ -335,7 +370,7 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im InternalCDORevision revision = cdoObject.cdoRevision(false); if (revision != null) { - ITreeItemContentProvider provider = (ITreeItemContentProvider)adapterFactory.adapt(object, + ITreeItemContentProvider provider = (ITreeItemContentProvider)stateManager.adapt(object, ITreeItemContentProvider.class); if (provider instanceof ItemProviderAdapter) { @@ -352,10 +387,10 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im } } - return super.hasChildren(object); + ITreeContentProvider contentProvider = stateManager.getContentProvider(object); + return contentProvider.hasChildren(object); } - @Override public Object[] getChildren(Object object) { if (object == input) @@ -445,7 +480,9 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im loadedRevisions.addAll(revisions); } - Object[] children = CDOCheckoutContentProvider.super.getChildren(finalObject); + ITreeContentProvider contentProvider = stateManager.getContentProvider(finalObject); + Object[] children = contentProvider.getChildren(finalObject); + children = CDOCheckoutContentModifier.Registry.INSTANCE.modifyChildren(finalObject, children); childrenCache.put(originalObject, children); } @@ -557,7 +594,7 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im InternalCDORevision revision = cdoObject.cdoRevision(false); if (revision != null) { - ITreeItemContentProvider provider = (ITreeItemContentProvider)adapterFactory.adapt(object, + ITreeItemContentProvider provider = (ITreeItemContentProvider)stateManager.adapt(object, ITreeItemContentProvider.class); if (provider instanceof ItemProviderAdapter) { @@ -573,7 +610,8 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im if (missingIDs.isEmpty()) { // All revisions are cached. Just return the objects without server round-trips. - return super.getChildren(object); + ITreeContentProvider contentProvider = stateManager.getContentProvider(object); + return contentProvider.getChildren(object); } } } @@ -583,13 +621,11 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im return null; } - @Override public Object[] getElements(Object object) { return getChildren(object); } - @Override public Object getParent(Object object) { if (object == input) @@ -626,37 +662,19 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im } } - return super.getParent(object); + ITreeContentProvider contentProvider = stateManager.getContentProvider(object); + return contentProvider.getParent(object); } - @Override - public void notifyChanged(Notification notification) + public IPropertySource getPropertySource(Object object) { - Object notifier = notification.getNotifier(); - if (notifier instanceof EObject) + IPropertySourceProvider contentProvider = stateManager.getContentProvider(object); + if (contentProvider != null) { - EObject eObject = (EObject)notifier; - - Object feature = notification.getFeature(); - if (feature instanceof EReference) - { - EReference reference = (EReference)feature; - if (reference.isContainment()) - { - Adapter adapter = EcoreUtil.getAdapter(eObject.eAdapters(), CDOCheckout.class); - if (adapter instanceof CDOCheckout) - { - CDOCheckout checkout = (CDOCheckout)adapter; - if (checkout.isOpen()) - { - notification = new ViewerNotification(notification, checkout, true, true); - } - } - } - } + return contentProvider.getPropertySource(object); } - super.notifyChanged(notification); + return null; } public void selectObject(final Object object) @@ -735,6 +753,7 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im { EObject eObject = (EObject)element; IWorkbenchPage page = getWorkbenchPage(); + ComposedAdapterFactory adapterFactory = stateManager.getAdapterFactory(eObject); OpenWithActionProvider.openEditor(page, adapterFactory, eObject, null); } } @@ -860,8 +879,8 @@ public class CDOCheckoutContentProvider extends AdapterFactoryContentProvider im } } - public static final CDOCheckoutContentProvider getInstance() + public static final CDOCheckoutContentProvider getInstance(String viewerID) { - return instance; + return INSTANCES.get(viewerID); } } diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java index ac9b35e57f..6137777e85 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutDropAdapterAssistant.java @@ -25,7 +25,6 @@ import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.transaction.CDOTransaction; import org.eclipse.emf.cdo.ui.compare.CDOCompareEditorUtil; import org.eclipse.emf.cdo.util.CDOUtil; -import org.eclipse.emf.cdo.view.CDOViewOpener; import org.eclipse.net4j.util.AdapterUtil; import org.eclipse.net4j.util.ObjectUtil; @@ -126,14 +125,18 @@ public class CDOCheckoutDropAdapterAssistant extends CommonDropAdapterAssistant else if (dropOperation == DND.DROP_COPY) { // Merge From (online + offline) + CDORepository repository = checkout.getRepository(); + CDOBranchPoint left = checkout.getBranchPoint(); + CDOBranchPoint right = branchPoint; + CDOCompareEditorUtil.openEditor(repository, repository, left, right, null, true); } else if (dropOperation == DND.DROP_LINK) { // Compare With (online + offline) - CDOViewOpener viewOpener = checkout.getRepository(); + CDORepository repository = checkout.getRepository(); CDOBranchPoint left = checkout.getBranchPoint(); CDOBranchPoint right = branchPoint; - CDOCompareEditorUtil.openEditor(viewOpener, left, right, null, true); + CDOCompareEditorUtil.openEditor(repository, left, right, null, true); } return Status.OK_STATUS; diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelProvider.java index 569f58ecaa..0c0866b966 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutLabelProvider.java @@ -10,244 +10,170 @@ */ package org.eclipse.emf.cdo.explorer.ui.checkouts; -import org.eclipse.emf.cdo.CDOElement; -import org.eclipse.emf.cdo.eresource.CDOResourceLeaf; -import org.eclipse.emf.cdo.eresource.CDOResourceNode; -import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.explorer.ui.ViewerUtil; -import org.eclipse.emf.cdo.explorer.ui.bundle.OM; -import org.eclipse.emf.cdo.internal.ui.editor.CDOEditor; import org.eclipse.emf.cdo.transfer.CDOTransferElement; -import org.eclipse.emf.cdo.ui.CDOEditorUtil; -import org.eclipse.emf.cdo.ui.CDOLabelDecorator; import org.eclipse.net4j.util.ui.views.ContainerItemProvider; -import org.eclipse.emf.common.notify.Notifier; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.emf.ecore.util.EcoreUtil; -import org.eclipse.emf.edit.provider.ComposedAdapterFactory; -import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; - -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.jface.resource.JFaceResources; -import org.eclipse.jface.resource.LocalResourceManager; -import org.eclipse.jface.resource.ResourceManager; import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; import org.eclipse.jface.viewers.IColorProvider; +import org.eclipse.jface.viewers.ILabelProvider; +import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.LabelProviderChangedEvent; +import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; -import org.eclipse.ui.IEditorDescriptor; import org.eclipse.ui.IEditorRegistry; +import org.eclipse.ui.IMemento; import org.eclipse.ui.IPropertyListener; -import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.navigator.ICommonContentExtensionSite; +import org.eclipse.ui.navigator.ICommonLabelProvider; /** * @author Eike Stepper */ -public class CDOCheckoutLabelProvider extends AdapterFactoryLabelProvider implements IColorProvider, +public class CDOCheckoutLabelProvider extends LabelProvider implements ICommonLabelProvider, IColorProvider, IStyledLabelProvider { - private static final Image CHECKOUT_IMAGE = OM.getImage("icons/checkout.gif"); - - private static final Image CHECKOUT_CLOSED_IMAGE = OM.getImage("icons/checkout_closed.gif"); - - private static final Image FOLDER_IMAGE = OM.getImage("icons/CDOResourceFolder.gif"); - - private static final Image ERROR_IMAGE = PlatformUI.getWorkbench().getSharedImages() - .getImage(ISharedImages.IMG_OBJS_ERROR_TSK); - private static final IEditorRegistry EDITOR_REGISTRY = PlatformUI.getWorkbench().getEditorRegistry(); - private final ComposedAdapterFactory adapterFactory; + private final EditorRegistryListener editorRegistryListener = new EditorRegistryListener(); - private IPropertyListener editorRegistryListener; + private ICommonContentExtensionSite config; - private ResourceManager resourceManager; + private CDOCheckoutStateManager stateManager; public CDOCheckoutLabelProvider() { - super(null); + } - adapterFactory = CDOEditor.createAdapterFactory(true); - setAdapterFactory(adapterFactory); + public CDOCheckoutLabelProvider(CDOCheckoutContentProvider contentProvider) + { + stateManager = contentProvider.getStateManager(); + } + + public void init(ICommonContentExtensionSite config) + { + this.config = config; + EDITOR_REGISTRY.addPropertyListener(editorRegistryListener); } @Override public void dispose() { - if (editorRegistryListener != null) - { - EDITOR_REGISTRY.removePropertyListener(editorRegistryListener); - resourceManager = null; - } + EDITOR_REGISTRY.removePropertyListener(editorRegistryListener); + super.dispose(); + } - if (resourceManager != null) - { - resourceManager.dispose(); - resourceManager = null; - } + public void saveState(IMemento aMemento) + { + // Do nothing. + } - super.dispose(); + public void restoreState(IMemento aMemento) + { + // Do nothing. + } - // Must come after super.dispose(). - adapterFactory.dispose(); + public void fireLabelProviderChanged() + { + fireLabelProviderChanged(new LabelProviderChangedEvent(this)); } - @Override public Color getForeground(Object object) { - if (object instanceof ViewerUtil.Pending) + IColorProvider provider = getStateManager().getLabelProvider(object); + if (provider != null) { - return ContainerItemProvider.PENDING_COLOR; + return provider.getForeground(object); } - return super.getForeground(object); + return null; } - @Override - public String getText(Object element) + public Color getBackground(Object object) { - try + IColorProvider provider = getStateManager().getLabelProvider(object); + if (provider != null) { - if (element instanceof CDOCheckout) - { - CDOCheckout checkout = (CDOCheckout)element; - return checkout.getLabel(); - } - - if (element instanceof CDOElement) - { - CDOElement checkoutElement = (CDOElement)element; - return checkoutElement.toString(); - } - - if (element instanceof EObject) - { - CDOElement checkoutElement = (CDOElement)EcoreUtil.getExistingAdapter((Notifier)element, CDOElement.class); - if (checkoutElement != null) - { - return checkoutElement.toString(element); - } - - if (element instanceof CDOResourceNode) - { - CDOResourceNode resourceNode = (CDOResourceNode)element; - - String name = resourceNode.getName(); - if (name == null) - { - // This must be the root resource. - return ""; - } + return provider.getBackground(object); + } - return name; - } - } + return null; + } - if (element instanceof ViewerUtil.Pending) - { - ViewerUtil.Pending pending = (ViewerUtil.Pending)element; - return pending.getText(); - } + public String getDescription(Object object) + { + int xxx; + return null; + } - return super.getText(element); - } - catch (Exception ex) + public StyledString getStyledText(Object object) + { + IStyledLabelProvider provider = getStateManager().getLabelProvider(object); + if (provider != null) { - return ex.getMessage(); + return provider.getStyledText(object); } + + String text = getText(object); + return new StyledString(text); } @Override - public Image getImage(Object element) + public String getText(Object object) { - try + if (object instanceof ViewerUtil.Pending) { - if (element instanceof CDOCheckout) - { - CDOCheckout checkout = (CDOCheckout)element; - if (checkout.isOpen()) - { - return CDOLabelDecorator.decorate(CHECKOUT_IMAGE, checkout.getRootObject()); - } - - return CHECKOUT_CLOSED_IMAGE; - } - - if (element instanceof ViewerUtil.Pending) - { - return ContainerItemProvider.PENDING_IMAGE; - } - - if (element instanceof CDOElement) - { - element = ((CDOElement)element).getDelegate(); - Image image = doGetImage(element); - return CDOLabelDecorator.decorate(image, element); - } - - return doGetImage(element); + ViewerUtil.Pending pending = (ViewerUtil.Pending)object; + return pending.getText(); } - catch (Exception ex) + + ILabelProvider provider = getStateManager().getLabelProvider(object); + if (provider != null) { - return ERROR_IMAGE; + return provider.getText(object); } + + return super.getText(object); } - private Image doGetImage(Object element) + @Override + public Image getImage(Object object) { - if (element instanceof CDOResourceLeaf) + if (object instanceof ViewerUtil.Pending) { - String name = ((CDOResourceLeaf)element).getName(); - if (name == null) - { - // This must be the root resource. - return FOLDER_IMAGE; - } + return ContainerItemProvider.PENDING_IMAGE; + } - IEditorDescriptor editorDescriptor = EDITOR_REGISTRY.getDefaultEditor(name); - if (editorDescriptor != null && !CDOEditorUtil.TEXT_EDITOR_ID.equals(editorDescriptor.getId())) - { - Image image = getWorkbenchImage(name); - if (image != null) - { - return image; - } - } + ILabelProvider provider = getStateManager().getLabelProvider(object); + if (provider != null) + { + return provider.getImage(object); } - return super.getImage(element); + return super.getImage(object); } - protected Image getWorkbenchImage(String name) + public CDOCheckoutStateManager getStateManager() { - ImageDescriptor imageDescriptor = EDITOR_REGISTRY.getImageDescriptor(name); - if (imageDescriptor != null) + if (stateManager == null) { - if (editorRegistryListener == null) + String viewerID = config.getService().getViewerId(); + CDOCheckoutContentProvider contentProvider = CDOCheckoutContentProvider.getInstance(viewerID); + if (contentProvider != null) { - editorRegistryListener = new EditorRegistryListener(); - EDITOR_REGISTRY.addPropertyListener(editorRegistryListener); + stateManager = contentProvider.getStateManager(); } - - ResourceManager resourceManager = getResourceManager(); - return (Image)resourceManager.get(imageDescriptor); } - return null; + return stateManager; } - protected ResourceManager getResourceManager() + public void setStateManager(CDOCheckoutStateManager stateManager) { - if (resourceManager == null) - { - resourceManager = new LocalResourceManager(JFaceResources.getResources()); - } - - return resourceManager; + this.stateManager = stateManager; } /** @@ -255,9 +181,8 @@ public class CDOCheckoutLabelProvider extends AdapterFactoryLabelProvider implem * from the associated {@link #getItemProvider() item provider} when {@link CDOTransferElement element} labels need to be updated. * * @author Eike Stepper - * @since 4.2 */ - protected class EditorRegistryListener implements IPropertyListener + private class EditorRegistryListener implements IPropertyListener { public void propertyChanged(Object source, int propId) { diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutState.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutState.java new file mode 100644 index 0000000000..8d00fb51b2 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutState.java @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2004-2014 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.explorer.ui.checkouts; + +import org.eclipse.emf.cdo.CDOElement; +import org.eclipse.emf.cdo.eresource.CDOResourceLeaf; +import org.eclipse.emf.cdo.eresource.CDOResourceNode; +import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; +import org.eclipse.emf.cdo.explorer.ui.ViewerUtil; +import org.eclipse.emf.cdo.explorer.ui.bundle.OM; +import org.eclipse.emf.cdo.internal.ui.editor.CDOEditor; +import org.eclipse.emf.cdo.ui.CDOEditorUtil; +import org.eclipse.emf.cdo.ui.CDOLabelDecorator; + +import org.eclipse.net4j.util.ui.views.ContainerItemProvider; + +import org.eclipse.emf.common.notify.Adapter; +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.common.notify.Notification; +import org.eclipse.emf.common.notify.Notifier; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EReference; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; +import org.eclipse.emf.edit.provider.ViewerNotification; +import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; +import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; + +import org.eclipse.core.commands.common.EventManager; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.jface.resource.ResourceManager; +import org.eclipse.jface.util.SafeRunnable; +import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider.IStyledLabelProvider; +import org.eclipse.jface.viewers.IColorProvider; +import org.eclipse.jface.viewers.ILabelProviderListener; +import org.eclipse.jface.viewers.LabelProviderChangedEvent; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.Image; +import org.eclipse.ui.IEditorDescriptor; +import org.eclipse.ui.IEditorRegistry; +import org.eclipse.ui.ISharedImages; +import org.eclipse.ui.PlatformUI; + +/** + * @author Eike Stepper + */ +public final class CDOCheckoutState +{ + private static final Image CHECKOUT_IMAGE = OM.getImage("icons/checkout.gif"); + + private static final Image CHECKOUT_CLOSED_IMAGE = OM.getImage("icons/checkout_closed.gif"); + + private static final Image FOLDER_IMAGE = OM.getImage("icons/CDOResourceFolder.gif"); + + private static final Image ERROR_IMAGE = PlatformUI.getWorkbench().getSharedImages() + .getImage(ISharedImages.IMG_OBJS_ERROR_TSK); + + private static final IEditorRegistry EDITOR_REGISTRY = PlatformUI.getWorkbench().getEditorRegistry(); + + private final EventBroker eventBroker = new EventBroker(); + + private final CDOCheckout checkout; + + private final ComposedAdapterFactory adapterFactory; + + private final ContentProvider contentProvider; + + private final LabelProvider labelProvider; + + CDOCheckoutState(CDOCheckoutStateManager stateManager, CDOCheckout checkout) + { + this.checkout = checkout; + + adapterFactory = CDOEditor.createAdapterFactory(true); + + CDOCheckoutContentProvider main = stateManager.getMainContentProvider(); + contentProvider = new ContentProvider(adapterFactory); + contentProvider.inputChanged(main.getViewer(), null, main.getInput()); + + ResourceManager resourceManager = stateManager.getResourceManager(); + labelProvider = new LabelProvider(adapterFactory, resourceManager); + labelProvider.addListener(eventBroker); + } + + public CDOCheckout getCheckout() + { + return checkout; + } + + public ComposedAdapterFactory getAdapterFactory() + { + return adapterFactory; + } + + public ContentProvider getContentProvider() + { + return contentProvider; + } + + public LabelProvider getLabelProvider() + { + return labelProvider; + } + + public void addListener(ILabelProviderListener listener) + { + eventBroker.addListener(listener); + } + + public void removeListener(ILabelProviderListener listener) + { + eventBroker.removeListener(listener); + } + + public void dispose() + { + labelProvider.dispose(); + contentProvider.dispose(); + adapterFactory.dispose(); + eventBroker.dispose(); + } + + /** + * @author Eike Stepper + */ + private static final class EventBroker extends EventManager implements ILabelProviderListener + { + public void addListener(ILabelProviderListener listener) + { + addListenerObject(listener); + } + + public void removeListener(ILabelProviderListener listener) + { + removeListenerObject(listener); + } + + public void labelProviderChanged(final LabelProviderChangedEvent event) + { + Object[] listeners = getListeners(); + for (int i = 0; i < listeners.length; ++i) + { + final ILabelProviderListener listener = (ILabelProviderListener)listeners[i]; + SafeRunnable.run(new SafeRunnable() + { + public void run() + { + listener.labelProviderChanged(event); + } + }); + } + } + + public void dispose() + { + clearListeners(); + } + } + + /** + * @author Eike Stepper + */ + public static final class ContentProvider extends AdapterFactoryContentProvider + { + public ContentProvider(AdapterFactory adapterFactory) + { + super(adapterFactory); + } + + @Override + public void notifyChanged(Notification notification) + { + Object notifier = notification.getNotifier(); + if (notifier instanceof EObject) + { + EObject eObject = (EObject)notifier; + + Object feature = notification.getFeature(); + if (feature instanceof EReference) + { + EReference reference = (EReference)feature; + if (reference.isContainment()) + { + Adapter adapter = EcoreUtil.getAdapter(eObject.eAdapters(), CDOCheckout.class); + if (adapter instanceof CDOCheckout) + { + CDOCheckout checkout = (CDOCheckout)adapter; + if (checkout.isOpen()) + { + notification = new ViewerNotification(notification, checkout, true, true); + } + } + } + } + } + + super.notifyChanged(notification); + } + } + + /** + * @author Eike Stepper + */ + public static final class LabelProvider extends AdapterFactoryLabelProvider implements IColorProvider, + IStyledLabelProvider + { + private final ResourceManager resourceManager; + + public LabelProvider(AdapterFactory adapterFactory, ResourceManager resourceManager) + { + super(adapterFactory); + this.resourceManager = resourceManager; + } + + @Override + public Color getForeground(Object object) + { + if (object instanceof ViewerUtil.Pending) + { + return ContainerItemProvider.PENDING_COLOR; + } + + return super.getForeground(object); + } + + @Override + public String getText(Object element) + { + try + { + if (element instanceof CDOCheckout) + { + CDOCheckout checkout = (CDOCheckout)element; + return checkout.getLabel(); + } + + if (element instanceof CDOElement) + { + CDOElement checkoutElement = (CDOElement)element; + return checkoutElement.toString(); + } + + if (element instanceof EObject) + { + CDOElement checkoutElement = (CDOElement)EcoreUtil.getExistingAdapter((Notifier)element, CDOElement.class); + if (checkoutElement != null) + { + return checkoutElement.toString(element); + } + + if (element instanceof CDOResourceNode) + { + CDOResourceNode resourceNode = (CDOResourceNode)element; + + String name = resourceNode.getName(); + if (name == null) + { + // This must be the root resource. + return ""; + } + + return name; + } + } + + if (element instanceof ViewerUtil.Pending) + { + ViewerUtil.Pending pending = (ViewerUtil.Pending)element; + return pending.getText(); + } + + return super.getText(element); + } + catch (Exception ex) + { + return ex.getMessage(); + } + } + + @Override + public Image getImage(Object element) + { + try + { + if (element instanceof CDOCheckout) + { + CDOCheckout checkout = (CDOCheckout)element; + if (checkout.isOpen()) + { + return CDOLabelDecorator.decorate(CHECKOUT_IMAGE, checkout.getRootObject()); + } + + return CHECKOUT_CLOSED_IMAGE; + } + + if (element instanceof ViewerUtil.Pending) + { + return ContainerItemProvider.PENDING_IMAGE; + } + + if (element instanceof CDOElement) + { + element = ((CDOElement)element).getDelegate(); + Image image = doGetImage(element); + return CDOLabelDecorator.decorate(image, element); + } + + return doGetImage(element); + } + catch (Exception ex) + { + return ERROR_IMAGE; + } + } + + private Image doGetImage(Object element) + { + if (element instanceof CDOResourceLeaf) + { + String name = ((CDOResourceLeaf)element).getName(); + if (name == null) + { + // This must be the root resource. + return FOLDER_IMAGE; + } + + IEditorDescriptor editorDescriptor = EDITOR_REGISTRY.getDefaultEditor(name); + if (editorDescriptor != null && !CDOEditorUtil.TEXT_EDITOR_ID.equals(editorDescriptor.getId())) + { + Image image = getWorkbenchImage(name); + if (image != null) + { + return image; + } + } + } + + return super.getImage(element); + } + + private Image getWorkbenchImage(String name) + { + ImageDescriptor imageDescriptor = EDITOR_REGISTRY.getImageDescriptor(name); + if (imageDescriptor != null) + { + return (Image)resourceManager.get(imageDescriptor); + } + + return null; + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutStateManager.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutStateManager.java new file mode 100644 index 0000000000..0555e082ef --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutStateManager.java @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2004-2014 Eike Stepper (Berlin, Germany) 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: + * Eike Stepper - initial API and implementation + */ +package org.eclipse.emf.cdo.explorer.ui.checkouts; + +import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; +import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; +import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutState.ContentProvider; +import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutState.LabelProvider; + +import org.eclipse.emf.edit.provider.ComposedAdapterFactory; + +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.jface.resource.LocalResourceManager; +import org.eclipse.jface.resource.ResourceManager; +import org.eclipse.jface.viewers.IContentProvider; +import org.eclipse.jface.viewers.TreeViewer; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author Eike Stepper + */ +public final class CDOCheckoutStateManager +{ + private final ResourceManager resourceManager = new LocalResourceManager(JFaceResources.getResources()); + + private final Map<CDOCheckout, CDOCheckoutState> states = new HashMap<CDOCheckout, CDOCheckoutState>(); + + private final CDOCheckoutContentProvider mainContentProvider; + + public CDOCheckoutStateManager(CDOCheckoutContentProvider mainContentProvider) + { + this.mainContentProvider = mainContentProvider; + } + + public CDOCheckoutContentProvider getMainContentProvider() + { + return mainContentProvider; + } + + public ResourceManager getResourceManager() + { + return resourceManager; + } + + public CDOCheckoutState[] getStates() + { + synchronized (states) + { + return states.values().toArray(new CDOCheckoutState[states.size()]); + } + } + + public CDOCheckoutState getState(Object object) + { + CDOCheckout checkout = CDOExplorerUtil.getCheckout(object); + if (checkout != null) + { + synchronized (states) + { + CDOCheckoutState state = states.get(checkout); + if (state == null) + { + state = new CDOCheckoutState(this, checkout); + states.put(checkout, state); + } + + return state; + } + } + + return null; + } + + public void inputChanged(TreeViewer newTreeViewer, Object oldInput, Object newInput) + { + for (CDOCheckoutState state : getStates()) + { + IContentProvider contentProvider = state.getContentProvider(); + contentProvider.inputChanged(newTreeViewer, oldInput, newInput); + } + } + + public Object adapt(Object target, Object type) + { + CDOCheckoutState state = getState(target); + if (state != null) + { + return state.getAdapterFactory().adapt(target, type); + } + + return null; + } + + public ComposedAdapterFactory getAdapterFactory(Object object) + { + CDOCheckoutState state = getState(object); + if (state != null) + { + return state.getAdapterFactory(); + } + + return null; + } + + public ContentProvider getContentProvider(Object object) + { + CDOCheckoutState state = getState(object); + if (state != null) + { + return state.getContentProvider(); + } + + return null; + } + + public LabelProvider getLabelProvider(Object object) + { + CDOCheckoutState state = getState(object); + if (state != null) + { + return state.getLabelProvider(); + } + + return null; + } + + public void dispose() + { + resourceManager.dispose(); + } +} diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutViewerSorter.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutViewerSorter.java index 605c64e91e..fbd40d38bb 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutViewerSorter.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/CDOCheckoutViewerSorter.java @@ -47,11 +47,14 @@ public class CDOCheckoutViewerSorter extends ViewerSorter EObject child2 = (EObject)e2; EObject parent = CDOElement.getParentOf(child1); - EList<EObject> children = parent.eContents(); - - int pos1 = children.indexOf(child1); - int pos2 = children.indexOf(child2); - return pos1 - pos2; + if (parent != null) + { + EList<EObject> children = parent.eContents(); + + int pos1 = children.indexOf(child1); + int pos2 = children.indexOf(child2); + return pos1 - pos2; + } } return super.compare(viewer, e1, e2); diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/NewActionProvider.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/NewActionProvider.java index b3d7441ebf..09b2eaa194 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/NewActionProvider.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/actions/NewActionProvider.java @@ -17,6 +17,7 @@ import org.eclipse.emf.cdo.eresource.CDOResourceNode; import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutContentProvider; +import org.eclipse.emf.cdo.explorer.ui.checkouts.wizards.AbstractNewWizard; import org.eclipse.emf.cdo.internal.ui.actions.TransactionalBackgroundAction; import org.eclipse.emf.cdo.internal.ui.editor.CDOEditor; import org.eclipse.emf.cdo.internal.ui.editor.CDOEditor.NewRootMenuPopulator; @@ -59,6 +60,9 @@ import org.eclipse.ui.navigator.ICommonMenuConstants; import org.eclipse.ui.navigator.ICommonViewerSite; import org.eclipse.ui.navigator.ICommonViewerWorkbenchSite; import org.eclipse.ui.navigator.WizardActionGroup; +import org.eclipse.ui.wizards.IWizardCategory; +import org.eclipse.ui.wizards.IWizardDescriptor; +import org.eclipse.ui.wizards.IWizardRegistry; import java.util.Collection; @@ -69,7 +73,9 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio { private static final String NEW_MENU_NAME = "common.new.menu"; //$NON-NLS-1$ - private final ComposedAdapterFactory adapterFactory; + private ICommonActionExtensionSite extensionSite; + + private CDOCheckoutContentProvider contentProvider; private ActionFactory.IWorkbenchAction showDlgAction; @@ -83,12 +89,12 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio public NewActionProvider() { - adapterFactory = CDOEditor.createAdapterFactory(true); } @Override public void init(ICommonActionExtensionSite extensionSite) { + this.extensionSite = extensionSite; ICommonViewerSite viewSite = extensionSite.getViewSite(); if (viewSite instanceof ICommonViewerWorkbenchSite) { @@ -97,8 +103,41 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio showDlgAction = ActionFactory.NEW.create(window); - newWizardActionGroup = new WizardActionGroup(window, PlatformUI.getWorkbench().getNewWizardRegistry(), - WizardActionGroup.TYPE_NEW, extensionSite.getContentService()); + final CDOCheckoutContentProvider contentProvider = getContentProvider(); + final IWizardRegistry wizardRegistry = PlatformUI.getWorkbench().getNewWizardRegistry(); + + IWizardRegistry wrapperRegistry = new IWizardRegistry() + { + public IWizardCategory getRootCategory() + { + return wizardRegistry.getRootCategory(); + } + + public IWizardDescriptor[] getPrimaryWizards() + { + return wizardRegistry.getPrimaryWizards(); + } + + public IWizardDescriptor findWizard(String id) + { + IWizardDescriptor wizard = wizardRegistry.findWizard(id); + if (wizard instanceof AbstractNewWizard) + { + AbstractNewWizard newWizard = (AbstractNewWizard)wizard; + newWizard.setContentProvider(contentProvider); + } + + return wizard; + } + + public IWizardCategory findCategory(String id) + { + return wizardRegistry.findCategory(id); + } + }; + + newWizardActionGroup = new WizardActionGroup(window, wrapperRegistry, WizardActionGroup.TYPE_NEW, + extensionSite.getContentService()); viewer = (TreeViewer)extensionSite.getStructuredViewer(); viewer.addSelectionChangedListener(this); @@ -120,7 +159,6 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio showDlgAction = null; } - adapterFactory.dispose(); super.dispose(); } @@ -207,7 +245,13 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio @Override protected IAction createAction(EObject object) { - return new NewRootAction(resource, object); + CDOCheckoutContentProvider contentProvider = getContentProvider(); + ComposedAdapterFactory adapterFactory = contentProvider.getStateManager().getState(object).getAdapterFactory(); + + Object image = CDOEditor.getLabelImage(adapterFactory, object); + ImageDescriptor imageDescriptor = ExtendedImageRegistry.getInstance().getImageDescriptor(image); + + return new NewRootAction(resource, object, imageDescriptor); } }; @@ -219,6 +263,9 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio CDOCheckout checkout = CDOExplorerUtil.getCheckout(object); ResourceSet resourceSet = checkout.getView().getResourceSet(); + CDOCheckoutContentProvider contentProvider = getContentProvider(); + ComposedAdapterFactory adapterFactory = contentProvider.getStateManager().getState(checkout).getAdapterFactory(); + EditingDomain editingDomain = new AdapterFactoryEditingDomain(adapterFactory, new BasicCommandStack(), resourceSet); IStructuredSelection selection = new StructuredSelection(object); CDOObject cdoObject = CDOUtil.getCDOObject(object); @@ -236,6 +283,17 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio } } + private CDOCheckoutContentProvider getContentProvider() + { + if (contentProvider == null) + { + String viewerID = extensionSite.getContentService().getViewerId(); + contentProvider = CDOCheckoutContentProvider.getInstance(viewerID); + } + + return contentProvider; + } + /** * @author Eike Stepper */ @@ -276,7 +334,7 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio EObject object = view.getObject(newObject); if (object != null) { - CDOCheckoutContentProvider contentProvider = CDOCheckoutContentProvider.getInstance(); + CDOCheckoutContentProvider contentProvider = getContentProvider(); if (contentProvider != null) { contentProvider.selectObject(object); @@ -293,10 +351,9 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio { private final EObject object; - public NewRootAction(CDOResource resource, EObject object) + public NewRootAction(CDOResource resource, EObject object, ImageDescriptor image) { - super(object.eClass().getName(), null, ExtendedImageRegistry.getInstance().getImageDescriptor( - CDOEditor.getLabelImage(adapterFactory, object)), resource); + super(object.eClass().getName(), null, image, resource); this.object = object; } @@ -326,24 +383,34 @@ public class NewActionProvider extends CommonActionProvider implements ISelectio @Override protected EObject doRun(CDOTransaction transaction, CDOObject parent, ISelection selection) { - BasicCommandStack commandStack = new BasicCommandStack(); - ResourceSet resourceSet = transaction.getResourceSet(); - EditingDomain editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, resourceSet); + ComposedAdapterFactory adapterFactory = CDOEditor.createAdapterFactory(true); - CreateChildAction delegate = new CreateChildAction(editingDomain, selection, childDescriptor); - delegate.run(); - - if (childDescriptor instanceof CommandParameter) + try { - CommandParameter parameter = (CommandParameter)childDescriptor; - Object value = parameter.getValue(); - if (value instanceof EObject) + BasicCommandStack commandStack = new BasicCommandStack(); + ResourceSet resourceSet = transaction.getResourceSet(); + + EditingDomain editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, resourceSet); + + CreateChildAction delegate = new CreateChildAction(editingDomain, selection, childDescriptor); + delegate.run(); + + if (childDescriptor instanceof CommandParameter) { - return (EObject)value; + CommandParameter parameter = (CommandParameter)childDescriptor; + Object value = parameter.getValue(); + if (value instanceof EObject) + { + return (EObject)value; + } } - } - return null; + return null; + } + finally + { + adapterFactory.dispose(); + } } } } diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/AbstractNewWizard.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/AbstractNewWizard.java index 771ab2c11a..aab9a5a268 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/AbstractNewWizard.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/AbstractNewWizard.java @@ -43,6 +43,8 @@ public abstract class AbstractNewWizard extends Wizard implements INewWizard private IStructuredSelection selection; + private CDOCheckoutContentProvider contentProvider; + private NewWizardPage page; protected AbstractNewWizard(String resourceType, String title) @@ -56,6 +58,11 @@ public abstract class AbstractNewWizard extends Wizard implements INewWizard this.selection = selection; } + public void setContentProvider(CDOCheckoutContentProvider contentProvider) + { + this.contentProvider = contentProvider; + } + public final String getResourceType() { return resourceType; @@ -130,17 +137,13 @@ public abstract class AbstractNewWizard extends Wizard implements INewWizard "An error occured while creating the " + title.toLowerCase() + ".", status); } - if (commitInfo != null) + if (commitInfo != null && contentProvider != null) { - CDOCheckoutContentProvider contentProvider = CDOCheckoutContentProvider.getInstance(); - if (contentProvider != null) - { - CDOView view = checkout.getView(); - view.waitForUpdate(commitInfo.getTimeStamp()); - - CDOObject newObject = view.getObject(newID); - contentProvider.selectObject(newObject); - } + CDOView view = checkout.getView(); + view.waitForUpdate(commitInfo.getTimeStamp()); + + CDOObject newObject = view.getObject(newID); + contentProvider.selectObject(newObject); } return Status.OK_STATUS; diff --git a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/NewWizardPage.java b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/NewWizardPage.java index a0ea83ed85..804df47180 100644 --- a/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/NewWizardPage.java +++ b/plugins/org.eclipse.emf.cdo.explorer.ui/src/org/eclipse/emf/cdo/explorer/ui/checkouts/wizards/NewWizardPage.java @@ -15,6 +15,7 @@ import org.eclipse.emf.cdo.eresource.CDOResourceNode; import org.eclipse.emf.cdo.explorer.CDOExplorerUtil; import org.eclipse.emf.cdo.explorer.checkouts.CDOCheckout; import org.eclipse.emf.cdo.explorer.ui.bundle.OM; +import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutContentProvider; import org.eclipse.emf.cdo.explorer.ui.checkouts.CDOCheckoutLabelProvider; import org.eclipse.emf.cdo.ui.CDOItemProvider; @@ -155,10 +156,15 @@ public class NewWizardPage extends WizardPage } }; + CDOCheckoutContentProvider contentProvider = new CDOCheckoutContentProvider(); + contentProvider.disposeWith(parentControl); + + CDOCheckoutLabelProvider labelProvider = new CDOCheckoutLabelProvider(contentProvider); + parentViewer = new TreeViewer(container, SWT.BORDER); parentViewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1)); parentViewer.setContentProvider(parentItemProvider); - parentViewer.setLabelProvider(new CDOCheckoutLabelProvider()); + parentViewer.setLabelProvider(labelProvider); parentViewer.setInput(CDOExplorerUtil.getCheckoutManager()); parentViewer.addSelectionChangedListener(new ISelectionChangedListener() { diff --git a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/CDOExplorerUtil.java b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/CDOExplorerUtil.java index 670b7e631a..0dd267d342 100644 --- a/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/CDOExplorerUtil.java +++ b/plugins/org.eclipse.emf.cdo.explorer/src/org/eclipse/emf/cdo/explorer/CDOExplorerUtil.java @@ -88,6 +88,11 @@ public final class CDOExplorerUtil path.addFirst(object); } + if (object instanceof CDOCheckout) + { + return (CDOCheckout)object; + } + if (object instanceof EObject) { EObject eObject = (EObject)object; diff --git a/plugins/org.eclipse.emf.cdo.ui.compare/src/org/eclipse/emf/cdo/ui/compare/CDOCompareEditorUtil.java b/plugins/org.eclipse.emf.cdo.ui.compare/src/org/eclipse/emf/cdo/ui/compare/CDOCompareEditorUtil.java index 70ef2f68e3..c33c0b20b8 100644 --- a/plugins/org.eclipse.emf.cdo.ui.compare/src/org/eclipse/emf/cdo/ui/compare/CDOCompareEditorUtil.java +++ b/plugins/org.eclipse.emf.cdo.ui.compare/src/org/eclipse/emf/cdo/ui/compare/CDOCompareEditorUtil.java @@ -17,6 +17,8 @@ import org.eclipse.emf.cdo.compare.CDOCompareUtil; import org.eclipse.emf.cdo.session.CDORepositoryInfo; import org.eclipse.emf.cdo.session.CDOSession; import org.eclipse.emf.cdo.spi.common.branch.CDOBranchUtil; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.transaction.CDOTransactionOpener; import org.eclipse.emf.cdo.ui.CDOItemProvider; import org.eclipse.emf.cdo.ui.internal.compare.bundle.OM; import org.eclipse.emf.cdo.view.CDOView; @@ -30,6 +32,7 @@ import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.domain.ICompareEditingDomain; import org.eclipse.emf.compare.domain.impl.EMFCompareEditingDomain; import org.eclipse.emf.compare.scope.IComparisonScope; +import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.edit.EMFEditPlugin; import org.eclipse.emf.edit.provider.ComposedAdapterFactory; @@ -37,6 +40,8 @@ import org.eclipse.emf.spi.cdo.InternalCDOView; import org.eclipse.compare.CompareConfiguration; import org.eclipse.compare.CompareUI; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.util.IPropertyChangeListener; import org.eclipse.swt.graphics.Image; @@ -62,11 +67,20 @@ public class CDOCompareEditorUtil public static boolean openEditor(CDOViewOpener viewOpener, CDOBranchPoint leftPoint, CDOBranchPoint rightPoint, CDOView[] originView, boolean activate) { + return openEditor(null, viewOpener, leftPoint, rightPoint, originView, activate); + } + + /** + * @since 4.3 + */ + public static boolean openEditor(CDOTransactionOpener transactionOpener, CDOViewOpener viewOpener, + CDOBranchPoint leftPoint, CDOBranchPoint rightPoint, CDOView[] originView, boolean activate) + { ACTIVATE_EDITOR.set(activate); try { - return openDialog(viewOpener, leftPoint, rightPoint, originView); + return openDialog(transactionOpener, viewOpener, leftPoint, rightPoint, originView); } finally { @@ -139,6 +153,15 @@ public class CDOCompareEditorUtil public static boolean openDialog(CDOViewOpener viewOpener, CDOBranchPoint leftPoint, CDOBranchPoint rightPoint, CDOView[] originView) { + return openDialog(null, viewOpener, leftPoint, rightPoint, originView); + } + + /** + * @since 4.3 + */ + public static boolean openDialog(CDOTransactionOpener transactionOpener, CDOViewOpener viewOpener, + CDOBranchPoint leftPoint, CDOBranchPoint rightPoint, CDOView[] originView) + { final Boolean activateEditor = ACTIVATE_EDITOR.get(); final CDOView[] leftAndRightView = { null, null }; @@ -153,7 +176,17 @@ public class CDOCompareEditorUtil try { - leftAndRightView[0] = viewOpener.openView(leftPoint, new ResourceSetImpl()); + ResourceSet leftResourceSet = new ResourceSetImpl(); + if (transactionOpener != null) + { + leftPoint = leftPoint.getBranch().getHead(); + leftAndRightView[0] = transactionOpener.openTransaction(leftPoint, leftResourceSet); + } + else + { + leftAndRightView[0] = viewOpener.openView(leftPoint, leftResourceSet); + } + leftAndRightView[1] = viewOpener.openView(rightPoint, new ResourceSetImpl()); return openDialog(leftAndRightView[0], leftAndRightView[1], originView); @@ -251,18 +284,23 @@ public class CDOCompareEditorUtil String rightLabel = itemProvider.getText(rightBranchPoint); itemProvider.dispose(); + boolean leftEditable = !leftView.isReadOnly(); + boolean rightEditable = !rightView.isReadOnly(); + CompareConfiguration configuration = new CompareConfiguration(); configuration.setLeftImage(leftImage); - configuration.setLeftLabel(leftLabel); - configuration.setLeftEditable(!leftView.isReadOnly()); + configuration.setLeftLabel("Target: " + leftLabel); + configuration.setLeftEditable(leftEditable); configuration.setRightImage(rightImage); - configuration.setRightLabel(rightLabel); - configuration.setRightEditable(!rightView.isReadOnly()); + configuration.setRightLabel("Source: " + rightLabel); + configuration.setRightEditable(rightEditable); - String title = "Compare " + ((InternalCDOView)leftView).getRepositoryName() + " " + leftLabel + " and " + boolean merge = leftEditable || rightEditable; + String repositoryName = ((InternalCDOView)leftView).getRepositoryName(); + String title = (merge ? "Merge " : "Compare ") + repositoryName + " " + leftLabel + (merge ? " from " : " and ") + rightLabel; - Input input = new Input(configuration, comparison, editingDomain, adapterFactory); + Input input = new Input(leftView, configuration, comparison, editingDomain, adapterFactory); input.setTitle(title); return input; } @@ -315,15 +353,18 @@ public class CDOCompareEditorUtil { private static final Image COMPARE_IMAGE = OM.getImage("icons/compare.gif"); + private final CDOView leftView; + private List<Runnable> disposeRunnables; private boolean ok; - private Input(CompareConfiguration configuration, Comparison comparison, ICompareEditingDomain editingDomain, - AdapterFactory adapterFactory) + private Input(CDOView leftView, CompareConfiguration configuration, Comparison comparison, + ICompareEditingDomain editingDomain, AdapterFactory adapterFactory) { super(new org.eclipse.emf.compare.ide.ui.internal.configuration.EMFCompareConfiguration(configuration), comparison, editingDomain, adapterFactory); + this.leftView = leftView; } private void dispose() @@ -350,6 +391,31 @@ public class CDOCompareEditorUtil this.disposeRunnables = disposeRunnables; } + @Override + public void cancelPressed() + { + super.cancelPressed(); + } + + @Override + public void saveChanges(IProgressMonitor monitor) throws CoreException + { + if (leftView instanceof CDOTransaction) + { + CDOTransaction transaction = (CDOTransaction)leftView; + + try + { + transaction.commit(monitor); + setDirty(false); + } + catch (Exception ex) + { + OM.BUNDLE.coreException(ex); + } + } + } + public boolean isOK() { return ok; diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractBundle.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractBundle.java index 183ccacc3a..708e31ae55 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractBundle.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/internal/util/bundle/AbstractBundle.java @@ -20,6 +20,11 @@ import org.eclipse.net4j.util.om.log.OMLogger; import org.eclipse.net4j.util.om.trace.OMTracer; import org.eclipse.net4j.util.om.trace.Tracer; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Status; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -200,6 +205,57 @@ public abstract class AbstractBundle implements OMBundle, OMBundle.DebugSupport, return logger; } + public IStatus getStatus(Object obj) + { + if (obj instanceof CoreException) + { + CoreException coreException = (CoreException)obj; + return coreException.getStatus(); + } + + if (obj instanceof Throwable) + { + Throwable t = (Throwable)obj; + String msg = t.getLocalizedMessage(); + if (msg == null || msg.length() == 0) + { + msg = t.getClass().getName(); + } + + return new Status(IStatus.ERROR, getBundleID(), msg, t); + } + + return new Status(IStatus.INFO, getBundleID(), obj.toString(), null); + } + + public void coreException(Throwable t) throws CoreException + { + if (t instanceof CoreException) + { + CoreException ex = (CoreException)t; + IStatus status = ex.getStatus(); + if (status != null && status.getSeverity() == IStatus.CANCEL) + { + throw new OperationCanceledException(); + } + + throw ex; + } + + if (t instanceof OperationCanceledException) + { + throw (OperationCanceledException)t; + } + + if (t instanceof Error) + { + throw (Error)t; + } + + IStatus status = getStatus(t); + throw new CoreException(status); + } + public File getConfigFile() { return platform.getConfigFile(getConfigFileName()); diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/OMBundle.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/OMBundle.java index 870d19187f..4433f4c53d 100644 --- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/OMBundle.java +++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/om/OMBundle.java @@ -4,7 +4,7 @@ * 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: * Eike Stepper - initial API and implementation */ @@ -14,6 +14,8 @@ import org.eclipse.net4j.util.om.log.OMLogger; import org.eclipse.net4j.util.om.pref.OMPreferences; import org.eclipse.net4j.util.om.trace.OMTracer; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; import org.eclipse.osgi.service.debug.DebugOptions; import org.osgi.framework.Bundle; @@ -28,7 +30,7 @@ import java.util.ResourceBundle; /** * Represents a {@link Bundle bundle}, whether OSGi {@link OMPlatform#isOSGiRunning() is running} or not. - * + * * @author Eike Stepper * @noextend This interface is not intended to be extended by clients. * @noimplement This interface is not intended to be implemented by clients. @@ -59,6 +61,16 @@ public interface OMBundle public OMPreferences preferences(); + /** + * @since 3.5 + */ + public IStatus getStatus(Object obj); + + /** + * @since 3.5 + */ + public void coreException(Throwable t) throws CoreException; + public File getConfigFile(); public Properties getConfigProperties(); @@ -80,7 +92,7 @@ public interface OMBundle /** * A facility for accessing OSGi {@link DebugOptions debug options}, whether OSGi {@link OMPlatform#isOSGiRunning() is * running} or not. - * + * * @author Eike Stepper */ public interface DebugSupport @@ -106,21 +118,21 @@ public interface OMBundle /** * A facility for accessing {@link ResourceBundle resource bundles}. - * + * * @author Eike Stepper */ public interface TranslationSupport { /** * Indicates whether strings should be translated by default. - * + * * @return <code>true</code> if strings should be translated by default; <code>false</code> otherwise. */ public boolean shouldTranslate(); /** * Sets whether strings should be translated by default. - * + * * @param shouldTranslate * whether strings should be translated by default. */ @@ -128,7 +140,7 @@ public interface OMBundle /** * Returns the string resource associated with the key. - * + * * @param key * the key of the string resource. * @return the string resource associated with the key. @@ -137,7 +149,7 @@ public interface OMBundle /** * Returns the string resource associated with the key. - * + * * @param key * the key of the string resource. * @param translate @@ -148,7 +160,7 @@ public interface OMBundle /** * Returns a string resource associated with the key, and performs substitutions. - * + * * @param key * the key of the string. * @param args @@ -161,7 +173,7 @@ public interface OMBundle /** * Returns a string resource associated with the key, and performs substitutions. - * + * * @param key * the key of the string. * @param translate |