From 0bbc83cfb3afc97b76b075f54577edff7d938a30 Mon Sep 17 00:00:00 2001 From: Mickael ADAM Date: Fri, 21 Oct 2016 17:07:24 +0200 Subject: Bug 505908 - [Navigation] navigation framework should provide an option to create a diagram. https://bugs.eclipse.org/bugs/show_bug.cgi?id=505908 Change-Id: I90c438d95c8ebed6c9bbab1ecf2372396f6a4c3a Signed-off-by: Mickael ADAM --- .../.classpath | 14 +- .../.settings/org.eclipse.jdt.core.prefs | 6 +- .../META-INF/MANIFEST.MF | 2 +- .../HyperlinkNavigationMenuEditPolicy.java | 263 ++++++++++++++++++++- .../infra/gmfdiag/hyperlink/messages/Messages.java | 20 ++ .../gmfdiag/hyperlink/messages/messages.properties | 11 + 6 files changed, 304 insertions(+), 12 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 index 2d1a4302f04..eca7bdba8f0 100644 --- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.classpath +++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/.classpath @@ -1,7 +1,7 @@ - - - - - - - + + + + + + + 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 index 4759947300a..62a08f4494d 100644 --- 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 @@ -1,10 +1,10 @@ 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.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.source=1.8 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 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 6e7e082e88d..1d5325c5559 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 @@ -16,4 +16,4 @@ Bundle-Name: GMF Diagram Hyperlink Bundle-ManifestVersion: 2 Bundle-Activator: org.eclipse.papyrus.infra.gmfdiag.hyperlink.Activator Bundle-SymbolicName: org.eclipse.papyrus.infra.gmfdiag.hyperlink;singleton:=true -Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperlinkNavigationMenuEditPolicy.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperlinkNavigationMenuEditPolicy.java index c37014874e5..5d2401622c4 100644 --- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperlinkNavigationMenuEditPolicy.java +++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/editpolicies/HyperlinkNavigationMenuEditPolicy.java @@ -15,30 +15,43 @@ package org.eclipse.papyrus.infra.gmfdiag.hyperlink.editpolicies; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.LinkedList; +import java.util.List; +import java.util.Set; +import org.eclipse.emf.common.command.Command; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EStructuralFeature.Setting; import org.eclipse.emf.transaction.RecordingCommand; import org.eclipse.emf.transaction.TransactionalEditingDomain; +import org.eclipse.emf.transaction.util.TransactionUtil; import org.eclipse.gmf.runtime.diagram.ui.editparts.IGraphicalEditPart; import org.eclipse.gmf.runtime.diagram.ui.tools.AbstractPopupBarTool; +import org.eclipse.gmf.runtime.notation.View; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; +import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.LabelProvider; +import org.eclipse.jface.window.Window; 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.Activator; +import org.eclipse.papyrus.infra.gmfdiag.hyperlink.messages.Messages; import org.eclipse.papyrus.infra.gmfdiag.navigation.editpolicy.NavigationEditPolicy; import org.eclipse.papyrus.infra.gmfdiag.navigation.menu.button.HyperlinkButton; import org.eclipse.papyrus.infra.hyperlink.helper.AbstractHyperLinkHelper; import org.eclipse.papyrus.infra.hyperlink.helper.HyperLinkHelperFactory; import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkDocument; import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkObject; +import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkSpecificObject; import org.eclipse.papyrus.infra.hyperlink.object.HyperLinkWeb; import org.eclipse.papyrus.infra.hyperlink.ui.HyperLinkManagerShell; import org.eclipse.papyrus.infra.hyperlink.util.HyperLinkException; @@ -47,8 +60,17 @@ import org.eclipse.papyrus.infra.services.labelprovider.service.LabelProviderSer import org.eclipse.papyrus.infra.ui.editorsfactory.IPageIconsRegistry; import org.eclipse.papyrus.infra.ui.editorsfactory.PageIconsRegistry; import org.eclipse.papyrus.infra.ui.util.EditorHelper; +import org.eclipse.papyrus.infra.viewpoints.configuration.PapyrusDiagram; +import org.eclipse.papyrus.infra.viewpoints.configuration.PapyrusSyncTable; +import org.eclipse.papyrus.infra.viewpoints.configuration.PapyrusTable; +import org.eclipse.papyrus.infra.viewpoints.policy.PolicyChecker; +import org.eclipse.papyrus.infra.viewpoints.policy.ViewPrototype; +import org.eclipse.papyrus.infra.viewpoints.style.PapyrusViewStyle; +import org.eclipse.papyrus.infra.widgets.providers.EncapsulatedContentProvider; +import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; /** * The Class HyperlinkNavigationMenuEditPolicy can be applied on edit part to display @@ -59,6 +81,104 @@ import org.eclipse.swt.widgets.Shell; */ public class HyperlinkNavigationMenuEditPolicy extends NavigationEditPolicy { + /** Icon for new Table. */ + private static final String ICONS_NEW_TABLE = "icons/NewTable.gif"; //$NON-NLS-1$ + + /** Icon for new Diagram. */ + private static final String ICONS_NEW_DIAGRAM = "icons/NewDiagram.gif"; //$NON-NLS-1$ + + /** + * Action to open the popup of creation of new View. + */ + public class AddViewPopupAction extends Action { + + /** The list of available view prototype. */ + private List viewPrototypes; + + /** the dialog title. */ + private String title; + + /** The dialog message. */ + private String message; + + /** + * The label Provider for ViewPrototype. + */ + LabelProvider labelProvider = new LabelProvider() { + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.LabelProvider#getText(java.lang.Object) + */ + @Override + public String getText(final Object element) { + String text = null; + if (element instanceof ViewPrototype) { + ViewPrototype prototype = (ViewPrototype) element; + text = prototype.getLabel(); + } else { + text = super.getText(element); + } + return text; + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.viewers.LabelProvider#getImage(java.lang.Object) + */ + @Override + public Image getImage(final Object element) { + Image image = null; + if (element instanceof ViewPrototype) { + image = ((ViewPrototype) element).getIconDescriptor().createImage(); + } else { + image = super.getImage(element); + } + return image; + } + }; + + /** + * Constructor. + * + * @param diagramPrototypes + */ + public AddViewPopupAction(List diagramPrototypes, String Title, String message) { + this.viewPrototypes = diagramPrototypes; + this.title = Title; + this.message = message; + } + + /** + * Open the dialog. + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override + public void run() { + + ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(EditorHelper.getActiveShell(), labelProvider, new EncapsulatedContentProvider(ArrayContentProvider.getInstance())); + dialog.setAllowMultiple(false); + dialog.setTitle(title); + dialog.setMessage(message); + + dialog.setInput(viewPrototypes); + dialog.setSize(SWT.DEFAULT, 10); + dialog.open(); + + if (Window.OK == dialog.getReturnCode()) { + // Gets the selected view prototype + Object firstResult = dialog.getFirstResult(); + if (firstResult instanceof ViewPrototype) { + ViewPrototype prototype = (ViewPrototype) firstResult; + // Create the View(Diagram or Table) and add hyperlink as default. + new CreateViewAndHyperlinkAction(prototype).run(); + } + } + } + } + /** The editor registry. */ private IPageIconsRegistry editorRegistry; @@ -107,10 +227,151 @@ public class HyperlinkNavigationMenuEditPolicy extends NavigationEditPolicy { Activator.log.error(e); } + // Add View(Diagram/Table) with associated hyperlink creation + addHyperlinkedViewCreations(); + // Add the New Hyperlink tool - addNavigationMenuHyperlinkDescriptor(Activator.getDefault().getIcon(Activator.IMG_PLUS), new AddHyperlinkAction(), "Open hyperlinks menu", "Modify hyperlinks"); + addNavigationMenuHyperlinkDescriptor(Activator.getDefault().getIcon(Activator.IMG_PLUS), new AddHyperlinkAction(), Messages.HyperlinkNavigationMenuEditPolicy_EditHyperLinkTooltip, Messages.HyperlinkNavigationMenuEditPolicy_EditHyperLinkTooltipLabel); + } + + /** + * Add View Navigation hyperlink. + */ + private void addHyperlinkedViewCreations() { + EObject selection = null; + Object model = ((IGraphicalEditPart) getHost()).getModel(); + if (model instanceof View) { + View view = (View) model; + selection = EMFHelper.getEObject(view.getElement()); + + } + if (null != selection) { + + // Gets View Prototype for Table and for Diagram + List diagramPrototypes = new ArrayList(); + List tablePrototypes = new ArrayList(); + + for (final ViewPrototype proto : PolicyChecker.getCurrent().getPrototypesFor(selection)) { + if (proto.getConfiguration() instanceof PapyrusDiagram) { + diagramPrototypes.add(proto); + } else if (proto.getConfiguration() instanceof PapyrusTable || proto.getConfiguration() instanceof PapyrusSyncTable) { + tablePrototypes.add(proto); + } + } + + // Diagram case + if (0 < diagramPrototypes.size()) { + // Sort list + Collections.sort(diagramPrototypes, new ViewPrototype.Comp()); + // Add popup action + Image addDiagramIcon = Activator.imageDescriptorFromPlugin(org.eclipse.papyrus.infra.viewpoints.policy.Activator.PLUGIN_ID, ICONS_NEW_DIAGRAM).createImage(); + AddViewPopupAction addDiagramAction = new AddViewPopupAction(diagramPrototypes, Messages.HyperlinkNavigationMenuEditPolicy_CreateDiagramDialogLabel, Messages.HyperlinkNavigationMenuEditPolicy_CreateDiagramDialogMessage); + addNavigationMenuHyperlinkDescriptor(addDiagramIcon, addDiagramAction, Messages.HyperlinkNavigationMenuEditPolicy_CreateDiagramhyperlinkTooltip, Messages.HyperlinkNavigationMenuEditPolicy_CreateDiagramhyperlinkLabel); + } + // Table case + if (0 < tablePrototypes.size()) { + // sort list + Collections.sort(tablePrototypes, new ViewPrototype.Comp()); + // The image + Image addTableIcon = Activator.imageDescriptorFromPlugin(org.eclipse.papyrus.infra.viewpoints.policy.Activator.PLUGIN_ID, ICONS_NEW_TABLE).createImage(); + // The action + AddViewPopupAction addTableAction = new AddViewPopupAction(tablePrototypes, Messages.HyperlinkNavigationMenuEditPolicy_CreateTableDialogTitle, Messages.HyperlinkNavigationMenuEditPolicy_CreateTableDialogMessage); + // Add Popup action + addNavigationMenuHyperlinkDescriptor(addTableIcon, addTableAction, Messages.HyperlinkNavigationMenuEditPolicy_CreateTableHyperLinkTooltip, Messages.HyperlinkNavigationMenuEditPolicy_CreateTableHyperLinkLabel); + } + } } + /** + * Create View and the hyperlink set as default from a ViewPrototype. + */ + protected class CreateViewAndHyperlinkAction extends Action { + private ViewPrototype prototype; + + /** + * Constructor. + */ + public CreateViewAndHyperlinkAction(final ViewPrototype prototype) { + this.prototype = prototype; + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override + public void run() { + try { + Object model = ((IGraphicalEditPart) getHost()).getModel(); + if (model instanceof View) { + View view = (View) model; + + EObject eObject = EMFHelper.getEObject(view.getElement()); + + if (null != eObject) { + + // Get the usage of object before action + Set usagesBefore = new HashSet(); + Collection usages = EMFHelper.getUsages(eObject); + if (null != usages) { + for (Setting setting : usages) { + usagesBefore.add(setting.getEObject()); + } + } + prototype.instantiateOn(eObject); + + // Get the usage of object after action + Set usagesAfter = new HashSet(); + usages = EMFHelper.getUsages(eObject); + if (usages != null) { + for (Setting setting : usages) { + usagesAfter.add(setting.getEObject()); + } + } + + // remove the before usage to get the new created Diagram, Table, ... + // In Diagram case and Table, it should be only one element. + usagesAfter.removeAll(usagesBefore); + + // Gets the container + EObject container = null; + for (EObject createdObject : usagesAfter) { + if (createdObject instanceof PapyrusViewStyle) { + // Add it to hyperLink + PapyrusViewStyle viewStyle = (PapyrusViewStyle) createdObject; + container = viewStyle.eContainer(); + } else if (null == container) { + container = createdObject; + } + } + + // Set hyperLink + if (null != container) { + HyperLinkSpecificObject hyperLink = new HyperLinkSpecificObject(container); + // Set it to default to be open by double click + hyperLink.setIsDefault(true); + + List hyperLinkList = new ArrayList(); + hyperLinkList.add(hyperLink); + + TransactionalEditingDomain domain = TransactionUtil.getEditingDomain(eObject); + Command addHyperLinkCommand = hyperlinkHelperFactory.getAddHyperLinkCommand(domain, (EModelElement) model, hyperLinkList); + + if (addHyperLinkCommand.canExecute()) { + domain.getCommandStack().execute(addHyperLinkCommand); + } + } + } + + } + } catch (HyperLinkException ex) { + Activator.log.error(ex); + } + } + } + + private void addHyperlinks() { ILabelProvider labelProvider = null; boolean localLabelProvider = false; diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/messages/Messages.java b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/messages/Messages.java index 0666379b224..04ef98c3cae 100644 --- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/messages/Messages.java +++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/messages/Messages.java @@ -26,6 +26,26 @@ public class Messages extends NLS { public static String EditorHyperLinkHelper_Editor; + public static String HyperlinkNavigationMenuEditPolicy_CreateDiagramDialogLabel; + + public static String HyperlinkNavigationMenuEditPolicy_CreateDiagramDialogMessage; + + public static String HyperlinkNavigationMenuEditPolicy_CreateDiagramhyperlinkLabel; + + public static String HyperlinkNavigationMenuEditPolicy_CreateDiagramhyperlinkTooltip; + + public static String HyperlinkNavigationMenuEditPolicy_CreateTableDialogMessage; + + public static String HyperlinkNavigationMenuEditPolicy_CreateTableDialogTitle; + + public static String HyperlinkNavigationMenuEditPolicy_CreateTableHyperLinkLabel; + + public static String HyperlinkNavigationMenuEditPolicy_CreateTableHyperLinkTooltip; + + public static String HyperlinkNavigationMenuEditPolicy_EditHyperLinkTooltip; + + public static String HyperlinkNavigationMenuEditPolicy_EditHyperLinkTooltipLabel; + static { // initialize resource bundle NLS.initializeMessages(BUNDLE_NAME, Messages.class); diff --git a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/messages/messages.properties b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/messages/messages.properties index 5d49220db77..732e7f3e58e 100644 --- a/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/messages/messages.properties +++ b/plugins/infra/gmfdiag/org.eclipse.papyrus.infra.gmfdiag.hyperlink/src/org/eclipse/papyrus/infra/gmfdiag/hyperlink/messages/messages.properties @@ -13,3 +13,14 @@ EditorHyperLinkEditorShell_ICanFindTheHyperLinkEditorObject=I can't find the HyperlinkEditorObject for : {0} EditorHyperLinkEditorShell_View=View: EditorHyperLinkHelper_Editor=View + +HyperlinkNavigationMenuEditPolicy_CreateDiagramDialogLabel=Diagram creation. +HyperlinkNavigationMenuEditPolicy_CreateDiagramDialogMessage=Select the Diagram to Create. +HyperlinkNavigationMenuEditPolicy_CreateDiagramhyperlinkLabel=Create Hyperlinked Diagram... +HyperlinkNavigationMenuEditPolicy_CreateDiagramhyperlinkTooltip=Create a diagram in the selected Element. +HyperlinkNavigationMenuEditPolicy_CreateTableDialogMessage=Select the Table to Create. +HyperlinkNavigationMenuEditPolicy_CreateTableDialogTitle=Table creation. +HyperlinkNavigationMenuEditPolicy_CreateTableHyperLinkLabel=Create Hyperlinked Table... +HyperlinkNavigationMenuEditPolicy_CreateTableHyperLinkTooltip=Create a table in the selected Element. +HyperlinkNavigationMenuEditPolicy_EditHyperLinkTooltip=Open hyperlinks menu +HyperlinkNavigationMenuEditPolicy_EditHyperLinkTooltipLabel=Modify hyperlinks -- cgit v1.2.3