]> source.dussan.org Git - vaadin-framework.git/commitdiff
#8438 Event handler registration is now a Set in the shared state
authorArtur Signell <artur@vaadin.com>
Mon, 19 Mar 2012 14:02:52 +0000 (16:02 +0200)
committerArtur Signell <artur@vaadin.com>
Wed, 21 Mar 2012 13:27:48 +0000 (15:27 +0200)
18 files changed:
src/com/vaadin/terminal/gwt/client/ApplicationConnection.java
src/com/vaadin/terminal/gwt/client/ComponentConnector.java
src/com/vaadin/terminal/gwt/client/ComponentDetail.java
src/com/vaadin/terminal/gwt/client/ComponentState.java
src/com/vaadin/terminal/gwt/client/ConnectorMap.java
src/com/vaadin/terminal/gwt/client/ui/AbsoluteLayoutConnector.java
src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java
src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java
src/com/vaadin/terminal/gwt/client/ui/ClickEventHandler.java
src/com/vaadin/terminal/gwt/client/ui/CssLayoutConnector.java
src/com/vaadin/terminal/gwt/client/ui/EmbeddedConnector.java
src/com/vaadin/terminal/gwt/client/ui/GridLayoutConnector.java
src/com/vaadin/terminal/gwt/client/ui/PanelConnector.java
src/com/vaadin/terminal/gwt/client/ui/RootConnector.java
src/com/vaadin/terminal/gwt/client/ui/TextFieldConnector.java
src/com/vaadin/terminal/gwt/client/ui/WindowConnector.java
src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java
src/com/vaadin/ui/AbstractComponent.java

index 95483eac92464751efb1fdad46f49a281df3033e..b74200d195ffefaf1871448bc0b80af4b05ad071 100644 (file)
@@ -2162,14 +2162,19 @@ public class ApplicationConnection {
      * before the component is updated so the value is correct if called from
      * updatedFromUIDL.
      * 
+     * @param paintable
+     *            The connector to register event listeners for
      * @param eventIdentifier
      *            The identifier for the event
      * @return true if at least one listener has been registered on server side
      *         for the event identified by eventIdentifier.
+     * @deprecated Use {@link ComponentState#hasEventListener(String)}
+     *             instead
      */
+    @Deprecated
     public boolean hasEventListeners(ComponentConnector paintable,
             String eventIdentifier) {
-        return connectorMap.hasEventListeners(paintable, eventIdentifier);
+        return paintable.hasEventListener(eventIdentifier);
     }
 
     /**
index 206be10700ba473f46def3a06cf14b9184d3cd3b..1e9b3a3a0f230d1fb00ae799de153d91834155d7 100644 (file)
@@ -101,4 +101,7 @@ public interface ComponentConnector extends ServerConnector {
      */
     @Deprecated
     public boolean isReadOnly();
+
+    public boolean hasEventListener(String eventIdentifier);
+
 }
index eff5a76583c5d2c1cf054f5f78d82733b605ff8d..c13775d355c41062e164608afd6b2f2dab8097f8 100644 (file)
@@ -5,7 +5,6 @@ package com.vaadin.terminal.gwt.client;
 
 import java.util.HashMap;
 
-import com.google.gwt.core.client.JsArrayString;
 import com.vaadin.terminal.gwt.client.RenderInformation.Size;
 
 class ComponentDetail {
@@ -73,38 +72,4 @@ class ComponentDetail {
         }
     }
 
-    private JsArrayString eventListeners;
-
-    /**
-     * Stores the event listeners registered on server-side and passed along in
-     * the UIDL.
-     * 
-     * @param componentUIDL
-     *            The UIDL for the component
-     * @since 6.2
-     */
-    native void registerEventListenersFromUIDL(UIDL uidl)
-    /*-{
-        this.@com.vaadin.terminal.gwt.client.ComponentDetail::eventListeners = uidl[1].eventListeners;
-    }-*/;
-
-    /**
-     * Checks if there is a registered server side listener for the event.
-     * 
-     * @param eventIdentifier
-     *            The identifier for the event
-     * @return true if at least one listener has been registered on server side
-     *         for the event identified by eventIdentifier.
-     */
-    public boolean hasEventListeners(String eventIdentifier) {
-        if (eventListeners != null) {
-            int l = eventListeners.length();
-            for (int i = 0; i < l; i++) {
-                if (eventListeners.get(i).equals(eventIdentifier)) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
 }
index 407782756f3549aba912d207c7e42967a488c010..b631f90d226496470f87e6323acbdbe723aa29ee 100644 (file)
@@ -4,7 +4,9 @@
 
 package com.vaadin.terminal.gwt.client;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import com.vaadin.terminal.gwt.client.communication.SharedState;
 import com.vaadin.terminal.gwt.client.communication.URLReference;
@@ -31,6 +33,10 @@ public class ComponentState extends SharedState {
     private URLReference icon = null;
     private List<String> styles = null;
     private String debugId = null;
+    /**
+     * A set of event identifiers with registered listeners.
+     */
+    private Set<String> registeredEventListeners = null;
 
     /**
      * Returns the component height as set by the server.
@@ -319,4 +325,58 @@ public class ComponentState extends SharedState {
         this.debugId = debugId;
     }
 
+    /**
+     * Gets the identifiers for the event listeners that have been registered
+     * for the component (using an event id)
+     * 
+     * @return A set of event identifiers or null if no identifiers have been
+     *         registered
+     */
+    public Set<String> getRegisteredEventListeners() {
+        return registeredEventListeners;
+    }
+
+    /**
+     * Sets the identifiers for the event listeners that have been registered
+     * for the component (using an event id)
+     * 
+     * @param registeredEventListeners
+     *            The new set of identifiers or null if no identifiers have been
+     *            registered
+     */
+    public void setRegisteredEventListeners(Set<String> registeredEventListeners) {
+        this.registeredEventListeners = registeredEventListeners;
+    }
+
+    /**
+     * Adds an event listener id.
+     * 
+     * @param eventListenerId
+     *            The event identifier to add
+     */
+    public void addRegisteredEventListener(String eventListenerId) {
+        if (registeredEventListeners == null) {
+            registeredEventListeners = new HashSet<String>();
+        }
+        registeredEventListeners.add(eventListenerId);
+
+    }
+
+    /**
+     * Removes an event listener id.
+     * 
+     * @param eventListenerId
+     *            The event identifier to remove
+     */
+    public void removeRegisteredEventListener(String eventIdentifier) {
+        if (registeredEventListeners == null) {
+            return;
+        }
+        registeredEventListeners.remove(eventIdentifier);
+        if (registeredEventListeners.size() == 0) {
+            registeredEventListeners = null;
+        }
+
+    }
+
 }
index 79b16be3a74109a17674bb45563edd213695fd79..4f8b5701cf097a466b5e5d4a948ba470b94c2209 100644 (file)
@@ -216,23 +216,6 @@ public class ConnectorMap {
         return result.toArray(new ComponentConnector[result.size()]);
     }
 
-    /**
-     * FIXME: Should not be here
-     * 
-     * @param pid
-     * @param uidl
-     */
-    @Deprecated
-    public void registerEventListenersFromUIDL(String pid, UIDL uidl) {
-        ComponentDetail cd = idToComponentDetail.get(pid);
-        if (cd == null) {
-            throw new IllegalArgumentException("Pid must not be null");
-        }
-
-        cd.registerEventListenersFromUIDL(uidl);
-
-    }
-
     /**
      * FIXME: Should not be here
      * 
@@ -299,19 +282,6 @@ public class ConnectorMap {
 
     }
 
-    /**
-     * FIXME: Should not be here
-     * 
-     * @param componentConnector
-     * @return
-     */
-    @Deprecated
-    public boolean hasEventListeners(ComponentConnector componentConnector,
-            String eventIdentifier) {
-        return getComponentDetail(componentConnector).hasEventListeners(
-                eventIdentifier);
-    }
-
     /**
      * Tests if the widget is the root widget of a {@link ComponentConnector}.
      * 
index 4b7b5f6421f2ed1c90834f573d7d0ae6da3906d1..ca0d6bbc737d94e97aa0c22e3dbb3b5c2f814570 100644 (file)
@@ -48,7 +48,7 @@ public class AbsoluteLayoutConnector extends
             return;
         }
 
-        clickEventHandler.handleEventHandlerRegistration(client);
+        clickEventHandler.handleEventHandlerRegistration();
 
         HashSet<String> unrenderedPids = new HashSet<String>(
                 getWidget().pidToComponentWrappper.keySet());
index f1529c0087f6a11fdfb62a2700eddb07998a502c..02f34ac279454149d365b9373abfdfa3e1459a0e 100644 (file)
@@ -3,6 +3,8 @@
  */
 package com.vaadin.terminal.gwt.client.ui;
 
+import java.util.Set;
+
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.ui.FocusWidget;
 import com.google.gwt.user.client.ui.Focusable;
@@ -124,10 +126,6 @@ public abstract class AbstractComponentConnector extends AbstractConnector
         }
 
         ConnectorMap paintableMap = ConnectorMap.get(getConnection());
-        // register the listened events by the server-side to the event-handler
-        // of the component
-        paintableMap.registerEventListenersFromUIDL(getConnectorId(), uidl);
-
         // Visibility
         setVisible(!uidl.getBooleanAttribute("invisible"), uidl);
 
@@ -441,4 +439,18 @@ public abstract class AbstractComponentConnector extends AbstractConnector
         this.parent = parent;
     }
 
+    /**
+     * Checks if there is a registered server side listener for the given event
+     * identifier.
+     * 
+     * @param eventIdentifier
+     *            The identifier to check for
+     * @return true if an event listener has been registered with the given
+     *         event identifier on the server side, false otherwise
+     */
+    public boolean hasEventListener(String eventIdentifier) {
+        Set<String> reg = getState().getRegisteredEventListeners();
+        return (reg != null && reg.contains(eventIdentifier));
+    }
+
 }
index 3363aa792bf1ccf9455e1ec76230089c0baef4a1..5725f6d4f534f946705d8213324b89447fe75094 100644 (file)
@@ -112,7 +112,7 @@ public abstract class AbstractSplitPanelConnector extends
         }
         getWidget().setEnabled(isEnabled());
 
-        clickEventHandler.handleEventHandlerRegistration(client);
+        clickEventHandler.handleEventHandlerRegistration();
         if (getState().hasStyles()) {
             getWidget().componentStyleNames = getState().getStyles();
         } else {
index 4029a56e99ca16a689f704f0da89c590100e3f6f..30e5c8ce46bb4320a9a2df5daff12c5176728ff3 100644 (file)
@@ -19,7 +19,6 @@ import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.Element;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.ComponentConnector;
-import com.vaadin.terminal.gwt.client.ConnectorMap;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.MouseEventDetailsBuilder;
 
@@ -32,7 +31,6 @@ public abstract class ClickEventHandler implements DoubleClickHandler,
 
     protected String clickEventIdentifier;
     protected ComponentConnector paintable;
-    private ApplicationConnection client;
 
     public ClickEventHandler(ComponentConnector paintable,
             String clickEventIdentifier) {
@@ -40,8 +38,7 @@ public abstract class ClickEventHandler implements DoubleClickHandler,
         this.clickEventIdentifier = clickEventIdentifier;
     }
 
-    public void handleEventHandlerRegistration(ApplicationConnection client) {
-        this.client = client;
+    public void handleEventHandlerRegistration() {
         // Handle registering/unregistering of click handler depending on if
         // server side listeners have been added or removed.
         if (hasEventListener()) {
@@ -73,25 +70,23 @@ public abstract class ClickEventHandler implements DoubleClickHandler,
             final H handler, DomEvent.Type<H> type);
 
     protected ApplicationConnection getApplicationConnection() {
-        return client;
+        return paintable.getConnection();
     }
 
     public boolean hasEventListener() {
-        return getApplicationConnection().hasEventListeners(paintable,
-                clickEventIdentifier);
+        return paintable.hasEventListener(clickEventIdentifier);
     }
 
     protected void fireClick(NativeEvent event) {
-        ApplicationConnection client = getApplicationConnection();
-        String pid = ConnectorMap.get(getApplicationConnection())
-                .getConnectorId(paintable);
+        String pid = paintable.getConnectorId();
 
         MouseEventDetails mouseDetails = MouseEventDetailsBuilder
                 .buildMouseEventDetails(event, getRelativeToElement());
 
         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("mouseDetails", mouseDetails.serialize());
-        client.updateVariable(pid, clickEventIdentifier, parameters, true);
+        paintable.getConnection().updateVariable(pid, clickEventIdentifier,
+                parameters, true);
 
     }
 
index 4c244722afd67187d39ad6e4c4015d41684b1cf2..d2a8497331ef4535b8652cec405a305081f7ec65 100644 (file)
@@ -38,7 +38,7 @@ public class CssLayoutConnector extends AbstractComponentContainerConnector {
         if (!isRealUpdate(uidl)) {
             return;
         }
-        clickEventHandler.handleEventHandlerRegistration(client);
+        clickEventHandler.handleEventHandlerRegistration();
 
         getWidget().setMarginAndSpacingStyles(
                 new VMarginInfo(uidl.getIntAttribute("margins")),
index 912f11f0aad67cd9ff7a4973d85c08a75bc98a94..d57f56d9efdc52fbd4cd50d0e3608a98d7e60cd5 100644 (file)
@@ -40,7 +40,7 @@ public class EmbeddedConnector extends AbstractComponentConnector {
 
         boolean clearBrowserElement = true;
 
-        clickEventHandler.handleEventHandlerRegistration(client);
+        clickEventHandler.handleEventHandlerRegistration();
 
         if (uidl.hasAttribute("type")) {
             getWidget().type = uidl.getStringAttribute("type");
index b26df5ddb6b30f0928e4bf8600d8a98e6d0a9c65..dbe490f01747318cab1629271ba44bde62655d71 100644 (file)
@@ -54,7 +54,7 @@ public class GridLayoutConnector extends AbstractComponentContainerConnector
         if (!isRealUpdate(uidl)) {
             return;
         }
-        clickEventHandler.handleEventHandlerRegistration(client);
+        clickEventHandler.handleEventHandlerRegistration();
 
         int cols = uidl.getIntAttribute("w");
         int rows = uidl.getIntAttribute("h");
index f5766d8ab41e93bd3282fa997be016d300b552a5..87306896d86e3eee33e198020939cb252245321e 100644 (file)
@@ -132,7 +132,7 @@ public class PanelConnector extends AbstractComponentContainerConnector
             return;
         }
 
-        clickEventHandler.handleEventHandlerRegistration(client);
+        clickEventHandler.handleEventHandlerRegistration();
 
         getWidget().client = client;
         getWidget().id = uidl.getId();
index 086ded17432374f4e5787a82b1e69b971a388b15..3aac8d7ac3cacb9ad70212f76a39f1c97c7a42c5 100644 (file)
@@ -37,10 +37,6 @@ public class RootConnector extends AbstractComponentContainerConnector
     @Override
     public void updateFromUIDL(final UIDL uidl, ApplicationConnection client) {
         ConnectorMap paintableMap = ConnectorMap.get(getConnection());
-        // register the listened events by the server-side to the event-handler
-        // of the component
-        paintableMap.registerEventListenersFromUIDL(getConnectorId(), uidl);
-
         getWidget().rendering = true;
         getWidget().id = getConnectorId();
         boolean firstPaint = getWidget().connection == null;
@@ -69,7 +65,7 @@ public class RootConnector extends AbstractComponentContainerConnector
         }
         getWidget().setStyleName(styles.trim());
 
-        clickEventHandler.handleEventHandlerRegistration(client);
+        clickEventHandler.handleEventHandlerRegistration();
 
         if (!getWidget().isEmbedded() && getState().getCaption() != null) {
             // only change window title if we're in charge of the whole page
index e1fb3a56a85a5d9d36d81d4fecb1186b364a8bf9..274810d6dfe32031d1f7ee584c37edb9eacaf3ea 100644 (file)
@@ -38,8 +38,7 @@ public class TextFieldConnector extends AbstractFieldConnector implements
 
         getWidget().immediate = getState().isImmediate();
 
-        getWidget().listenTextChangeEvents = client.hasEventListeners(this,
-                "ie");
+        getWidget().listenTextChangeEvents = hasEventListener("ie");
         if (getWidget().listenTextChangeEvents) {
             getWidget().textChangeEventMode = uidl
                     .getStringAttribute(VTextField.ATTR_TEXTCHANGE_EVENTMODE);
index 943c2e196789d0a5f436400b161a6de52e50f09d..8d8931590d8c8f872c35fc2831d655d8ec66378c 100644 (file)
@@ -106,7 +106,7 @@ public class WindowConnector extends AbstractComponentContainerConnector
         }
         getWidget().visibilityChangesDisabled = false;
 
-        clickEventHandler.handleEventHandlerRegistration(client);
+        clickEventHandler.handleEventHandlerRegistration();
 
         getWidget().immediate = getState().isImmediate();
 
index ac0cc7c46d668a583f041693266054fcde40fa6a..e4633a0081276545c1c7d8d657906d1635b9d9c2 100644 (file)
@@ -1189,6 +1189,7 @@ public abstract class AbstractCommunicationManager implements
     }
 
     public static Iterable<Component> getChildComponents(HasComponents cc) {
+        // TODO This must be moved to Root/Panel
         if (cc instanceof Root) {
             Root root = (Root) cc;
             List<Component> children = new ArrayList<Component>();
index cc5ec68ecce69ea75c343bde126d89e19a9790a3..500b5afaaf76266b21de6d48227ba4161d47f66d 100644 (file)
@@ -12,13 +12,11 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -75,11 +73,6 @@ public abstract class AbstractComponent implements Component, MethodEventSource
      */
     private EventRouter eventRouter = null;
 
-    /**
-     * A set of event identifiers with registered listeners.
-     */
-    private Set<String> eventIdentifiers = null;
-
     /**
      * The internal error message of the component.
      */
@@ -763,11 +756,6 @@ public abstract class AbstractComponent implements Component, MethodEventSource
             // Only paint content of visible components.
             if (isVisibleInContext()) {
 
-                if (eventIdentifiers != null) {
-                    target.addAttribute("eventListeners",
-                            eventIdentifiers.toArray());
-                }
-
                 paintContent(target);
 
                 final ErrorMessage error = getErrorMessage();
@@ -1023,14 +1011,11 @@ public abstract class AbstractComponent implements Component, MethodEventSource
         if (eventRouter == null) {
             eventRouter = new EventRouter();
         }
-        if (eventIdentifiers == null) {
-            eventIdentifiers = new HashSet<String>();
-        }
         boolean needRepaint = !eventRouter.hasListeners(eventType);
         eventRouter.addListener(eventType, target, method);
 
         if (needRepaint) {
-            eventIdentifiers.add(eventIdentifier);
+            getState().addRegisteredEventListener(eventIdentifier);
             requestRepaint();
         }
     }
@@ -1079,7 +1064,7 @@ public abstract class AbstractComponent implements Component, MethodEventSource
         if (eventRouter != null) {
             eventRouter.removeListener(eventType, target);
             if (!eventRouter.hasListeners(eventType)) {
-                eventIdentifiers.remove(eventIdentifier);
+                getState().removeRegisteredEventListener(eventIdentifier);
                 requestRepaint();
             }
         }