diff options
| author | Pierre-Charles David | 2016-10-07 07:43:03 +0000 |
|---|---|---|
| committer | Pierre-Charles David | 2016-10-07 07:51:06 +0000 |
| commit | 365a2626341a806c2388e825e3b15bfd450317af (patch) | |
| tree | 607bc846add9fed679eebaf3443b8507448cfb9e | |
| parent | a018f4ca7b6bb2135b1a0e4528ecd160664cc879 (diff) | |
| download | org.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>
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; + } + +} |
