Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcletavernie2013-04-12 10:04:32 +0000
committercletavernie2013-04-12 10:04:32 +0000
commit0bdd0b1e9322b951649cc6615c8a2b447505706d (patch)
treee89bc7508df529e2b138ab31b41c6c21445e722e /plugins/infra/gmfdiag
parent33dfb75319f26a7673d3e2ea60a5710a5a9d58ac (diff)
downloadorg.eclipse.papyrus-0bdd0b1e9322b951649cc6615c8a2b447505706d.tar.gz
org.eclipse.papyrus-0bdd0b1e9322b951649cc6615c8a2b447505706d.tar.xz
org.eclipse.papyrus-0bdd0b1e9322b951649cc6615c8a2b447505706d.zip
399857: [Hyperlinks] Papyrus shall enable to navigate between model elements shown in views
https://bugs.eclipse.org/bugs/show_bug.cgi?id=399857
Diffstat (limited to 'plugins/infra/gmfdiag')
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/META-INF/MANIFEST.MF3
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/plugin.xml7
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperLinkPopupBarEditPolicy.java26
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/providers/SpecificViewContentProvider.java117
4 files changed, 140 insertions, 13 deletions
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/META-INF/MANIFEST.MF b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/META-INF/MANIFEST.MF
index a0d2114dac7..ad2d74bd90c 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/META-INF/MANIFEST.MF
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/META-INF/MANIFEST.MF
@@ -19,7 +19,8 @@ Require-Bundle: org.eclipse.ui,
org.eclipse.papyrus.infra.core.log;bundle-version="0.10.0",
org.eclipse.gmf.runtime.diagram.ui;bundle-version="1.6.0",
org.eclipse.papyrus.infra.services.labelprovider;bundle-version="0.10.0",
- org.eclipse.papyrus.infra.gmfdiag.dnd;bundle-version="0.10.0"
+ org.eclipse.papyrus.infra.gmfdiag.dnd;bundle-version="0.10.0",
+ org.eclipse.papyrus.infra.widgets;bundle-version="0.10.0"
Bundle-RequiredExecutionEnvironment: J2SE-1.5
Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.papyrus.infra.gmfdiag.hyperlink,
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/plugin.xml b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/plugin.xml
index 58a5a833629..7c6419322c3 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/plugin.xml
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/plugin.xml
@@ -16,5 +16,12 @@
strategy="org.eclipse.papyrus.infra.gmfdiag.hyperlink.dnd.HyperlinkDropStrategy">
</strategy>
</extension>
+ <extension
+ point="org.eclipse.papyrus.infra.hyperlink.specificHyperLinks">
+ <specificHyperLink
+ contentProvider="org.eclipse.papyrus.infra.gmfdiag.hyperlink.providers.SpecificViewContentProvider">
+ </specificHyperLink>
+
+ </extension>
</plugin>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperLinkPopupBarEditPolicy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperLinkPopupBarEditPolicy.java
index 5f46e3c5738..a2fa1dc5cc7 100644
--- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperLinkPopupBarEditPolicy.java
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperLinkPopupBarEditPolicy.java
@@ -282,6 +282,14 @@ public class HyperLinkPopupBarEditPolicy extends DiagramAssistantEditPolicy {
* @see org.eclipse.draw2d.MouseListener#mousePressed(org.eclipse.draw2d.MouseEvent)
*/
@Override
+ public void mouseReleased(MouseEvent me) {
+ //FIXME: We should use mouseReleased instead of mousePressed,
+ //but it seems the mouseReleased event is consumed before we receive it
+ super.mouseReleased(me);
+ // setPopupBarOnDiagramActivated(true);
+ }
+
+ @Override
public void mousePressed(MouseEvent me) {
if(3 == me.button) // context menu, hide the popup bar
{
@@ -292,13 +300,16 @@ public class HyperLinkPopupBarEditPolicy extends DiagramAssistantEditPolicy {
if(me.getSource() instanceof PopupBarLabelPlusHandle) {
hyperLinkManagerShell = new AdvancedHLManager(getEditorRegistry(), ((IGraphicalEditPart)getHost()).getEditingDomain(), (EModelElement)((IGraphicalEditPart)getHost()).getNotationView().getElement(), ((IGraphicalEditPart)getHost()).getNotationView(), hyperlinkHelperFactory);
hyperLinkManagerShell.setInput(hyperLinkObjectList);
+ hideDiagramAssistant();
hyperLinkManagerShell.open();
-
+ me.consume();
} else if(me.getSource() instanceof PopupBarLabelHandle) {
if((((PopupBarLabelHandle)me.getSource()).getReferencedObject()) instanceof HyperLinkObject) {
final HyperLinkObject hyperLinkObject = (HyperLinkObject)(((PopupBarLabelHandle)me.getSource()).getReferencedObject());
if(hyperLinkObject.needsOpenCommand()) {
try {
+ //FIXME: Sometimes, it is possible to automatically determine whether the editing domain should be dirty or not
+ //We should use standard GMF/GEF commands with the DiagramCommandStack to have the same behavior than NavigationEditPolicy
TransactionalEditingDomain editingDomain = ServiceUtilsForEditPart.getInstance().getTransactionalEditingDomain(getHost());
editingDomain.getCommandStack().execute(new RecordingCommand(editingDomain, "Open hyperlink") {
@@ -314,22 +325,13 @@ public class HyperLinkPopupBarEditPolicy extends DiagramAssistantEditPolicy {
hyperLinkObject.openLink();
}
}
+ me.consume();
}
hideDiagramAssistant();
-
}
- super.mousePressed(me);
- // setPopupBarOnDiagramActivated(true);
- }
-
- /**
- * {@inheritedDoc}
- */
- @Override
- public void mouseReleased(MouseEvent me) {
- super.mouseReleased(me);
+ super.mousePressed(me);
}
}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/providers/SpecificViewContentProvider.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/providers/SpecificViewContentProvider.java
new file mode 100644
index 00000000000..d280566d620
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/providers/SpecificViewContentProvider.java
@@ -0,0 +1,117 @@
+/*****************************************************************************
+ * Copyright (c) 2013 CEA LIST.
+ *
+ *
+ * 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:
+ * Camille Letavernier (camille.letavernier@cea.fr) - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink.providers;
+
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.papyrus.infra.core.resource.AbstractBaseModel;
+import org.eclipse.papyrus.infra.core.resource.IModel;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.gmfdiag.common.helper.SemanticElementHelper;
+import org.eclipse.papyrus.infra.gmfdiag.common.model.NotationModel;
+import org.eclipse.papyrus.infra.gmfdiag.hyperlink.Activator;
+import org.eclipse.papyrus.infra.widgets.providers.IHierarchicContentProvider;
+
+
+public class SpecificViewContentProvider implements IHierarchicContentProvider {
+
+ private EObject[] roots;
+
+ private EObject[] getRoots(ServicesRegistry context) {
+ try {
+ ModelSet modelSet = context.getService(ModelSet.class);
+ IModel notationModel = modelSet.getModel(NotationModel.MODEL_ID);
+ if(notationModel instanceof AbstractBaseModel) {
+ Resource resource = ((AbstractBaseModel)notationModel).getResource();
+ List<Diagram> result = new LinkedList<Diagram>();
+ for(EObject rootElement : resource.getContents()) {
+ if(rootElement instanceof Diagram) {
+ result.add((Diagram)rootElement);
+ }
+ }
+ return result.toArray(new Diagram[0]);
+ }
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+ return new EObject[0];
+ }
+
+ public Object[] getElements(Object inputElement) {
+ if(roots == null) {
+ if(inputElement instanceof EObject) {
+ try {
+ ServicesRegistry registry = ServiceUtilsForEObject.getInstance().getServiceRegistry((EObject)inputElement);
+ roots = getRoots(registry);
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+ }
+ }
+ return roots == null ? new Object[0] : roots;
+ }
+
+ public Object[] getChildren(Object parentElement) {
+ if(parentElement instanceof EObject) {
+ List<Object> validChildren = new LinkedList<Object>();
+ for(Object childElement : ((EObject)parentElement).eContents()) {
+ if(isValidValue(childElement)) {
+ validChildren.add(childElement);
+ } else {
+ //Go deeper, to find e.g. TopView(Class)::AttributeCompartment(Class)::TopView(Property)
+ validChildren.addAll(Arrays.asList(getChildren(childElement)));
+ }
+ }
+ return validChildren.toArray();
+
+ }
+ return new Object[0];
+ }
+
+ public Object getParent(Object element) {
+ if(element instanceof EObject) {
+ return ((EObject)element).eContainer();
+ }
+ return null;
+ }
+
+ public boolean hasChildren(Object element) {
+ return getChildren(element).length > 0;
+ }
+
+ public void dispose() {
+ //Nothing
+ }
+
+ public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+ //Ignored
+ }
+
+ public boolean isValidValue(Object element) {
+ if(element instanceof View && ((View)element).getElement() == null) {
+ return false;
+ }
+ return element instanceof View && SemanticElementHelper.findTopView((View)element) == element;
+ }
+}

Back to the top