Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre-Charles David2016-10-07 07:43:03 +0000
committerPierre-Charles David2016-10-07 07:51:06 +0000
commit365a2626341a806c2388e825e3b15bfd450317af (patch)
tree607bc846add9fed679eebaf3443b8507448cfb9e
parenta018f4ca7b6bb2135b1a0e4528ecd160664cc879 (diff)
downloadorg.eclipse.sirius-365a2626341a806c2388e825e3b15bfd450317af.tar.gz
org.eclipse.sirius-365a2626341a806c2388e825e3b15bfd450317af.tar.xz
org.eclipse.sirius-365a2626341a806c2388e825e3b15bfd450317af.zip
[496061] Rework the solution to integrate the default rules in the main sub-menu
The previous approach used the "menuBuilder" extension point to contribute the action, but it had the unfortunate side-effect of showing the new menu as a first entry. It becomes very confusing for users which are accustomed to see the "New > Viewpoint" as the first entry in the first context sub-menu. This new approach relies on the EMF ChildExtender mechanism instead, to contribute the default rules in addition to the "plain" ViewExtensionDescription instance. Because of the way menu labels are computed, by default both would have the same label, so we use a temporary internal adapter to mark the default rules instance with a custom label, which is used if available in AbstractMenuBuilder.CustomCreateChildAction. Bug: 496061 Change-Id: I3b08be24914dbb840f7585262ca486c0b0a09155 Signed-off-by: Pierre-Charles David <pierre-charles.david@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.editor.properties/plugin.properties1
-rw-r--r--plugins/org.eclipse.sirius.editor.properties/plugin.xml7
-rw-r--r--plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/DefaultRulesCreationExtender.java47
-rw-r--r--plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/Messages.java3
-rw-r--r--plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingDefaultPropertiesViewDescriptionAction.java122
-rw-r--r--plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingDefaultPropertiesViewDescriptionCommand.java59
-rw-r--r--plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingMenu.java72
-rw-r--r--plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/api/menu/AbstractMenuBuilder.java19
-rw-r--r--plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/menu/CustomChildTextAdapter.java32
9 files changed, 101 insertions, 261 deletions
diff --git a/plugins/org.eclipse.sirius.editor.properties/plugin.properties b/plugins/org.eclipse.sirius.editor.properties/plugin.properties
index 20e4862888..c533a8dae3 100644
--- a/plugins/org.eclipse.sirius.editor.properties/plugin.properties
+++ b/plugins/org.eclipse.sirius.editor.properties/plugin.properties
@@ -16,4 +16,3 @@ viewpoint.tab.label.name = Label
viewpoint.tab.widget.name = Widget
ImportingDefaultPropertiesViewDescriptionCommand_text = Default Properties View Description
-ImportingMenu_label = Import \ No newline at end of file
diff --git a/plugins/org.eclipse.sirius.editor.properties/plugin.xml b/plugins/org.eclipse.sirius.editor.properties/plugin.xml
index f861d54027..0c618f7ad2 100644
--- a/plugins/org.eclipse.sirius.editor.properties/plugin.xml
+++ b/plugins/org.eclipse.sirius.editor.properties/plugin.xml
@@ -577,14 +577,13 @@
<propertyTab category="default" id="viewpoint.tab.widget" label="%viewpoint.tab.widget.name" afterTab="viewpoint.tab.label"/>
</propertyTabs>
</extension>
-
+ <extension point="org.eclipse.emf.edit.childCreationExtenders">
+ <extender uri="http://www.eclipse.org/sirius/description/1.1.0" class="org.eclipse.sirius.editor.properties.DefaultRulesCreationExtender"/>
+ </extension>
<extension point="org.eclipse.sirius.editor.menuBuilder">
<builder class="org.eclipse.sirius.editor.properties.tools.internal.menu.WidgetsMenuBuilder" />
<builder class="org.eclipse.sirius.editor.properties.tools.internal.menu.StyleMenuBuilder" />
<builder class="org.eclipse.sirius.editor.properties.tools.internal.menu.LayoutMenuBuilder" />
- <builder
- class="org.eclipse.sirius.editor.properties.tools.internal.menu.ImportingMenu">
- </builder>
</extension>
</plugin>
<!-- End of user code plugin.xml end specifics -->
diff --git a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/DefaultRulesCreationExtender.java b/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/DefaultRulesCreationExtender.java
new file mode 100644
index 0000000000..83ccbbb559
--- /dev/null
+++ b/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/DefaultRulesCreationExtender.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.editor.properties;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.eclipse.emf.common.util.ResourceLocator;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.command.CommandParameter;
+import org.eclipse.emf.edit.domain.EditingDomain;
+import org.eclipse.emf.edit.provider.IChildCreationExtender;
+import org.eclipse.sirius.editor.tools.internal.menu.CustomChildTextAdapter;
+import org.eclipse.sirius.properties.ViewExtensionDescription;
+import org.eclipse.sirius.ui.properties.internal.tabprovider.SiriusTabDescriptorProvider;
+import org.eclipse.sirius.viewpoint.description.DescriptionPackage;
+
+/**
+ * Contributes the default rules model to the creation context menu in the VSM editor.
+ *
+ * @author pcdavid
+ */
+public class DefaultRulesCreationExtender implements IChildCreationExtender {
+
+ @Override
+ public Collection<?> getNewChildDescriptors(Object object, EditingDomain editingDomain) {
+ ArrayList<Object> result = new ArrayList<Object>();
+ ViewExtensionDescription rules = EcoreUtil.copy(SiriusTabDescriptorProvider.getDefaultRules());
+ rules.eAdapters().add(new CustomChildTextAdapter(Messages.ImportingDefaultPropertiesViewDescriptionCommand_text));
+ result.add(new CommandParameter(null, DescriptionPackage.Literals.GROUP__EXTENSIONS, rules));
+ return result;
+ }
+
+ @Override
+ public ResourceLocator getResourceLocator() {
+ return SiriusEditorPropertiesPlugin.INSTANCE;
+ }
+
+}
diff --git a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/Messages.java b/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/Messages.java
index 9e4435efb3..866eaa3f93 100644
--- a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/Messages.java
+++ b/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/Messages.java
@@ -28,9 +28,6 @@ public final class Messages {
@TranslatableMessage
public static String ImportingDefaultPropertiesViewDescriptionCommand_text;
- @TranslatableMessage
- public static String ImportingMenu_label;
-
// CHECKSTYLE:ON
private Messages() {
diff --git a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingDefaultPropertiesViewDescriptionAction.java b/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingDefaultPropertiesViewDescriptionAction.java
deleted file mode 100644
index 7d49e8d8f2..0000000000
--- a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingDefaultPropertiesViewDescriptionAction.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Obeo.
- * 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:
- * Obeo - initial API and implementation
- *******************************************************************************/
-package org.eclipse.sirius.editor.properties.tools.internal.menu;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.UnexecutableCommand;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.ui.action.StaticSelectionCommandAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.sirius.viewpoint.description.Group;
-import org.eclipse.ui.IEditorPart;
-
-/**
- * Action for inlining the default rules in the current VSM.
- *
- * @author mbats
- *
- */
-public class ImportingDefaultPropertiesViewDescriptionAction extends StaticSelectionCommandAction {
-
- /**
- * A field indicating if the selection used to construct the action is
- * valid.
- */
- private boolean isSelectionValid;
-
- /**
- * Create a new importing action.
- *
- * @param editor
- * the current editor.
- * @param selection
- * the current selection.
- */
- public ImportingDefaultPropertiesViewDescriptionAction(final IEditorPart editor, final ISelection selection) {
- super(editor);
- isSelectionValid = true;
- configureAction(selection);
- }
-
- @Override
- public String getText() {
- if (command != null) {
- return command.getLabel();
- } else {
- return super.getText();
- }
- }
-
- @Override
- protected Command createActionCommand(final EditingDomain editingDomain, final Collection<?> selection) {
-
- final Collection<EObject> selected = new ArrayList<EObject>();
- for (final Object object : selection) {
- if (object instanceof EObject) {
- selected.add((EObject) object);
- }
- }
- return buildActionCommand(editingDomain, selected);
- }
-
- /**
- * Build the command for the importing action.
- *
- * @param editingDomain
- * the current editing domain.
- * @param selection
- * the selected eobjects
- * @return the builded action command.
- */
- protected Command buildActionCommand(final EditingDomain editingDomain, final Collection<EObject> selection) {
- Command result = UnexecutableCommand.INSTANCE;
- this.isSelectionValid = false;
- if (selection.size() == 1) {
- final EObject selectedEObject = selection.iterator().next();
- if (selectedEObject instanceof Group) {
- this.isSelectionValid = true;
- result = new ImportingDefaultPropertiesViewDescriptionCommand(editingDomain.getResourceSet(), (Group) selectedEObject);
- }
- }
- return result;
- }
-
- /**
- * <p>
- * Indicates if the selection used to build the action is valid.
- * </p>
- *
- * <p>
- * This information will be used by the
- * {@link ImportingMenu}
- * to decide whether this action should be added to the menu or not. <br/>
- * 4 cases can happen :
- * <ul>
- * <li>isSelectionValid && isEnabled -> the Action is shown an can be
- * executed</li>
- * <li>isSelectionValid && !(isEnabled) -> the Action is shown an cannot be
- * executed</li>
- * <li>!(isSelectionValid) && isEnabled -> this case cannot happen</li>
- * <li>!(isSelectionValid) && !(isEnabled) -> the Action hidden (not added
- * to the refactor menu)</li>
- * </ul>
- * </p>
- *
- * @return <code>true</code> if the selection is valid.
- */
- public boolean isSelectionValid() {
- return this.isSelectionValid;
- }
-}
diff --git a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingDefaultPropertiesViewDescriptionCommand.java b/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingDefaultPropertiesViewDescriptionCommand.java
deleted file mode 100644
index b1d61ead16..0000000000
--- a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingDefaultPropertiesViewDescriptionCommand.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Obeo.
- * 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:
- * Obeo - initial API and implementation
- *******************************************************************************/
-package org.eclipse.sirius.editor.properties.tools.internal.menu;
-
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.sirius.editor.properties.Messages;
-import org.eclipse.sirius.editor.tools.api.menu.AbstractUndoRecordingCommand;
-import org.eclipse.sirius.properties.ViewExtensionDescription;
-import org.eclipse.sirius.ui.properties.internal.tabprovider.SiriusTabDescriptorProvider;
-import org.eclipse.sirius.viewpoint.description.Group;
-
-/**
- * Command inlining the default properties view description.
- *
- * @author mbats
- *
- */
-public class ImportingDefaultPropertiesViewDescriptionCommand extends AbstractUndoRecordingCommand {
-
- private final Group group;
-
- /**
- * Create a new command.
- *
- * @param set
- * the current resourceSet.
- * @param group
- * the group element in which the rules must be imported.
- */
- public ImportingDefaultPropertiesViewDescriptionCommand(final ResourceSet set, final Group group) {
- super(set);
- this.group = group;
- }
-
- @Override
- protected void doExecute() {
- // Load the default rules
- ViewExtensionDescription defaults = SiriusTabDescriptorProvider.getDefaultRules();
-
- // Copy the default rules into the selected group
- ViewExtensionDescription ved = EcoreUtil.copy(defaults);
- group.getExtensions().add(ved);
-
- }
-
- @Override
- protected String getText() {
- return Messages.ImportingDefaultPropertiesViewDescriptionCommand_text;
- }
-}
diff --git a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingMenu.java b/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingMenu.java
deleted file mode 100644
index 9cd39f58c4..0000000000
--- a/plugins/org.eclipse.sirius.editor.properties/src/org/eclipse/sirius/editor/properties/tools/internal/menu/ImportingMenu.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 Obeo.
- * 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:
- * Obeo - initial API and implementation
- *******************************************************************************/
-package org.eclipse.sirius.editor.properties.tools.internal.menu;
-
-import java.util.Collection;
-import java.util.Set;
-
-import org.eclipse.emf.edit.command.CommandParameter;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.sirius.editor.properties.Messages;
-import org.eclipse.sirius.editor.tools.api.menu.AbstractMenuBuilder;
-import org.eclipse.ui.IEditorPart;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Sets;
-
-/**
- * The menu for the import actions.
- *
- * @author mbats
- */
-public class ImportingMenu extends AbstractMenuBuilder {
-
- /**
- * Import menu label.
- */
- public static final String IMPORTING_MENU_LABEL = Messages.ImportingMenu_label;
-
- @Override
- public String getLabel() {
- return IMPORTING_MENU_LABEL;
- }
-
- @Override
- public int getPriority() {
- return AbstractMenuBuilder.OTHERS;
- }
-
- @Override
- public void update(final Collection newChildDescriptors, final ISelection selection, final IEditorPart editor) {
- depopulate();
- advancedChildActions = generateImportingActions(selection, editor);
- }
-
- private Collection<?> generateImportingActions(final ISelection selection, final IEditorPart editor) {
- // We first build all candidate Actions
- Set<ImportingDefaultPropertiesViewDescriptionAction> allActions = Sets.newLinkedHashSet();
- allActions.add(new ImportingDefaultPropertiesViewDescriptionAction(editor, selection));
-
- // We only add to the menu the actions that have a valid selection
- return Sets.filter(allActions, new Predicate<ImportingDefaultPropertiesViewDescriptionAction>() {
-
- public boolean apply(ImportingDefaultPropertiesViewDescriptionAction candidateAction) {
- return candidateAction.isSelectionValid();
- }
- });
- }
-
- @Override
- protected boolean isMine(final CommandParameter object) {
- // not relevant here
- return false;
- }
-}
diff --git a/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/api/menu/AbstractMenuBuilder.java b/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/api/menu/AbstractMenuBuilder.java
index 26753c85b5..fcdd6c6221 100644
--- a/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/api/menu/AbstractMenuBuilder.java
+++ b/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/api/menu/AbstractMenuBuilder.java
@@ -20,9 +20,11 @@ import java.util.List;
import java.util.Map;
import java.util.MissingResourceException;
+import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.util.ResourceLocator;
import org.eclipse.emf.ecore.EModelElement;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.command.CommandParameter;
import org.eclipse.emf.edit.ui.action.CreateChildAction;
import org.eclipse.jface.action.ActionContributionItem;
@@ -37,6 +39,7 @@ import org.eclipse.jface.viewers.ISelection;
import org.eclipse.sirius.business.internal.metamodel.helper.EClassHelper;
import org.eclipse.sirius.editor.editorPlugin.SiriusEditorPlugin;
import org.eclipse.sirius.editor.tools.internal.editor.EditorCustomizationManager;
+import org.eclipse.sirius.editor.tools.internal.menu.CustomChildTextAdapter;
import org.eclipse.sirius.ext.base.Option;
import org.eclipse.sirius.ext.base.Options;
import org.eclipse.sirius.viewpoint.description.DescriptionPackage;
@@ -544,11 +547,18 @@ public abstract class AbstractMenuBuilder {
*/
private final class CustomCreateChildAction extends CreateChildAction {
private final String key;
+ private String customText;
private CustomCreateChildAction(IEditorPart editorPart, ISelection selection, CommandParameter descriptor) {
super(editorPart, selection, descriptor);
if (descriptor.getValue() instanceof EObject) {
key = EClassHelper.getPath(((EObject) descriptor.getValue()).eClass());
+ EObject eObj = (EObject) descriptor.getValue();
+ Adapter ccta = EcoreUtil.getAdapter(eObj.eAdapters(), CustomChildTextAdapter.class);
+ if (ccta instanceof CustomChildTextAdapter) {
+ customText = ((CustomChildTextAdapter) ccta).getText();
+ eObj.eAdapters().remove(ccta);
+ }
} else {
key = null;
}
@@ -557,6 +567,15 @@ public abstract class AbstractMenuBuilder {
public String getCreatedElementType() {
return this.key;
}
+
+ @Override
+ public String getText() {
+ if (customText != null) {
+ return customText;
+ } else {
+ return super.getText();
+ }
+ }
@Override
public String toString() {
diff --git a/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/menu/CustomChildTextAdapter.java b/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/menu/CustomChildTextAdapter.java
new file mode 100644
index 0000000000..6c1de217ed
--- /dev/null
+++ b/plugins/org.eclipse.sirius.editor/src/org/eclipse/sirius/editor/tools/internal/menu/CustomChildTextAdapter.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2016 Obeo.
+ * 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:
+ * Obeo - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.sirius.editor.tools.internal.menu;
+
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+
+// CHECKSTYLE:OFF
+public class CustomChildTextAdapter extends AdapterImpl {
+ private final String text;
+
+ public CustomChildTextAdapter(String text) {
+ this.text = text;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ @Override
+ public boolean isAdapterForType(Object type) {
+ return type == CustomChildTextAdapter.class;
+ }
+
+}

Back to the top