From 039069727fbc76b9959197e03f2004ae3d7bf963 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 28 Feb 2012 15:30:51 +0200 Subject: [PATCH] #8448 Replaced id and connection setters with parameters to the init method and refactored RootConnector initialization to be compatible with this --- .../gwt/client/ApplicationConfiguration.java | 7 ++ .../gwt/client/ApplicationConnection.java | 47 ++++++-------- .../vaadin/terminal/gwt/client/Connector.java | 34 ++-------- .../terminal/gwt/client/MeasuredSize.java | 1 - .../client/ui/AbstractComponentConnector.java | 57 ++++------------- .../gwt/client/ui/AbstractConnector.java | 64 +++++++++++++++++++ .../terminal/gwt/client/ui/RootConnector.java | 17 ++--- 7 files changed, 111 insertions(+), 116 deletions(-) create mode 100755 src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java index f7afd745d1..bb094bf916 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConfiguration.java @@ -241,6 +241,13 @@ public class ApplicationConfiguration implements EntryPoint { return appUri; } + public String getThemeName() { + String uri = getThemeUri(); + String themeName = uri.substring(uri.lastIndexOf('/')); + themeName = themeName.replaceAll("[^a-zA-Z0-9]", ""); + return themeName; + } + public String getThemeUri() { return themeUri; } diff --git a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java index 3c8e2c8a99..ec1ca7e585 100644 --- a/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java +++ b/src/com/vaadin/terminal/gwt/client/ApplicationConnection.java @@ -169,7 +169,6 @@ public class ApplicationConnection { public ApplicationConnection() { view = GWT.create(RootConnector.class); - view.setConnection(this); } public void init(WidgetSet widgetSet, ApplicationConfiguration cnf) { @@ -1058,36 +1057,32 @@ public class ApplicationConnection { try { final UIDL change = changes.get(i).cast(); final UIDL uidl = change.getChildUIDL(0); - String paintableId = uidl.getId(); - // TODO optimize + String connectorId = uidl.getId(); + + if (!connectorMap.hasConnector(connectorId) + && uidl.getTag().equals( + configuration.getEncodedWindowTag())) { + // First RootConnector update. Up until this + // point the connectorId for RootConnector has + // not been known + connectorMap.registerConnector(connectorId, view); + view.doInit(connectorId, ApplicationConnection.this); + } + final ComponentConnector paintable = (ComponentConnector) connectorMap - .getConnector(paintableId); + .getConnector(connectorId); if (paintable != null) { paintable.updateFromUIDL(uidl, ApplicationConnection.this); updatedComponentConnectors.add(paintable); } else { - if (!uidl.getTag().equals( - configuration.getEncodedWindowTag())) { - VConsole.error("Received update for " - + uidl.getTag() - + ", but there is no such paintable (" - + paintableId + ") rendered."); - } else { - String pid = uidl.getId(); - if (!connectorMap.hasConnector(pid)) { - connectorMap.registerConnector(pid, view); - } - // VView does not call updateComponent so we - // register any event listeners here - connectorMap.registerEventListenersFromUIDL( - pid, uidl); - - // Finally allow VView to update itself - view.updateFromUIDL(uidl, - ApplicationConnection.this); - } + VConsole.error("Received update for " + + uidl.getTag() + + ", but there is no such paintable (" + + connectorId + ") rendered."); + } + } catch (final Throwable e) { VConsole.error(e); } @@ -1708,10 +1703,8 @@ public class ApplicationConnection { // Create and register a new connector with the given type ComponentConnector p = widgetSet.createWidget(connectorType, configuration); - p.setConnection(this); - p.setId(connectorId); - p.init(); connectorMap.registerConnector(connectorId, p); + p.doInit(connectorId, this); return p; } diff --git a/src/com/vaadin/terminal/gwt/client/Connector.java b/src/com/vaadin/terminal/gwt/client/Connector.java index 01a7f3eeac..6f568d8fd9 100644 --- a/src/com/vaadin/terminal/gwt/client/Connector.java +++ b/src/com/vaadin/terminal/gwt/client/Connector.java @@ -41,44 +41,20 @@ public interface Connector { /** * Returns the id for this connector. This must always be what has been set - * using {@link #setId(String)}. + * in {@link #init(String, ApplicationConnection)} and must never change. * * @return The id for the connector. */ public String getId(); - /** - * Sets the id for the connector. This method is called once by the - * framework when the connector is initialized and should never be called - * otherwise. - *

- * The connector id is used to map the server and the client side together. - * It is unique in this Root and assigned by the framework. - *

- * - * @param id - * The id of the connector. - */ - public void setId(String id); - /** * Gets ApplicationConnection instance that created this connector. * * @return The ApplicationConnection as set by - * {@link #setConnection(ApplicationConnection)} + * {@link #init(String, ApplicationConnection)} */ public ApplicationConnection getConnection(); - /** - * Sets the reference to ApplicationConnection. This method is called by the - * framework when the connector is created and should never be called - * otherwise. - * - * @param connection - * The ApplicationConnection that created this connector - */ - public void setConnection(ApplicationConnection connection); - /** * Tests whether the component is enabled or not. A user can not interact * with disabled components. Disabled components are rendered in a style @@ -91,10 +67,10 @@ public interface Connector { /** * - * Called once when the connection and id has been set. + * Called once by the framework to initialize the connector. * - * Note that the shared state is not yet available during init(). + * Note that the shared state is not yet available at this point. */ - public void init(); + public void doInit(String connectorId, ApplicationConnection connection); } diff --git a/src/com/vaadin/terminal/gwt/client/MeasuredSize.java b/src/com/vaadin/terminal/gwt/client/MeasuredSize.java index 499503e7da..e8078031e3 100644 --- a/src/com/vaadin/terminal/gwt/client/MeasuredSize.java +++ b/src/com/vaadin/terminal/gwt/client/MeasuredSize.java @@ -184,7 +184,6 @@ public class MeasuredSize { setOuterHeight(requiredHeight + marginHeight); int requiredWidth = Util.getRequiredWidth(element); - VConsole.log("Width of " + element.toString() + " is " + requiredWidth); int marginWidth = sumWidths(margins); setOuterWidth(requiredWidth + marginWidth); diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java index 85ef32d3b4..514bdb8e3d 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractComponentConnector.java @@ -9,19 +9,20 @@ import com.google.gwt.user.client.ui.FocusWidget; import com.google.gwt.user.client.ui.Focusable; import com.google.gwt.user.client.ui.Widget; import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.ComponentConnector; +import com.vaadin.terminal.gwt.client.ComponentContainerConnector; import com.vaadin.terminal.gwt.client.ComponentState; +import com.vaadin.terminal.gwt.client.ConnectorMap; import com.vaadin.terminal.gwt.client.LayoutManager; import com.vaadin.terminal.gwt.client.TooltipInfo; import com.vaadin.terminal.gwt.client.UIDL; import com.vaadin.terminal.gwt.client.VConsole; -import com.vaadin.terminal.gwt.client.ConnectorMap; -import com.vaadin.terminal.gwt.client.ComponentConnector; -import com.vaadin.terminal.gwt.client.ComponentContainerConnector; import com.vaadin.terminal.gwt.client.communication.ClientToServerRpc; import com.vaadin.terminal.gwt.client.communication.ClientToServerRpc.InitializableClientToServerRpc; import com.vaadin.terminal.gwt.client.communication.SharedState; -public abstract class AbstractComponentConnector implements ComponentConnector { +public abstract class AbstractComponentConnector extends AbstractConnector + implements ComponentConnector { // Generic UIDL parameter names, to be moved to shared state. // Attributes are here mainly if they apply to all paintable widgets or @@ -36,8 +37,6 @@ public abstract class AbstractComponentConnector implements ComponentConnector { public static final String ATTRIBUTE_HIDEERRORS = "hideErrors"; private Widget widget; - private ApplicationConnection connection; - private String id; /* State variables */ private boolean enabled = true; @@ -55,12 +54,6 @@ public abstract class AbstractComponentConnector implements ComponentConnector { public AbstractComponentConnector() { } - /** - * Called after the application connection reference has been set up - */ - public void init() { - } - /** * Creates and returns the widget for this VPaintableWidget. This method * should only be called once when initializing the paintable. @@ -83,34 +76,6 @@ public abstract class AbstractComponentConnector implements ComponentConnector { return widget; } - /* - * (non-Javadoc) - * - * @see com.vaadin.terminal.gwt.client.VPaintable#getConnection() - */ - public final ApplicationConnection getConnection() { - return connection; - } - - /* - * (non-Javadoc) - * - * @see - * com.vaadin.terminal.gwt.client.VPaintable#setConnection(com.vaadin.terminal - * .gwt.client.ApplicationConnection) - */ - public final void setConnection(ApplicationConnection connection) { - this.connection = connection; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - /** * Returns the shared state object for a paintable widget. * @@ -156,7 +121,8 @@ public abstract class AbstractComponentConnector implements ComponentConnector { return null; } if (paintableMap.isConnector(w)) { - return (ComponentContainerConnector) paintableMap.getConnector(w); + return (ComponentContainerConnector) paintableMap + .getConnector(w); } } } @@ -184,8 +150,8 @@ public abstract class AbstractComponentConnector implements ComponentConnector { setVisible(!uidl.getBooleanAttribute("invisible"), uidl); if (uidl.getId().startsWith("PID_S")) { - DOM.setElementProperty(getWidget().getElement(), "id", - uidl.getId().substring(5)); + DOM.setElementProperty(getWidget().getElement(), "id", uidl.getId() + .substring(5)); } if (!isVisible()) { @@ -203,8 +169,7 @@ public abstract class AbstractComponentConnector implements ComponentConnector { * Disabled state may affect (override) tabindex so the order must be * first setting tabindex, then enabled state. */ - if (uidl.hasAttribute("tabindex") - && getWidget() instanceof Focusable) { + if (uidl.hasAttribute("tabindex") && getWidget() instanceof Focusable) { ((Focusable) getWidget()).setTabIndex(uidl .getIntAttribute("tabindex")); } @@ -471,6 +436,6 @@ public abstract class AbstractComponentConnector implements ComponentConnector { } public LayoutManager getLayoutManager() { - return LayoutManager.get(connection); + return LayoutManager.get(getConnection()); } } diff --git a/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java b/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java new file mode 100755 index 0000000000..2b5bccd66f --- /dev/null +++ b/src/com/vaadin/terminal/gwt/client/ui/AbstractConnector.java @@ -0,0 +1,64 @@ +package com.vaadin.terminal.gwt.client.ui; + +import com.vaadin.terminal.gwt.client.ApplicationConnection; +import com.vaadin.terminal.gwt.client.Connector; + +public abstract class AbstractConnector implements Connector { + + private ApplicationConnection connection; + private String id; + + /* + * (non-Javadoc) + * + * @see com.vaadin.terminal.gwt.client.VPaintable#getConnection() + */ + public final ApplicationConnection getConnection() { + return connection; + } + + private final void setConnection(ApplicationConnection connection) { + this.connection = connection; + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.terminal.gwt.client.Connector#getId() + */ + public String getId() { + return id; + } + + private void setId(String id) { + this.id = id; + } + + /** + * + * Called once by the framework to initialize the connector. + * + * Custom widgets should not override this method, override init instead; + * + * Note that the shared state is not yet available at this point. + */ + public final void doInit(String connectorId, + ApplicationConnection connection) { + setConnection(connection); + setId(connectorId); + + init(); + } + + /** + * Called when the connector has been initialized. Override this method to + * perform initialization of the connector. + */ + // FIXME: It might make sense to make this abstract to force users to use + // init instead of constructor, where connection and id has not yet been + // set. + protected void init() { + + } + +} diff --git a/src/com/vaadin/terminal/gwt/client/ui/RootConnector.java b/src/com/vaadin/terminal/gwt/client/ui/RootConnector.java index c495ce5a2b..a484e0eac7 100644 --- a/src/com/vaadin/terminal/gwt/client/ui/RootConnector.java +++ b/src/com/vaadin/terminal/gwt/client/ui/RootConnector.java @@ -34,10 +34,7 @@ public class RootConnector extends AbstractComponentContainerConnector { @Override public void updateFromUIDL(final UIDL uidl, ApplicationConnection client) { getWidget().rendering = true; - // As VView is not created in the same way as all other paintables we - // have to set the id here - setId(uidl.getId()); - getWidget().id = uidl.getId(); + getWidget().id = getId(); boolean firstPaint = getWidget().connection == null; getWidget().connection = client; @@ -275,15 +272,9 @@ public class RootConnector extends AbstractComponentContainerConnector { // Remove the v-app-loading or any splash screen added inside the div by // the user root.getElement().setInnerHTML(""); - // For backwards compatibility with static index pages only. - // No longer added by AbstractApplicationServlet/Portlet - root.removeStyleName("v-app-loading"); - - String themeUri = applicationConnection.getConfiguration() - .getThemeUri(); - String themeName = themeUri.substring(themeUri.lastIndexOf('/')); - themeName = themeName.replaceAll("[^a-zA-Z0-9]", ""); - root.addStyleName("v-theme-" + themeName); + + root.addStyleName("v-theme-" + + applicationConnection.getConfiguration().getThemeName()); root.add(getWidget()); -- 2.39.5