Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2022-05-09 04:24:16 +0000
committerEike Stepper2022-05-09 04:28:39 +0000
commitdf0581fc5c479ab0555bcb1abc900ecd6b21890d (patch)
treea2e8a20143ead84dc874ca690ee5471e1933133f /plugins/org.eclipse.emf.cdo.ui/src/org
parent545e909ec104404a784f7f3302a28959705e07ed (diff)
downloadcdo-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')
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOAdapterFactoryContentProvider.java61
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/CDOContentProvider.java40
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOActionBarContributor.java3
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOEditor.java123
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/internal/ui/editor/CDOLoadResourceAction.java159
-rw-r--r--plugins/org.eclipse.emf.cdo.ui/src/org/eclipse/emf/cdo/ui/CDOLoadResourceProvider.java64
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;
+ }
+ }
+}

Back to the top