KeyboardShortcut.java
/* 
 * Copyright 2008 IT Mill Ltd.
 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 
 * http://www.apache.org/licenses/LICENSE-2.0
 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.itmill.toolkit.demo;

import java.util.Date;

import com.itmill.toolkit.Application;
import com.itmill.toolkit.event.Action;
import com.itmill.toolkit.event.ShortcutAction;
import com.itmill.toolkit.event.Action.Handler;
import com.itmill.toolkit.ui.Button;
import com.itmill.toolkit.ui.ExpandLayout;
import com.itmill.toolkit.ui.Label;
import com.itmill.toolkit.ui.OrderedLayout;
import com.itmill.toolkit.ui.Panel;
import com.itmill.toolkit.ui.TextField;
import com.itmill.toolkit.ui.Window;

/**
 * Test application for KeyboardShortcuts
 */
public class KeyboardShortcut extends Application implements Handler {

    private OrderedLayout loki;

    private final Label instructions = new Label(
            "<p>Keyboard shortcuts is a must have feature for applications in a "
                    "daily use. In IT Mill toolkit shortcuts are binded to "
                    "Panel and its subclasses like Windows (most common place)."
                    "</p>"
                    "<p>Browsers reserve some keyboard combinations for their own"
                    " actions, so all combinations cannot be used in web "
                    "applications. (see our article on <a href=\"http://www.itmill"
                    ".com/articles/Keybindings_in_Web_Browsers.htm\">"
                    "www.itmill.com)</a></p>"
                    "Events are attached to Window in this application, so a "
                    "component inside window must be focused to fire event on"
                    " keyboard shortcut.</p>"
                    "<strong>Shortcuts used in this example:</strong> "
                    "<br/>ESC restarts program, ctrl-shift-a (Button A), "
                    "ctrl-shift-z (Button Z), ctrl-shift-x (Button X)",
            Label.CONTENT_XHTML);

    private final Action ACTION_A = new ShortcutAction("Button a action",
            ShortcutAction.KeyCode.A, new int[] {
                    ShortcutAction.ModifierKey.CTRL,
                    ShortcutAction.ModifierKey.SHIFT });

    private final Action ACTION_Z = new ShortcutAction("Button z action",
            ShortcutAction.KeyCode.Z, new int[] {
                    ShortcutAction.ModifierKey.CTRL,
                    ShortcutAction.ModifierKey.SHIFT });

    private final Action ACTION_X = new ShortcutAction("Button x action",
            ShortcutAction.KeyCode.X, new int[] {
                    ShortcutAction.ModifierKey.CTRL,
                    ShortcutAction.ModifierKey.SHIFT });

    private final Action ACTION_RESTART = new ShortcutAction("Restart ",
            ShortcutAction.KeyCode.ESCAPE, null);

    private final Action[] actions = new Action[] { ACTION_A, ACTION_Z,
            ACTION_X, ACTION_RESTART };

    private TextField f;

    public void init() {

        final Window w = new Window("Keyboard shortcuts demo");
        final ExpandLayout main = new ExpandLayout();
        main.setMargin(true);
        main.setSpacing(true);
        setMainWindow(w);
        w.setLayout(main);

        final Panel p = new Panel("Test application for shortcut actions");
        p.addComponent(instructions);

        final OrderedLayout buttons = new OrderedLayout(
                OrderedLayout.ORIENTATION_HORIZONTAL);

        // Restart button
        final Button close = new Button("restart", this, "close");
        final Button a = new Button("Button A", this, "actionAHandler");
        final Button z = new Button("Button Z", this, "actionZHandler");
        final Button x = new Button("Button X", this, "actionXHandler");
        f = new TextField();

        buttons.addComponent(close);

        buttons.addComponent(a);
        buttons.addComponent(z);
        buttons.addComponent(x);
        buttons.addComponent(f);
        p.addComponent(buttons);

        main.addComponent(p);

        loki = new OrderedLayout();
        main.addComponent(loki);
        main.expand(loki);

        w.addActionHandler(this);

        f.focus();
    }

    public Action[] getActions(Object target, Object sender) {
        return actions;
    }

    public void handleAction(Action action, Object sender, Object target) {
        if (action == ACTION_A) {
            actionAHandler();
        }
        if (action == ACTION_Z) {
            actionZHandler();
        }
        if (action == ACTION_X) {
            actionXHandler();
        }
        if (action == ACTION_RESTART) {
            actionRestartHandler();
        }
    }

    public void actionAHandler() {
        log("Button A handler fired");
    }

    public void actionZHandler() {
        log("Button Z handler fired");
    }

    public void actionXHandler() {
        log("Button X handler fired");
    }

    public void actionRestartHandler() {
        close();
    }

    public void log(String s) {
        loki.addComponentAsFirst(new Label(new Date() " : " + s));
    }

}