aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/itmill/toolkit/event/ShortcutAction.java100
-rw-r--r--src/com/itmill/toolkit/ui/Button.java119
2 files changed, 218 insertions, 1 deletions
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();
+ }
+ }
}