diff --git a/com.archimatetool.editor/plugin.xml b/com.archimatetool.editor/plugin.xml
index f05fb9c2e..33131ffbe 100644
--- a/com.archimatetool.editor/plugin.xml
+++ b/com.archimatetool.editor/plugin.xml
@@ -939,6 +939,18 @@
id="com.archimatetool.editor.action.deleteFromModel"
name="%command.name.20">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/com.archimatetool.editor/src/com/archimatetool/editor/diagram/ArchimateDiagramEditorPalette.java b/com.archimatetool.editor/src/com/archimatetool/editor/diagram/ArchimateDiagramEditorPalette.java
index 623091683..14b8ee925 100644
--- a/com.archimatetool.editor/src/com/archimatetool/editor/diagram/ArchimateDiagramEditorPalette.java
+++ b/com.archimatetool.editor/src/com/archimatetool/editor/diagram/ArchimateDiagramEditorPalette.java
@@ -97,23 +97,25 @@ private void createExtrasGroup() {
// Note
ToolEntry noteEntry = new ExtCombinedTemplateCreationEntry(
- Messages.ArchimateDiagramEditorPalette_2,
+ getEntryName(IArchimatePackage.eINSTANCE.getDiagramModelNote()),
Messages.ArchimateDiagramEditorPalette_3,
new ArchimateDiagramModelFactory(IArchimatePackage.eINSTANCE.getDiagramModelNote()),
IArchiImages.ImageFactory.getImageDescriptor(IArchiImages.ICON_NOTE),
IArchiImages.ImageFactory.getImageDescriptor(IArchiImages.ICON_NOTE));
+ noteEntry.setToolProperty(PaletteKeyHandler.KEY_NAME, IArchimatePackage.eINSTANCE.getDiagramModelNote().getName());
group.add(noteEntry);
// Group
ToolEntry groupEntry = new ExtCombinedTemplateCreationEntry(
- Messages.ArchimateDiagramEditorPalette_4,
+ getEntryName(IArchimatePackage.eINSTANCE.getDiagramModelGroup()),
Messages.ArchimateDiagramEditorPalette_5,
new ArchimateDiagramModelFactory(IArchimatePackage.eINSTANCE.getDiagramModelGroup()),
IArchiImages.ImageFactory.getImageDescriptor(IArchiImages.ICON_GROUP),
IArchiImages.ImageFactory.getImageDescriptor(IArchiImages.ICON_GROUP));
+ groupEntry.setToolProperty(PaletteKeyHandler.KEY_NAME, IArchimatePackage.eINSTANCE.getDiagramModelGroup().getName());
group.add(groupEntry);
- // Note Connection
+ // Connection
ToolEntry entry = createConnectionCreationToolEntry(
IArchimatePackage.eINSTANCE.getDiagramModelConnection(),
Messages.ArchimateDiagramEditorPalette_7);
@@ -139,7 +141,7 @@ private void createArchimateRelationsGroup() {
// Magic Connector
ConnectionCreationToolEntry magicConnectionEntry = new ConnectionCreationToolEntry(
- Messages.ArchimateDiagramEditorPalette_14,
+ Messages.ArchimateDiagramEditorPalette_14 + getAcceleratorText("MagicConnector"), //$NON-NLS-1$
Messages.ArchimateDiagramEditorPalette_15,
new MagicConnectionModelFactory(),
IArchiImages.ImageFactory.getImageDescriptor(IArchiImages.ICON_MAGIC_CONNECTION),
@@ -147,6 +149,7 @@ private void createArchimateRelationsGroup() {
magicConnectionEntry.setToolClass(MagicConnectionCreationTool.class);
magicConnectionEntry.setToolProperty(AbstractTool.PROPERTY_UNLOAD_WHEN_FINISHED, true);
+ magicConnectionEntry.setToolProperty(PaletteKeyHandler.KEY_NAME, "MagicConnector"); //$NON-NLS-1$
group.add(magicConnectionEntry);
// Relations
@@ -327,18 +330,20 @@ public void dispose() {
private ToolEntry createElementCreationToolEntry(EClass eClass, String description) {
ToolEntry entry = new ExtCombinedTemplateCreationEntry(
- ArchiLabelProvider.INSTANCE.getDefaultName(eClass),
+ getEntryName(eClass),
description,
new ArchimateDiagramModelFactory(eClass),
ArchiLabelProvider.INSTANCE.getImageDescriptor(eClass),
ArchiLabelProvider.INSTANCE.getImageDescriptor(eClass));
+ entry.setToolProperty(PaletteKeyHandler.KEY_NAME, eClass.getName());
+
return entry;
}
private ToolEntry createConnectionCreationToolEntry(EClass eClass, String description) {
ToolEntry entry = new ExtConnectionCreationToolEntry(
- ArchiLabelProvider.INSTANCE.getDefaultName(eClass),
+ getEntryName(eClass),
description,
new ArchimateDiagramModelFactory(eClass),
ArchiLabelProvider.INSTANCE.getImageDescriptor(eClass),
@@ -347,6 +352,17 @@ private ToolEntry createConnectionCreationToolEntry(EClass eClass, String descri
// Ensure Tool gets deselected
entry.setToolProperty(AbstractTool.PROPERTY_UNLOAD_WHEN_FINISHED, true);
+ entry.setToolProperty(PaletteKeyHandler.KEY_NAME, eClass.getName());
+
return entry;
}
+
+ private String getEntryName(EClass eClass) {
+ return ArchiLabelProvider.INSTANCE.getDefaultName(eClass) + getAcceleratorText(eClass.getName());
+ }
+
+ private String getAcceleratorText(String key) {
+ String text = PaletteKeyHandler.getAcceleratorText(key);
+ return text != null ? " (" + text + ")" : ""; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ }
}
diff --git a/com.archimatetool.editor/src/com/archimatetool/editor/diagram/PaletteKeyHandler.java b/com.archimatetool.editor/src/com/archimatetool/editor/diagram/PaletteKeyHandler.java
new file mode 100644
index 000000000..5f19f2239
--- /dev/null
+++ b/com.archimatetool.editor/src/com/archimatetool/editor/diagram/PaletteKeyHandler.java
@@ -0,0 +1,142 @@
+/**
+ * This program and the accompanying materials
+ * are made available under the terms of the License
+ * which accompanies this distribution in the file LICENSE.txt
+ */
+package com.archimatetool.editor.diagram;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.commands.IParameter;
+import org.eclipse.core.commands.IParameterValues;
+import org.eclipse.core.commands.Parameterization;
+import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.core.commands.common.NotDefinedException;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.gef.palette.PaletteContainer;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.gef.ui.palette.PaletteViewer;
+import org.eclipse.jface.bindings.TriggerSequence;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.commands.ICommandService;
+import org.eclipse.ui.handlers.HandlerUtil;
+import org.eclipse.ui.keys.IBindingService;
+
+import com.archimatetool.editor.ui.ArchiLabelProvider;
+import com.archimatetool.model.IArchimatePackage;
+import com.archimatetool.model.util.ArchimateModelUtils;
+
+/**
+ * Handle Palette Key commands
+ *
+ * @author Phillip Beauvoir
+ */
+@SuppressWarnings("nls")
+public class PaletteKeyHandler extends AbstractHandler implements IParameterValues {
+
+ public static final String COMMAND_ID = "com.archimatetool.editor.palette.command";
+ public static final String PARAMETER_ID = "com.archimatetool.editor.palette.command.params";
+ public static final String CONTEXT_ID = "com.archimatetool.editor.view.context";
+ public static final String KEY_NAME = "keyName";
+
+ private static Map paramValues;
+
+ @Override
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ String parameterValue = event.getParameter(PARAMETER_ID);
+
+ if(parameterValue != null && HandlerUtil.getActiveEditor(event) instanceof IDiagramModelEditor editor) {
+ PaletteViewer paletteViewer = editor.getGraphicalViewer().getEditDomain().getPaletteViewer();
+
+ for(Object rootEntry : paletteViewer.getPaletteRoot().getChildren()) {
+ if(rootEntry instanceof PaletteContainer container) {
+ for(Object childEntry : container.getChildren()) {
+ if(childEntry instanceof ToolEntry toolEntry) {
+ String keyName = (String)toolEntry.getToolProperty(KEY_NAME);
+ if(parameterValue.equals(keyName)) {
+ paletteViewer.setActiveTool(toolEntry);
+ return null;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return null;
+ }
+
+ @Override
+ public Map getParameterValues() {
+ if(paramValues == null) {
+ paramValues = new HashMap<>();
+
+ // ArchiMate elements
+ for(EClass eClass : ArchimateModelUtils.getAllArchimateClasses()) {
+ paramValues.put(ArchiLabelProvider.INSTANCE.getDefaultName(eClass), eClass.getName());
+ }
+
+ // ArchiMate relations
+ for(EClass eClass : ArchimateModelUtils.getRelationsClasses()) {
+ paramValues.put(ArchiLabelProvider.INSTANCE.getDefaultName(eClass), eClass.getName());
+ }
+
+ // Connectors
+ for(EClass eClass : ArchimateModelUtils.getConnectorClasses()) {
+ paramValues.put(ArchiLabelProvider.INSTANCE.getDefaultName(eClass), eClass.getName());
+ }
+
+ // Magic Connector
+ paramValues.put("Magic Connector", "MagicConnector");
+
+ // Note
+ paramValues.put("Note", IArchimatePackage.eINSTANCE.getDiagramModelNote().getName());
+
+ // Group
+ paramValues.put("Group", IArchimatePackage.eINSTANCE.getDiagramModelGroup().getName());
+
+ // Connection
+ paramValues.put("Connection", IArchimatePackage.eINSTANCE.getDiagramModelConnection().getName());
+ }
+
+ return paramValues;
+ }
+
+ /**
+ * @return Shortcut key, if any, as text
+ */
+ public static String getAcceleratorText(String parameterValue) {
+ if(parameterValue == null || !PlatformUI.isWorkbenchRunning()) {
+ return null;
+ }
+
+ Command command = PlatformUI.getWorkbench().getService(ICommandService.class).getCommand(COMMAND_ID);
+ if(command == null) {
+ return null;
+ }
+
+ IParameter parameter = null;
+ try {
+ parameter = command.getParameter(PARAMETER_ID);
+ }
+ catch(NotDefinedException ex) {
+ ex.printStackTrace();
+ }
+
+ if(parameter == null) {
+ return null;
+ }
+
+ Parameterization[] params = new Parameterization[] { new Parameterization(parameter, parameterValue) };
+ ParameterizedCommand parameterizedCommand = new ParameterizedCommand(command, params);
+
+ TriggerSequence ts = PlatformUI.getWorkbench().getService(IBindingService.class).getBestActiveBindingFor(parameterizedCommand);
+ return ts != null ? ts.format() : null;
+ }
+
+}