]> source.dussan.org Git - vaadin-framework.git/commitdiff
fixes #3913
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 24 Mar 2010 10:05:38 +0000 (10:05 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Wed, 24 Mar 2010 10:05:38 +0000 (10:05 +0000)
svn changeset:12055/svn branch:6.3

16 files changed:
src/com/vaadin/event/FieldEvents.java
src/com/vaadin/terminal/gwt/client/EventHelper.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/EventId.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/VButton.java
src/com/vaadin/terminal/gwt/client/ui/VCheckBox.java
src/com/vaadin/terminal/gwt/client/ui/VFilterSelect.java
src/com/vaadin/terminal/gwt/client/ui/VNativeButton.java
src/com/vaadin/terminal/gwt/client/ui/VOptionGroup.java
src/com/vaadin/terminal/gwt/client/ui/VTextField.java
src/com/vaadin/terminal/gwt/client/ui/VTextualDate.java
src/com/vaadin/ui/Button.java
src/com/vaadin/ui/DateField.java
src/com/vaadin/ui/OptionGroup.java
src/com/vaadin/ui/Select.java
src/com/vaadin/ui/TextField.java
tests/src/com/vaadin/tests/components/FocusAndBlurListeners.java

index e810798b07defc91f0477c008caf0943dc7794cc..5aff31e1bf9db3cdf42c7da19ded2626af114c81 100644 (file)
@@ -6,6 +6,7 @@ package com.vaadin.event;
 \r
 import java.lang.reflect.Method;\r
 \r
+import com.vaadin.terminal.gwt.client.EventId;\r
 import com.vaadin.tools.ReflectTools;\r
 import com.vaadin.ui.Component;\r
 import com.vaadin.ui.Field;\r
@@ -97,8 +98,14 @@ public interface FieldEvents {
      * \r
      * @since 6.2\r
      */\r
+    @SuppressWarnings("serial")\r
     public class FocusEvent extends Component.Event {\r
 \r
+        /**\r
+         * Identifier for event that can be used in {@link EventRouter}\r
+         */\r
+        public static final String EVENT_ID = EventId.FOCUS;\r
+\r
         public FocusEvent(Component source) {\r
             super(source);\r
         }\r
@@ -131,8 +138,14 @@ public interface FieldEvents {
      * \r
      * @since 6.2\r
      */\r
+    @SuppressWarnings("serial")\r
     public class BlurEvent extends Component.Event {\r
 \r
+        /**\r
+         * Identifier for event that can be used in {@link EventRouter}\r
+         */\r
+        public static final String EVENT_ID = EventId.BLUR;\r
+\r
         public BlurEvent(Component source) {\r
             super(source);\r
         }\r
diff --git a/src/com/vaadin/terminal/gwt/client/EventHelper.java b/src/com/vaadin/terminal/gwt/client/EventHelper.java
new file mode 100644 (file)
index 0000000..0b2f6ef
--- /dev/null
@@ -0,0 +1,74 @@
+package com.vaadin.terminal.gwt.client;
+
+import static com.vaadin.terminal.gwt.client.EventId.BLUR;
+import static com.vaadin.terminal.gwt.client.EventId.FOCUS;
+
+import com.google.gwt.event.dom.client.BlurHandler;
+import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.event.dom.client.HasBlurHandlers;
+import com.google.gwt.event.dom.client.HasFocusHandlers;
+import com.google.gwt.event.shared.HandlerRegistration;
+
+/**
+ * Helper class for attaching/detaching handlers for Vaadin client side
+ * components, based on identifiers in UIDL. Helpers expect Paintables to be
+ * both listeners and sources for events. This helper cannot be used for more
+ * complex widgets.
+ * <p>
+ * Possible current registration is given as parameter. The returned
+ * registration (possibly the same as given, should be store for next update.
+ * <p>
+ * Pseudocode what helpers do:
+ * 
+ * <pre>
+ * 
+ * if paintable has event listener in UIDL
+ *      if registration is null
+ *              register paintable as as handler for event
+ *      return the registration
+ * else 
+ *      if registration is not null
+ *              remove the handler from paintable
+ *      return null
+ * 
+ * 
+ * </pre>
+ * 
+ */
+public class EventHelper {
+
+    public static HandlerRegistration updateFocusHandler(Paintable paintable,
+            ApplicationConnection client,
+            HandlerRegistration handlerRegistration) {
+        if (client.hasEventListeners(paintable, FOCUS)) {
+            if (handlerRegistration == null) {
+                handlerRegistration = ((HasFocusHandlers) paintable)
+                        .addFocusHandler((FocusHandler) paintable);
+            }
+            return handlerRegistration;
+        } else if (handlerRegistration != null) {
+            handlerRegistration.removeHandler();
+            handlerRegistration = null;
+
+        }
+        return null;
+    }
+
+    public static HandlerRegistration updateBlurHandler(Paintable paintable,
+            ApplicationConnection client,
+            HandlerRegistration handlerRegistration) {
+        if (client.hasEventListeners(paintable, BLUR)) {
+            if (handlerRegistration == null) {
+                handlerRegistration = ((HasBlurHandlers) paintable)
+                        .addBlurHandler((BlurHandler) paintable);
+            }
+            return handlerRegistration;
+        } else if (handlerRegistration != null) {
+            handlerRegistration.removeHandler();
+            handlerRegistration = null;
+
+        }
+        return null;
+    }
+
+}
diff --git a/src/com/vaadin/terminal/gwt/client/EventId.java b/src/com/vaadin/terminal/gwt/client/EventId.java
new file mode 100644 (file)
index 0000000..c6b725a
--- /dev/null
@@ -0,0 +1,6 @@
+package com.vaadin.terminal.gwt.client;
+
+public interface EventId {
+    public static final String BLUR = "blur";
+    public static final String FOCUS = "focus";
+}
index 36d9f5ec1e20007ac76051ef636728886376956e..6eb9fb2925b97893c3af61934502fa2eaad6c2c2 100644 (file)
@@ -7,20 +7,28 @@ package com.vaadin.terminal.gwt.client.ui;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.event.dom.client.BlurEvent;
+import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.FocusEvent;
+import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.Accessibility;
 import com.google.gwt.user.client.ui.FocusWidget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
+import com.vaadin.terminal.gwt.client.EventHelper;
+import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.Paintable;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.VTooltip;
 
-public class VButton extends FocusWidget implements Paintable, ClickHandler {
+public class VButton extends FocusWidget implements Paintable, ClickHandler,
+        FocusHandler, BlurHandler {
 
     public static final String CLASSNAME = "v-button";
     private static final String CLASSNAME_PRESSED = "v-pressed";
@@ -69,6 +77,9 @@ public class VButton extends FocusWidget implements Paintable, ClickHandler {
     private boolean disallowNextClick = false;
     private boolean isHovering;
 
+    private HandlerRegistration focusHandlerRegistration;
+    private HandlerRegistration blurHandlerRegistration;
+
     public VButton() {
         super(DOM.createDiv());
         setTabIndex(0);
@@ -97,6 +108,11 @@ public class VButton extends FocusWidget implements Paintable, ClickHandler {
             return;
         }
 
+        focusHandlerRegistration = EventHelper.updateFocusHandler(this, client,
+                focusHandlerRegistration);
+        blurHandlerRegistration = EventHelper.updateBlurHandler(this, client,
+                blurHandlerRegistration);
+
         // Save details
         this.client = client;
         id = uidl.getId();
@@ -455,4 +471,12 @@ public class VButton extends FocusWidget implements Paintable, ClickHandler {
        return ret;
     }-*/;
 
+    public void onFocus(FocusEvent arg0) {
+        client.updateVariable(id, EventId.FOCUS, "", true);
+    }
+
+    public void onBlur(BlurEvent arg0) {
+        client.updateVariable(id, EventId.BLUR, "", true);
+    }
+
 }
index 389c2210d3717cdf5a233a74c1ce9f5bae4d0534..88b3f876ddd45761e54271317794e31f9ecc1f97 100644 (file)
@@ -8,20 +8,27 @@ import com.google.gwt.dom.client.InputElement;
 import com.google.gwt.dom.client.LabelElement;
 import com.google.gwt.dom.client.Node;
 import com.google.gwt.dom.client.NodeList;
+import com.google.gwt.event.dom.client.BlurEvent;
+import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.FocusEvent;
+import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Event;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
+import com.vaadin.terminal.gwt.client.EventHelper;
+import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.Paintable;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.VTooltip;
 
 public class VCheckBox extends com.google.gwt.user.client.ui.CheckBox implements
-        Paintable, Field {
+        Paintable, Field, FocusHandler, BlurHandler {
 
     public static final String CLASSNAME = "v-checkbox";
 
@@ -37,6 +44,9 @@ public class VCheckBox extends com.google.gwt.user.client.ui.CheckBox implements
 
     private boolean isBlockMode = false;
 
+    private HandlerRegistration focusHandlerRegistration;
+    private HandlerRegistration blurHandlerRegistration;
+
     public VCheckBox() {
         setStyleName(CLASSNAME);
         addClickHandler(new ClickHandler() {
@@ -68,6 +78,10 @@ public class VCheckBox extends com.google.gwt.user.client.ui.CheckBox implements
             return;
         }
 
+        focusHandlerRegistration = EventHelper.updateFocusHandler(this, client,
+                focusHandlerRegistration);
+        blurHandlerRegistration = EventHelper.updateBlurHandler(this, client, blurHandlerRegistration);
+
         if (uidl.hasAttribute("error")) {
             if (errorIndicatorElement == null) {
                 errorIndicatorElement = DOM.createSpan();
@@ -172,4 +186,12 @@ public class VCheckBox extends com.google.gwt.user.client.ui.CheckBox implements
             isBlockMode = true;
         }
     }
+
+    public void onFocus(FocusEvent arg0) {
+        client.updateVariable(id, EventId.FOCUS, "", true);
+    }
+
+    public void onBlur(BlurEvent arg0) {
+        client.updateVariable(id, EventId.BLUR, "", true);
+    }
 }
index 669b5b90ea8f6f84b0ba13f13c4f1ff3e46e8a38..003b16cea1bca20e6b01d4b47c3507c07bd3f7f3 100644 (file)
@@ -40,6 +40,7 @@ import com.google.gwt.user.client.ui.PopupPanel.PositionCallback;
 import com.google.gwt.user.client.ui.SuggestOracle.Suggestion;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
+import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.Focusable;
 import com.vaadin.terminal.gwt.client.Paintable;
 import com.vaadin.terminal.gwt.client.UIDL;
@@ -542,8 +543,6 @@ public class VFilterSelect extends Composite implements Paintable, Field,
     public static final int FILTERINGMODE_CONTAINS = 2;
 
     private static final String CLASSNAME = "v-filterselect";
-    public static final String FOCUS_EVENT_IDENTIFIER = "focus";
-    public static final String BLUR_EVENT_IDENTIFIER = "blur";
 
     protected int pageLength = 10;
 
@@ -1081,10 +1080,8 @@ public class VFilterSelect extends Composite implements Paintable, Field,
         }
         addStyleDependentName("focus");
 
-        if (client.hasEventListeners(this, FOCUS_EVENT_IDENTIFIER)) {
-            client
-                    .updateVariable(paintableId, FOCUS_EVENT_IDENTIFIER, "",
-                            true);
+        if (client.hasEventListeners(this, EventId.FOCUS)) {
+            client.updateVariable(paintableId, EventId.FOCUS, "", true);
         }
     }
 
@@ -1106,8 +1103,8 @@ public class VFilterSelect extends Composite implements Paintable, Field,
         }
         removeStyleDependentName("focus");
 
-        if (client.hasEventListeners(this, BLUR_EVENT_IDENTIFIER)) {
-            client.updateVariable(paintableId, BLUR_EVENT_IDENTIFIER, "", true);
+        if (client.hasEventListeners(this, EventId.BLUR)) {
+            client.updateVariable(paintableId, EventId.BLUR, "", true);
         }
     }
 
index ef7e1836989d5b7580eb2dea95eeb17c410091e5..21e74bab09ee50c029e1e8ca0d8441c5cc950cbc 100644 (file)
@@ -5,8 +5,13 @@
 package com.vaadin.terminal.gwt.client.ui;
 
 import com.google.gwt.dom.client.Element;
+import com.google.gwt.event.dom.client.BlurEvent;
+import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.FocusEvent;
+import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.DeferredCommand;
@@ -14,12 +19,15 @@ import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.Button;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
+import com.vaadin.terminal.gwt.client.EventHelper;
+import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.Paintable;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.VTooltip;
 
-public class VNativeButton extends Button implements Paintable, ClickHandler {
+public class VNativeButton extends Button implements Paintable, ClickHandler,
+        FocusHandler, BlurHandler {
 
     public static final String CLASSNAME = "v-nativebutton";
 
@@ -42,6 +50,9 @@ public class VNativeButton extends Button implements Paintable, ClickHandler {
      */
     private boolean clickPending;
 
+    private HandlerRegistration focusHandlerRegistration;
+    private HandlerRegistration blurHandlerRegistration;
+
     public VNativeButton() {
         setStyleName(CLASSNAME);
 
@@ -63,6 +74,11 @@ public class VNativeButton extends Button implements Paintable, ClickHandler {
             return;
         }
 
+        focusHandlerRegistration = EventHelper.updateFocusHandler(this, client,
+                focusHandlerRegistration);
+        blurHandlerRegistration = EventHelper.updateBlurHandler(this, client,
+                blurHandlerRegistration);
+
         // Save details
         this.client = client;
         id = uidl.getId();
@@ -189,4 +205,12 @@ public class VNativeButton extends Button implements Paintable, ClickHandler {
         clickPending = false;
     }
 
+    public void onFocus(FocusEvent arg0) {
+        client.updateVariable(id, EventId.FOCUS, "", true);
+    }
+
+    public void onBlur(BlurEvent arg0) {
+        client.updateVariable(id, EventId.BLUR, "", true);
+    }
+
 }
index a8ce1d124efe301445308858b5451d64f9406ef3..f49cd5098b8538384b1fef5c92ce9f7f2b78c96f 100644 (file)
@@ -4,20 +4,32 @@
 \r
 package com.vaadin.terminal.gwt.client.ui;\r
 \r
+import java.util.ArrayList;\r
 import java.util.HashMap;\r
 import java.util.Iterator;\r
+import java.util.List;\r
 import java.util.Map;\r
 \r
+import com.google.gwt.event.dom.client.BlurEvent;\r
+import com.google.gwt.event.dom.client.BlurHandler;\r
 import com.google.gwt.event.dom.client.ClickEvent;\r
+import com.google.gwt.event.dom.client.FocusEvent;\r
+import com.google.gwt.event.dom.client.FocusHandler;\r
+import com.google.gwt.event.shared.HandlerRegistration;\r
+import com.google.gwt.user.client.Command;\r
+import com.google.gwt.user.client.DeferredCommand;\r
 import com.google.gwt.user.client.ui.CheckBox;\r
 import com.google.gwt.user.client.ui.FocusWidget;\r
 import com.google.gwt.user.client.ui.Focusable;\r
 import com.google.gwt.user.client.ui.Panel;\r
 import com.google.gwt.user.client.ui.RadioButton;\r
 import com.google.gwt.user.client.ui.Widget;\r
+import com.vaadin.terminal.gwt.client.ApplicationConnection;\r
+import com.vaadin.terminal.gwt.client.EventId;\r
 import com.vaadin.terminal.gwt.client.UIDL;\r
 \r
-public class VOptionGroup extends VOptionGroupBase {\r
+public class VOptionGroup extends VOptionGroupBase implements FocusHandler,\r
+        BlurHandler {\r
 \r
     public static final String CLASSNAME = "v-select-optiongroup";\r
 \r
@@ -25,12 +37,61 @@ public class VOptionGroup extends VOptionGroupBase {
 \r
     private final Map optionsToKeys;\r
 \r
+    private boolean sendFocusEvents = false;\r
+    private boolean sendBlurEvents = false;\r
+    private List<HandlerRegistration> focusHandlers = null;\r
+    private List<HandlerRegistration> blurHandlers = null;\r
+\r
+    /**\r
+     * used to check whether a blur really was a blur of the complete\r
+     * optiongroup: if a control inside this optiongroup gains focus right after\r
+     * blur of another control inside this optiongroup (meaning: if onFocus\r
+     * fires after onBlur has fired), the blur and focus won't be sent to the\r
+     * server side as only a focus change inside this optiongroup occured\r
+     */\r
+    private boolean blurOccured = false;\r
+\r
     public VOptionGroup() {\r
         super(CLASSNAME);\r
         panel = (Panel) optionsContainer;\r
         optionsToKeys = new HashMap();\r
     }\r
 \r
+    @Override\r
+    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
+        super.updateFromUIDL(uidl, client);\r
+\r
+        sendFocusEvents = client.hasEventListeners(this, EventId.FOCUS);\r
+        sendBlurEvents = client.hasEventListeners(this, EventId.BLUR);\r
+\r
+        if (focusHandlers != null) {\r
+            for (HandlerRegistration reg : focusHandlers) {\r
+                reg.removeHandler();\r
+            }\r
+            focusHandlers.clear();\r
+            focusHandlers = null;\r
+\r
+            for (HandlerRegistration reg : blurHandlers) {\r
+                reg.removeHandler();\r
+            }\r
+            blurHandlers.clear();\r
+            blurHandlers = null;\r
+        }\r
+\r
+        if (sendFocusEvents || sendBlurEvents) {\r
+            focusHandlers = new ArrayList<HandlerRegistration>();\r
+            blurHandlers = new ArrayList<HandlerRegistration>();\r
+\r
+            // add focus and blur handlers to checkboxes / radio buttons\r
+            for (Widget wid : panel) {\r
+                if (wid instanceof CheckBox) {\r
+                    focusHandlers.add(((CheckBox) wid).addFocusHandler(this));\r
+                    blurHandlers.add(((CheckBox) wid).addBlurHandler(this));\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
     /*\r
      * Return true if no elements were changed, false otherwise.\r
      */\r
@@ -96,4 +157,37 @@ public class VOptionGroup extends VOptionGroupBase {
         }\r
     }\r
 \r
+    public void onFocus(FocusEvent arg0) {\r
+        if (!blurOccured) {\r
+            // no blur occured before this focus event\r
+            // panel was blurred => fire the event to the server side if\r
+            // requested by server side\r
+            if (sendFocusEvents) {\r
+                client.updateVariable(id, EventId.FOCUS, "", true);\r
+            }\r
+        } else {\r
+            // blur occured before this focus event\r
+            // another control inside the panel (checkbox / radio box) was\r
+            // blurred => do not fire the focus and set blurOccured to false, so\r
+            // blur will not be fired, too\r
+            blurOccured = false;\r
+        }\r
+    }\r
+\r
+    public void onBlur(BlurEvent arg0) {\r
+        blurOccured = true;\r
+        if (sendBlurEvents) {\r
+            DeferredCommand.addCommand(new Command() {\r
+                public void execute() {\r
+                    // check whether blurOccured still is true and then send the\r
+                    // event out to the server\r
+                    if (blurOccured) {\r
+                        client.updateVariable(id, EventId.BLUR, "",\r
+                                true);\r
+                        blurOccured = false;\r
+                    }\r
+                }\r
+            });\r
+        }\r
+    }\r
 }\r
index f4bc96f66af1de17c6ec7b9e97f502d17a67b221..2f8d8edff9fd09c11d431e09b904c43a8987802f 100644 (file)
@@ -18,6 +18,7 @@ import com.google.gwt.user.client.Event;
 import com.google.gwt.user.client.ui.TextBoxBase;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
+import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.Paintable;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.Util;
@@ -54,8 +55,6 @@ public class VTextField extends TextBoxBase implements Paintable, Field,
 
     private static final String CLASSNAME_PROMPT = "prompt";
     private static final String ATTR_INPUTPROMPT = "prompt";
-    public static final String FOCUS_EVENT_IDENTIFIER = "focus";
-    public static final String BLUR_EVENT_IDENTIFIER = "blur";
 
     private String inputPrompt = null;
     private boolean prompting = false;
@@ -185,10 +184,9 @@ public class VTextField extends TextBoxBase implements Paintable, Field,
             boolean sendBlurEvent = false;
             boolean sendValueChange = false;
 
-            if (blurred
-                    && client.hasEventListeners(this, BLUR_EVENT_IDENTIFIER)) {
+            if (blurred && client.hasEventListeners(this, EventId.BLUR)) {
                 sendBlurEvent = true;
-                client.updateVariable(id, BLUR_EVENT_IDENTIFIER, "", false);
+                client.updateVariable(id, EventId.BLUR, "", false);
             }
 
             String newText = getText();
@@ -225,9 +223,8 @@ public class VTextField extends TextBoxBase implements Paintable, Field,
             }
         }
         focusedTextField = this;
-        if (client.hasEventListeners(this, FOCUS_EVENT_IDENTIFIER)) {
-            client.updateVariable(client.getPid(this), FOCUS_EVENT_IDENTIFIER,
-                    "", true);
+        if (client.hasEventListeners(this, EventId.FOCUS)) {
+            client.updateVariable(client.getPid(this), EventId.FOCUS, "", true);
         }
     }
 
index cbb5f3d7fc85955e12eefa5649aaf082ce5cac2d..510676b3a47ec3ee27119ff50418a888450fd32f 100644 (file)
@@ -19,6 +19,7 @@ import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
 import com.vaadin.terminal.gwt.client.ClientExceptionHandler;
 import com.vaadin.terminal.gwt.client.ContainerResizedListener;
+import com.vaadin.terminal.gwt.client.EventId;
 import com.vaadin.terminal.gwt.client.Focusable;
 import com.vaadin.terminal.gwt.client.LocaleNotLoadedException;
 import com.vaadin.terminal.gwt.client.LocaleService;
@@ -30,8 +31,6 @@ public class VTextualDate extends VDateField implements Paintable, Field,
 
     private static final String PARSE_ERROR_CLASSNAME = CLASSNAME
             + "-parseerror";
-    public static final String FOCUS_EVENT_IDENTIFIER = "focus";
-    public static final String BLUR_EVENT_IDENTIFIER = "blur";
 
     private final TextBox text;
 
@@ -60,8 +59,8 @@ public class VTextualDate extends VDateField implements Paintable, Field,
                         + VTextField.CLASSNAME_FOCUS);
                 if (client != null
                         && client.hasEventListeners(VTextualDate.this,
-                                FOCUS_EVENT_IDENTIFIER)) {
-                    client.updateVariable(id, FOCUS_EVENT_IDENTIFIER, "", true);
+                                EventId.FOCUS)) {
+                    client.updateVariable(id, EventId.FOCUS, "", true);
                 }
             }
         });
@@ -71,8 +70,8 @@ public class VTextualDate extends VDateField implements Paintable, Field,
                         + VTextField.CLASSNAME_FOCUS);
                 if (client != null
                         && client.hasEventListeners(VTextualDate.this,
-                                BLUR_EVENT_IDENTIFIER)) {
-                    client.updateVariable(id, BLUR_EVENT_IDENTIFIER, "", true);
+                                EventId.BLUR)) {
+                    client.updateVariable(id, EventId.BLUR, "", true);
                 }
             }
         });
index 004bf43a8f3d1b575a116f196bca7416c6c97c70..038186ce1647e13ef1b5528b57ee042c71cedbd4 100644 (file)
@@ -11,6 +11,11 @@ import java.util.Map;
 
 import com.vaadin.data.Property;
 import com.vaadin.event.ShortcutListener;
+import com.vaadin.event.FieldEvents;
+import com.vaadin.event.FieldEvents.BlurEvent;
+import com.vaadin.event.FieldEvents.BlurListener;
+import com.vaadin.event.FieldEvents.FocusEvent;
+import com.vaadin.event.FieldEvents.FocusListener;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.gwt.client.ui.VButton;
@@ -26,7 +31,8 @@ import com.vaadin.ui.themes.BaseTheme;
  */
 @SuppressWarnings("serial")
 @ClientWidget(VButton.class)
-public class Button extends AbstractField {
+public class Button extends AbstractField implements FieldEvents.BlurNotifier,
+        FieldEvents.FocusNotifier {
 
     /* Private members */
 
@@ -143,7 +149,7 @@ public class Button extends AbstractField {
      * @param variables
      */
     @Override
-    public void changeVariables(Object source, Map variables) {
+    public void changeVariables(Object source, Map<String, Object> variables) {
         super.changeVariables(source, variables);
 
         if (!isReadOnly() && variables.containsKey("state")) {
@@ -173,6 +179,13 @@ public class Button extends AbstractField {
                 }
             }
         }
+
+        if (variables.containsKey(FocusEvent.EVENT_ID)) {
+            fireEvent(new FocusEvent(this));
+        }
+        if (variables.containsKey(BlurEvent.EVENT_ID)) {
+            fireEvent(new BlurEvent(this));
+        }
     }
 
     /**
@@ -348,6 +361,25 @@ public class Button extends AbstractField {
         super.setInternalValue(newValue);
     }
 
+    public void addListener(BlurListener listener) {
+        addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener,
+                BlurListener.blurMethod);
+    }
+
+    public void removeListener(BlurListener listener) {
+        removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener);
+    }
+
+    public void addListener(FocusListener listener) {
+        addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener,
+                FocusListener.focusMethod);
+    }
+
+    public void removeListener(FocusListener listener) {
+        removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener);
+
+    }
+    
     /*
      * Actions
      */
index fca0cc472cd9302a97a8ade154f70fee64d2bfb9..45fd45716d29c64f9ad1fc91ef7688174d420954 100644 (file)
@@ -21,7 +21,6 @@ import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.gwt.client.ui.VDateField;
 import com.vaadin.terminal.gwt.client.ui.VPopupCalendar;
-import com.vaadin.terminal.gwt.client.ui.VTextualDate;
 
 /**
  * <p>
@@ -93,9 +92,6 @@ public class DateField extends AbstractField implements
      */
     protected static final String TYPE_INLINE = "inline";
 
-    private static final String BLUR_EVENT = VTextualDate.BLUR_EVENT_IDENTIFIER;
-    private static final String FOCUS_EVENT = VTextualDate.FOCUS_EVENT_IDENTIFIER;
-
     /**
      * Specified widget type.
      */
@@ -370,11 +366,11 @@ public class DateField extends AbstractField implements
             }
         }
 
-        if (variables.containsKey(FOCUS_EVENT)) {
+        if (variables.containsKey(FocusEvent.EVENT_ID)) {
             fireEvent(new FocusEvent(this));
         }
 
-        if (variables.containsKey(BLUR_EVENT)) {
+        if (variables.containsKey(BlurEvent.EVENT_ID)) {
             fireEvent(new BlurEvent(this));
         }
     }
@@ -576,21 +572,21 @@ public class DateField extends AbstractField implements
     }
 
     public void addListener(FocusListener listener) {
-        addListener(FOCUS_EVENT, FocusEvent.class, listener,
+        addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener,
                 FocusListener.focusMethod);
     }
 
     public void removeListener(FocusListener listener) {
-        removeListener(FOCUS_EVENT, FocusEvent.class, listener);
+        removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener);
     }
 
     public void addListener(BlurListener listener) {
-        addListener(BLUR_EVENT, BlurEvent.class, listener,
+        addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener,
                 BlurListener.blurMethod);
     }
 
     public void removeListener(BlurListener listener) {
-        removeListener(BLUR_EVENT, BlurEvent.class, listener);
+        removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener);
     }
 
     /**
index ab925f878589d6e8a80d261c595c4bce2e1f1c41..d8baf0bf5ce85039ab24b4a64f2714c108e1f172 100644 (file)
@@ -5,8 +5,14 @@
 package com.vaadin.ui;
 
 import java.util.Collection;
+import java.util.Map;
 
 import com.vaadin.data.Container;
+import com.vaadin.event.FieldEvents;
+import com.vaadin.event.FieldEvents.BlurEvent;
+import com.vaadin.event.FieldEvents.BlurListener;
+import com.vaadin.event.FieldEvents.FocusEvent;
+import com.vaadin.event.FieldEvents.FocusListener;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.gwt.client.ui.VOptionGroup;
@@ -16,7 +22,8 @@ import com.vaadin.terminal.gwt.client.ui.VOptionGroup;
  */
 @SuppressWarnings("serial")
 @ClientWidget(VOptionGroup.class)
-public class OptionGroup extends AbstractSelect {
+public class OptionGroup extends AbstractSelect implements
+        FieldEvents.BlurNotifier, FieldEvents.FocusNotifier {
 
     public OptionGroup() {
         super();
@@ -40,4 +47,35 @@ public class OptionGroup extends AbstractSelect {
         super.paintContent(target);
     }
 
+    @Override
+    public void changeVariables(Object source, Map<String, Object> variables) {
+        super.changeVariables(source, variables);
+
+        if (variables.containsKey(FocusEvent.EVENT_ID)) {
+            fireEvent(new FocusEvent(this));
+        }
+        if (variables.containsKey(BlurEvent.EVENT_ID)) {
+            fireEvent(new BlurEvent(this));
+        }
+    }
+
+    public void addListener(BlurListener listener) {
+        addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener,
+                BlurListener.blurMethod);
+    }
+
+    public void removeListener(BlurListener listener) {
+        removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener);
+    }
+
+    public void addListener(FocusListener listener) {
+        addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener,
+                FocusListener.focusMethod);
+    }
+
+    public void removeListener(FocusListener listener) {
+        removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener);
+
+    }
+
 }
index 4174001d8739112c08c39a27c30494550ead1731..31c4ff6ef77cf9691da08d587d1d6390b3a6f6ac 100644 (file)
@@ -46,9 +46,6 @@ import com.vaadin.terminal.gwt.client.ui.VFilterSelect;
 public class Select extends AbstractSelect implements AbstractSelect.Filtering,
         FieldEvents.BlurNotifier, FieldEvents.FocusNotifier {
 
-    private static final String BLUR_EVENT_ID = VFilterSelect.BLUR_EVENT_IDENTIFIER;
-    private static final String FOCUS_EVENT_ID = VFilterSelect.FOCUS_EVENT_IDENTIFIER;
-
     /**
      * Holds value of property pageLength. 0 disables paging.
      */
@@ -432,10 +429,10 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering,
             }
         }
 
-        if (variables.containsKey(FOCUS_EVENT_ID)) {
+        if (variables.containsKey(FocusEvent.EVENT_ID)) {
             fireEvent(new FocusEvent(this));
         }
-        if (variables.containsKey(BLUR_EVENT_ID)) {
+        if (variables.containsKey(BlurEvent.EVENT_ID)) {
             fireEvent(new BlurEvent(this));
         }
 
@@ -496,21 +493,21 @@ public class Select extends AbstractSelect implements AbstractSelect.Filtering,
     }
 
     public void addListener(BlurListener listener) {
-        addListener(BLUR_EVENT_ID, BlurEvent.class, listener,
+        addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener,
                 BlurListener.blurMethod);
     }
 
     public void removeListener(BlurListener listener) {
-        removeListener(BLUR_EVENT_ID, BlurEvent.class, listener);
+        removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener);
     }
 
     public void addListener(FocusListener listener) {
-        addListener(FOCUS_EVENT_ID, FocusEvent.class, listener,
+        addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener,
                 FocusListener.focusMethod);
     }
 
     public void removeListener(FocusListener listener) {
-        removeListener(FOCUS_EVENT_ID, FocusEvent.class, listener);
+        removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener);
 
     }
 
index a3f76160a7892c3f71d9a92cc0e21def88ddfb88..88451717cecbb73d40c1a82bc3844c939361f7f8 100644 (file)
@@ -89,9 +89,6 @@ public class TextField extends AbstractField implements
      */
     private int maxLength = -1;
 
-    private static final String BLUR_EVENT = VTextField.BLUR_EVENT_IDENTIFIER;
-    private static final String FOCUS_EVENT = VTextField.FOCUS_EVENT_IDENTIFIER;
-
     /* Constructors */
 
     /**
@@ -280,11 +277,11 @@ public class TextField extends AbstractField implements
             }
         }
 
-        if (variables.containsKey(FOCUS_EVENT)) {
-            fireFocus(variables.get(FOCUS_EVENT));
+        if (variables.containsKey(FocusEvent.EVENT_ID)) {
+            fireEvent(new FocusEvent(this));
         }
-        if (variables.containsKey(BLUR_EVENT)) {
-            fireBlur(variables.get(BLUR_EVENT));
+        if (variables.containsKey(BlurEvent.EVENT_ID)) {
+            fireEvent(new BlurEvent(this));
         }
 
     }
@@ -619,30 +616,22 @@ public class TextField extends AbstractField implements
         requestRepaint();
     }
 
-    private void fireFocus(Object object) {
-        fireEvent(new FocusEvent(this));
-    }
-
-    private void fireBlur(Object object) {
-        fireEvent(new BlurEvent(this));
-    }
-
     public void addListener(FocusListener listener) {
-        addListener(FOCUS_EVENT, FocusEvent.class, listener,
+        addListener(FocusEvent.EVENT_ID, FocusEvent.class, listener,
                 FocusListener.focusMethod);
     }
 
     public void removeListener(FocusListener listener) {
-        removeListener(FOCUS_EVENT, FocusEvent.class, listener);
+        removeListener(FocusEvent.EVENT_ID, FocusEvent.class, listener);
     }
 
     public void addListener(BlurListener listener) {
-        addListener(BLUR_EVENT, BlurEvent.class, listener,
+        addListener(BlurEvent.EVENT_ID, BlurEvent.class, listener,
                 BlurListener.blurMethod);
     }
 
     public void removeListener(BlurListener listener) {
-        removeListener(BLUR_EVENT, BlurEvent.class, listener);
+        removeListener(BlurEvent.EVENT_ID, BlurEvent.class, listener);
     }
 
 }
index 32f1de752a2f4ef347adb2ee4c55abf3c437af73..3ef26c7e1c04850d911884f5a75c150d1c9c4b15 100644 (file)
@@ -6,12 +6,18 @@ import com.vaadin.event.FieldEvents.BlurEvent;
 import com.vaadin.event.FieldEvents.BlurListener;
 import com.vaadin.event.FieldEvents.FocusEvent;
 import com.vaadin.event.FieldEvents.FocusListener;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.CheckBox;
 import com.vaadin.ui.ComboBox;
 import com.vaadin.ui.DateField;
 import com.vaadin.ui.Label;
 import com.vaadin.ui.Layout;
+import com.vaadin.ui.NativeButton;
+import com.vaadin.ui.OptionGroup;
 import com.vaadin.ui.TextField;
 import com.vaadin.ui.VerticalLayout;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
 
 public class FocusAndBlurListeners extends TestBase {
 
@@ -37,26 +43,72 @@ public class FocusAndBlurListeners extends TestBase {
     @Override
     protected void setup() {
         Layout l = getLayout();
+
         TextField tf = new TextField("TextField");
         l.addComponent(tf);
+
         DateField df = new DateField("DateField");
         l.addComponent(df);
 
         ComboBox cb = new ComboBox("ComboBox");
-
         l.addComponent(cb);
 
+        Button btn = new Button("Button");
+        l.addComponent(btn);
+
+        NativeButton nbtn = new NativeButton("NativeButton");
+        l.addComponent(nbtn);
+
+        CheckBox chkb = new CheckBox("CheckBox");
+        l.addComponent(chkb);
+
+        OptionGroup og = createOptionGroup("OptionGroup");
+        og.setMultiSelect(false);
+        l.addComponent(og);
+
+        final OptionGroup ogm = createOptionGroup("OptionGroup (multiselect)");
+        ogm.setMultiSelect(true);
+        l.addComponent(ogm);
+
+        btn.addListener(new ClickListener() {
+
+            private int i;
+
+            public void buttonClick(ClickEvent event) {
+                ogm.addItem("newItem" + i++);
+
+            }
+        });
+
         tf.addListener(focusListener);
         tf.addListener(blurListener);
         df.addListener(focusListener);
         df.addListener(blurListener);
         cb.addListener(focusListener);
         cb.addListener(blurListener);
+        btn.addListener(focusListener);
+        btn.addListener(blurListener);
+        nbtn.addListener(focusListener);
+        nbtn.addListener(blurListener);
+        chkb.addListener(focusListener);
+        chkb.addListener(blurListener);
+        og.addListener(focusListener);
+        og.addListener(blurListener);
+        ogm.addListener(focusListener);
+        ogm.addListener(blurListener);
 
         l.addComponent(messages);
 
     }
 
+    private OptionGroup createOptionGroup(String caption) {
+        OptionGroup og = new OptionGroup(caption);
+        og.addItem("Option 0");
+        og.addItem("Option 1");
+        og.addItem("Option 2");
+        return og;
+    }
+
     @Override
     protected String getDescription() {
         return "Testing blur and focus listeners added in 6.2";