/** * Copyright (c) 2009 Borland Software Corp. * * 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: * Alexander Shatalin (Borland) - initial API and implementation */ package org.eclipse.gmf.graphdef.editor.edit.policies.keyhandler; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPart; import org.eclipse.gef.EditPolicy; import org.eclipse.gef.GraphicalEditPart; import org.eclipse.gef.KeyStroke; import org.eclipse.gef.commands.Command; import org.eclipse.gmf.graphdef.editor.edit.policies.KeyHandlerEditPolicy; import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyEvent; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; public class KeyHandler extends org.eclipse.gef.KeyHandler { public static final KeyStroke ACTIVATE_CHILD_SELECTION = KeyStroke.getPressed((char) 12, (int) 'l', SWT.CTRL); private IDiagramGraphicalViewer myViewer; private Set<KeyStroke> myHandledKeyStrokes = new HashSet<KeyStroke>(); public KeyHandler(IDiagramGraphicalViewer viewer) { myViewer = viewer; setParent(myViewer.getKeyHandler()); myHandledKeyStrokes.add(ACTIVATE_CHILD_SELECTION); } @Override public boolean keyPressed(KeyEvent event) { return performRequest(KeyStroke.getPressed(event.character, event.keyCode, event.stateMask)) || super.keyPressed(event); } private boolean performRequest(KeyStroke keyStroke) { if (myHandledKeyStrokes.contains(keyStroke)) { EditPart target = getSelectedEditPart(); if (target != null) { KeyPressedRequest request = new KeyPressedRequest(keyStroke); request.setLocation(getCursorLocation(target)); EditPolicy editPolicy = target.getEditPolicy(KeyHandlerEditPolicy.KEY_HANDLER_ROLE); if (editPolicy instanceof KeyHandlerEditPolicy) { ((KeyHandlerEditPolicy) editPolicy).processRequest(request); } target = target.getTargetEditPart(request); if (target != null) { Command command = target.getCommand(request); if (command != null && command.canExecute()) { myViewer.getDiagramEditDomain().getDiagramCommandStack().execute(command); } } return request.isPerformed(); } } return false; } private Point getCursorLocation(EditPart target) { Display display = myViewer.getControl().getDisplay(); Control control = display.getCursorControl(); if (control == myViewer.getControl() && target instanceof GraphicalEditPart) { Point location = new Point(control.toControl(display.getCursorLocation())); ((GraphicalEditPart) target).getFigure().translateToRelative(location); return location; } return null; } private EditPart getSelectedEditPart() { for (EditPart editPart : (List<EditPart>) myViewer.getSelectedEditParts()) { if (editPart.getSelected() == EditPart.SELECTED_PRIMARY) { return editPart; } } return null; } }