diff options
author | Eike Stepper | 2022-05-09 04:24:16 +0000 |
---|---|---|
committer | Eike Stepper | 2022-05-09 04:28:39 +0000 |
commit | df0581fc5c479ab0555bcb1abc900ecd6b21890d (patch) | |
tree | a2e8a20143ead84dc874ca690ee5471e1933133f /plugins/org.eclipse.emf.cdo.ui/src/org | |
parent | 545e909ec104404a784f7f3302a28959705e07ed (diff) | |
download | cdo-df0581fc5c479ab0555bcb1abc900ecd6b21890d.tar.gz cdo-df0581fc5c479ab0555bcb1abc900ecd6b21890d.tar.xz cdo-df0581fc5c479ab0555bcb1abc900ecd6b21890d.zip |
[579862] Provide a way to contribute "Browse Xyz..." buttons to the "Load Resource" dialog
https://bugs.eclipse.org/bugs/show_bug.cgi?id=579862
Diffstat (limited to 'plugins/org.eclipse.emf.cdo.ui/src/org')
6 files changed, 336 insertions, 114 deletions
diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOAdapterFactoryContentProvider.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOAdapterFactoryContentProvider.java new file mode 100644 index 0000000000..1b63726595 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOAdapterFactoryContentProvider.java @@ -0,0 +1,61 @@ +package org.eclipse.emf.cdo.internal.ui; + +import org.eclipse.emf.cdo.internal.ui.bundle.OM; + +import org.eclipse.net4j.util.om.trace.ContextTracer; + +import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider; + +import org.eclipse.jface.viewers.Viewer; + +/** + * @author Eike Stepper + */ +public class CDOAdapterFactoryContentProvider extends AdapterFactoryContentProvider +{ + private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOAdapterFactoryContentProvider.class); + + public CDOAdapterFactoryContentProvider(AdapterFactory adapterFactory) + { + super(adapterFactory); + } + + @Override + public void inputChanged(Viewer viewer, Object oldInput, Object newInput) + { + super.inputChanged(viewer, oldInput, newInput); + + if (viewer != null) + { + viewerRefresh = new RunnableViewerRefresh(viewer); + } + else + { + viewerRefresh = null; + } + } + + public RunnableViewerRefresh getViewerRefresh() + { + return (RunnableViewerRefresh)viewerRefresh; + } + + @Override + public boolean hasChildren(Object object) + { + try + { + return super.hasChildren(object); + } + catch (Exception ex) + { + if (TRACER.isEnabled()) + { + TRACER.trace(ex); + } + + return false; + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOContentProvider.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOContentProvider.java index e7e6975495..fac93d8ecf 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOContentProvider.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOContentProvider.java @@ -741,4 +741,44 @@ public abstract class CDOContentProvider<CONTEXT> implements ITreeContentProvide { Opening, Open, Closed } + + /** + * @author Eike Stepper + */ + public static abstract class ContextFree extends CDOContentProvider<Object> + { + public ContextFree() + { + } + + @Override + protected boolean isContext(Object object) + { + return false; + } + + @Override + protected ContextState getContextState(Object context) + { + throw new UnsupportedOperationException(); + } + + @Override + protected void openContext(Object context) + { + throw new UnsupportedOperationException(); + } + + @Override + protected void closeContext(Object context) + { + throw new UnsupportedOperationException(); + } + + @Override + protected Object getRootObject(Object context) + { + throw new UnsupportedOperationException(); + } + } } diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java index d15953de9e..54a5b3b965 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java @@ -22,7 +22,6 @@ import org.eclipse.emf.edit.ui.action.ControlAction; import org.eclipse.emf.edit.ui.action.CreateChildAction; import org.eclipse.emf.edit.ui.action.CreateSiblingAction; import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor; -import org.eclipse.emf.edit.ui.action.LoadResourceAction; import org.eclipse.emf.edit.ui.action.ValidateAction; import org.eclipse.jface.action.Action; @@ -177,7 +176,7 @@ public class CDOActionBarContributor extends EditingDomainActionBarContributor i public CDOActionBarContributor() { super(ADDITIONS_LAST_STYLE); - loadResourceAction = new LoadResourceAction(); + loadResourceAction = new CDOLoadResourceAction(); loadResourceAction.setId(LOAD_RESOURCE_ID); importRootsAction = new ImportRootsAction(); diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java index e38288ca8e..cca2b0df67 100644 --- a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java @@ -24,6 +24,7 @@ import org.eclipse.emf.cdo.common.model.CDOPackageUnit; import org.eclipse.emf.cdo.common.model.EMFUtil; import org.eclipse.emf.cdo.common.util.CDOCommonUtil; import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.internal.ui.CDOAdapterFactoryContentProvider; import org.eclipse.emf.cdo.internal.ui.CDOContentProvider; import org.eclipse.emf.cdo.internal.ui.RunnableViewerRefresh; import org.eclipse.emf.cdo.internal.ui.ViewerUtil; @@ -58,6 +59,7 @@ import org.eclipse.net4j.util.collection.ConcurrentArray; import org.eclipse.net4j.util.lifecycle.LifecycleUtil; import org.eclipse.net4j.util.om.OMPlatform; import org.eclipse.net4j.util.om.trace.ContextTracer; +import org.eclipse.net4j.util.ui.SafeTreeViewer; import org.eclipse.net4j.util.ui.UIUtil; import org.eclipse.net4j.util.ui.actions.LongRunningAction; import org.eclipse.net4j.util.ui.actions.SafeAction; @@ -157,12 +159,10 @@ import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Item; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; -import org.eclipse.swt.widgets.Widget; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorPart; @@ -1267,13 +1267,15 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv { editingDomain = (AdapterFactoryEditingDomain)domainProvider.getEditingDomain(); commandStack = editingDomain.getCommandStack(); - if (editingDomain.getAdapterFactory() instanceof ComposedAdapterFactory) + + AdapterFactory editingDomainAdapterFactory = editingDomain.getAdapterFactory(); + if (editingDomainAdapterFactory instanceof ComposedAdapterFactory) { - adapterFactory = (ComposedAdapterFactory)editingDomain.getAdapterFactory(); + adapterFactory = (ComposedAdapterFactory)editingDomainAdapterFactory; } else { - adapterFactory.addAdapterFactory(editingDomain.getAdapterFactory()); + adapterFactory.addAdapterFactory(editingDomainAdapterFactory); } } else @@ -1346,7 +1348,7 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv } Tree tree = new Tree(getContainer(), SWT.MULTI); - selectionViewer = new SafeTreeViewer(tree); + selectionViewer = new SafeTreeViewer(tree, ex -> handleException(ex)); setCurrentViewer(selectionViewer); selectionViewer.setContentProvider(createContentProvider()); @@ -1551,56 +1553,10 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv */ protected IContentProvider createContentProvider() { - class DelegateContentProvider extends AdapterFactoryContentProvider - { - public DelegateContentProvider(AdapterFactory adapterFactory) - { - super(adapterFactory); - } - - @Override - public void inputChanged(Viewer viewer, Object oldInput, Object newInput) - { - super.inputChanged(viewer, oldInput, newInput); - - if (viewer != null) - { - viewerRefresh = new RunnableViewerRefresh(viewer); - } - else - { - viewerRefresh = null; - } - } - - public RunnableViewerRefresh getViewerRefresh() - { - return (RunnableViewerRefresh)viewerRefresh; - } - - @Override - public boolean hasChildren(Object object) - { - try - { - return super.hasChildren(object); - } - catch (Exception ex) - { - if (TRACER.isEnabled()) - { - TRACER.trace(ex); - } - - return false; - } - } - } - - DelegateContentProvider delegate = new DelegateContentProvider(adapterFactory); - return new CDOContentProvider<CDOView>() { + private final CDOAdapterFactoryContentProvider delegate = new CDOAdapterFactoryContentProvider(adapterFactory); + @Override public void inputChanged(Viewer newViewer, Object oldInput, Object newInput) { @@ -3101,7 +3057,7 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv } else { - TreeViewer treeViewer = new SafeTreeViewer(parent, getTreeStyle()); + TreeViewer treeViewer = new SafeTreeViewer(parent, getTreeStyle(), ex -> handleException(ex)); treeViewer.addSelectionChangedListener(this); ReflectUtil.setValue(CONTENT_OUTLINE_PAGE_VIEWER_FIELD, this, treeViewer); } @@ -3166,63 +3122,6 @@ public class CDOEditor extends MultiPageEditorPart implements IEditingDomainProv /** * @author Eike Stepper */ - private final class SafeTreeViewer extends TreeViewer - { - public SafeTreeViewer(Tree tree) - { - super(tree); - } - - public SafeTreeViewer(Composite parent, int style) - { - super(parent, style); - } - - @Override - protected void doUpdateItem(Widget widget, Object element, boolean fullMap) - { - try - { - super.doUpdateItem(widget, element, fullMap); - } - catch (Exception ex) - { - handleException(ex); - } - } - - @Override - protected void doUpdateItem(final Item item, Object element) - { - try - { - super.doUpdateItem(item, element); - } - catch (Exception ex) - { - handleException(ex); - } - } - - @Override - public boolean isExpandable(Object element) - { - try - { - return super.isExpandable(element); - } - catch (Exception ex) - { - - handleException(ex); - return false; - } - } - } - - /** - * @author Eike Stepper - */ public static abstract class NewRootMenuPopulator { private final CDOPackageRegistry packageRegistry; diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOLoadResourceAction.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOLoadResourceAction.java new file mode 100644 index 0000000000..e94420568d --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOLoadResourceAction.java @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2022 Eike Stepper (Loehne, 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.internal.ui.editor; + +import org.eclipse.emf.cdo.ui.CDOLoadResourceProvider; + +import org.eclipse.net4j.util.ObjectUtil; +import org.eclipse.net4j.util.container.IPluginContainer; + +import org.eclipse.emf.common.EMFPlugin; +import org.eclipse.emf.common.ui.CommonUIPlugin; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.edit.domain.EditingDomain; +import org.eclipse.emf.edit.ui.action.LoadResourceAction; + +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.widgets.WidgetFactory; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Button; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.eclipse.ui.PlatformUI; + +import java.util.List; + +/** + * @author Eike Stepper + */ +public class CDOLoadResourceAction extends LoadResourceAction +{ + public CDOLoadResourceAction() + { + } + + public CDOLoadResourceAction(EditingDomain domain) + { + super(domain); + } + + @Override + public void run() + { + LoadResourceDialog dialog = new CDOLoadResourceDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), domain); + dialog.open(); + } + + /** + * @author Eike Stepper + */ + public static class CDOLoadResourceDialog extends LoadResourceDialog + { + public CDOLoadResourceDialog(Shell parent, EditingDomain domain) + { + super(parent, domain); + } + + @Override + protected Control createDialogArea(Composite parent) + { + Shell shell = getShell(); + boolean multi = isMulti(); + + ResourceSet resourceSet = domain.getResourceSet(); + List<CDOLoadResourceProvider> providers = CDOLoadResourceProvider.Factory.getProviders(IPluginContainer.INSTANCE, resourceSet); + + // Create a composite with standard margins and spacing. + GridLayout areaLayout = new GridLayout(); + areaLayout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN); + areaLayout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN); + areaLayout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING); + areaLayout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING); + areaLayout.numColumns = 1 // resourceURILabel + + 1 // browseFileSystemButton + + (EMFPlugin.IS_RESOURCES_BUNDLE_AVAILABLE ? 1 : 0) // browseWorkspaceButton + + providers.size(); // Provider buttons + + Composite composite = WidgetFactory.composite(SWT.NONE).layout(areaLayout).layoutData(new GridData(GridData.FILL_BOTH)).create(parent); + applyDialogFont(composite); + + Label resourceURILabel = new Label(composite, SWT.LEFT); + resourceURILabel.setText(CommonUIPlugin.INSTANCE.getString(multi ? "_UI_ResourceURIs_label" : "_UI_ResourceURI_label")); + resourceURILabel.setLayoutData(GridDataFactory.fillDefaults().align(SWT.LEFT, SWT.CENTER).create()); + + Button browseFileSystemButton = new Button(composite, SWT.PUSH); + browseFileSystemButton.setText(CommonUIPlugin.INSTANCE.getString("_UI_BrowseFileSystem_label")); + browseFileSystemButton.setLayoutData(GridDataFactory.fillDefaults().create()); + prepareBrowseFileSystemButton(browseFileSystemButton); + + if (EMFPlugin.IS_RESOURCES_BUNDLE_AVAILABLE) + { + Button browseWorkspaceButton = new Button(composite, SWT.PUSH); + browseWorkspaceButton.setText(CommonUIPlugin.INSTANCE.getString("_UI_BrowseWorkspace_label")); + browseWorkspaceButton.setLayoutData(GridDataFactory.fillDefaults().create()); + prepareBrowseWorkspaceButton(browseWorkspaceButton); + } + + for (CDOLoadResourceProvider provider : providers) + { + Button button = new Button(composite, SWT.PUSH); + button.setText(provider.getButtonText(resourceSet)); + button.setLayoutData(GridDataFactory.fillDefaults().create()); + button.addSelectionListener(new SelectionAdapter() + { + @Override + public void widgetSelected(SelectionEvent e) + { + List<URI> uris = provider.browseResources(resourceSet, shell, multi); + if (ObjectUtil.isEmpty(uris)) + { + return; + } + + if (multi) + { + StringBuilder builder = new StringBuilder(); + + for (URI uri : uris) + { + builder.append(uri.toString()); + builder.append(" "); + } + + uriField.setText((uriField.getText() + " " + builder.toString()).trim()); + } + else + { + uriField.setText(uris.get(0).toString()); + } + } + }); + } + + uriField = new Text(composite, SWT.BORDER); + uriField.setLayoutData(GridDataFactory.fillDefaults().span(areaLayout.numColumns, 1).grab(true, false).create()); + + Label separatorLabel = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL); + separatorLabel.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create()); + + return composite; + } + } +} diff --git a/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOLoadResourceProvider.java b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOLoadResourceProvider.java new file mode 100644 index 0000000000..9bf4ef0ad3 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOLoadResourceProvider.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2022 Eike Stepper (Loehne, 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.ui; + +import org.eclipse.net4j.util.container.IManagedContainer; +import org.eclipse.net4j.util.factory.ProductCreationException; + +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.ResourceSet; + +import org.eclipse.swt.widgets.Shell; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author Eike Stepper + * @since 4.13 + */ +public interface CDOLoadResourceProvider +{ + public String getButtonText(ResourceSet resourceSet); + + public boolean canHandle(ResourceSet resourceSet); + + public List<URI> browseResources(ResourceSet resourceSet, Shell shell, boolean multi); + + /** + * @author Eike Stepper + */ + public static abstract class Factory extends org.eclipse.net4j.util.factory.Factory + { + public static final String PRODUCT_GROUP = "org.eclipse.emf.cdo.ui.loadResourceProviders"; + + public Factory(String type) + { + super(PRODUCT_GROUP, type); + } + + @Override + public abstract CDOLoadResourceProvider create(String description) throws ProductCreationException; + + public static List<CDOLoadResourceProvider> getProviders(IManagedContainer container, ResourceSet resourceSet) + { + List<CDOLoadResourceProvider> providers = new ArrayList<>(); + container.forEachElement(PRODUCT_GROUP, CDOLoadResourceProvider.class, provider -> { + if (provider.canHandle(resourceSet)) + { + providers.add(provider); + } + }); + + return providers; + } + } +} |