]> source.dussan.org Git - vaadin-framework.git/commitdiff
Initial commit to suppor shortcut keys see #231
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 28 Mar 2007 15:50:42 +0000 (15:50 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 28 Mar 2007 15:50:42 +0000 (15:50 +0000)
svn changeset:1040/svn branch:trunk

src/com/itmill/toolkit/event/ShortcutAction.java [new file with mode: 0644]
src/com/itmill/toolkit/ui/Button.java

diff --git a/src/com/itmill/toolkit/event/ShortcutAction.java b/src/com/itmill/toolkit/event/ShortcutAction.java
new file mode 100644 (file)
index 0000000..9663cf9
--- /dev/null
@@ -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;
+       }
+}
index 20bcd4fc93677c9bdf7f269f3e08cea607cc451c..f649eb8e714e32406f5a96dd163a3e4ca0c49623 100644 (file)
 
 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();        
+               }
+       }
 }