blob: 3ff151f11e324571f3d22e8ce8229147395be214 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2015 EclipseSource Muenchen GmbH and others.
*
* 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:
* Stefan Dirix - initial API and implementation
******************************************************************************/
package org.eclipse.emfforms.spi.swt.treemasterdetail.actions;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
/**
* Extended {@link MasterDetailAction} to help introduce keybindings.
*
* @author Stefan Dirix
* @since 1.8
*
*/
public abstract class KeybindedMasterDetailAction extends MasterDetailAction
implements KeyListener, ISelectionChangedListener {
private TreeViewer registeredTreeViewer;
private ISelection currentSelection;
/**
* {@inheritDoc}
*
* @see org.eclipse.emfforms.spi.swt.treemasterdetail.actions.MasterDetailAction#setTreeViewer(org.eclipse.jface.viewers.TreeViewer)
*/
@Override
public void setTreeViewer(TreeViewer treeviewer) {
super.setTreeViewer(treeviewer);
if (registeredTreeViewer != null) {
registeredTreeViewer.getTree().removeKeyListener(this);
registeredTreeViewer.removeSelectionChangedListener(this);
}
treeviewer.getTree().addKeyListener(this);
treeviewer.addSelectionChangedListener(this);
registeredTreeViewer = treeviewer;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
*/
@Override
public void selectionChanged(SelectionChangedEvent event) {
currentSelection = event.getSelection();
}
/**
* Returns the current {@link ISelection}.
*
* @return
* The current {@link ISelection} if there is one, {@code null} otherwise.
*/
protected ISelection getCurrentSelection() {
return currentSelection;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.KeyListener#keyPressed(org.eclipse.swt.events.KeyEvent)
*/
@Override
public void keyPressed(KeyEvent event) {
if (isExecuteOnKeyPressed(event)) {
executeOnKeyPressed(currentSelection);
}
}
/**
* Determines if the {@link #executeOnKeyPressed(ISelection)} method shall be executed.
*
* @param event
* The {@link KeyEvent} which triggers this method.
* @return
* {@code true} if {@link #executeOnKeyPressed(ISelection)} method shall be called, {@code false} otherwise.
*/
protected boolean isExecuteOnKeyPressed(KeyEvent event) {
return false;
}
/**
* This method is triggered by {@link #isExecuteOnKeyPressed(KeyEvent)} when a {@link KeyEvent} is triggered by a
* key press.
*
* @param currentSelection
* The current {@link ISelection}.
*/
protected void executeOnKeyPressed(ISelection currentSelection) {
// no op
}
/**
* {@inheritDoc}
*
* @see org.eclipse.swt.events.KeyListener#keyReleased(org.eclipse.swt.events.KeyEvent)
*/
@Override
public void keyReleased(KeyEvent event) {
if (isExecuteOnKeyRelease(event)) {
executeOnKeyRelease(currentSelection);
}
}
/**
* Determines if the {@link #executeOnKeyRelease(ISelection)} method shall be executed.
*
* @param event
* The {@link KeyEvent} which triggers this method.
* @return
* {@code true} if {@link #executeOnKeyRelease(ISelection)} method shall be called, {@code false} otherwise.
*/
protected abstract boolean isExecuteOnKeyRelease(KeyEvent event);
/**
* This method is triggered by {@link #isExecuteOnKeyRelease(KeyEvent)} when a {@link KeyEvent} is triggered by a
* key release.
*
* @param currentSelection
* The current {@link ISelection}.
*/
protected abstract void executeOnKeyRelease(ISelection currentSelection);
/**
* Determines if the keys indicated by the SWT {@code swtMask} and {@code c} are active.
*
* @param event
* The {@link KeyEvent} to check.
* @param swtMask
* SWT key event mask, e.g. {@link org.eclipse.swt.SWT.CTRL SWT.CTRL},
* {@link org.eclipse.swt.SWT.ALT SWT.ALT} etc.
* @param c
* 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.
*/
protected static boolean isActivated(KeyEvent event, int swtMask, char c) {
return (event.stateMask & swtMask) == swtMask && event.keyCode == c;
}
}