Skip to content

Commit

Permalink
Palette Key Command Handler 1
Browse files Browse the repository at this point in the history
  • Loading branch information
Phillipus committed Jan 6, 2024
1 parent b5a2eef commit 279a081
Show file tree
Hide file tree
Showing 3 changed files with 210 additions and 6 deletions.
46 changes: 46 additions & 0 deletions com.archimatetool.editor/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -939,6 +939,18 @@
id="com.archimatetool.editor.action.deleteFromModel"
name="%command.name.20">
</command>
<command
categoryId="com.archimatetool.editor.category"
defaultHandler="com.archimatetool.editor.diagram.PaletteKeyHandler"
id="com.archimatetool.editor.palette.command"
name="Palette Key">
<commandParameter
id="com.archimatetool.editor.palette.command.params"
name="Palette Parameters"
optional="false"
values="com.archimatetool.editor.diagram.PaletteKeyHandler">
</commandParameter>
</command>
<category
description="Archi Commands"
id="com.archimatetool.editor.category"
Expand Down Expand Up @@ -1701,5 +1713,39 @@
</with>
</definition>
</extension>
<extension
name="Palette Key Bindings"
point="org.eclipse.ui.bindings">
<key
commandId="com.archimatetool.editor.palette.command"
contextId="org.eclipse.ui.contexts.dialogAndWindow"
schemeId="com.archimatetool.editor.keybindings"
sequence="M1+M M1+C">
<parameter
id="com.archimatetool.editor.palette.command.params"
value="MagicConnector">
</parameter>
</key>
<key
commandId="com.archimatetool.editor.palette.command"
contextId="org.eclipse.ui.contexts.dialogAndWindow"
schemeId="com.archimatetool.editor.keybindings"
sequence="M1+B M1+A">
<parameter
id="com.archimatetool.editor.palette.command.params"
value="BusinessActor">
</parameter>
</key>
<key
commandId="com.archimatetool.editor.palette.command"
contextId="org.eclipse.ui.contexts.dialogAndWindow"
schemeId="com.archimatetool.editor.keybindings"
sequence="M1+B M1+R">
<parameter
id="com.archimatetool.editor.palette.command.params"
value="BusinessRole">
</parameter>
</key>
</extension>

</plugin>
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -139,14 +141,15 @@ 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),
IArchiImages.ImageFactory.getImageDescriptor(IArchiImages.ICON_MAGIC_CONNECTION));

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
Expand Down Expand Up @@ -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),
Expand All @@ -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$
}
}
Original file line number Diff line number Diff line change
@@ -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<String, String> 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<String, String> 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;
}

}

0 comments on commit 279a081

Please sign in to comment.