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; + } + +}