diff options
author | Vincent Lorenzo | 2021-10-20 08:10:53 +0000 |
---|---|---|
committer | Pauline DEVILLE | 2021-10-20 09:23:01 +0000 |
commit | 28c27073aba91a8295f9206ad2b4860d5f18d73a (patch) | |
tree | 50a0d4f92e5ce467771be989ac97879a07f00ed6 /plugins/views | |
parent | 8961fcf1a70aa86e10d75ef26d03e29c079d754b (diff) | |
download | org.eclipse.papyrus-28c27073aba91a8295f9206ad2b4860d5f18d73a.tar.gz org.eclipse.papyrus-28c27073aba91a8295f9206ad2b4860d5f18d73a.tar.xz org.eclipse.papyrus-28c27073aba91a8295f9206ad2b4860d5f18d73a.zip |
Bug 576599: [ModelExplorer] IOpenable and Open on double-click must be
improved
Change-Id: Idf266c7ffc894ad799b2229236142d3586285e6f
Signed-off-by: Vincent Lorenzo <vincent.lorenzo@cea.fr>
Diffstat (limited to 'plugins/views')
6 files changed, 148 insertions, 158 deletions
diff --git a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/META-INF/MANIFEST.MF b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/META-INF/MANIFEST.MF index 5fa867ca26f..0e3ed866073 100644 --- a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/META-INF/MANIFEST.MF +++ b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/META-INF/MANIFEST.MF @@ -41,6 +41,7 @@ Require-Bundle: org.eclipse.core.expressions;bundle-version="[3.6.0,4.0.0)", org.eclipse.papyrus.infra.services.labelprovider;bundle-version="[3.0.0,4.0.0)", org.eclipse.papyrus.infra.services.navigation;bundle-version="[4.0.0,5.0.0)", org.eclipse.papyrus.infra.services.semantic;bundle-version="[3.0.0,4.0.0)", + org.eclipse.papyrus.infra.tools;bundle-version="[4.2.0,5.0.0)", org.eclipse.papyrus.infra.ui;bundle-version="[3.0.0,4.0.0)", org.eclipse.papyrus.infra.ui.emf;bundle-version="[3.0.0,4.0.0)", org.eclipse.papyrus.infra.viewpoints.policy;bundle-version="[4.0.0,5.0.0)", diff --git a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/plugin.xml b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/plugin.xml index ebaab1dee8b..0b70f14a335 100644 --- a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/plugin.xml +++ b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/plugin.xml @@ -121,6 +121,20 @@ name="search filter" visibleInUI="false"> </commonFilter> + <actionProvider + class="org.eclipse.papyrus.views.modelexplorer.actionprovider.OpenActionProvider" + id="org.eclipse.papyrus.views.modelexplorer.actionprovider.OpenActionProvider"> + <enablement> + <or> + <adapt + type="org.eclipse.emf.ecore.EObject"> + <adapt + type="org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.IOpenable"> + </adapt> + </adapt> + </or> + </enablement> + </actionProvider> </extension> <!-- <extension diff --git a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/ModelExplorerView.java b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/ModelExplorerView.java index e24bdb2c235..f458199ba91 100644 --- a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/ModelExplorerView.java +++ b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/ModelExplorerView.java @@ -18,7 +18,7 @@ * Ansgar Radermacher (CEA LIST) - Bug 516459: Navigation mechanism with Alt+hover does not work on Linux * Ansgar Radermacher (CEA LIST) - Bug 553094: Avoid potential NPE during dispose and remove reload-listener * Ansgar Radermacher (CEA LIST) - Bug 574410: Exceptions during reload, contents disappears during 2nd reload - * + * Vincent Lorenzo (CEA LIST) - Bug 576599: IOpenable and Open on double-click must be improved *****************************************************************************/ package org.eclipse.papyrus.views.modelexplorer; @@ -49,6 +49,7 @@ import org.eclipse.emf.transaction.ResourceSetListener; import org.eclipse.emf.transaction.ResourceSetListenerImpl; import org.eclipse.emf.transaction.Transaction; import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.jface.action.IAction; import org.eclipse.jface.util.Policy; import org.eclipse.jface.viewers.ColumnViewerToolTipSupport; import org.eclipse.jface.viewers.DoubleClickEvent; @@ -58,6 +59,7 @@ import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.StructuredSelection; +import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerColumn; import org.eclipse.jface.viewers.ViewerFilter; @@ -72,7 +74,6 @@ import org.eclipse.papyrus.infra.core.sasheditor.editor.ISashWindowsContainer; import org.eclipse.papyrus.infra.core.sashwindows.di.service.IPageManager; import org.eclipse.papyrus.infra.core.services.ServiceException; import org.eclipse.papyrus.infra.core.services.ServicesRegistry; -import org.eclipse.papyrus.infra.core.utils.AdapterUtils; import org.eclipse.papyrus.infra.core.utils.ServiceUtils; import org.eclipse.papyrus.infra.emf.commands.PapyrusDeleteCommand; import org.eclipse.papyrus.infra.emf.gmf.command.ICommandWrapper; @@ -81,6 +82,7 @@ import org.eclipse.papyrus.infra.emf.utils.EMFHelper; import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService; import org.eclipse.papyrus.infra.services.navigation.service.NavigationMenu; import org.eclipse.papyrus.infra.services.navigation.service.NavigationService; +import org.eclipse.papyrus.infra.tools.util.PlatformHelper; import org.eclipse.papyrus.infra.ui.editor.IMultiDiagramEditor; import org.eclipse.papyrus.infra.ui.editor.IReloadableEditor; import org.eclipse.papyrus.infra.ui.editor.reload.EditorReloadAdapter; @@ -94,7 +96,6 @@ import org.eclipse.papyrus.infra.widgets.editors.StringWithClearEditor; import org.eclipse.papyrus.infra.widgets.providers.PatternViewerFilter; import org.eclipse.papyrus.infra.widgets.util.IRevealSemanticElement; import org.eclipse.papyrus.views.modelexplorer.SharedModelExplorerState.StateChangedEvent; -import org.eclipse.papyrus.views.modelexplorer.listener.DoubleClickListener; import org.eclipse.papyrus.views.modelexplorer.matching.ModelElementItemMatchingItem; import org.eclipse.papyrus.views.modelexplorer.preferences.IFilterPreferenceConstants; import org.eclipse.papyrus.views.modelexplorer.preferences.INavigatorPreferenceConstants; @@ -129,6 +130,7 @@ import org.eclipse.ui.PartInitException; import org.eclipse.ui.navigator.CommonNavigator; import org.eclipse.ui.navigator.CommonViewer; import org.eclipse.ui.navigator.CommonViewerSorter; +import org.eclipse.ui.navigator.ICommonActionConstants; import org.eclipse.ui.navigator.IExtensionActivationListener; import org.eclipse.ui.navigator.ILinkHelper; import org.eclipse.ui.navigator.INavigatorContentService; @@ -139,7 +141,6 @@ import org.eclipse.ui.views.properties.IPropertySheetPage; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; -import com.google.common.base.Supplier; import com.google.common.collect.Lists; /** @@ -303,6 +304,9 @@ public class ModelExplorerView extends CommonNavigator implements IRevealSemanti /** The {@link IPropertySheetPage} this model explorer will use. */ private final List<IPropertySheetPage> propertySheetPages = new LinkedList<>(); + + + /** * * Constructor. @@ -362,8 +366,17 @@ public class ModelExplorerView extends CommonNavigator implements IRevealSemanti @Override protected void handleDoubleClick(DoubleClickEvent anEvent) { - if (Activator.getDefault().getPreferenceStore().getBoolean(INavigatorPreferenceConstants.PREF_EXPAND_NODE_ON_DOUBLE_CLICK)) { - super.handleDoubleClick(anEvent); + final IAction openHandler = getViewSite().getActionBars().getGlobalActionHandler(ICommonActionConstants.OPEN); + + if (openHandler == null && Activator.getDefault().getPreferenceStore().getBoolean(INavigatorPreferenceConstants.PREF_EXPAND_NODE_ON_DOUBLE_CLICK)) { + IStructuredSelection selection = (IStructuredSelection) anEvent + .getSelection(); + Object element = selection.getFirstElement(); + + TreeViewer viewer = getCommonViewer(); + if (viewer.isExpandable(element)) { + viewer.setExpandedState(element, !viewer.getExpandedState(element)); + } } } @@ -591,12 +604,6 @@ public class ModelExplorerView extends CommonNavigator implements IRevealSemanti getCommonViewer().setSorter(null); ((CustomCommonViewer) getCommonViewer()).getDropAdapter().setFeedbackEnabled(true); - getCommonViewer().addDoubleClickListener(new DoubleClickListener(new Supplier<ServicesRegistry>() { - @Override - public ServicesRegistry get() { - return serviceRegistry; - } - })); try { navigationMenu = serviceRegistry.getService(NavigationService.class).createNavigationList(); @@ -953,7 +960,7 @@ public class ModelExplorerView extends CommonNavigator implements IRevealSemanti getCommonViewer().setInput(serviceRegistry); } editingDomain.addResourceSetListener(resourceSetListener); - IReadOnlyHandler2 readOnlyHandler = AdapterUtils.adapt(editingDomain, IReadOnlyHandler2.class, null); + final IReadOnlyHandler2 readOnlyHandler = PlatformHelper.getAdapter(editingDomain, IReadOnlyHandler2.class); if (readOnlyHandler != null) { readOnlyHandler.addReadOnlyListener(createReadOnlyListener()); } diff --git a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/actionprovider/OpenActionProvider.java b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/actionprovider/OpenActionProvider.java new file mode 100755 index 00000000000..9eac90ddb8b --- /dev/null +++ b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/actionprovider/OpenActionProvider.java @@ -0,0 +1,60 @@ +/***************************************************************************** + * Copyright (c) 2021 CEA LIST. + * + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License 2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation + *****************************************************************************/ +package org.eclipse.papyrus.views.modelexplorer.actionprovider; + +import org.eclipse.jface.action.IAction; +import org.eclipse.papyrus.infra.ui.api.actions.EclipseCommandToAction; +import org.eclipse.ui.IActionBars; +import org.eclipse.ui.navigator.CommonActionProvider; +import org.eclipse.ui.navigator.ICommonActionConstants; + +/** + * + * This provider provides the action used to be able to open an existing page on a DoubleClick + * reusing the Papyrus Open Command declared in the plugin.xml + * + * @since 5.0 + * + */ +public class OpenActionProvider extends CommonActionProvider { + + /** + * The ID of the open command declared in the ModelExplorer + */ + private static final String OPEN_COMMAND_ID = "org.eclipse.papyrus.views.modelexplorer.popup.open.command"; //$NON-NLS-1$ + + /** + * + * Constructor. + * + */ + public OpenActionProvider() { + // nothing to do + } + + /** + * @see org.eclipse.ui.actions.ActionGroup#fillActionBars(org.eclipse.ui.IActionBars) + * + * @param actionBars + */ + @Override + public void fillActionBars(final IActionBars actionBars) { + final IAction openAction = new EclipseCommandToAction(OPEN_COMMAND_ID); + if (openAction.isEnabled()) { + actionBars.setGlobalActionHandler(ICommonActionConstants.OPEN, openAction); + } + } + +} diff --git a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/handler/OpenHandler.java b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/handler/OpenHandler.java index e27e30d8a07..644b59bbbc6 100644 --- a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/handler/OpenHandler.java +++ b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/handler/OpenHandler.java @@ -11,11 +11,14 @@ * * Contributors: * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation - * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - bug 576595 + * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - bug 576595, 576599 *****************************************************************************/ package org.eclipse.papyrus.views.modelexplorer.handler; +import java.util.ArrayList; +import java.util.Collection; import java.util.Hashtable; +import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -24,18 +27,15 @@ import org.eclipse.core.commands.ExecutionException; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExecutableExtension; +import org.eclipse.core.runtime.Platform; import org.eclipse.emf.ecore.EObject; -import org.eclipse.gmf.runtime.notation.Diagram; +import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.IOpenable; import org.eclipse.papyrus.infra.core.sashwindows.di.service.IPageManager; -import org.eclipse.papyrus.infra.gmfdiag.common.utils.DiagramUtils; import org.eclipse.papyrus.infra.ui.command.AbstractPapyrusHandler; import org.eclipse.papyrus.infra.viewpoints.policy.ViewPrototype; /** - * This handler allows to Open Diagrams and Tables - * - * - * + * This handler allows to Open EObject that can be adapted to IOpenable. */ public class OpenHandler extends AbstractPapyrusHandler implements IExecutableExtension { @@ -58,7 +58,6 @@ public class OpenHandler extends AbstractPapyrusHandler implements IExecutableEx */ private boolean isDuplicateViewAllowed = false; - /** * * @see org.eclipse.core.commands.AbstractHandler#execute(org.eclipse.core.commands.ExecutionEvent) @@ -68,32 +67,42 @@ public class OpenHandler extends AbstractPapyrusHandler implements IExecutableEx * @throws ExecutionException */ @Override - public Object execute(ExecutionEvent event) throws ExecutionException { + public Object execute(final ExecutionEvent event) throws ExecutionException { final IPageManager pageManager = getPageManager(event); if (pageManager == null) { return null; } - // Try to close each selected editor. - // There is no common type for object representing an editor. So, - // We try to get the EObject, and try to close it as an Editor. - List<EObject> selectedProperties = getCurrentSelectionAdaptedToType(event, EObject.class); - if (selectedProperties == null) { + // 1. get the selected EObject + final List<EObject> selectedEObjects = getCurrentSelectionAdaptedToType(event, EObject.class); + if (selectedEObjects == null || selectedEObjects.isEmpty()) { // nothing to do return null; } + // 2. convert to IOpenable + final Collection<IOpenable> openables = getIOpenables(selectedEObjects); + if (openables.isEmpty()) { + return null; + } + // Check each selected object final List<EObject> pagesToOpen = new LinkedList<>(); List<EObject> pagesToSelect = new LinkedList<>(); - for (EObject selected : selectedProperties) { - if (!canOpenByPolicy(selected)) { - continue; - } - if (!pageManager.isOpen(selected) || this.isDuplicateViewAllowed) { - pagesToOpen.add(selected); - } else { - pagesToSelect.add(selected); + for (IOpenable selected : openables) { + if (selected.getPageIdentifier() instanceof EObject) { + + // bug 571087 + // we use the IOpenable element to get the real element to open + final EObject realObjectToOpen = (EObject) selected.getPageIdentifier(); + if (!canOpenByPolicy(realObjectToOpen)) { + continue; + } + if (!pageManager.isOpen(realObjectToOpen) || this.isDuplicateViewAllowed) { + pagesToOpen.add(realObjectToOpen); + } else { + pagesToSelect.add(realObjectToOpen); + } } } @@ -111,6 +120,25 @@ public class OpenHandler extends AbstractPapyrusHandler implements IExecutableEx } /** + * + * @param selectedEObject + * the selected EObject + * @return + * the IOpenanbel corresponding to these {@link EObject} + */ + private Collection<IOpenable> getIOpenables(final Collection<EObject> selectedEObject) { + final Iterator<EObject> iter = selectedEObject.iterator(); + final Collection<IOpenable> openables = new ArrayList<>(); + while (iter.hasNext()) { + final IOpenable openable = Platform.getAdapterManager().getAdapter(iter.next(), IOpenable.class); + if (openable != null) { + openables.add(openable); + } + } + return openables; + } + + /** * Determines whether the current policy allows this object to be opened * * @param selection @@ -118,12 +146,8 @@ public class OpenHandler extends AbstractPapyrusHandler implements IExecutableEx * @return <code>true</code> if the object can be opened */ private boolean canOpenByPolicy(EObject selection) { - if (selection instanceof Diagram) { - Diagram diagram = (Diagram) selection; - ViewPrototype proto = DiagramUtils.getPrototype(diagram); - return proto != ViewPrototype.UNAVAILABLE_VIEW; - } - return true; + final ViewPrototype proto = ViewPrototype.get(selection); + return proto != ViewPrototype.UNAVAILABLE_VIEW; } /** @@ -147,5 +171,4 @@ public class OpenHandler extends AbstractPapyrusHandler implements IExecutableEx this.isDuplicateViewAllowed = Boolean.parseBoolean(value.toString()); } } - -} +}
\ No newline at end of file diff --git a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/listener/DoubleClickListener.java b/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/listener/DoubleClickListener.java deleted file mode 100644 index b82ee5cce3c..00000000000 --- a/plugins/views/modelexplorer/org.eclipse.papyrus.views.modelexplorer/src/org/eclipse/papyrus/views/modelexplorer/listener/DoubleClickListener.java +++ /dev/null @@ -1,115 +0,0 @@ -/***************************************************************************** - * Copyright (c) 2010, 2016, 2021 CEA LIST, Christian W. Damus, and others. - * - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License 2.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation - * Christian W. Damus - bug 450235 - * Christian W. Damus - bug 485220 - * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Bug 571087 - *****************************************************************************/ -package org.eclipse.papyrus.views.modelexplorer.listener; - -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; - -import org.eclipse.core.runtime.Platform; -import org.eclipse.emf.ecore.EObject; -import org.eclipse.jface.viewers.DoubleClickEvent; -import org.eclipse.jface.viewers.IDoubleClickListener; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.papyrus.infra.core.sasheditor.di.contentprovider.IOpenable; -import org.eclipse.papyrus.infra.core.sashwindows.di.service.IPageManager; -import org.eclipse.papyrus.infra.core.services.ServicesRegistry; -import org.eclipse.papyrus.infra.core.utils.ServiceUtils; -import org.eclipse.papyrus.infra.emf.utils.EMFHelper; -import org.eclipse.papyrus.views.modelexplorer.Activator; - -import com.google.common.base.Supplier; - -/** - * this class is a listener in charge to manage double on element of the model explorer - * - */ -public class DoubleClickListener implements IDoubleClickListener { - - private final Supplier<ServicesRegistry> servicesRegistry; - - /** - * Initializes me with a variable service registry. - * - * @param servicesRegistrySupplier - * a supplier of a dynamically variable service registry - */ - public DoubleClickListener(Supplier<ServicesRegistry> servicesRegistrySupplier) { - this.servicesRegistry = servicesRegistrySupplier; - } - - /** - * - * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent) - * - */ - @Override - public void doubleClick(DoubleClickEvent event) { - ISelection selection = event.getSelection(); - final IPageManager pageManager; - // get the page Manager - try { - pageManager = ServiceUtils.getInstance().getService(IPageManager.class, servicesRegistry.get()); - } catch (Exception e) { - Activator.log.error("Impossibility to load the page manager", e);//$NON-NLS-1$ - return; - } - - if (pageManager != null) { - if (selection instanceof IStructuredSelection) { - Iterator<?> iter = ((IStructuredSelection) selection).iterator(); - final List<EObject> pagesToOpen = new LinkedList<>(); - EObject pageToSelect = null; - while (iter.hasNext()) { - Object currentObject = iter.next(); - - final EObject selectedElement = EMFHelper.getEObject(currentObject); - final IOpenable openable = Platform.getAdapterManager().getAdapter(selectedElement, IOpenable.class); - - // bug 571087 - // we use the IOpenable element to get the real element to open - EObject toOpen = selectedElement; - if (openable != null && openable.getPageIdentifier() instanceof EObject) { - toOpen = (EObject) openable.getPageIdentifier(); - } - - - if (openable != null) { - // Note that Diagram migration is triggered by the Diagram Editor. - // Try to open the diagram, even if it is currently invalid. The editor might be able to repair it - if (pageManager.isOpen(toOpen)) { - pageToSelect = toOpen; - } else { - pagesToOpen.add(toOpen); - } - } - } - - if (!pagesToOpen.isEmpty()) { - for (EObject page : pagesToOpen) { - pageManager.openPage(page); - } - } else if (pageToSelect != null) { - pageManager.selectPage(pageToSelect); - } - } - - } - } - -} |