From 64a18bebab112db175996be19f60e5ae5e174395 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Wed, 25 Nov 2009 18:45:15 +0000 Subject: [PATCH] Separated client side listeners to a ClickEventHandler class svn changeset:10042/svn branch:event-framework-3234 --- src/TestListeners.java | 82 ++++++++++-- .../gwt/client/ui/ClickEventHandler.java | 126 ++++++++++++++++++ .../client/ui/LayoutClickEventHandler.java | 36 +++++ .../gwt/client/ui/VAbsoluteLayout.java | 66 ++++----- .../terminal/gwt/client/ui/VEmbedded.java | 59 ++++---- .../terminal/gwt/client/ui/VGridLayout.java | 85 ++++++++---- .../gwt/client/ui/VOrderedLayout.java | 66 ++++----- src/com/vaadin/ui/AbsoluteLayout.java | 8 +- src/com/vaadin/ui/AbstractOrderedLayout.java | 8 +- src/com/vaadin/ui/Embedded.java | 6 +- src/com/vaadin/ui/GridLayout.java | 9 +- 11 files changed, 386 insertions(+), 165 deletions(-) create mode 100644 src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java create mode 100644 src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java diff --git a/src/TestListeners.java b/src/TestListeners.java index 1c415bd0aa..9650c2269a 100644 --- a/src/TestListeners.java +++ b/src/TestListeners.java @@ -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 index 0000000000..aae416ba6a --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java @@ -0,0 +1,126 @@ +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.event.dom.client.ClickEvent; +import com.google.gwt.event.dom.client.ClickHandler; +import com.google.gwt.event.dom.client.ContextMenuEvent; +import com.google.gwt.event.dom.client.ContextMenuHandler; +import com.google.gwt.event.dom.client.DomEvent; +import com.google.gwt.event.dom.client.DoubleClickEvent; +import com.google.gwt.event.dom.client.DoubleClickHandler; +import com.google.gwt.event.dom.client.MouseUpEvent; +import com.google.gwt.event.dom.client.MouseUpHandler; +import com.google.gwt.event.shared.EventHandler; +import com.google.gwt.event.shared.HandlerRegistration; +import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.MouseEventDetails; +import com.vaadin.terminal.gwt.client.Paintable; + +abstract class ClickEventHandler implements ClickHandler, DoubleClickHandler, + ContextMenuHandler, MouseUpHandler { + + private HandlerRegistration clickHandlerRegistration; + private HandlerRegistration doubleClickHandlerRegistration; + private HandlerRegistration mouseUpHandlerRegistration; + private HandlerRegistration contextMenuHandlerRegistration; + + protected String clickEventIdentifier; + protected Paintable paintable; + + ClickEventHandler(Paintable paintable, String clickEventIdentifier) { + this.paintable = paintable; + this.clickEventIdentifier = clickEventIdentifier; + } + + public void handleHandlerRegistration() { + // Handle registering/unregistering of click handler depending on if + // server side listeners have been added or removed. + if (hasEventListener()) { + if (clickHandlerRegistration == null) { + clickHandlerRegistration = registerHandler(this, ClickEvent + .getType()); + mouseUpHandlerRegistration = registerHandler(this, MouseUpEvent + .getType()); + contextMenuHandlerRegistration = registerHandler(this, + ContextMenuEvent.getType()); + doubleClickHandlerRegistration = registerHandler(this, + DoubleClickEvent.getType()); + } + } else { + if (clickHandlerRegistration != null) { + // Remove existing handlers + clickHandlerRegistration.removeHandler(); + doubleClickHandlerRegistration.removeHandler(); + mouseUpHandlerRegistration.removeHandler(); + contextMenuHandlerRegistration.removeHandler(); + + contextMenuHandlerRegistration = null; + mouseUpHandlerRegistration = null; + doubleClickHandlerRegistration = null; + clickHandlerRegistration = null; + + } + } + + } + + protected abstract HandlerRegistration registerHandler( + final H handler, DomEvent.Type type); + + public abstract ApplicationConnection getApplicationConnection(); + + public boolean hasEventListener() { + return getApplicationConnection().hasEventListeners(paintable, + clickEventIdentifier); + } + + public void onClick(ClickEvent event) { + if (hasEventListener()) { + fireClick(event.getNativeEvent()); + } + } + + protected void fireClick(NativeEvent event) { + ApplicationConnection client = getApplicationConnection(); + String pid = getApplicationConnection().getPid(paintable); + + MouseEventDetails mouseDetails = new MouseEventDetails(event); + + Map parameters = new HashMap(); + parameters.put("mouseDetails", mouseDetails.serialize()); + client.updateVariable(pid, clickEventIdentifier, parameters, true); + + } + + public void onContextMenu(ContextMenuEvent event) { + if (hasEventListener()) { + // Prevent showing the browser's context menu when there is a right + // click listener. + event.preventDefault(); + } + + } + + public void onMouseUp(MouseUpEvent event) { + // TODO For perfect accuracy we should check that a mousedown has + // occured on this element before this mouseup and that no mouseup + // has occured anywhere after that. + if (hasEventListener()) { + if (event.getNativeButton() != NativeEvent.BUTTON_LEFT) { + // "Click" with right or middle button + fireClick(event.getNativeEvent()); + + } + } + } + + public void onDoubleClick(DoubleClickEvent event) { + if (hasEventListener()) { + fireClick(event.getNativeEvent()); + } + } + +} \ 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 index 0000000000..c19d0b1c7d --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/LayoutClickEventHandler.java @@ -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 parameters = new HashMap(); + parameters.put("mouseDetails", mouseDetails.serialize()); + parameters.put("component", childComponent); + + client.updateVariable(pid, clickEventIdentifier, parameters, true); + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java b/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java index ff26e4b005..a83df137f4 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VAbsoluteLayout.java @@ -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 HandlerRegistration registerHandler( + H handler, Type 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 unrenderedPids = new HashSet( 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) { diff --git a/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java b/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java index 2c00a68f92..adf8d7c354 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VEmbedded.java @@ -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 HandlerRegistration registerHandler( + H handler, Type 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); - - } - } - } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java b/src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java index 29f4c77769..8e658d0930 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VGridLayout.java @@ -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 HandlerRegistration registerHandler( + H handler, Type 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); diff --git a/src/com/vaadin/terminal/gwt/client/ui/VOrderedLayout.java b/src/com/vaadin/terminal/gwt/client/ui/VOrderedLayout.java index 9c07d61196..e32c88859f 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/VOrderedLayout.java +++ b/src/com/vaadin/terminal/gwt/client/ui/VOrderedLayout.java @@ -5,14 +5,13 @@ import java.util.Iterator; import java.util.Set; import com.google.gwt.core.client.JsArrayString; -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.Element; 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.MouseEventDetails; import com.vaadin.terminal.gwt.client.Paintable; import com.vaadin.terminal.gwt.client.RenderSpace; import com.vaadin.terminal.gwt.client.UIDL; @@ -23,7 +22,7 @@ import com.vaadin.terminal.gwt.client.RenderInformation.Size; import com.vaadin.terminal.gwt.client.ui.layout.CellBasedLayout; import com.vaadin.terminal.gwt.client.ui.layout.ChildComponentContainer; -public class VOrderedLayout extends CellBasedLayout implements ClickHandler { +public class VOrderedLayout extends CellBasedLayout { public static final String CLASSNAME = "v-orderedlayout"; @@ -53,6 +52,26 @@ public class VOrderedLayout extends CellBasedLayout implements ClickHandler { private ValueMap alignments; + 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 HandlerRegistration registerHandler( + H handler, Type type) { + return addDomHandler(handler, type); + } + }; + public VOrderedLayout() { this(CLASSNAME, ORIENTATION_VERTICAL); allowOrientationUpdate = true; @@ -81,7 +100,7 @@ public class VOrderedLayout extends CellBasedLayout implements ClickHandler { return; } - handleHandlerRegistration(); + clickEventHandler.handleHandlerRegistration(); if (allowOrientationUpdate) { handleOrientationUpdate(uidl); @@ -248,26 +267,6 @@ public class VOrderedLayout extends CellBasedLayout implements ClickHandler { sizeHasChangedDuringRendering = 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 void layoutSizeMightHaveChanged() { Size oldSize = new Size(activeLayoutSize.getWidth(), activeLayoutSize .getHeight()); @@ -943,28 +942,13 @@ public class VOrderedLayout extends CellBasedLayout implements ClickHandler { } } - 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); - } - /** * Returns the child component which contains "element". * * @param element * @return */ - private Paintable getChildComponent(Element element) { + private Paintable getComponent(Element element) { Element rootElement = getElement(); while (element != null && element != rootElement) { Paintable paintable = client.getPaintable(element); diff --git a/src/com/vaadin/ui/AbsoluteLayout.java b/src/com/vaadin/ui/AbsoluteLayout.java index b2f0a5be76..6461a64da2 100644 --- a/src/com/vaadin/ui/AbsoluteLayout.java +++ b/src/com/vaadin/ui/AbsoluteLayout.java @@ -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) variables.get(CLICK_EVENT)); } } - private void fireClick(Object[] parameters) { + private void fireClick(Map 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)); } diff --git a/src/com/vaadin/ui/AbstractOrderedLayout.java b/src/com/vaadin/ui/AbstractOrderedLayout.java index b3cfebc212..505009bf3d 100644 --- a/src/com/vaadin/ui/AbstractOrderedLayout.java +++ b/src/com/vaadin/ui/AbstractOrderedLayout.java @@ -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) variables.get(CLICK_EVENT)); } } - private void fireClick(Object[] parameters) { + private void fireClick(Map 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)); } diff --git a/src/com/vaadin/ui/Embedded.java b/src/com/vaadin/ui/Embedded.java index c670de86a2..bd4003a231 100644 --- a/src/com/vaadin/ui/Embedded.java +++ b/src/com/vaadin/ui/Embedded.java @@ -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) variables.get(CLICK_EVENT)); } } - private void fireClick(Object parameters) { + private void fireClick(Map parameters) { MouseEventDetails mouseDetails = MouseEventDetails - .deserialize((String) parameters); + .deserialize((String) parameters.get("mouseDetails")); fireEvent(new ClickEvent(this, mouseDetails)); } diff --git a/src/com/vaadin/ui/GridLayout.java b/src/com/vaadin/ui/GridLayout.java index 530b5fc7dd..599c6a71a9 100644 --- a/src/com/vaadin/ui/GridLayout.java +++ b/src/com/vaadin/ui/GridLayout.java @@ -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) variables.get(CLICK_EVENT)); } } - private void fireClick(Object[] parameters) { + private void fireClick(Map 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)); } -- 2.39.5