From aa893c5486ef5deb101a010c22b7a6b3d1066b69 Mon Sep 17 00:00:00 2001 From: Matti Tahvonen Date: Wed, 28 Mar 2007 15:50:42 +0000 Subject: [PATCH] Initial commit to suppor shortcut keys see #231 svn changeset:1040/svn branch:trunk --- .../itmill/toolkit/event/ShortcutAction.java | 100 +++++++++++++++ src/com/itmill/toolkit/ui/Button.java | 119 +++++++++++++++++- 2 files changed, 218 insertions(+), 1 deletion(-) create mode 100644 src/com/itmill/toolkit/event/ShortcutAction.java diff --git a/src/com/itmill/toolkit/event/ShortcutAction.java b/src/com/itmill/toolkit/event/ShortcutAction.java new file mode 100644 index 0000000000..9663cf9c71 --- /dev/null +++ b/src/com/itmill/toolkit/event/ShortcutAction.java @@ -0,0 +1,100 @@ +package com.itmill.toolkit.event; + +import com.itmill.toolkit.terminal.Resource; + +public class ShortcutAction extends Action { + + private int keyCode; + private int[] modifiers; + + public ShortcutAction(String caption, int kc, int[] m) { + super(caption); + keyCode = kc; + modifiers = m; + } + + public ShortcutAction(String caption, Resource icon, int kc, int[] m) { + super(caption, icon); + keyCode = kc; + modifiers = m; + } + + public int getKeyCode() { + return keyCode; + } + + public int[] getModifiers() { + return modifiers; + } + + /** + * Key codes that can be used for shortcuts + * + * @author mattitahvonen + * + */ + public interface KeyCode { + public static final int ENTER = 13; + public static final int ESCAPE = 27; + public static final int PAGE_UP = 33; + public static final int PAGE_DOWN = 34; + public static final int TAB = 9; + public static final int ARROW_LEFT = 37; + public static final int ARROW_UP = 38; + public static final int ARROW_RIGHT = 39; + public static final int ARROW_DOWN = 40; + public static final int BACKSPACE = 8; + public static final int DELETE = 46; + public static final int INSERT = 45; + public static final int END = 35; + public static final int HOME = 36; + public static final int F1 = 112; + public static final int F2 = 113; + public static final int F3 = 114; + public static final int F4 = 115; + public static final int F5 = 116; + public static final int F6 = 117; + public static final int F7 = 118; + public static final int F8 = 119; + public static final int F9 = 120; + public static final int F10 = 121; + public static final int F11 = 122; + public static final int F12 = 123; + public static final int A = 65; + public static final int B = 66; + public static final int C = 67; + public static final int D = 68; + public static final int E = 69; + public static final int F = 70; + public static final int G = 71; + public static final int H = 72; + public static final int I = 73; + public static final int J = 74; + public static final int K = 75; + public static final int L = 76; + public static final int M = 77; + public static final int N = 78; + public static final int O = 79; + public static final int P = 80; + public static final int Q = 81; + public static final int R = 82; + public static final int S = 83; + public static final int T = 84; + public static final int U = 85; + public static final int W = 86; + public static final int X = 87; + public static final int Y = 88; + public static final int Z = 89; + } + /** + * Modifier key constants + * + * @author mattitahvonen + * + */ + public interface ModifierKey { + public static final int SHIFT = 16; + public static final int CNTRL = 17; + public static final int ALT = 18; + } +} diff --git a/src/com/itmill/toolkit/ui/Button.java b/src/com/itmill/toolkit/ui/Button.java index 20bcd4fc93..f649eb8e71 100644 --- a/src/com/itmill/toolkit/ui/Button.java +++ b/src/com/itmill/toolkit/ui/Button.java @@ -28,12 +28,22 @@ package com.itmill.toolkit.ui; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; import java.lang.reflect.Method; import com.itmill.toolkit.data.Property; +import com.itmill.toolkit.terminal.KeyMapper; import com.itmill.toolkit.terminal.PaintException; import com.itmill.toolkit.terminal.PaintTarget; +import com.itmill.toolkit.event.Action; +import com.itmill.toolkit.event.ShortcutAction; +import com.itmill.toolkit.event.Action.Handler; + /** A generic button component. * @@ -41,11 +51,18 @@ import com.itmill.toolkit.terminal.PaintTarget; * @version @VERSION@ * @since 3.0 */ -public class Button extends AbstractField { +public class Button extends AbstractField implements Action.Container { /* Private members ************************************************* */ boolean switchMode = false; + + /** List of action handlers */ + private LinkedList actionHandlers = null; + + /** Action mapper */ + private KeyMapper actionMapper = null; + /** Creates a new push button. * @@ -133,6 +150,49 @@ public class Button extends AbstractField { state = false; } target.addVariable(this, "state", state); + + // Actions + if (actionHandlers != null) { + Set actionSet = new LinkedHashSet(); + for (Iterator ahi = actionHandlers.iterator(); + ahi.hasNext(); + ) { + Action[] aa = + ((Action.Handler) ahi.next()).getActions( + this, + this); + if (aa != null) + for (int ai = 0; ai < aa.length; ai++) { + actionSet.add(aa[ai]); + } + } + + target.startTag("actions"); + target.addVariable(this, "action", ""); + for (Iterator i = actionSet.iterator(); i.hasNext();) { + try { + ShortcutAction a = (ShortcutAction) i.next(); + target.startTag("action"); + if (a.getCaption() != null) + target.addAttribute("caption", a.getCaption()); + if (a.getIcon() != null) + target.addAttribute("icon", a.getIcon()); + target.addAttribute("key", actionMapper.key(a)); + target.addAttribute("keycode", a.getKeyCode()); + if(a.getModifiers() != null) { + int[] modifiers = a.getModifiers(); + target.addAttribute("modifiers", modifiers.length); + for(int j = 0; j < modifiers.length; j++) { + target.addAttribute("modifier" + j, modifiers[j]); + } + } + target.endTag("action"); + } catch( Exception e ){ + // ignore non-shorcut actions for button + } + } + target.endTag("actions"); + } } /** Invoked when the value of a variable has changed. Button @@ -166,6 +226,26 @@ public class Button extends AbstractField { setValue(new Boolean(false)); } } + // Actions + // TODO this is pretty much copy-pasted from tree, may be simplified + if (variables.containsKey("action")) { + + StringTokenizer st = + new StringTokenizer((String) variables.get("action"), ","); + if (st.countTokens() == 2) { + Action action = (Action) actionMapper.get(st.nextToken()); + if (action != null + && actionHandlers != null) + for (Iterator i = actionHandlers.iterator(); + i.hasNext(); + ) + ((Action.Handler) i.next()).handleAction( + action, + this, + this); + } + } + } /** @@ -278,4 +358,41 @@ public class Button extends AbstractField { protected void fireClick() { fireEvent(new Button.ClickEvent(this)); } + + /** Adds an action handler. + * @see com.itmill.toolkit.event.Action.Container#addActionHandler(Action.Handler) + */ + public void addActionHandler(Action.Handler actionHandler) { + + if (actionHandler != null) { + + if (actionHandlers == null) { + actionHandlers = new LinkedList(); + actionMapper = new KeyMapper(); + } + + if(!actionHandlers.contains(actionHandler)){ + actionHandlers.add(actionHandler); + requestRepaint(); + } + } + } + + /** Removes an action handler. + * @see com.itmill.toolkit.event.Action.Container#removeActionHandler(Action.Handler) + */ + public void removeActionHandler(Action.Handler actionHandler) { + + if (actionHandlers != null && actionHandlers.contains(actionHandler)) { + + actionHandlers.remove(actionHandler); + + if (actionHandlers.isEmpty()) { + actionHandlers = null; + actionMapper = null; + } + + requestRepaint(); + } + } } -- 2.39.5