]> source.dussan.org Git - vaadin-framework.git/commitdiff
Separated client side listeners to a ClickEventHandler class
authorArtur Signell <artur.signell@itmill.com>
Wed, 25 Nov 2009 18:45:15 +0000 (18:45 +0000)
committerArtur Signell <artur.signell@itmill.com>
Wed, 25 Nov 2009 18:45:15 +0000 (18:45 +0000)
svn changeset:10042/svn branch:event-framework-3234

src/TestListeners.java
src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java
src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java
src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java
src/com/vaadin/terminal/gwt/client/ui/VOrderedLayout.java
src/com/vaadin/ui/AbsoluteLayout.java
src/com/vaadin/ui/AbstractOrderedLayout.java
src/com/vaadin/ui/Embedded.java
src/com/vaadin/ui/GridLayout.java

index 1c415bd0aa48d958a772cecdd1f41b743bb32381..9650c2269a3048a00e00eb6fcc9edf63a44f5a07 100644 (file)
@@ -9,10 +9,14 @@ import com.vaadin.event.MouseEvents.ClickEvent;
 import com.vaadin.event.MouseEvents.ClickListener;
 import com.vaadin.terminal.ExternalResource;
 import com.vaadin.ui.AbsoluteLayout;
+import com.vaadin.ui.Component;
 import com.vaadin.ui.Embedded;
 import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.HorizontalLayout;
 import com.vaadin.ui.Label;
+import com.vaadin.ui.Layout;
 import com.vaadin.ui.TextField;
+import com.vaadin.ui.VerticalLayout;
 import com.vaadin.ui.Window;
 
 public class TestListeners extends Application implements LayoutClickListener,
@@ -22,7 +26,8 @@ public class TestListeners extends Application implements LayoutClickListener,
     public void init() {
         Window w = new Window("main window");
         setMainWindow(w);
-
+        HorizontalLayout hl = new HorizontalLayout();
+        w.setContent(hl);
         // Panel p = new Panel("My panel");
         // p.addListener(new ClickListener() {
         //
@@ -37,7 +42,7 @@ public class TestListeners extends Application implements LayoutClickListener,
         // }
         // VerticalLayout vl = new VerticalLayout();
 
-        AbsoluteLayout al = new AbsoluteLayout();
+        final AbsoluteLayout al = new AbsoluteLayout();
         al.setWidth("200px");
         al.setHeight("200px");
         al.addComponent(new TextField("This is its caption",
@@ -45,15 +50,18 @@ public class TestListeners extends Application implements LayoutClickListener,
         al.addComponent(new TextField("Antoerh caption",
                 "This is another textfield"),
                 "top: 120px; left: 0px; width: 100px;");
-        al.addListener(new LayoutClickListener() {
+
+        final LayoutClickListener lcl = new LayoutClickListener() {
 
             public void layoutClick(LayoutClickEvent event) {
-                System.out.println("Click on " + event.getChildComponent());
+                System.out.println("AL: Click on " + event.getChildComponent());
+                // al.removeListener(this);
 
             }
-        });
+        };
+        al.addListener(lcl);
 
-        GridLayout vl = new GridLayout();
+        final GridLayout vl = new GridLayout();
         vl.addComponent(al);
         vl.setSpacing(true);
         for (int i = 0; i < 10; i++) {
@@ -99,12 +107,69 @@ public class TestListeners extends Application implements LayoutClickListener,
 
             public void layoutClick(LayoutClickEvent event) {
                 TestListeners.this.layoutClick(event);
-
+                vl.removeListener(this);
             }
         });
         vl.setMargin(true);
-        w.setContent(vl);
 
+        hl.addComponent(vl);
+        hl.addComponent(createClickableGridLayout());
+        hl.addComponent(createClickableVerticalLayout());
+    }
+
+    private Layout createClickableGridLayout() {
+
+        GridLayout gl = new GridLayout(3, 3);
+        addContent(gl, 5);
+
+        gl.addListener(new LayoutClickListener() {
+
+            public void layoutClick(LayoutClickEvent event) {
+                getMainWindow().showNotification(
+                        "GL-click on " + event.getChildComponent());
+
+            }
+        });
+
+        return wrap(gl, "Clickable GridLayout");
+    }
+
+    private Layout createClickableVerticalLayout() {
+
+        VerticalLayout gl = new VerticalLayout();
+        addContent(gl, 5);
+
+        gl.addListener(new LayoutClickListener() {
+
+            public void layoutClick(LayoutClickEvent event) {
+                getMainWindow().showNotification(
+                        "VL-click on " + event.getChildComponent());
+
+            }
+        });
+
+        return wrap(gl, "Clickable VerticalLayout");
+    }
+
+    private void addContent(Layout gl, int nr) {
+        for (int i = 1; i < nr; i++) {
+            Label l = new Label("This is label " + i);
+            l.setWidth(null);
+            gl.addComponent(l);
+        }
+        for (int i = nr; i < nr * 2; i++) {
+            gl.addComponent(new TextField("This is tf" + i, "this is tf " + i));
+        }
+    }
+
+    private Layout wrap(Component c, String caption) {
+        VerticalLayout vl = new VerticalLayout();
+        Label l = new Label(caption);
+        l.setWidth(null);
+        vl.addComponent(l);
+        vl.addComponent(c);
+
+        return vl;
     }
 
     public void layoutClick(LayoutClickEvent event) {
@@ -114,7 +179,6 @@ public class TestListeners extends Application implements LayoutClickListener,
             getMainWindow().showNotification(
                     "Clicked on " + event.getChildComponent() + "!");
             // getMainWindow().removeComponent(event.getChildComponent());
-
         }
 
     }
diff --git a/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java b/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java
new file mode 100644 (file)
index 0000000..aae416b
--- /dev/null
@@ -0,0 +1,126 @@
+package com.vaadin.terminal.gwt.client.ui;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import com.google.gwt.dom.client.NativeEvent;\r
+import com.google.gwt.event.dom.client.ClickEvent;\r
+import com.google.gwt.event.dom.client.ClickHandler;\r
+import com.google.gwt.event.dom.client.ContextMenuEvent;\r
+import com.google.gwt.event.dom.client.ContextMenuHandler;\r
+import com.google.gwt.event.dom.client.DomEvent;\r
+import com.google.gwt.event.dom.client.DoubleClickEvent;\r
+import com.google.gwt.event.dom.client.DoubleClickHandler;\r
+import com.google.gwt.event.dom.client.MouseUpEvent;\r
+import com.google.gwt.event.dom.client.MouseUpHandler;\r
+import com.google.gwt.event.shared.EventHandler;\r
+import com.google.gwt.event.shared.HandlerRegistration;\r
+import com.vaadin.terminal.gwt.client.ApplicationConnection;\r
+import com.vaadin.terminal.gwt.client.MouseEventDetails;\r
+import com.vaadin.terminal.gwt.client.Paintable;\r
+\r
+abstract class ClickEventHandler implements ClickHandler, DoubleClickHandler,\r
+        ContextMenuHandler, MouseUpHandler {\r
+\r
+    private HandlerRegistration clickHandlerRegistration;\r
+    private HandlerRegistration doubleClickHandlerRegistration;\r
+    private HandlerRegistration mouseUpHandlerRegistration;\r
+    private HandlerRegistration contextMenuHandlerRegistration;\r
+\r
+    protected String clickEventIdentifier;\r
+    protected Paintable paintable;\r
+\r
+    ClickEventHandler(Paintable paintable, String clickEventIdentifier) {\r
+        this.paintable = paintable;\r
+        this.clickEventIdentifier = clickEventIdentifier;\r
+    }\r
+\r
+    public void handleHandlerRegistration() {\r
+        // Handle registering/unregistering of click handler depending on if\r
+        // server side listeners have been added or removed.\r
+        if (hasEventListener()) {\r
+            if (clickHandlerRegistration == null) {\r
+                clickHandlerRegistration = registerHandler(this, ClickEvent\r
+                        .getType());\r
+                mouseUpHandlerRegistration = registerHandler(this, MouseUpEvent\r
+                        .getType());\r
+                contextMenuHandlerRegistration = registerHandler(this,\r
+                        ContextMenuEvent.getType());\r
+                doubleClickHandlerRegistration = registerHandler(this,\r
+                        DoubleClickEvent.getType());\r
+            }\r
+        } else {\r
+            if (clickHandlerRegistration != null) {\r
+                // Remove existing handlers\r
+                clickHandlerRegistration.removeHandler();\r
+                doubleClickHandlerRegistration.removeHandler();\r
+                mouseUpHandlerRegistration.removeHandler();\r
+                contextMenuHandlerRegistration.removeHandler();\r
+\r
+                contextMenuHandlerRegistration = null;\r
+                mouseUpHandlerRegistration = null;\r
+                doubleClickHandlerRegistration = null;\r
+                clickHandlerRegistration = null;\r
+\r
+            }\r
+        }\r
+\r
+    }\r
+\r
+    protected abstract <H extends EventHandler> HandlerRegistration registerHandler(\r
+            final H handler, DomEvent.Type<H> type);\r
+\r
+    public abstract ApplicationConnection getApplicationConnection();\r
+\r
+    public boolean hasEventListener() {\r
+        return getApplicationConnection().hasEventListeners(paintable,\r
+                clickEventIdentifier);\r
+    }\r
+\r
+    public void onClick(ClickEvent event) {\r
+        if (hasEventListener()) {\r
+            fireClick(event.getNativeEvent());\r
+        }\r
+    }\r
+\r
+    protected void fireClick(NativeEvent event) {\r
+        ApplicationConnection client = getApplicationConnection();\r
+        String pid = getApplicationConnection().getPid(paintable);\r
+\r
+        MouseEventDetails mouseDetails = new MouseEventDetails(event);\r
+\r
+        Map<String, Object> parameters = new HashMap<String, Object>();\r
+        parameters.put("mouseDetails", mouseDetails.serialize());\r
+        client.updateVariable(pid, clickEventIdentifier, parameters, true);\r
+\r
+    }\r
+\r
+    public void onContextMenu(ContextMenuEvent event) {\r
+        if (hasEventListener()) {\r
+            // Prevent showing the browser's context menu when there is a right\r
+            // click listener.\r
+            event.preventDefault();\r
+        }\r
+\r
+    }\r
+\r
+    public void onMouseUp(MouseUpEvent event) {\r
+        // TODO For perfect accuracy we should check that a mousedown has\r
+        // occured on this element before this mouseup and that no mouseup\r
+        // has occured anywhere after that.\r
+        if (hasEventListener()) {\r
+            if (event.getNativeButton() != NativeEvent.BUTTON_LEFT) {\r
+                // "Click" with right or middle button\r
+                fireClick(event.getNativeEvent());\r
+\r
+            }\r
+        }\r
+    }\r
+\r
+    public void onDoubleClick(DoubleClickEvent event) {\r
+        if (hasEventListener()) {\r
+            fireClick(event.getNativeEvent());\r
+        }\r
+    }\r
+\r
+}
\ No newline at end of file
diff --git a/src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java b/src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java
new file mode 100644 (file)
index 0000000..c19d0b1
--- /dev/null
@@ -0,0 +1,36 @@
+package com.vaadin.terminal.gwt.client.ui;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.google.gwt.dom.client.NativeEvent;
+import com.google.gwt.user.client.Element;
+import com.vaadin.terminal.gwt.client.ApplicationConnection;
+import com.vaadin.terminal.gwt.client.MouseEventDetails;
+import com.vaadin.terminal.gwt.client.Paintable;
+
+abstract class LayoutClickEventHandler extends ClickEventHandler {
+
+    LayoutClickEventHandler(Paintable paintable, String clickEventIdentifier) {
+        super(paintable, clickEventIdentifier);
+    }
+
+    protected abstract Paintable getChildComponent(Element element);
+
+    @Override
+    protected void fireClick(NativeEvent event) {
+        ApplicationConnection client = getApplicationConnection();
+        String pid = getApplicationConnection().getPid(paintable);
+
+        MouseEventDetails mouseDetails = new MouseEventDetails(event);
+        Paintable childComponent = getChildComponent((Element) event
+                .getEventTarget().cast());
+
+        Map<String, Object> parameters = new HashMap<String, Object>();
+        parameters.put("mouseDetails", mouseDetails.serialize());
+        parameters.put("component", childComponent);
+
+        client.updateVariable(pid, clickEventIdentifier, parameters, true);
+    }
+
+}
index ff26e4b0056f75d160e29993608164b93a348069..a83df137f4ca44108c7154c2952bf01180a65d72 100644 (file)
@@ -10,8 +10,8 @@ import java.util.Map.Entry;
 import com.google.gwt.dom.client.DivElement;
 import com.google.gwt.dom.client.Document;
 import com.google.gwt.dom.client.Style;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.DomEvent.Type;
+import com.google.gwt.event.shared.EventHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
@@ -21,14 +21,12 @@ import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
 import com.vaadin.terminal.gwt.client.Container;
-import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.Paintable;
 import com.vaadin.terminal.gwt.client.RenderSpace;
 import com.vaadin.terminal.gwt.client.UIDL;
 import com.vaadin.terminal.gwt.client.VCaption;
 
-public class VAbsoluteLayout extends ComplexPanel implements Container,
-        ClickHandler {
+public class VAbsoluteLayout extends ComplexPanel implements Container {
 
     /** Tag name for widget creation */
     public static final String TAGNAME = "absolutelayout";
@@ -54,6 +52,26 @@ public class VAbsoluteLayout extends ComplexPanel implements Container,
 
     private boolean rendering;
 
+    private LayoutClickEventHandler clickEventHandler = new LayoutClickEventHandler(
+            this, CLICK_EVENT_IDENTIFIER) {
+
+        @Override
+        public ApplicationConnection getApplicationConnection() {
+            return client;
+        }
+
+        @Override
+        protected Paintable getChildComponent(Element element) {
+            return getComponent(element);
+        }
+
+        @Override
+        protected <H extends EventHandler> HandlerRegistration registerHandler(
+                H handler, Type<H> type) {
+            return addDomHandler(handler, type);
+        }
+    };
+
     public VAbsoluteLayout() {
         setElement(Document.get().createDivElement());
         setStyleName(CLASSNAME);
@@ -62,7 +80,6 @@ public class VAbsoluteLayout extends ComplexPanel implements Container,
         canvas.getStyle().setProperty("overflow", "hidden");
         marginElement.appendChild(canvas);
         getElement().appendChild(marginElement);
-        addDomHandler(this, ClickEvent.getType());
     }
 
     public RenderSpace getAllocatedSpace(Widget child) {
@@ -137,7 +154,7 @@ public class VAbsoluteLayout extends ComplexPanel implements Container,
             return;
         }
 
-        handleHandlerRegistration();
+        clickEventHandler.handleHandlerRegistration();
 
         HashSet<String> unrenderedPids = new HashSet<String>(
                 pidToComponentWrappper.keySet());
@@ -158,26 +175,6 @@ public class VAbsoluteLayout extends ComplexPanel implements Container,
         rendering = false;
     }
 
-    private HandlerRegistration clickHandlerRegistration;
-
-    private void handleHandlerRegistration() {
-        // Handle registering/unregistering of click handler depending on if
-        // server side listeners have been added or removed.
-        if (client.hasEventListeners(this, CLICK_EVENT_IDENTIFIER)) {
-            if (clickHandlerRegistration == null) {
-                clickHandlerRegistration = addDomHandler(this, ClickEvent
-                        .getType());
-            }
-        } else {
-            if (clickHandlerRegistration != null) {
-                clickHandlerRegistration.removeHandler();
-                clickHandlerRegistration = null;
-
-            }
-        }
-
-    }
-
     private AbsoluteWrapper getWrapper(ApplicationConnection client,
             UIDL componentUIDL) {
         AbsoluteWrapper wrapper = pidToComponentWrappper.get(componentUIDL
@@ -420,21 +417,8 @@ public class VAbsoluteLayout extends ComplexPanel implements Container,
         }
     }
 
-    public void onClick(ClickEvent event) {
-        // This is only called if there are click listeners registered on server
-        // side
-        Paintable childComponent = getChildComponent((Element) event
-                .getNativeEvent().getEventTarget().cast());
-        final MouseEventDetails details = new MouseEventDetails(event
-                .getNativeEvent());
-
-        Object[] parameters = new Object[] { details, childComponent };
-
-        client.updateVariable(client.getPid(this), CLICK_EVENT_IDENTIFIER,
-                parameters, true);
-    }
 
-    private Paintable getChildComponent(Element target) {
+    private Paintable getComponent(Element target) {
         while (target != null && target != canvas) {
             Paintable paintable = client.getPaintable(target);
             if (paintable != null) {
index 2c00a68f9253ba8daac449d781224b39a63179f5..adf8d7c354ba5f739cdc1b57a68145e3463658a3 100644 (file)
@@ -11,24 +11,21 @@ import com.google.gwt.dom.client.Node;
 import com.google.gwt.dom.client.NodeList;
 import com.google.gwt.dom.client.ObjectElement;
 import com.google.gwt.dom.client.Style;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.dom.client.MouseUpEvent;
-import com.google.gwt.event.dom.client.MouseUpHandler;
+import com.google.gwt.event.dom.client.DomEvent.Type;
+import com.google.gwt.event.shared.EventHandler;
+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.google.gwt.user.client.ui.HTML;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
-import com.vaadin.terminal.gwt.client.MouseEventDetails;
 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 VEmbedded extends HTML implements Paintable, ClickHandler,
-        MouseUpHandler {
+public class VEmbedded extends HTML implements Paintable {
     public static final String CLICK_EVENT_IDENTIFIER = "click";
 
     private static String CLASSNAME = "v-embedded";
@@ -39,10 +36,24 @@ public class VEmbedded extends HTML implements Paintable, ClickHandler,
 
     private ApplicationConnection client;
 
+    private ClickEventHandler clickEventHandler = new ClickEventHandler(this,
+            CLICK_EVENT_IDENTIFIER) {
+
+        @Override
+        public ApplicationConnection getApplicationConnection() {
+            return client;
+        }
+
+        @Override
+        protected <H extends EventHandler> HandlerRegistration registerHandler(
+                H handler, Type<H> type) {
+            return addDomHandler(handler, type);
+        }
+
+    };
+
     public VEmbedded() {
         setStyleName(CLASSNAME);
-        addClickHandler(this);
-        addMouseUpHandler(this);
     }
 
     public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
@@ -53,6 +64,8 @@ public class VEmbedded extends HTML implements Paintable, ClickHandler,
 
         boolean clearBrowserElement = true;
 
+        clickEventHandler.handleHandlerRegistration();
+
         if (uidl.hasAttribute("type")) {
             final String type = uidl.getStringAttribute("type");
             if (type.equals("image")) {
@@ -227,8 +240,7 @@ public class VEmbedded extends HTML implements Paintable, ClickHandler,
     protected void onDetach() {
         if (BrowserInfo.get().isIE()) {
             // Force browser to fire unload event when component is detached
-            // from
-            // the view (IE doesn't do this automatically)
+            // from the view (IE doesn't do this automatically)
             if (browserElement != null) {
                 DOM.setElementAttribute(browserElement, "src",
                         "javascript:false");
@@ -247,29 +259,4 @@ public class VEmbedded extends HTML implements Paintable, ClickHandler,
         client.handleTooltipEvent(event, this);
     }
 
-    private void fireClick(MouseEventDetails mouseDetails) {
-        client.updateVariable(client.getPid(this), CLICK_EVENT_IDENTIFIER,
-                mouseDetails.serialize(), true);
-    }
-
-    public void onClick(ClickEvent event) {
-        if (client.hasEventListeners(this, CLICK_EVENT_IDENTIFIER)) {
-            MouseEventDetails mouseDetails = new MouseEventDetails(event
-                    .getNativeEvent());
-            fireClick(mouseDetails);
-        }
-    }
-
-    public void onMouseUp(MouseUpEvent event) {
-        if (client.hasEventListeners(this, CLICK_EVENT_IDENTIFIER)) {
-
-            MouseEventDetails mouseDetails = new MouseEventDetails(event
-                    .getNativeEvent());
-            if (mouseDetails.getButton() != MouseEventDetails.BUTTON_LEFT) {
-                // "Click" with right or middle button
-                fireClick(mouseDetails);
-
-            }
-        }
-    }
 }
index 29f4c77769de1f2e61aea246ad109838e6aa5aa7..8e658d0930e1cbf34383b6bde7e55e8df225f7a2 100644 (file)
@@ -14,8 +14,9 @@ import java.util.Set;
 
 import com.google.gwt.dom.client.DivElement;
 import com.google.gwt.dom.client.Document;
-import com.google.gwt.event.dom.client.ClickEvent;
-import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.dom.client.DomEvent.Type;
+import com.google.gwt.event.shared.EventHandler;
+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.ui.AbsolutePanel;
@@ -23,7 +24,6 @@ import com.google.gwt.user.client.ui.SimplePanel;
 import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.Container;
-import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.Paintable;
 import com.vaadin.terminal.gwt.client.RenderSpace;
 import com.vaadin.terminal.gwt.client.StyleConstants;
@@ -32,8 +32,7 @@ import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.ui.layout.CellBasedLayout;
 import com.vaadin.terminal.gwt.client.ui.layout.ChildComponentContainer;
 
-public class VGridLayout extends SimplePanel implements Paintable, Container,
-        ClickHandler {
+public class VGridLayout extends SimplePanel implements Paintable, Container {
 
     public static final String CLASSNAME = "v-gridlayout";
 
@@ -73,13 +72,31 @@ public class VGridLayout extends SimplePanel implements Paintable, Container,
 
     private boolean sizeChangedDuringRendering = false;
 
+    private LayoutClickEventHandler clickEventHandler = new LayoutClickEventHandler(
+            this, CLICK_EVENT_IDENTIFIER) {
+
+        @Override
+        public ApplicationConnection getApplicationConnection() {
+            return client;
+        }
+
+        @Override
+        protected Paintable getChildComponent(Element element) {
+            return getComponent(element);
+        }
+
+        @Override
+        protected <H extends EventHandler> HandlerRegistration registerHandler(
+                H handler, Type<H> type) {
+            return addDomHandler(handler, type);
+        }
+    };
+
     public VGridLayout() {
         super();
         getElement().appendChild(margin);
         setStyleName(CLASSNAME);
         setWidget(canvas);
-
-        addDomHandler(this, ClickEvent.getType());
     }
 
     @Override
@@ -95,6 +112,7 @@ public class VGridLayout extends SimplePanel implements Paintable, Container,
             rendering = false;
             return;
         }
+        clickEventHandler.handleHandlerRegistration();
 
         canvas.setWidth("0px");
 
@@ -204,6 +222,26 @@ public class VGridLayout extends SimplePanel implements Paintable, Container,
 
     }
 
+    // private HandlerRegistration clickHandlerRegistration;
+    //
+    // private void handleHandlerRegistration() {
+    // // Handle registering/unregistering of click handler depending on if
+    // // server side listeners have been added or removed.
+    // if (client.hasEventListeners(this, CLICK_EVENT_IDENTIFIER)) {
+    // if (clickHandlerRegistration == null) {
+    // clickHandlerRegistration = addDomHandler(this, ClickEvent
+    // .getType());
+    // }
+    // } else {
+    // if (clickHandlerRegistration != null) {
+    // clickHandlerRegistration.removeHandler();
+    // clickHandlerRegistration = null;
+    //
+    // }
+    // }
+    //
+    // }
+
     private static int[] cloneArray(int[] toBeCloned) {
         int[] clone = new int[toBeCloned.length];
         for (int i = 0; i < clone.length; i++) {
@@ -1031,22 +1069,23 @@ public class VGridLayout extends SimplePanel implements Paintable, Container,
         return cell;
     }
 
-    public void onClick(ClickEvent event) {
-        // This is only called if there are click listeners registered on server
-        // side
-
-        Paintable childComponent = getChildComponent((Element) event
-                .getNativeEvent().getEventTarget().cast());
-        final MouseEventDetails details = new MouseEventDetails(event
-                .getNativeEvent());
-
-        Object[] parameters = new Object[] { details, childComponent };
-        client.updateVariable(client.getPid(this), CLICK_EVENT_IDENTIFIER,
-                parameters, true);
-
-    }
-
-    private Paintable getChildComponent(Element element) {
+    // public void onClick(ClickEvent event) {
+    // // This is only called if there are click listeners registered on server
+    // // side
+    //
+    // Paintable childComponent = getChildComponent((Element) event
+    // .getNativeEvent().getEventTarget().cast());
+    // final MouseEventDetails details = new MouseEventDetails(event
+    // .getNativeEvent());
+    //
+    // Object[] parameters = new Object[] { details.serialize(),
+    // childComponent };
+    // client.updateVariable(client.getPid(this), CLICK_EVENT_IDENTIFIER,
+    // parameters, true);
+    //
+    // }
+
+    private Paintable getComponent(Element element) {
         Element rootElement = getElement();
         while (element != null && element != rootElement) {
             Paintable paintable = client.getPaintable(element);
index 9c07d61196d2ba87a15b4d6eb5caca9f9486f309..e32c88859f097ea3095956b2ae7e016521223083 100644 (file)
@@ -5,14 +5,13 @@ import java.util.Iterator;
 import java.util.Set;\r
 \r
 import com.google.gwt.core.client.JsArrayString;\r
-import com.google.gwt.event.dom.client.ClickEvent;\r
-import com.google.gwt.event.dom.client.ClickHandler;\r
+import com.google.gwt.event.dom.client.DomEvent.Type;\r
+import com.google.gwt.event.shared.EventHandler;\r
 import com.google.gwt.event.shared.HandlerRegistration;\r
 import com.google.gwt.user.client.Element;\r
 import com.google.gwt.user.client.ui.Widget;\r
 import com.vaadin.terminal.gwt.client.ApplicationConnection;\r
 import com.vaadin.terminal.gwt.client.BrowserInfo;\r
-import com.vaadin.terminal.gwt.client.MouseEventDetails;\r
 import com.vaadin.terminal.gwt.client.Paintable;\r
 import com.vaadin.terminal.gwt.client.RenderSpace;\r
 import com.vaadin.terminal.gwt.client.UIDL;\r
@@ -23,7 +22,7 @@ import com.vaadin.terminal.gwt.client.RenderInformation.Size;
 import com.vaadin.terminal.gwt.client.ui.layout.CellBasedLayout;\r
 import com.vaadin.terminal.gwt.client.ui.layout.ChildComponentContainer;\r
 \r
-public class VOrderedLayout extends CellBasedLayout implements ClickHandler {\r
+public class VOrderedLayout extends CellBasedLayout {\r
 \r
     public static final String CLASSNAME = "v-orderedlayout";\r
 \r
@@ -53,6 +52,26 @@ public class VOrderedLayout extends CellBasedLayout implements ClickHandler {
 \r
     private ValueMap alignments;\r
 \r
+    private LayoutClickEventHandler clickEventHandler = new LayoutClickEventHandler(\r
+            this, CLICK_EVENT_IDENTIFIER) {\r
+\r
+        @Override\r
+        public ApplicationConnection getApplicationConnection() {\r
+            return client;\r
+        }\r
+\r
+        @Override\r
+        protected Paintable getChildComponent(Element element) {\r
+            return getComponent(element);\r
+        }\r
+\r
+        @Override\r
+        protected <H extends EventHandler> HandlerRegistration registerHandler(\r
+                H handler, Type<H> type) {\r
+            return addDomHandler(handler, type);\r
+        }\r
+    };\r
+\r
     public VOrderedLayout() {\r
         this(CLASSNAME, ORIENTATION_VERTICAL);\r
         allowOrientationUpdate = true;\r
@@ -81,7 +100,7 @@ public class VOrderedLayout extends CellBasedLayout implements ClickHandler {
             return;\r
         }\r
 \r
-        handleHandlerRegistration();\r
+        clickEventHandler.handleHandlerRegistration();\r
 \r
         if (allowOrientationUpdate) {\r
             handleOrientationUpdate(uidl);\r
@@ -248,26 +267,6 @@ public class VOrderedLayout extends CellBasedLayout implements ClickHandler {
         sizeHasChangedDuringRendering = false;\r
     }\r
 \r
-    private HandlerRegistration clickHandlerRegistration;\r
-\r
-    private void handleHandlerRegistration() {\r
-        // Handle registering/unregistering of click handler depending on if\r
-        // server side listeners have been added or removed.\r
-        if (client.hasEventListeners(this, CLICK_EVENT_IDENTIFIER)) {\r
-            if (clickHandlerRegistration == null) {\r
-                clickHandlerRegistration = addDomHandler(this, ClickEvent\r
-                        .getType());\r
-            }\r
-        } else {\r
-            if (clickHandlerRegistration != null) {\r
-                clickHandlerRegistration.removeHandler();\r
-                clickHandlerRegistration = null;\r
-\r
-            }\r
-        }\r
-\r
-    }\r
-\r
     private void layoutSizeMightHaveChanged() {\r
         Size oldSize = new Size(activeLayoutSize.getWidth(), activeLayoutSize\r
                 .getHeight());\r
@@ -943,28 +942,13 @@ public class VOrderedLayout extends CellBasedLayout implements ClickHandler {
         }\r
     }\r
 \r
-    public void onClick(ClickEvent event) {\r
-        // This is only called if there are click listeners registered on server\r
-        // side\r
-\r
-        Paintable childComponent = getChildComponent((Element) event\r
-                .getNativeEvent().getEventTarget().cast());\r
-        final MouseEventDetails details = new MouseEventDetails(event\r
-                .getNativeEvent());\r
-\r
-        Object[] parameters = new Object[] { details, childComponent };\r
-\r
-        client.updateVariable(client.getPid(this), CLICK_EVENT_IDENTIFIER,\r
-                parameters, true);\r
-    }\r
-\r
     /**\r
      * Returns the child component which contains "element".\r
      * \r
      * @param element\r
      * @return\r
      */\r
-    private Paintable getChildComponent(Element element) {\r
+    private Paintable getComponent(Element element) {\r
         Element rootElement = getElement();\r
         while (element != null && element != rootElement) {\r
             Paintable paintable = client.getPaintable(element);\r
index b2f0a5be7693abf441d8c9c9efac0d378e9ac87a..6461a64da247b3f1db1d810ef4567d45fa32431b 100644 (file)
@@ -362,15 +362,15 @@ public class AbsoluteLayout extends AbstractLayout {
     public void changeVariables(Object source, Map variables) {
         super.changeVariables(source, variables);
         if (variables.containsKey(CLICK_EVENT)) {
-            fireClick((Object[]) variables.get(CLICK_EVENT));
+            fireClick((Map<String, Object>) variables.get(CLICK_EVENT));
         }
 
     }
 
-    private void fireClick(Object[] parameters) {
+    private void fireClick(Map<String, Object> parameters) {
         MouseEventDetails mouseDetails = MouseEventDetails
-                .deserialize((String) parameters[0]);
-        Component childComponent = (Component) parameters[1];
+                .deserialize((String) parameters.get("mouseDetails"));
+        Component childComponent = (Component) parameters.get("component");
 
         fireEvent(new LayoutClickEvent(this, mouseDetails, childComponent));
     }
index b3cfebc21292864598ef88c14e702a5aab9a7e79..505009bf3d7eec98cfbde98b0a6ed921a5a00386 100644 (file)
@@ -317,15 +317,15 @@ public abstract class AbstractOrderedLayout extends AbstractLayout implements
     public void changeVariables(Object source, Map variables) {
         super.changeVariables(source, variables);
         if (variables.containsKey(CLICK_EVENT)) {
-            fireClick((Object[]) variables.get(CLICK_EVENT));
+            fireClick((Map<String, Object>) variables.get(CLICK_EVENT));
         }
 
     }
 
-    private void fireClick(Object[] parameters) {
+    private void fireClick(Map<String, Object> parameters) {
         MouseEventDetails mouseDetails = MouseEventDetails
-                .deserialize((String) parameters[0]);
-        Component childComponent = (Component) parameters[1];
+                .deserialize((String) parameters.get("mouseDetails"));
+        Component childComponent = (Component) parameters.get("component");
 
         fireEvent(new LayoutClickEvent(this, mouseDetails, childComponent));
     }
index c670de86a2c9bc5cf306e2d588a6f9d1f22ed4f3..bd4003a231ab4933d979338cc7b3adc74ba21a01 100644 (file)
@@ -433,14 +433,14 @@ public class Embedded extends AbstractComponent {
     public void changeVariables(Object source, Map variables) {
         super.changeVariables(source, variables);
         if (variables.containsKey(CLICK_EVENT)) {
-            fireClick(variables.get(CLICK_EVENT));
+            fireClick((Map<String, Object>) variables.get(CLICK_EVENT));
         }
 
     }
 
-    private void fireClick(Object parameters) {
+    private void fireClick(Map<String, Object> parameters) {
         MouseEventDetails mouseDetails = MouseEventDetails
-                .deserialize((String) parameters);
+                .deserialize((String) parameters.get("mouseDetails"));
 
         fireEvent(new ClickEvent(this, mouseDetails));
     }
index 530b5fc7dd4be98cb0afd4919bd4fbfad2036dbf..599c6a71a916a7ed0146f997480f0c86bb793222 100644 (file)
@@ -1307,16 +1307,17 @@ public class GridLayout extends AbstractLayout implements
     @Override
     public void changeVariables(Object source, Map variables) {
         super.changeVariables(source, variables);
+
         if (variables.containsKey(CLICK_EVENT)) {
-            fireClick((Object[]) variables.get(CLICK_EVENT));
+            fireClick((Map<String, Object>) variables.get(CLICK_EVENT));
         }
 
     }
 
-    private void fireClick(Object[] parameters) {
+    private void fireClick(Map<String, Object> parameters) {
         MouseEventDetails mouseDetails = MouseEventDetails
-                .deserialize((String) parameters[0]);
-        Component childComponent = (Component) parameters[1];
+                .deserialize((String) parameters.get("mouseDetails"));
+        Component childComponent = (Component) parameters.get("component");
 
         fireEvent(new LayoutClickEvent(this, mouseDetails, childComponent));
     }