org.eclipse.emfforms.spi.swt.treemasterdetail.actions.KeybindedMasterDetailAction.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emfforms.spi.swt.treemasterdetail.actions.KeybindedMasterDetailAction.java

Source

/*******************************************************************************
 * 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;
    }
}