Bug 520213 - Improve Key Bindings for TreeMaster Detail Actions Change-Id: I1d01002995753f1d17753b53801b098dab431c2c Signed-off-by: Jonas Helming <jhelming@eclipsesource.com>
diff --git a/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/KeybindedMasterDetailAction.java b/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/KeybindedMasterDetailAction.java index 3ff151f..5073c80 100644 --- a/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/KeybindedMasterDetailAction.java +++ b/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/KeybindedMasterDetailAction.java
@@ -30,6 +30,7 @@ private TreeViewer registeredTreeViewer; private ISelection currentSelection; + private boolean executeOnKeyRelease; /** * {@inheritDoc} @@ -75,6 +76,7 @@ */ @Override public void keyPressed(KeyEvent event) { + setExecuteOnKeyRelease(isExecuteOnKeyRelease(event)); if (isExecuteOnKeyPressed(event)) { executeOnKeyPressed(currentSelection); } @@ -86,7 +88,7 @@ * @param event * The {@link KeyEvent} which triggers this method. * @return - * {@code true} if {@link #executeOnKeyPressed(ISelection)} method shall be called, {@code false} otherwise. + * {@code true} if {@link #executeOnKeyPressed(ISelection)} method shall be called, {@code false} otherwise. */ protected boolean isExecuteOnKeyPressed(KeyEvent event) { return false; @@ -110,18 +112,19 @@ */ @Override public void keyReleased(KeyEvent event) { - if (isExecuteOnKeyRelease(event)) { + if (isExecuteOnKeyRelease()) { executeOnKeyRelease(currentSelection); } + setExecuteOnKeyRelease(false); } /** * Determines if the {@link #executeOnKeyRelease(ISelection)} method shall be executed. * * @param event - * The {@link KeyEvent} which triggers this method. + * The {@link KeyEvent} on Keypress. This allows to react on key combinations even on key release * @return - * {@code true} if {@link #executeOnKeyRelease(ISelection)} method shall be called, {@code false} otherwise. + * {@code true} if {@link #executeOnKeyRelease(ISelection)} method shall be called, {@code false} otherwise. */ protected abstract boolean isExecuteOnKeyRelease(KeyEvent event); @@ -146,9 +149,23 @@ * The additional pressed char. Use {@link KeyEvent#keyCode} if you only want to check for * {@code swtMask}. * @return - * {@code true} if the keys indicated by {@code swtMask} and {@code c} are active, {@code false} otherwise. + * {@code true} if the keys indicated by {@code swtMask} and {@code c} are active, {@code false} otherwise. */ protected static boolean isActivated(KeyEvent event, int swtMask, char c) { return (event.stateMask & swtMask) == swtMask && event.keyCode == c; } + + /** + * @return the executeOnKeyRelease + */ + protected boolean isExecuteOnKeyRelease() { + return executeOnKeyRelease; + } + + /** + * @param executeOnKeyRelease the executeOnKeyRelease to set + */ + protected void setExecuteOnKeyRelease(boolean executeOnKeyRelease) { + this.executeOnKeyRelease = executeOnKeyRelease; + } }
diff --git a/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/delegating/PasteInParentMasterDetailAction.java b/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/delegating/PasteInParentMasterDetailAction.java index 1074904..ec956b9 100644 --- a/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/delegating/PasteInParentMasterDetailAction.java +++ b/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/delegating/PasteInParentMasterDetailAction.java
@@ -13,8 +13,6 @@ import org.eclipse.emf.edit.domain.EditingDomain; import org.eclipse.emf.edit.ui.action.CommandActionHandler; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.KeyEvent; /** * Delegates to {@link PasteInParentAction}. @@ -23,9 +21,7 @@ * @since 1.13 * */ -public class PasteInParentMasterDetailAction extends DelegatingMasterDetailAction { - - private static final String ICON_PATH = "icons/paste.gif"; //$NON-NLS-1$ +public class PasteInParentMasterDetailAction extends PasteMasterDetailAction { /** * Constructor. @@ -38,17 +34,8 @@ } @Override - protected String getEMFImagePath() { - return ICON_PATH; - } - - @Override protected CommandActionHandler createDelegatedAction(EditingDomain editingDomain) { return new PasteInParentAction(editingDomain); } - @Override - protected boolean isExecuteOnKeyRelease(KeyEvent event) { - return isActivated(event, SWT.CTRL | SWT.SHIFT, 'v'); - } }
diff --git a/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/delegating/PasteMasterDetailAction.java b/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/delegating/PasteMasterDetailAction.java index 19efd99..112d4cd 100644 --- a/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/delegating/PasteMasterDetailAction.java +++ b/bundles/org.eclipse.emfforms.swt.treemasterdetail/src/org/eclipse/emfforms/spi/swt/treemasterdetail/actions/delegating/PasteMasterDetailAction.java
@@ -27,6 +27,7 @@ public class PasteMasterDetailAction extends DelegatingMasterDetailAction { private static final String ICON_PATH = "icons/paste.gif"; //$NON-NLS-1$ + private boolean alreadyPasted; /** * Constructor. @@ -50,6 +51,34 @@ @Override protected boolean isExecuteOnKeyRelease(KeyEvent event) { + return false; + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.emfforms.spi.swt.treemasterdetail.actions.KeybindedMasterDetailAction#keyPressed(org.eclipse.swt.events.KeyEvent) + */ + @Override + public void keyPressed(KeyEvent event) { + if (isExecuteOnKeyPressed(event)) { + if (!alreadyPasted) { + executeOnKeyRelease(getCurrentSelection()); + alreadyPasted = true; + } + } else { + alreadyPasted = false; + } + + } + + /** + * {@inheritDoc} + * + * @see org.eclipse.emfforms.spi.swt.treemasterdetail.actions.KeybindedMasterDetailAction#isExecuteOnKeyPressed(org.eclipse.swt.events.KeyEvent) + */ + @Override + protected boolean isExecuteOnKeyPressed(KeyEvent event) { return isActivated(event, SWT.CTRL, 'v'); } }