Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.navigation/src/org/eclipse/papyrus/infra/gmfdiag/navigation/editpolicy/NavigationEditPolicy.java')
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.navigation/src/org/eclipse/papyrus/infra/gmfdiag/navigation/editpolicy/NavigationEditPolicy.java254
1 files changed, 46 insertions, 208 deletions
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.navigation/src/org/eclipse/papyrus/infra/gmfdiag/navigation/editpolicy/NavigationEditPolicy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.navigation/src/org/eclipse/papyrus/infra/gmfdiag/navigation/editpolicy/NavigationEditPolicy.java
index 06121f1c88d..97fd218b966 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.navigation/src/org/eclipse/papyrus/infra/gmfdiag/navigation/editpolicy/NavigationEditPolicy.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.navigation/src/org/eclipse/papyrus/infra/gmfdiag/navigation/editpolicy/NavigationEditPolicy.java
@@ -8,13 +8,10 @@
*
* Contributors:
* Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ * Shuai Li (CEA LIST) shuai.li@cea.fr - Selection menu modifications
*****************************************************************************/
package org.eclipse.papyrus.infra.gmfdiag.navigation.editpolicy;
-import java.util.List;
-
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.emf.ecore.EObject;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.EditPolicy;
@@ -23,19 +20,13 @@ import org.eclipse.gef.RootEditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.editpolicies.GraphicalEditPolicy;
import org.eclipse.gef.requests.SelectionRequest;
-import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
-import org.eclipse.gmf.runtime.draw2d.ui.figures.WrappingLabel;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.papyrus.infra.core.services.ServiceException;
import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
-import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
import org.eclipse.papyrus.infra.gmfdiag.common.utils.ServiceUtilsForEditPart;
import org.eclipse.papyrus.infra.gmfdiag.navigation.Activator;
-import org.eclipse.papyrus.infra.services.navigation.service.NavigableElement;
+import org.eclipse.papyrus.infra.services.navigation.service.NavigationMenu;
import org.eclipse.papyrus.infra.services.navigation.service.NavigationService;
-import org.eclipse.papyrus.infra.widgets.editors.SelectionMenu;
+import org.eclipse.swt.widgets.Shell;
/**
* An edit policy to use the {@link NavigationService} on GMF Diagrams
@@ -47,14 +38,13 @@ public class NavigationEditPolicy extends GraphicalEditPolicy {
public static final String EDIT_POLICY_ID = "org.eclipse.papyrus.infra.gmfdiag.navigation.NavigationEditPolicy";
- private ViewerContext viewerContext;
+ protected NavigationMenu navigationMenu;
@Override
public void activate() {
super.activate();
initViewerContext();
-
- if (viewerContext == null) {
+ if (navigationMenu == null) {
return;
}
}
@@ -62,11 +52,22 @@ public class NavigationEditPolicy extends GraphicalEditPolicy {
private void initViewerContext() {
if (getHost() == getRoot()) {
EditPartViewer viewer = getHost().getViewer();
- viewerContext = new ViewerContext(viewer);
+ try {
+ ServicesRegistry registry = ServiceUtilsForEditPart.getInstance().getServiceRegistry(getHost());
+ Shell parentShell = viewer.getControl().getShell();
+
+ navigationMenu = registry.getService(NavigationService.class).createNavigationList();
+ if (navigationMenu != null) {
+ navigationMenu.setServicesRegistry(registry);
+ navigationMenu.setParentShell(parentShell);
+ }
+ } catch (ServiceException e) {
+ Activator.log.error(e);
+ }
} else {
EditPolicy rootNavigationEditPolicy = getRoot().getEditPolicy(EDIT_POLICY_ID);
if (rootNavigationEditPolicy instanceof NavigationEditPolicy) {
- this.viewerContext = ((NavigationEditPolicy) rootNavigationEditPolicy).viewerContext;
+ this.navigationMenu = ((NavigationEditPolicy) rootNavigationEditPolicy).navigationMenu;
}
}
}
@@ -75,7 +76,7 @@ public class NavigationEditPolicy extends GraphicalEditPolicy {
public void showTargetFeedback(Request request) {
super.showTargetFeedback(request);
- if (viewerContext == null) {
+ if (navigationMenu == null) {
return;
}
@@ -86,14 +87,25 @@ public class NavigationEditPolicy extends GraphicalEditPolicy {
if (request instanceof SelectionRequest) {
SelectionRequest selectionRequest = (SelectionRequest) request;
- viewerContext.handleRequest(selectionRequest);
+ EditPart targetEditPart = getHost().getViewer().findObjectAt(selectionRequest.getLocation());
+
+ if (navigationMenu.willEnter(selectionRequest, targetEditPart)) {
+ prependNavigationMenuItem();
+ appendNavigationMenuItem();
+ }
+
+ navigationMenu.handleRequest(selectionRequest, targetEditPart);
}
}
@Override
public Command getCommand(Request request) {
- if (request instanceof SelectionRequest && viewerContext != null) {
- return viewerContext.navigate((SelectionRequest) request);
+ if (request instanceof SelectionRequest && navigationMenu != null) {
+ SelectionRequest selectionRequest = (SelectionRequest) request;
+ Object command = navigationMenu.navigate(selectionRequest, getHost());
+ if (command instanceof Command) {
+ return (Command) command;
+ }
}
return super.getCommand(request);
}
@@ -103,197 +115,23 @@ public class NavigationEditPolicy extends GraphicalEditPolicy {
return rootEditPart.getContents();
}
- // A Single ViewerContext for each diagram (Root EditPartViewer)
- private class ViewerContext {
-
- private EditPartViewer editPartViewer;
-
- private EObject currentModel;
-
- private SelectionMenu selectionMenu;
-
- private boolean wasUnderlined;
-
- private WrappingLabel lastWrappingLabel;
-
- public void handleRequest(SelectionRequest request) {
- if (isExitState(request)) {
- exitItem();
- }
-
- if (isEnterState(request)) {
- enterItem(currentModel, request);
- }
- }
-
- public Command navigate(final SelectionRequest request) {
- if (!isAlt(request)) {
- return null;
- }
-
- final NavigableElement element = getElementToNavigate(request);
- if (element == null) {
- return null;
- }
-
- return new Command() {
-
- @Override
- public void execute() {
- try {
- getNavigationService(request).navigate(element);
- } catch (ServiceException ex) {
- Activator.log.error(ex);
- }
- exitItem();
- }
- };
- }
-
- private NavigableElement getElementToNavigate(SelectionRequest request) {
- try {
- List<NavigableElement> navigableElements = getNavigationService(request).getNavigableElements(getEditPart(request));
- if (navigableElements.isEmpty()) {
- return null;
- }
-
- for (NavigableElement element : navigableElements) {
- if (element.isEnabled()) {
- return element;
- }
- }
- } catch (ServiceException ex) {
- // Ignore: the service is not available, do nothing
- }
- return null;
- }
-
- private NavigationService getNavigationService(SelectionRequest request) throws ServiceException {
- return getServicesRegistry().getService(NavigationService.class);
- }
-
- public ViewerContext(EditPartViewer editPartViewer) {
- this.editPartViewer = editPartViewer;
- }
-
- private boolean isExitState(SelectionRequest request) {
- if (currentModel == null) {
- return false;
- }
-
- EObject newModel = getModel(request);
- if (newModel == null) {
- return true;
- }
-
- if (newModel != currentModel) {
- return true;
- }
-
- if (!isAlt(request)) {
- return true;
- }
-
- return false;
- }
-
- private boolean isEnterState(SelectionRequest request) {
- EObject model = getModel(request);
- if (model == currentModel) {
- return false;
- }
-
- if (model == null) {
- return false;
- }
-
- if (!isAlt(request)) {
- return false;
- }
-
- currentModel = model;
-
- return true;
- }
-
- private boolean isAlt(SelectionRequest request) {
- return request.isAltKeyPressed();
- }
-
- private EObject getModel(SelectionRequest request) {
- return EMFHelper.getEObject(getEditPart(request));
-
- }
-
- private EditPart getEditPart(SelectionRequest request) {
- return editPartViewer.findObjectAt(request.getLocation());
- }
-
- private void disposeCurrentMenu() {
- if (selectionMenu != null) {
- selectionMenu.dispose();
- selectionMenu = null;
- }
- }
-
- private void exitItem() {
- if (lastWrappingLabel != null) {
- lastWrappingLabel.setTextUnderline(wasUnderlined);
- }
- wasUnderlined = false;
- lastWrappingLabel = null;
- currentModel = null;
- disposeCurrentMenu();
- }
-
- private void enterItem(EObject model, SelectionRequest request) {
- try {
- EditPart targetEditPart = getEditPart(request);
-
- final NavigationService navigation = getServicesRegistry().getService(NavigationService.class);
- disposeCurrentMenu();
- selectionMenu = navigation.createNavigationList(targetEditPart, editPartViewer.getControl());
- if (selectionMenu == null) {
- return;
- }
-
- wasUnderlined = false;
- if (targetEditPart instanceof IGraphicalEditPart) {
- IGraphicalEditPart graphicalEditPart = (IGraphicalEditPart) targetEditPart;
- IFigure figure = graphicalEditPart.getFigure();
- if (figure instanceof WrappingLabel) {
- lastWrappingLabel = ((WrappingLabel) figure);
- wasUnderlined = lastWrappingLabel.isTextUnderlined();
- lastWrappingLabel.setTextUnderline(!wasUnderlined);
- }
- }
-
- selectionMenu.addSelectionChangedListener(new ISelectionChangedListener() {
+ protected void prependNavigationMenuItem () {
+ // Nothing here, written in sub-classes
+ }
- public void selectionChanged(SelectionChangedEvent event) {
- if (event.getSelection().isEmpty()) {
- return;
- }
- Object selectedElement = ((IStructuredSelection) event.getSelection()).getFirstElement();
- if (selectedElement instanceof NavigableElement) {
- NavigableElement navigableElement = (NavigableElement) selectedElement;
- navigate(navigableElement, navigation);
- }
- }
- });
- } catch (ServiceException ex) {
- Activator.log.error(ex);
- }
- }
+ protected void appendNavigationMenuItem () {
+ // Nothing here, written in sub-classes
+ }
- private void navigate(NavigableElement navigableElement, NavigationService navigationService) {
- navigationService.navigate(navigableElement);
- exitItem();
+ protected void clearAppendObjects() {
+ if (navigationMenu != null && navigationMenu.getAppendObjects() != null) {
+ navigationMenu.getAppendObjects().clear();
}
+ }
- private ServicesRegistry getServicesRegistry() throws ServiceException {
- return ServiceUtilsForEditPart.getInstance().getServiceRegistry(getHost());
+ protected void clearPrependObjects() {
+ if (navigationMenu != null && navigationMenu.getPrependObjects() != null) {
+ this.navigationMenu.getPrependObjects().clear();
}
-
}
}

Back to the top