Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcletavernie2013-02-04 04:51:45 -0500
committercletavernie2013-02-04 04:51:45 -0500
commit6a94865fd1ac67c9b6f603d88f9d99b682b2ac63 (patch)
tree561b443a70b76182baf03e3a38b44155d194660c /plugins/infra
parent1fa89e8995d5a65dbe0590970c4fbb93d5cf06fc (diff)
downloadorg.eclipse.papyrus-6a94865fd1ac67c9b6f603d88f9d99b682b2ac63.tar.gz
org.eclipse.papyrus-6a94865fd1ac67c9b6f603d88f9d99b682b2ac63.tar.xz
org.eclipse.papyrus-6a94865fd1ac67c9b6f603d88f9d99b682b2ac63.zip
367938: [Refactoring][Diagram Common] the package oep.uml.diagram.common.ui.hyperlink should be moved in a new plugin
https://bugs.eclipse.org/bugs/show_bug.cgi?id=367938 391945: [Refactoring] Part 2: Refactoring on Kepler (0.10) https://bugs.eclipse.org/bugs/show_bug.cgi?id=391945 Move oep.infra.gmfdiag.hyperlink to its final SVN location
Diffstat (limited to 'plugins/infra')
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.classpath7
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.project28
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.settings/org.eclipse.jdt.core.prefs7
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/META-INF/MANIFEST.MF27
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/about.html28
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/build.properties7
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/plugin.xml20
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/Activator.java69
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/dnd/HyperlinkDropStrategy.java125
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperLinkPopupBarEditPolicy.java681
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/NavigationEditPolicy.java245
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/providers/HyperlinkEditPolicyProvider.java59
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/AdvancedHLManager.java125
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/HyperLinkDiagramConstants.java32
-rw-r--r--plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/LocalDefaultLinkDiagramTab.java360
15 files changed, 1820 insertions, 0 deletions
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.classpath b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.classpath
new file mode 100644
index 00000000000..2d1a4302f04
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.project b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.project
new file mode 100644
index 00000000000..094c2587586
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.papyrus.infra.gmfdiag.hyperlink</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.settings/org.eclipse.jdt.core.prefs b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..44217f8c068
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
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
new file mode 100644
index 00000000000..a0d2114dac7
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: GMF Diagram Hyperlink (Incubation)
+Bundle-SymbolicName: org.eclipse.papyrus.infra.gmfdiag.hyperlink;singleton:=true
+Bundle-Version: 0.10.0.qualifier
+Bundle-Activator: org.eclipse.papyrus.infra.gmfdiag.hyperlink.Activator
+Bundle-Vendor: Eclipse Modeling Project
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.papyrus.infra.hyperlink;bundle-version="0.10.0",
+ org.eclipse.papyrus.infra.gmfdiag.common;bundle-version="0.10.0",
+ org.eclipse.papyrus.infra.gmfdiag.navigation;bundle-version="0.10.0",
+ org.eclipse.gmf.runtime.common.core;bundle-version="1.4.1",
+ org.eclipse.gmf.runtime.notation;bundle-version="1.5.0",
+ org.eclipse.emf.transaction;bundle-version="1.4.0",
+ org.eclipse.papyrus.infra.core;bundle-version="0.10.0",
+ org.eclipse.papyrus.infra.gmfdiag.commands;bundle-version="0.10.0",
+ org.eclipse.papyrus.infra.emf;bundle-version="0.10.0",
+ 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"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
+Export-Package: org.eclipse.papyrus.infra.gmfdiag.hyperlink,
+ org.eclipse.papyrus.infra.gmfdiag.hyperlink.editpolicies,
+ org.eclipse.papyrus.infra.gmfdiag.hyperlink.ui
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/about.html b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/about.html
new file mode 100644
index 00000000000..209103075a7
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>November 14, 2008</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;). Unless otherwise
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is available
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content. Check the Redistributor's license that was
+provided with the Content. If no such license exists, contact the Redistributor. Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html> \ No newline at end of file
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/build.properties b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/build.properties
new file mode 100644
index 00000000000..e3693a3b66e
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+ .,\
+ about.html,\
+ plugin.xml
+src.includes = about.html
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
new file mode 100644
index 00000000000..58a5a833629
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/plugin.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+ <extension
+ point="org.eclipse.gmf.runtime.diagram.ui.editpolicyProviders">
+ <editpolicyProvider
+ class="org.eclipse.papyrus.infra.gmfdiag.hyperlink.providers.HyperlinkEditPolicyProvider">
+ <Priority
+ name="Lowest">
+ </Priority>
+ </editpolicyProvider>
+ </extension>
+ <extension
+ point="org.eclipse.papyrus.infra.gmfdiag.dnd.dropStrategy">
+ <strategy
+ strategy="org.eclipse.papyrus.infra.gmfdiag.hyperlink.dnd.HyperlinkDropStrategy">
+ </strategy>
+ </extension>
+
+</plugin>
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/Activator.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/Activator.java
new file mode 100644
index 00000000000..0c13db06cd0
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/Activator.java
@@ -0,0 +1,69 @@
+/*****************************************************************************
+ * Copyright (c) 2012 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 (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink;
+
+import org.eclipse.papyrus.infra.core.log.LogHelper;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+ // The plug-in ID
+ public static final String PLUGIN_ID = "org.eclipse.papyrus.infra.gmfdiag.hyperlink"; //$NON-NLS-1$
+
+ // The shared instance
+ private static Activator plugin;
+
+ public static LogHelper log;
+
+ /**
+ * The constructor
+ */
+ public Activator() {
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void start(BundleContext context) throws Exception {
+ super.start(context);
+ plugin = this;
+ log = new LogHelper(this);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+ */
+ @Override
+ public void stop(BundleContext context) throws Exception {
+ plugin = null;
+ super.stop(context);
+ }
+
+ /**
+ * Returns the shared instance
+ *
+ * @return the shared instance
+ */
+ public static Activator getDefault() {
+ return plugin;
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/dnd/HyperlinkDropStrategy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/dnd/HyperlinkDropStrategy.java
new file mode 100644
index 00000000000..75107e4f872
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/dnd/HyperlinkDropStrategy.java
@@ -0,0 +1,125 @@
+/*****************************************************************************
+ * Copyright (c) 2012 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 (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink.dnd;
+
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gmf.runtime.diagram.ui.requests.DropObjectsRequest;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.papyrus.commands.Activator;
+import org.eclipse.papyrus.infra.core.sasheditor.contentprovider.IPageMngr;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.core.services.ServicesRegistry;
+import org.eclipse.papyrus.infra.core.utils.ServiceUtils;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.gmfdiag.common.helper.SemanticElementHelper;
+import org.eclipse.papyrus.infra.gmfdiag.dnd.strategy.TransactionalDropStrategy;
+import org.eclipse.papyrus.infra.hyperlink.commands.CreateHyperLinkPageCommand;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * A Strategy to drop shortcuts to nested editors on GMF Diagram elements
+ *
+ * @author Camille Letavernier
+ *
+ */
+public class HyperlinkDropStrategy extends TransactionalDropStrategy {
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getLabel() {
+ return "Create hyperlinks";
+ }
+
+ public String getDescription() {
+ return "Creates an hyperlink to Papyrus nested editor (e.g. Diagram, Table, ...) on a Diagram element";
+ }
+
+ public Image getImage() {
+ return null;
+ }
+
+ public String getID() {
+ return "org.eclipse.papyrus.infra.gmfdiag.dnd.CreateHyperlink";
+ }
+
+ @Deprecated
+ public int getPriority() {
+ return 0;
+ }
+
+ @Override
+ public Command doGetCommand(Request request, final EditPart targetEditPart) {
+ if(request instanceof DropObjectsRequest) {
+
+ View view = getTargetView(targetEditPart);
+ if(view == null) {
+ return null;
+ }
+
+ final View mainView = SemanticElementHelper.findPrimaryView(view);
+ if(mainView instanceof Diagram) {
+ //We cannot create hyperlinks from the root edit part
+ return null;
+ }
+
+ final DropObjectsRequest dropRequest = (DropObjectsRequest)request;
+
+ final ServicesRegistry registry;
+ try {
+ registry = ServiceUtilsForEObject.getInstance().getServiceRegistry(mainView);
+ IPageMngr pageManager = ServiceUtils.getInstance().getIPageMngr(registry);
+
+ for(Object droppedObject : dropRequest.getObjects()) {
+ if(!(droppedObject instanceof EObject && pageManager.allPages().contains(droppedObject))) {
+ return null;
+ }
+ }
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ return null;
+ }
+
+ return new Command() {
+
+ @Override
+ public void execute() {
+
+ try {
+ ILabelProvider labelProvider = registry.getService(LabelProviderService.class).getLabelProvider();
+ TransactionalEditingDomain domain = ServiceUtils.getInstance().getTransactionalEditingDomain(registry);
+
+ for(Object droppedObject : dropRequest.getObjects()) {
+ String text = labelProvider.getText(droppedObject);
+ CreateHyperLinkPageCommand command = new CreateHyperLinkPageCommand(domain, mainView, text, text, (EModelElement)droppedObject, true);
+ command.execute();
+ }
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+
+
+ }
+ };
+ }
+
+ return null;
+ }
+}
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
new file mode 100644
index 00000000000..408038c5275
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperLinkPopupBarEditPolicy.java
@@ -0,0 +1,681 @@
+/*****************************************************************************
+ * Copyright (c) 2009 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink.editpolicies;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.draw2d.ColorConstants;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.Graphics;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.MouseEvent;
+import org.eclipse.draw2d.MouseListener;
+import org.eclipse.draw2d.RoundedRectangle;
+import org.eclipse.draw2d.Viewport;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.DragTracker;
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.gef.Handle;
+import org.eclipse.gef.LayerConstants;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.GraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.DiagramAssistantEditPolicy;
+import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramGraphicalViewer;
+import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramWorkbenchPart;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.jface.viewers.CellLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.papyrus.infra.core.editorsfactory.IPageIconsRegistry;
+import org.eclipse.papyrus.infra.core.editorsfactory.PageIconsRegistry;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.utils.EMFHelper;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.gmfdiag.common.utils.ServiceUtilsForEditPart;
+import org.eclipse.papyrus.infra.gmfdiag.hyperlink.ui.AdvancedHLManager;
+import org.eclipse.papyrus.infra.hyperlink.Activator;
+import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.helper.HyperLinkHelperFactory;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.ui.HyperLinkManagerShell;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkException;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkHelpersRegistrationUtil;
+import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderService;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+/**
+ * The Class HyperLinkPopupBarEditPolicy can be applied on edit part to display
+ * shortcuts on sub-diagrams or to associate hyper-link of files
+ */
+public class HyperLinkPopupBarEditPolicy extends DiagramAssistantEditPolicy {
+
+ /**
+ * Default tool placed on the popup bar.
+ *
+ * @author affrantz@us.ibm.com modified by Patrick Tessier
+ */
+
+ private class PopupBarLabelHandle extends Label implements Handle {
+
+ /**
+ * flag to drawFocus rect around the handle when the mouse rolls over
+ * it.
+ */
+ private boolean myMouseOver = false;
+
+ /** The dragTracker CreationTool associated with the handle *. */
+ private Object myObject = null;
+
+ /**
+ * constructor.
+ *
+ * @param theImage
+ * the image to display
+ * @param anObject
+ * the an object
+ */
+ public PopupBarLabelHandle(Object anObject, Image theImage) {
+ super(theImage);
+ myObject = anObject;
+ this.setOpaque(true);
+ this.setBackgroundColor(ColorConstants.buttonLightest);
+ }
+
+ /**
+ * Dispose.
+ */
+ public void dispose() {
+ //Nothing. Do not dispose the Image, as it may be shared
+
+ // if(this.getIcon() != null && (!this.getIcon().isDisposed())) {
+ // this.getIcon().dispose();
+ // }
+ }
+
+ /**
+ * Gets the accessible location.
+ *
+ * @return the accessible location
+ *
+ * @see org.eclipse.gef.Handle#getAccessibleLocation()
+ */
+ public Point getAccessibleLocation() {
+ return null;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ public DragTracker getDragTracker() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ /**
+ * Gets the referenced object.
+ *
+ * @return the referenced object
+ *
+ * @see org.eclipse.gef.Handle#getDragTracker()
+ */
+ public Object getReferencedObject() {
+ return myObject;
+ }
+
+ /**
+ * Handle mouse entered.
+ *
+ * @param event
+ * the event
+ *
+ * @see org.eclipse.draw2d.IFigure#handleMouseEntered(org.eclipse.draw2d.MouseEvent)
+ * flip myMouseOver bit and repaint
+ */
+ @Override
+ public void handleMouseEntered(MouseEvent event) {
+
+ super.handleMouseEntered(event);
+ this.setBackgroundColor(ColorConstants.button);
+ myMouseOver = true;
+ // repaint();
+ }
+
+ /**
+ * Handle mouse exited.
+ *
+ * @param event
+ * the event
+ *
+ * @see org.eclipse.draw2d.IFigure#handleMouseExited(org.eclipse.draw2d.MouseEvent)
+ * flip myMouseOver bit and repaint
+ */
+ @Override
+ public void handleMouseExited(MouseEvent event) {
+
+ super.handleMouseExited(event);
+ this.setBackgroundColor(ColorConstants.white);
+ myMouseOver = false;
+ // repaint();
+ }
+
+ /**
+ * Handle mouse pressed.
+ *
+ * @param event
+ * the event
+ *
+ * @see org.eclipse.draw2d.IFigure#handleMousePressed(org.eclipse.draw2d.MouseEvent)
+ * set PopupBarEditPolicy.myActionMoveFigure bit so the popup bar
+ * is not dismissed after creating an item in the editpart
+ */
+ @Override
+ public void handleMousePressed(MouseEvent event) {
+ if(1 == event.button) {
+ }
+ super.handleMousePressed(event);
+ }
+
+ /**
+ * Paint border.
+ *
+ * @param graphics
+ * the graphics
+ *
+ * @see org.eclipse.draw2d.Figure#paintBorder(org.eclipse.draw2d.Graphics)
+ * paint a focus rectangle for the label if the mouse is inside the
+ * label
+ */
+ @Override
+ protected void paintBorder(Graphics graphics) {
+ super.paintBorder(graphics);
+
+ if(myMouseOver) {
+
+ Rectangle area = getClientArea();
+ graphics.setForegroundColor(ColorConstants.black);
+ graphics.setBackgroundColor(ColorConstants.white);
+
+ graphics.drawFocus(area.x, area.y, area.width - 1, area.height - 1);
+
+ }
+
+ }
+
+ /**
+ * Paint figure.
+ *
+ * @param graphics
+ * the graphics
+ *
+ * @see org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics)
+ */
+ @Override
+ protected void paintFigure(Graphics graphics) {
+ if(!isEnabled()) {
+ Image theImage = this.getIcon();
+ if(theImage != null) {
+ graphics.translate(bounds.x, bounds.y);
+ graphics.drawImage(theImage, getIconLocation());
+ graphics.translate(-bounds.x, -bounds.y);
+ return;
+ }
+
+ }
+ super.paintFigure(graphics);
+
+ }
+ }
+
+ /**
+ * The Class PopupBarLabelPlusHandle.
+ */
+ private class PopupBarLabelPlusHandle extends PopupBarLabelHandle {
+
+ /**
+ * Instantiates a new popup bar label plus handle.
+ */
+ public PopupBarLabelPlusHandle() {
+ super(null, AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.papyrus.uml.diagram.common", "/icons/obj16/Plus.gif").createImage());
+ // TODO Auto-generated constructor stub
+ }
+ }
+
+ /**
+ * Listens for mouse key presses so the popup bar can be dismissed if the
+ * context menu is displayed.
+ *
+ * @author affrantz@us.ibm.com
+ */
+ private class PopupBarMouseListener extends MouseListener.Stub {
+
+ /**
+ * Mouse pressed.
+ *
+ * @param me
+ * the me
+ *
+ * @see org.eclipse.draw2d.MouseListener#mousePressed(org.eclipse.draw2d.MouseEvent)
+ */
+ @Override
+ public void mousePressed(MouseEvent me) {
+ if(3 == me.button) // context menu, hide the popup bar
+ {
+ hideDiagramAssistant();
+ }
+ if(1 == me.button) // context menu, hide the popup bar
+ {
+ if(me.getSource() instanceof PopupBarLabelPlusHandle) {
+ hyperLinkManagerShell = new AdvancedHLManager(getEditorRegistry(), ((IGraphicalEditPart)getHost()).getEditingDomain(), (EModelElement)((IGraphicalEditPart)getHost()).getNotationView().getElement(), ((IGraphicalEditPart)getHost()).getNotationView(), hyperlinkHelperFactory);
+ hyperLinkManagerShell.setInput(hyperLinkObjectList);
+ hyperLinkManagerShell.open();
+
+ } else if(me.getSource() instanceof PopupBarLabelHandle) {
+ if((((PopupBarLabelHandle)me.getSource()).getReferencedObject()) instanceof HyperLinkObject) {
+ HyperLinkObject hyperLinkObject = (HyperLinkObject)(((PopupBarLabelHandle)me.getSource()).getReferencedObject());
+ hyperLinkObject.executeSelectPressed();
+ }
+ }
+
+ hideDiagramAssistant();
+
+ }
+ super.mousePressed(me);
+ // setPopupBarOnDiagramActivated(true);
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ public void mouseReleased(MouseEvent me) {
+ super.mouseReleased(me);
+
+ }
+ }
+
+ /**
+ * This is the figure that represents the ballon portion of the popup bar.
+ *
+ * @author affrantz@us.ibm.com
+ */
+ private class RoundedRectangleWithTail extends RoundedRectangle {
+
+ /**
+ * constructor.
+ */
+ public RoundedRectangleWithTail() {
+ // we do not make the myActionTailFigue opaque because it
+ // doesn't look good when magnification is set.
+ this.setFill(true);
+ this.setBackgroundColor(ColorConstants.yellow);
+ this.setForegroundColor(ColorConstants.orange);
+ this.setVisible(true);
+ this.setEnabled(true);
+ this.setOpaque(true);
+
+ }
+
+ }
+
+ /** The editor registry. */
+ private IPageIconsRegistry editorRegistry;
+
+ /** The figure bar. */
+ private IFigure figureBar;
+
+ /** The hyper link manager shell. */
+ private HyperLinkManagerShell hyperLinkManagerShell;
+
+ /** Images created that must be deleted when popup bar is removed. */
+ protected List<Image> imagesToBeDisposed = new ArrayList<Image>();
+
+ /** mouse keys listener for the owner shape. */
+ private final PopupBarMouseListener myMouseKeyListener = new PopupBarMouseListener();
+
+ protected ArrayList<HyperLinkObject> hyperLinkObjectList;
+
+ protected HyperLinkHelperFactory hyperlinkHelperFactory;
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ public void activate() {
+ super.activate();
+ }
+
+ public HyperLinkPopupBarEditPolicy() {
+ super();
+ ArrayList<AbstractHyperLinkHelper> hyperLinkHelpers = new ArrayList<AbstractHyperLinkHelper>();
+ //TODO
+ // hyperLinkHelpers.add(new DiagramHyperLinkHelper());
+ // hyperLinkHelpers.add(new DocumentHyperLinkHelper());
+ // hyperLinkHelpers.add(new WebHyperLinkHelper());
+ hyperLinkHelpers.addAll(HyperLinkHelpersRegistrationUtil.INSTANCE.getAllRegisteredHyperLinkHelper());
+ hyperlinkHelperFactory = new HyperLinkHelperFactory(hyperLinkHelpers);
+ }
+
+ /**
+ * Adds the object list in the popup bar.
+ *
+ * @param imageLocation
+ * the image location that will represent the object
+ * @param positonwidth
+ * the positonwidth to display the icon into the popup
+ * @param objectList
+ * the object list to add
+ *
+ * @return the int the new position after adding all objects in the list
+ */
+ public int addObjectList(int positonwidth, List<?> objectList) {
+ for(int i = 0; i < objectList.size(); i++) {
+ PopupBarLabelHandle handle = null;
+
+ ILabelProvider labelProvider = null;
+ try {
+ EObject contextElement = EMFHelper.getEObject(getHost());
+ labelProvider = ServiceUtilsForEObject.getInstance().getService(LabelProviderService.class, contextElement).getLabelProvider();
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ }
+
+ if(labelProvider == null) {
+ labelProvider = new LabelProvider();
+ }
+
+ handle = new PopupBarLabelHandle(hyperLinkObjectList.get(i), labelProvider.getImage(objectList.get(i)));
+
+ Rectangle r1 = new Rectangle();
+ r1.setLocation(positonwidth, 5);
+ positonwidth += 20;
+ r1.setSize(16, 16);
+
+ Label l = new Label();
+ if(labelProvider instanceof CellLabelProvider) {
+ l.setText(((CellLabelProvider)labelProvider).getToolTipText(hyperLinkObjectList.get(i)));
+ } else {
+ l.setText(labelProvider.getText(hyperLinkObjectList.get(i)));
+ }
+ handle.setToolTip(l);
+
+ handle.setPreferredSize(16, 16);
+ handle.setBounds(r1);
+ handle.setBackgroundColor(ColorConstants.white);
+ getFigureBar().add(handle);
+ handle.addMouseListener(this.myMouseKeyListener);
+ handle.addMouseMotionListener(this);
+
+ }
+ return positonwidth;
+
+ }
+
+ /**
+ * Return the EditorRegistry for nested editor descriptors. Subclass should
+ * implements this method in order to return the registry associated to the
+ * extension point namespace.
+ *
+ * @return the EditorRegistry for nested editor descriptors
+ *
+ * @generated NOT
+ */
+ protected IPageIconsRegistry createEditorRegistry() {
+ try {
+ return ServiceUtilsForEditPart.getInstance().getService(IPageIconsRegistry.class, getHost());
+ } catch (ServiceException e) {
+ // Return an empty registry always providing null;
+ return new PageIconsRegistry();
+ }
+ }
+
+ /**
+ * Creates the popup bar figure.
+ *
+ * @return the i figure
+ */
+ protected IFigure createPopupBarFigure() {
+ figureBar = new RoundedRectangleWithTail();
+ return figureBar;
+ }
+
+ /**
+ * Gets the editor registry.
+ *
+ * @return the singleton eINSTANCE of editor registry
+ *
+ * @generated NOT Get the EditorRegistry used to create editor instances.
+ * This default implementation return the singleton eINSTANCE.
+ * This method can be subclassed to return another registry.
+ */
+ protected IPageIconsRegistry getEditorRegistry() {
+ if(editorRegistry == null) {
+ editorRegistry = createEditorRegistry();
+ }
+ return editorRegistry;
+ }
+
+ /**
+ * Gets the figure bar.
+ *
+ * @return the figure bar
+ */
+ protected IFigure getFigureBar() {
+
+ return figureBar;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ protected void hideDiagramAssistant() {
+ if(getFigureBar() != null) {
+ getFigureBar().removeMouseMotionListener(this);
+ getFigureBar().removeMouseListener(myMouseKeyListener);
+ IFigure layer = getLayer(LayerConstants.HANDLE_LAYER);
+ if(getFigureBar().getParent() != null) {
+ layer.remove(getFigureBar());
+ }
+
+ if(imagesToBeDisposed != null) {
+ for(Iterator iter = figureBar.getChildren().iterator(); iter.hasNext();) {
+ Object current = iter.next();
+ if(current instanceof PopupBarLabelHandle) {
+ ((PopupBarLabelHandle)current).dispose();
+ }
+ }
+ imagesToBeDisposed.clear();
+ }
+ }
+ figureBar = null;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ protected boolean isDiagramAssistant(Object object) {
+ return object instanceof RoundedRectangleWithTail || object instanceof PopupBarLabelHandle;
+ }
+
+ /**
+ * {@inheritedDoc}
+ */
+ @Override
+ protected boolean isDiagramAssistantShowing() {
+
+ return true;
+ }
+
+ /**
+ * {@inheritedDoc}.
+ *
+ * @return true, if checks if is preference on
+ */
+ @Override
+ protected boolean isPreferenceOn() {
+ return true;
+ }
+
+ /**
+ * fill the popup bar.
+ *
+ * @return the width of popup bar
+ */
+ protected int populatePopup() {
+ int xLoc = 5;
+ if(getFigureBar() != null) {
+ // add all subdiagrams
+
+ try {
+ hyperLinkObjectList = (ArrayList<HyperLinkObject>)hyperlinkHelperFactory.getAllreferenced(((IGraphicalEditPart)getHost()).getNotationView());
+ } catch (HyperLinkException e) {
+ e.printStackTrace();
+ }
+ xLoc = addObjectList(xLoc, hyperLinkObjectList);
+ // add the PLUS button
+ PopupBarLabelHandle handle = new PopupBarLabelPlusHandle();
+ Rectangle r1 = new Rectangle();
+ r1.setLocation(xLoc, 5);
+ xLoc += 20;
+ r1.setSize(16, 16);
+
+ Label l = new Label();
+ l.setText("Add hyperlink");
+
+ handle.setToolTip(l);
+ handle.setPreferredSize(16, 16);
+ handle.setBounds(r1);
+ handle.setBackgroundColor(ColorConstants.white);
+ getFigureBar().add(handle);
+ handle.addMouseListener(this.myMouseKeyListener);
+ handle.addMouseMotionListener(this);
+ }
+ return xLoc;
+ }
+
+ /**
+ * {@inheritedDoc}.
+ *
+ * @param referencePoint
+ * the reference point
+ */
+ @Override
+ protected void showDiagramAssistant(Point referencePoint) {
+ if(getFigureBar() == null) {
+ createPopupBarFigure();
+ int width = populatePopup();
+ IFigure layer = getLayer(LayerConstants.HANDLE_LAYER);
+ layer.add(getFigureBar());
+ if(referencePoint == null) {
+ referencePoint = getHostFigure().getBounds().getCenter();
+ }
+ Point position = getHostFigure().getBounds().getBottomLeft();
+ getHostFigure().translateToAbsolute(position);
+ EditPartViewer viewer = getHost().getRoot().getViewer();
+ Viewport viewport = null;
+ if(viewer instanceof DiagramGraphicalViewer) {
+ viewport = ((FigureCanvas)((DiagramGraphicalViewer)viewer).getControl()).getViewport();
+ }
+ if(viewport != null) {
+ position.x = position.x + viewport.getClientArea().x;
+ position.y = position.y + viewport.getClientArea().y;
+ }
+ getFigureBar().setSize(width, 30);
+ getFigureBar().setLocation(position);
+ getFigureBar().setBackgroundColor(ColorConstants.white);
+ getFigureBar().setForegroundColor(ColorConstants.orange);
+
+ // dismiss the popup bar after a delay
+ if(!shouldAvoidHidingDiagramAssistant()) {
+ hideDiagramAssistantAfterDelay(getDisappearanceDelay());
+ }
+ }
+ }
+
+ @Override
+ protected boolean shouldShowDiagramAssistant() {
+ return getHost().isActive() && isPreferenceOn() && isHostEditable() && isHostResolvable() && isDiagramPartActive();
+ }
+
+ /**
+ * Checks if the diagram part is active.
+ *
+ * @return True if the diagram part is active; false otherwise.
+ */
+ private boolean isDiagramPartActive() {
+ IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+
+ if(window != null) {
+ IWorkbenchPage page = window.getActivePage();
+ if(page != null) {
+ IWorkbenchPart activePart = page.getActivePart();
+
+ IDiagramWorkbenchPart editorPart = null;
+
+ if(activePart instanceof IDiagramWorkbenchPart) {
+ editorPart = (IDiagramWorkbenchPart)activePart;
+ } else if(activePart instanceof IAdaptable) {
+ editorPart = (IDiagramWorkbenchPart)((IAdaptable)activePart).getAdapter(IDiagramWorkbenchPart.class);
+ }
+
+ if(editorPart == null) {
+ return false;
+ }
+
+ return editorPart.getDiagramEditPart().getRoot().equals(((IGraphicalEditPart)getHost()).getRoot());
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Checks if the host editpart is editable.
+ *
+ * @return True if the host is editable; false otherwise.
+ */
+ private boolean isHostEditable() {
+ if(getHost() instanceof GraphicalEditPart) {
+ return ((GraphicalEditPart)getHost()).isEditModeEnabled();
+ }
+ return true;
+ }
+
+ /**
+ * Is the host's semantic reference resolvable (if applicable)?
+ *
+ * @return true if the semantic reference is resolvable, true if there is no
+ * semantic reference, and false otherwise
+ */
+ private boolean isHostResolvable() {
+ final View view = (View)getHost().getModel();
+ EObject element = view.getElement();
+ if(element != null) {
+ return !element.eIsProxy();
+ }
+ return true;
+ }
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/NavigationEditPolicy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/NavigationEditPolicy.java
new file mode 100644
index 00000000000..a1fc04804bd
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/NavigationEditPolicy.java
@@ -0,0 +1,245 @@
+/*****************************************************************************
+ * Copyright (c) 2010 Atos Origin.
+ *
+ *
+ * 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:
+ * Mathieu Velten (Atos Origin) mathieu.velten@atosorigin.com - Initial API and implementation
+ * Patrick Tessier (CEA LIST)-modification
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink.editpolicies;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.UnexecutableCommand;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.CompartmentEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.OpenEditPolicy;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.papyrus.commands.CreationCommandDescriptor;
+import org.eclipse.papyrus.infra.core.editorsfactory.IPageIconsRegistry;
+import org.eclipse.papyrus.infra.core.editorsfactory.PageIconsRegistry;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.gmfdiag.common.DiagramsUtil;
+import org.eclipse.papyrus.infra.gmfdiag.common.utils.ServiceUtilsForEditPart;
+import org.eclipse.papyrus.infra.gmfdiag.hyperlink.Activator;
+import org.eclipse.papyrus.infra.gmfdiag.hyperlink.ui.AdvancedHLManager;
+import org.eclipse.papyrus.infra.gmfdiag.navigation.ExistingNavigableElement;
+import org.eclipse.papyrus.infra.gmfdiag.navigation.NavigableElement;
+import org.eclipse.papyrus.infra.gmfdiag.navigation.NavigationHelper;
+import org.eclipse.papyrus.infra.gmfdiag.navigation.preference.INavigationPreferenceConstant;
+import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper;
+import org.eclipse.papyrus.infra.hyperlink.helper.HyperLinkHelperFactory;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkEditor;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.ui.EditorNavigationDialog;
+import org.eclipse.papyrus.infra.hyperlink.ui.HyperLinkManagerShell;
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkHelpersRegistrationUtil;
+
+/**
+ * This class is used to open a new diagram when the double click is detected.
+ * It is dependent of papyrus environment
+ */
+public class NavigationEditPolicy extends OpenEditPolicy {
+
+ public static final String NAVIGATION_POLICY = "NavigationEditPolicy";
+
+ public NavigationEditPolicy() {
+ }
+
+ /**
+ *
+ * @param request
+ * @return get the command to open a new diagram
+ */
+ @Override
+ protected Command getOpenCommand(Request request) {
+ final IGraphicalEditPart gep;
+
+ // in order to obtain the list of default diagram we need to fin the
+ // edit part that refers to default diagram
+
+ // if this a label of a compartment, the good editpart is the parent
+ if((IGraphicalEditPart)getHost() instanceof CompartmentEditPart) {
+ gep = (IGraphicalEditPart)getHost().getParent();
+ } else {
+
+ gep = (IGraphicalEditPart)getHost();
+ }
+ final EObject semanticElement = gep.resolveSemanticElement();
+
+ // navigable element by using heuristic
+ List<NavigableElement> navElements = null;
+
+ // defaultHyperlinks
+ final ArrayList<HyperLinkObject> defaultHyperLinkObject = new ArrayList<HyperLinkObject>();
+ final ArrayList<HyperLinkObject> hyperLinkObjectList;
+ // Diagrams that will be found by using heuristic
+ HashMap<NavigableElement, List<Diagram>> existingDiagrams = new HashMap<NavigableElement, List<Diagram>>();
+
+ if(semanticElement == null) {
+ return UnexecutableCommand.INSTANCE;
+ }
+ // initialition of code to extract hyperlinks, in the future to do with
+ // extension points
+ ArrayList<AbstractHyperLinkHelper> hyperLinkHelpers = new ArrayList<AbstractHyperLinkHelper>();
+ // hyperLinkHelpers.add(new DiagramHyperLinkHelper());
+ // hyperLinkHelpers.add(new DocumentHyperLinkHelper());
+ // hyperLinkHelpers.add(new WebHyperLinkHelper());
+ hyperLinkHelpers.addAll(HyperLinkHelpersRegistrationUtil.INSTANCE.getAllRegisteredHyperLinkHelper());
+ final HyperLinkHelperFactory hyperlinkHelperFactory = new HyperLinkHelperFactory(hyperLinkHelpers);
+
+ try {
+ // fill the list of default hyperlinks
+ hyperLinkObjectList = (ArrayList<HyperLinkObject>)hyperlinkHelperFactory.getAllreferenced(gep.getNotationView());
+
+ Iterator<HyperLinkObject> iterator = hyperLinkObjectList.iterator();
+ while(iterator.hasNext()) {
+ HyperLinkObject hyperlinkObject = iterator.next();
+ if(hyperlinkObject.getIsDefault()) {
+
+ defaultHyperLinkObject.add(hyperlinkObject);
+ }
+
+ }
+
+ // fill navigation by using heuristics
+ navElements = NavigationHelper.getInstance().getAllNavigableElements(semanticElement);
+ HashMap<NavigableElement, List<CreationCommandDescriptor>> possibleCreations = new HashMap<NavigableElement, List<CreationCommandDescriptor>>();
+
+ // test which kind of navigation by consulting preference
+ String navigationKind = Activator.getDefault().getPreferenceStore().getString(INavigationPreferenceConstant.PAPYRUS_NAVIGATION_DOUBLECLICK_KIND);
+
+ // no naviagation
+ if(navigationKind.equals(INavigationPreferenceConstant.NO_NAVIGATION)) {
+ // do nothing
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ // navigation by using heuristic
+ // add list of diagram navigables by using heuristic
+ if(navigationKind.equals(INavigationPreferenceConstant.EXPLICIT_IMPLICIT_NAVIGATION)) {
+ for(NavigableElement navElement : navElements) {
+ final EObject element = navElement.getElement();
+ if(navElement instanceof ExistingNavigableElement) {
+ List<Diagram> associatedDiagrams = DiagramsUtil.getAssociatedDiagrams(element, null);
+
+ // ignore the current diagram
+ associatedDiagrams.remove(gep.getNotationView().getDiagram());
+ if(associatedDiagrams != null && !associatedDiagrams.isEmpty()) {
+ existingDiagrams.put(navElement, associatedDiagrams);
+ }
+ }
+ }
+
+ Iterator<List<Diagram>> iter = existingDiagrams.values().iterator();
+ while(iter.hasNext()) {
+ List<Diagram> list = iter.next();
+ Iterator<Diagram> iterDiagram = list.iterator();
+ while(iterDiagram.hasNext()) {
+ Diagram diagram = iterDiagram.next();
+ HyperLinkEditor hyperLinkEditor = new HyperLinkEditor();
+ hyperLinkEditor.setObject(diagram);
+ hyperLinkEditor.setTooltipText(diagram.getName() + " (found by heuristic)");
+ // look for if a hyperlink already exists
+ HyperLinkObject foundHyperlink = null;
+ for(int i = 0; i < defaultHyperLinkObject.size() && foundHyperlink == null; i++) {
+ if(defaultHyperLinkObject.get(i).getObject().equals(diagram)) {
+ foundHyperlink = defaultHyperLinkObject.get(i);
+ }
+ }
+ // the diagram was not into the list of existing default
+ // hyperlink
+ if(foundHyperlink == null) {
+ defaultHyperLinkObject.add(hyperLinkEditor);
+ }
+ }
+ }
+ }
+ if(defaultHyperLinkObject.size() == 0) {
+ Command command = new Command() {
+
+ @Override
+ public void execute() {
+ EObject semanticElement = gep.getNotationView().getElement();
+ if(semanticElement instanceof EModelElement) {
+ HyperLinkManagerShell hyperLinkManagerShell = new AdvancedHLManager(createEditorRegistry(), ((IGraphicalEditPart)getHost()).getEditingDomain(), (EModelElement)semanticElement, gep.getNotationView(), hyperlinkHelperFactory);
+ hyperLinkManagerShell.setInput(hyperLinkObjectList);
+ hyperLinkManagerShell.open();
+ }
+ }
+ };
+ return command;
+ }
+ if(defaultHyperLinkObject.size() == 1) {
+ // open the diagram
+ Command command = new Command() {
+
+ @Override
+ public void execute() {
+ super.execute();
+ defaultHyperLinkObject.get(0).executeSelectPressed();
+ }
+ };
+ return command;
+
+ }
+ if(defaultHyperLinkObject.size() > 1) {
+ // open a dialog to choose a diagram
+ EditorNavigationDialog diagramNavigationDialog = new EditorNavigationDialog(getHost().getViewer().getControl().getShell(), defaultHyperLinkObject, semanticElement);
+ diagramNavigationDialog.open();
+ final List<HyperLinkObject> hList = diagramNavigationDialog.getSelectedHyperlinks();
+ Command command = new Command() {
+
+ @Override
+ public void execute() {
+ super.execute();
+
+ Iterator<HyperLinkObject> iter = hList.iterator();
+ while(iter.hasNext()) {
+ HyperLinkObject hyperlinkObject = iter.next();
+ hyperlinkObject.executeSelectPressed();
+ }
+ }
+ };
+ return command;
+
+ }
+
+ } catch (Exception e) {
+ Activator.log.error("Impossible to load hyperlinks", e);
+ }
+ return UnexecutableCommand.INSTANCE;
+ }
+
+ /**
+ * Return the EditorRegistry for nested editor descriptors. Subclass should
+ * implements this method in order to return the registry associated to the
+ * extension point namespace.
+ *
+ * @return the EditorRegistry for nested editor descriptors
+ *
+ * @generated NOT
+ */
+ protected IPageIconsRegistry createEditorRegistry() {
+ try {
+ return ServiceUtilsForEditPart.getInstance().getService(IPageIconsRegistry.class, getHost());
+ } catch (ServiceException e) {
+ // Return an empty registry always providing null;
+ return new PageIconsRegistry();
+ }
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/providers/HyperlinkEditPolicyProvider.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/providers/HyperlinkEditPolicyProvider.java
new file mode 100644
index 00000000000..06151d93396
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/providers/HyperlinkEditPolicyProvider.java
@@ -0,0 +1,59 @@
+/*****************************************************************************
+ * Copyright (c) 2012 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 (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink.providers;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gmf.runtime.common.core.service.AbstractProvider;
+import org.eclipse.gmf.runtime.common.core.service.IOperation;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editparts.IPrimaryEditPart;
+import org.eclipse.gmf.runtime.diagram.ui.editpolicies.EditPolicyRoles;
+import org.eclipse.gmf.runtime.diagram.ui.services.editpolicy.CreateEditPoliciesOperation;
+import org.eclipse.gmf.runtime.diagram.ui.services.editpolicy.IEditPolicyProvider;
+import org.eclipse.papyrus.infra.gmfdiag.hyperlink.editpolicies.HyperLinkPopupBarEditPolicy;
+import org.eclipse.papyrus.infra.gmfdiag.hyperlink.editpolicies.NavigationEditPolicy;
+
+/**
+ * An EditPolicyProvider for Navigation and Hyperlinks
+ *
+ * @author Camille Letavernier
+ *
+ */
+public class HyperlinkEditPolicyProvider extends AbstractProvider implements IEditPolicyProvider {
+
+ /**
+ * {@inheritDoc}
+ *
+ * This provider can handle GraphicalEditParts
+ */
+ public boolean provides(IOperation operation) {
+ if(operation instanceof CreateEditPoliciesOperation) {
+ CreateEditPoliciesOperation epOperation = (CreateEditPoliciesOperation)operation;
+ return epOperation.getEditPart() instanceof IGraphicalEditPart;
+ }
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Installs the Hyperlink and Navigation edit policies
+ */
+ public void createEditPolicies(EditPart editPart) {
+ if(editPart instanceof IPrimaryEditPart) {
+ editPart.installEditPolicy(EditPolicyRoles.POPUPBAR_ROLE, new HyperLinkPopupBarEditPolicy());
+ }
+ editPart.installEditPolicy(NavigationEditPolicy.NAVIGATION_POLICY, new NavigationEditPolicy());
+
+ }
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/AdvancedHLManager.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/AdvancedHLManager.java
new file mode 100644
index 00000000000..f0f75a128d8
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/AdvancedHLManager.java
@@ -0,0 +1,125 @@
+/*****************************************************************************
+ * Copyright (c) 2009-2011 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ * Arthur Daussy (Atos) arthur.daussy@atos.net - Bug 363827 - [Improvement] Diagram creation, remember the latest tab chosen
+ * Vincent Lorenzo (CEA-LIST) Vincent.lorenzo@cea.fr (refactoring of the hyperlink)
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink.ui;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.emf.ecore.EModelElement;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.gmf.runtime.notation.Diagram;
+import org.eclipse.gmf.runtime.notation.View;
+import org.eclipse.papyrus.commands.wrappers.GMFtoEMFCommandWrapper;
+import org.eclipse.papyrus.infra.core.editorsfactory.IPageIconsRegistry;
+import org.eclipse.papyrus.infra.hyperlink.helper.HyperLinkHelperFactory;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkEditor;
+import org.eclipse.papyrus.infra.hyperlink.ui.AbstractHyperLinkTab;
+import org.eclipse.papyrus.infra.hyperlink.ui.HyperLinkManagerShell;
+
+/**
+ *
+ * This hyperlink manager can manage default hyperlinks and creation of diagram with heuristic
+ */
+public class AdvancedHLManager extends HyperLinkManagerShell {
+
+
+ /**
+ *
+ * Constructor.
+ *
+ * @param editorFactoryRegistry
+ * the editor factory registry
+ * @param model
+ * the model that contains all elements
+ * @param domain
+ * the domain in order to execute command
+ * @param umlElement
+ * the uml element linked to the view
+ * @param aview
+ * the view of the uml element
+ *
+ */
+ public AdvancedHLManager(IPageIconsRegistry editorFactoryRegistry, TransactionalEditingDomain domain, EModelElement semanticElement, View aview, HyperLinkHelperFactory hyperHelperFactory) {
+ super(editorFactoryRegistry, domain, semanticElement, aview, hyperHelperFactory);
+ }
+
+ /**
+ * this method parse the command to extract created diagram and construct a list of hyperlinkDiagrams
+ *
+ * @param creationcommand
+ * a gmf command
+ * @return the list of hyperlinks diagram
+ */
+ protected ArrayList<HyperLinkEditor> getCreatedHyperlinkDiagramsWithHeuristic(ICommand creationcommand) {
+ ArrayList<Diagram> diagrams = new ArrayList<Diagram>();
+ if(creationcommand instanceof CompositeCommand) {
+ CompositeCommand compositeCommand = (CompositeCommand)creationcommand;
+ Object value = compositeCommand.getCommandResult().getReturnValue();
+ if(value instanceof ArrayList) {
+ diagrams.addAll((Collection<Diagram>)value);
+ }
+ }
+ ArrayList<HyperLinkEditor> hyperLinkDiagrams = new ArrayList<HyperLinkEditor>();
+ for(int i = 0; i < diagrams.size(); i++) {
+ HyperLinkEditor hyperLinkEditor = new HyperLinkEditor();
+ hyperLinkEditor.setObject(diagrams.get(i));
+ hyperLinkEditor.setIsDefault(true);
+ hyperLinkEditor.setTooltipText(diagrams.get(i).getName());
+ hyperLinkDiagrams.add(hyperLinkEditor);
+ }
+ return hyperLinkDiagrams;
+ }
+
+ @Override
+ protected void doAction() {
+ super.doAction();
+ // defaultTab = getDefaultHyperLinkTab();
+ final LocalDefaultLinkDiagramTab heuristicTab = getHeuristicTab();
+ ArrayList<HyperLinkEditor> defaultdiagramsWithHeuristic = new ArrayList<HyperLinkEditor>();
+ //if the default diagrams is opened, get created default diagrams
+ if(heuristicTab.getDefaultHyperlinkComposite().isVisible()) {
+ heuristicTab.okPressed();
+ ICommand creationCommand = heuristicTab.getCommand();
+ //TODO : should be chained with the others command
+ transactionalEditingDomain.getCommandStack().execute(new GMFtoEMFCommandWrapper(heuristicTab.getCommand()));
+ defaultdiagramsWithHeuristic.addAll(getCreatedHyperlinkDiagramsWithHeuristic(creationCommand));
+ }
+
+
+
+ //add into the list all diagram create by using heuristic
+ for(int i = 0; i < defaultdiagramsWithHeuristic.size(); i++) {
+ allhypHyperlinkObjects.add(0, defaultdiagramsWithHeuristic.get(i));
+ }
+
+ }
+
+ private LocalDefaultLinkDiagramTab getHeuristicTab() {
+ int i = 0;
+ LocalDefaultLinkDiagramTab tab = null;
+ for(AbstractHyperLinkTab current : tabList) {
+ if(current instanceof LocalDefaultLinkDiagramTab) {
+ tab = (LocalDefaultLinkDiagramTab)current;
+ i++;
+ }
+ }
+ Assert.isTrue(i == 1);
+ Assert.isNotNull(tab);
+ return tab;
+ }
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/HyperLinkDiagramConstants.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/HyperLinkDiagramConstants.java
new file mode 100644
index 00000000000..2375d7d0767
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/HyperLinkDiagramConstants.java
@@ -0,0 +1,32 @@
+/*****************************************************************************
+ * Copyright (c) 2012 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:
+ * Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink.ui;
+
+import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkConstants;
+
+
+public class HyperLinkDiagramConstants {
+
+ private HyperLinkDiagramConstants(){
+ //nothing to do
+ }
+
+ /**
+ * this is a key of eAnnnotation that contains hypertext link or referenced document
+ **/
+ public static final String HYPERLINK_DIAGRAM = HyperLinkConstants.PAPYRUS_HYPERLINK_PREFIX+ "Diagram";
+
+ public static final String HYPERLINK_DIAGRAM_NAME = "diagram_name";
+
+}
diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/LocalDefaultLinkDiagramTab.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/LocalDefaultLinkDiagramTab.java
new file mode 100644
index 00000000000..1595c2a7fa2
--- /dev/null
+++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/ui/LocalDefaultLinkDiagramTab.java
@@ -0,0 +1,360 @@
+/*****************************************************************************
+ * Copyright (c) 2011 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:
+ * Patrick Tessier (CEA LIST) Patrick.tessier@cea.fr - Initial API and implementation
+ *
+ *****************************************************************************/
+package org.eclipse.papyrus.infra.gmfdiag.hyperlink.ui;
+
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.gmf.runtime.common.core.command.CompositeCommand;
+import org.eclipse.gmf.runtime.common.core.command.ICommand;
+import org.eclipse.papyrus.commands.CreationCommandDescriptor;
+import org.eclipse.papyrus.commands.CreationCommandRegistry;
+import org.eclipse.papyrus.commands.ICreationCommandRegistry;
+import org.eclipse.papyrus.infra.core.editor.BackboneException;
+import org.eclipse.papyrus.infra.core.resource.ModelSet;
+import org.eclipse.papyrus.infra.core.services.ServiceException;
+import org.eclipse.papyrus.infra.emf.utils.ServiceUtilsForEObject;
+import org.eclipse.papyrus.infra.gmfdiag.hyperlink.Activator;
+import org.eclipse.papyrus.infra.gmfdiag.navigation.CreatedNavigableElement;
+import org.eclipse.papyrus.infra.gmfdiag.navigation.NavigableElement;
+import org.eclipse.papyrus.infra.gmfdiag.navigation.NavigationHelper;
+import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject;
+import org.eclipse.papyrus.infra.hyperlink.ui.AbstractHyperLinkTab;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.CCombo;
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.custom.TableEditor;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * this is the tab in charge to display the hyperlink diagram created by using heuristic for the property default
+ * the code was extract from {@link NavigationCreateDiagramDialog}
+ *
+ */
+public class LocalDefaultLinkDiagramTab extends AbstractHyperLinkTab {
+
+ private static final String CREATION_ENTRY_KEY = "CREATION_ENTRY";
+
+ private static final String ELEMENT_TYPE_COMBO_KEY = "ELEMENT_TYPE_COMBO";
+
+ private static final String DIAGRAM_TYPE_COMBO_KEY = "DIAGRAM_TYPE_COMBO";
+
+ private static final String DIAGRAM_NAME_TEXT_KEY = "DIAGRAM_NAME_TEXT";
+
+ private static final String[] COLUMN_NAMES = { "Navigation type", "Feature", "Element type", "Diagram type", "Diagram name" };
+
+ private static final int[] COLUMN_WIDTHS = { 80, 120, 120, 200, 120 };
+
+ private Map<NavigableElement, List<CreationCommandDescriptor>> possibleCreations;
+
+ private ICommand command = null;
+
+ private Table table;
+
+ private EObject semanticElement;
+
+
+ private class NavigableGroupKey {
+
+
+ public NavigableElement ancestor = null;
+
+ public EStructuralFeature feature = null;
+
+ @Override
+ public int hashCode() {
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if(obj instanceof NavigableGroupKey) {
+ NavigableGroupKey grpKey = (NavigableGroupKey)obj;
+ return grpKey.ancestor == ancestor && grpKey.feature == feature;
+ }
+ return false;
+ }
+ }
+
+ private Composite defaultHyperlinkComposite;
+
+
+ /**
+ * @return the composite that contains the table
+ * **/
+ public Composite getDefaultHyperlinkComposite() {
+ return defaultHyperlinkComposite;
+ }
+
+ /**
+ *
+ * Constructor.
+ *
+ * @param tabFolder
+ * the parent tabfolder
+ * @param semanticElement
+ * the element from which diagram can be created
+ */
+ @Deprecated
+ public LocalDefaultLinkDiagramTab(CTabFolder tabFolder, EObject semanticElement) {
+ this.semanticElement = semanticElement;
+ //init list of descriptor to fill the table
+ initLocalNavigableElement();
+ //associate the composite to the tabfolder
+ CTabItem tbtmDefaultsHyperlinks = new CTabItem(tabFolder, SWT.NONE);
+ tbtmDefaultsHyperlinks.setText("Hyperlink diagram with Heuristic");
+ defaultHyperlinkComposite = new Composite(tabFolder, SWT.NONE);
+ defaultHyperlinkComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ createArea(defaultHyperlinkComposite);
+ tbtmDefaultsHyperlinks.setControl(defaultHyperlinkComposite);
+ }
+
+ public LocalDefaultLinkDiagramTab() {
+ super();
+ }
+
+ @Override
+ public void init(CTabFolder tabFolder, List<HyperLinkObject> hyperlinkObjects, EObject element) {
+ super.init(tabFolder, hyperlinkObjects, element);
+ this.semanticElement = element;
+ //init list of descriptor to fill the table
+ initLocalNavigableElement();
+ //associate the composite to the tabfolder
+ CTabItem tbtmDefaultsHyperlinks = new CTabItem(tabFolder, SWT.NONE);
+ tbtmDefaultsHyperlinks.setText("Hyperlink diagram with Heuristic");
+ defaultHyperlinkComposite = new Composite(tabFolder, SWT.NONE);
+ defaultHyperlinkComposite.setLayout(new GridLayout(1, false));
+ defaultHyperlinkComposite.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+ createArea(defaultHyperlinkComposite);
+ tbtmDefaultsHyperlinks.setControl(defaultHyperlinkComposite);
+ }
+
+ /**
+ * get the command to create diagrams from the selection done into the table
+ *
+ * @return the command in charge of the creation of the diagrams
+ * **/
+ public ICommand getCommand() {
+ return command;
+ }
+
+ /**
+ * code that is called when the button ok is selected
+ */
+ protected void okPressed() {
+ ModelSet modelSet;
+
+ try {
+ modelSet = ServiceUtilsForEObject.getInstance().getModelSet(semanticElement);
+ } catch (ServiceException ex) {
+ Activator.log.error(ex);
+ return;
+ }
+
+ CompositeCommand compositeCommand = new CompositeCommand("Create diagrams");
+
+ for(TableItem tableItem : table.getItems()) {
+ try {
+ CCombo elementTypeCombo = (CCombo)tableItem.getData(ELEMENT_TYPE_COMBO_KEY);
+ int elementTypeSelectionIndex = elementTypeCombo.getSelectionIndex();
+ CCombo diagramTypeCombo = (CCombo)tableItem.getData(DIAGRAM_TYPE_COMBO_KEY);
+ int diagramTypeSelectionIndex = diagramTypeCombo.getSelectionIndex();
+
+ if(tableItem.getChecked() && elementTypeSelectionIndex != -1 && diagramTypeSelectionIndex != -1) {
+ List<NavigableElement> possibleElements = (List<NavigableElement>)tableItem.getData(CREATION_ENTRY_KEY);
+ NavigableElement navElement = possibleElements.get(elementTypeSelectionIndex);
+
+ CreationCommandDescriptor desc = possibleCreations.get(navElement).get(diagramTypeSelectionIndex);
+
+ Text diagramNameText = (Text)tableItem.getData(DIAGRAM_NAME_TEXT_KEY);
+
+ compositeCommand.add(NavigationHelper.getLinkCreateAndOpenNavigableDiagramCommand(navElement, desc.getCommand(), diagramNameText.getText(), modelSet));
+ }
+ } catch (BackboneException e) {
+ e.printStackTrace();
+ }
+ }
+
+ command = compositeCommand;
+
+ }
+
+ /**
+ * construction the ui
+ *
+ * @param parent
+ * the composite that contains table.
+ * @return the table contained in the composite
+ */
+ protected Control createArea(Composite parent) {
+
+ table = new Table(parent, SWT.BORDER | SWT.V_SCROLL | SWT.CHECK);
+ table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
+ table.setHeaderVisible(true);
+ table.setLinesVisible(true);
+ // table.setBounds(10, 20, 650, 170);
+
+ for(int i = 0; i < COLUMN_NAMES.length; i++) {
+ TableColumn col = new TableColumn(table, SWT.NONE);
+ col.setText(COLUMN_NAMES[i]);
+ col.setWidth(COLUMN_WIDTHS[i]);
+ col.setResizable(true);
+ }
+
+ // regroup CreatedNavigableElement which has same ancestor and use the same feature of this ancestor
+ Map<NavigableGroupKey, List<NavigableElement>> successorsMap = new HashMap<NavigableGroupKey, List<NavigableElement>>();
+
+ for(Entry<NavigableElement, List<CreationCommandDescriptor>> possibleCreationEntry : possibleCreations.entrySet()) {
+ NavigableElement navElement = possibleCreationEntry.getKey();
+
+ NavigableGroupKey groupKey = new NavigableGroupKey();
+
+ // ignore containing feature if we are on the root element
+ // because it is a direct diagram creation
+ // => the feature has no meaning in this case
+ if(!semanticElement.equals(navElement.getElement())) {
+ groupKey.feature = navElement.getFeature();
+ }
+
+ if(navElement instanceof CreatedNavigableElement) {
+ groupKey.ancestor = ((CreatedNavigableElement)navElement).getPreviousNavigableElement();
+ }
+
+ List<NavigableElement> successors = successorsMap.get(groupKey);
+ if(successors == null) {
+ successors = new LinkedList<NavigableElement>();
+ successorsMap.put(groupKey, successors);
+ }
+ successors.add(navElement);
+ }
+
+ // handle group
+ for(Entry<NavigableGroupKey, List<NavigableElement>> successorsEntry : successorsMap.entrySet()) {
+ NavigableGroupKey groupKey = successorsEntry.getKey();
+ List<NavigableElement> successors = successorsEntry.getValue();
+
+
+ TableItem tableItem = new TableItem(table, SWT.NONE);
+ tableItem.setChecked(false);
+ tableItem.setData(CREATION_ENTRY_KEY, successors);
+
+ //////FIXME///////
+ //tableItem.setText(0, UMLNavigationHelper.getNavigationTypeFromFeature(groupKey.feature)); //Remove this dependency to UML. LabelProviderService?
+ tableItem.setText(0, "Unknown");
+ //////////////////
+
+ String featureString = "";
+ if(groupKey.feature != null) {
+ featureString = groupKey.feature.getName();
+ }
+ tableItem.setText(1, featureString);
+
+ TableEditor diagramTypeEditor = new TableEditor(table);
+ final CCombo diagramTypeCombo = new CCombo(table, SWT.NONE);
+ diagramTypeEditor.grabHorizontal = true;
+ diagramTypeEditor.setEditor(diagramTypeCombo, tableItem, 3);
+ tableItem.setData(DIAGRAM_TYPE_COMBO_KEY, diagramTypeCombo);
+
+ TableEditor elementTypeEditor = new TableEditor(table);
+ final CCombo elementTypeCombo = new CCombo(table, SWT.NONE);
+ for(NavigableElement successor : successors) {
+ String typeName = successor.getElement().eClass().getName();
+ elementTypeCombo.add(typeName);
+ elementTypeCombo.setData(typeName, successor);
+ }
+ elementTypeEditor.grabHorizontal = true;
+ elementTypeEditor.setEditor(elementTypeCombo, tableItem, 2);
+ tableItem.setData(ELEMENT_TYPE_COMBO_KEY, elementTypeCombo);
+ elementTypeCombo.addModifyListener(new ModifyListener() {
+
+ public void modifyText(ModifyEvent e) {
+ String currentTypeName = ((CCombo)e.widget).getText();
+
+ NavigableElement successor = (NavigableElement)elementTypeCombo.getData(currentTypeName);
+
+ diagramTypeCombo.clearSelection();
+ diagramTypeCombo.removeAll();
+ for(CreationCommandDescriptor desc : possibleCreations.get(successor)) {
+ diagramTypeCombo.add(desc.getLabel());
+ }
+ diagramTypeCombo.select(0);
+ }
+ });
+ elementTypeCombo.select(0);
+
+ TableEditor diagramNameEditor = new TableEditor(table);
+ Text text = new Text(table, SWT.NONE);
+ text.setText("DefaultName");
+ diagramNameEditor.grabHorizontal = true;
+ diagramNameEditor.setEditor(text, tableItem, 4);
+ tableItem.setData(DIAGRAM_NAME_TEXT_KEY, text);
+ }
+
+ parent.pack();
+ return table;
+ }
+
+
+ /**
+ * this method is used to construct descriptors of heuristic to construct diagrams.
+ * These descriptors will be displayed in the table.
+ */
+ protected void initLocalNavigableElement() {
+ List<NavigableElement> navElements = NavigationHelper.getInstance().getAllNavigableElements(semanticElement);
+ possibleCreations = new HashMap<NavigableElement, List<CreationCommandDescriptor>>();
+
+ for(NavigableElement navElement : navElements) {
+ final EObject element = navElement.getElement();
+
+ List<CreationCommandDescriptor> possibleCommandDescs = new LinkedList<CreationCommandDescriptor>();
+ for(final CreationCommandDescriptor desc : getCreationCommandRegistry().getCommandDescriptors()) {
+ if(desc.getCondition() == null || desc.getCondition().create(element)) {
+ possibleCommandDescs.add(desc);
+ }
+ }
+ if(!possibleCommandDescs.isEmpty()) {
+ possibleCreations.put(navElement, possibleCommandDescs);
+ }
+ }
+ }
+
+ /**
+ * @return the creation command registry
+ */
+ protected static ICreationCommandRegistry getCreationCommandRegistry() {
+ return CreationCommandRegistry.getInstance(org.eclipse.papyrus.infra.core.Activator.PLUGIN_ID);
+ }
+
+ @Override
+ public void setInput(List<HyperLinkObject> hyperLinkObjectList) {
+ //nothing to do here?
+ }
+
+}

Back to the top