From da176c32c4d92676424021712a7f6d7ee8cedf76 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Fri, 24 Aug 2012 08:44:20 +0300 Subject: Renamed Root to UI, automatic rename (#8908) Automatic rename in Eclipse of the class Root to UI with all rename options enabled, rename also embedded "Root" in variable and method names. The following classes/methods were excluded in the rename: - BootstrapHandler.getApplicationCSSClassName() - ComponentLocator - ConnectorMap - ItemClickEvent - KeepAllItemsVisible - MenuBarTest - MenuBarTooltips - TreeTableTest - TreeWithIcons - Trees - VDebugConsole.printLayoutProblems() --- server/src/com/vaadin/Application.java | 154 +-- server/src/com/vaadin/annotations/EagerInit.java | 6 +- server/src/com/vaadin/annotations/Theme.java | 4 +- server/src/com/vaadin/annotations/Widgetset.java | 4 +- .../vaadin/terminal/AbstractClientConnector.java | 30 +- .../com/vaadin/terminal/AbstractRootProvider.java | 6 +- .../com/vaadin/terminal/DefaultRootProvider.java | 8 +- .../vaadin/terminal/DeploymentConfiguration.java | 2 +- server/src/com/vaadin/terminal/Page.java | 60 +- server/src/com/vaadin/terminal/RootProvider.java | 8 +- server/src/com/vaadin/terminal/WrappedRequest.java | 4 +- .../gwt/server/AbstractApplicationPortlet.java | 24 +- .../gwt/server/AbstractApplicationServlet.java | 12 +- .../gwt/server/AbstractCommunicationManager.java | 120 +- .../gwt/server/BootstrapFragmentResponse.java | 2 +- .../terminal/gwt/server/BootstrapHandler.java | 32 +- .../terminal/gwt/server/BootstrapPageResponse.java | 2 +- .../terminal/gwt/server/BootstrapResponse.java | 18 +- .../terminal/gwt/server/ClientConnector.java | 8 +- .../gwt/server/ClientMethodInvocation.java | 2 +- .../terminal/gwt/server/CommunicationManager.java | 10 +- .../terminal/gwt/server/DragAndDropService.java | 4 +- .../gwt/server/PortletApplicationContext2.java | 44 +- .../gwt/server/PortletCommunicationManager.java | 10 +- .../terminal/gwt/server/ServletPortletHelper.java | 6 +- server/src/com/vaadin/ui/AbstractComponent.java | 6 +- server/src/com/vaadin/ui/Component.java | 14 +- server/src/com/vaadin/ui/ConnectorTracker.java | 36 +- server/src/com/vaadin/ui/LoginForm.java | 4 +- server/src/com/vaadin/ui/Root.java | 1241 -------------------- server/src/com/vaadin/ui/UI.java | 1241 ++++++++++++++++++++ server/src/com/vaadin/ui/Window.java | 20 +- server/src/org/jsoup/select/Evaluator.java | 2 +- 33 files changed, 1572 insertions(+), 1572 deletions(-) delete mode 100644 server/src/com/vaadin/ui/Root.java create mode 100644 server/src/com/vaadin/ui/UI.java (limited to 'server/src') diff --git a/server/src/com/vaadin/Application.java b/server/src/com/vaadin/Application.java index d2924eb716..23d407e4f3 100644 --- a/server/src/com/vaadin/Application.java +++ b/server/src/com/vaadin/Application.java @@ -74,7 +74,7 @@ import com.vaadin.terminal.gwt.server.WebApplicationContext; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.AbstractComponent; import com.vaadin.ui.AbstractField; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; import com.vaadin.ui.Table; import com.vaadin.ui.Window; @@ -134,7 +134,7 @@ public class Application implements Terminal.ErrorListener, Serializable { /** * The name of the parameter that is by default used in e.g. web.xml to - * define the name of the default {@link Root} class. + * define the name of the default {@link UI} class. */ public static final String ROOT_PARAMETER = "root"; @@ -164,10 +164,10 @@ public class Application implements Terminal.ErrorListener, Serializable { private static final Pattern WINDOW_NAME_PATTERN = Pattern .compile("^/?([^/]+).*"); - private Root.LegacyWindow mainWindow; + private UI.LegacyWindow mainWindow; private String theme; - private Map legacyRootNames = new HashMap(); + private Map legacyRootNames = new HashMap(); /** * Sets the main window of this application. Setting window as a main @@ -176,7 +176,7 @@ public class Application implements Terminal.ErrorListener, Serializable { * @param mainWindow * the root to set as the default window */ - public void setMainWindow(Root.LegacyWindow mainWindow) { + public void setMainWindow(UI.LegacyWindow mainWindow) { if (this.mainWindow != null) { throw new IllegalStateException( "mainWindow has already been set"); @@ -203,7 +203,7 @@ public class Application implements Terminal.ErrorListener, Serializable { * * @return the root used as the default window */ - public Root.LegacyWindow getMainWindow() { + public UI.LegacyWindow getMainWindow() { return mainWindow; } @@ -219,7 +219,7 @@ public class Application implements Terminal.ErrorListener, Serializable { */ @Override - public Root.LegacyWindow getRoot(WrappedRequest request) { + public UI.LegacyWindow getRoot(WrappedRequest request) { String pathInfo = request.getRequestPathInfo(); String name = null; if (pathInfo != null && pathInfo.length() > 0) { @@ -229,7 +229,7 @@ public class Application implements Terminal.ErrorListener, Serializable { name = matcher.group(1); } } - Root.LegacyWindow window = getWindow(name); + UI.LegacyWindow window = getWindow(name); if (window != null) { return window; } @@ -240,7 +240,7 @@ public class Application implements Terminal.ErrorListener, Serializable { * Sets the application's theme. *

* Note that this theme can be overridden for a specific root with - * {@link Application#getThemeForRoot(Root)}. Setting theme to be + * {@link Application#getThemeForRoot(UI)}. Setting theme to be * null selects the default theme. For the available theme * names, see the contents of the VAADIN/themes directory. *

@@ -254,7 +254,7 @@ public class Application implements Terminal.ErrorListener, Serializable { /** * Gets the application's theme. The application's theme is the default - * theme used by all the roots for which a theme is not explicitly + * theme used by all the uIs for which a theme is not explicitly * defined. If the application theme is not explicitly set, * null is returned. * @@ -272,7 +272,7 @@ public class Application implements Terminal.ErrorListener, Serializable { */ @Override - public String getThemeForRoot(Root root) { + public String getThemeForRoot(UI uI) { return theme; } @@ -288,7 +288,7 @@ public class Application implements Terminal.ErrorListener, Serializable { * @return a root corresponding to the name, or null to use * the default window */ - public Root.LegacyWindow getWindow(String name) { + public UI.LegacyWindow getWindow(String name) { return legacyRootNames.get(name); } @@ -299,42 +299,42 @@ public class Application implements Terminal.ErrorListener, Serializable { /** * Adds a new browser level window to this application. Please note that - * Root doesn't have a name that is used in the URL - to add a named - * window you should instead use {@link #addWindow(Root, String)} + * UI doesn't have a name that is used in the URL - to add a named + * window you should instead use {@link #addWindow(UI, String)} * - * @param root + * @param uI * the root window to add to the application * @return returns the name that has been assigned to the window * - * @see #addWindow(Root, String) + * @see #addWindow(UI, String) */ - public void addWindow(Root.LegacyWindow root) { - if (root.getName() == null) { + public void addWindow(UI.LegacyWindow uI) { + if (uI.getName() == null) { String name = Integer.toString(namelessRootIndex++); - root.setName(name); + uI.setName(name); } - legacyRootNames.put(root.getName(), root); - root.setApplication(this); + legacyRootNames.put(uI.getName(), uI); + uI.setApplication(this); } /** * Removes the specified window from the application. This also removes * all name mappings for the window (see - * {@link #addWindow(Root, String) and #getWindowName(Root)}. + * {@link #addWindow(UI, String) and #getWindowName(UI)}. * *

* Note that removing window from the application does not close the * browser window - the window is only removed from the server-side. *

* - * @param root + * @param uI * the root to remove */ - public void removeWindow(Root.LegacyWindow root) { - for (Entry entry : legacyRootNames + public void removeWindow(UI.LegacyWindow uI) { + for (Entry entry : legacyRootNames .entrySet()) { - if (entry.getValue() == root) { + if (entry.getValue() == uI) { legacyRootNames.remove(entry.getKey()); } } @@ -349,7 +349,7 @@ public class Application implements Terminal.ErrorListener, Serializable { * * @return the unmodifiable collection of windows. */ - public Collection getWindows() { + public Collection getWindows() { return Collections.unmodifiableCollection(legacyRootNames.values()); } } @@ -490,14 +490,14 @@ public class Application implements Terminal.ErrorListener, Serializable { private LinkedList requestHandlers = new LinkedList(); private int nextRootId = 0; - private Map roots = new HashMap(); + private Map uIs = new HashMap(); private final Map retainOnRefreshRoots = new HashMap(); private final EventRouter eventRouter = new EventRouter(); /** - * Keeps track of which roots have been inited. + * Keeps track of which uIs have been inited. *

* TODO Investigate whether this might be derived from the different states * in getRootForRrequest. @@ -1844,7 +1844,7 @@ public class Application implements Terminal.ErrorListener, Serializable { *

* *

- * If {@link BrowserDetails} are required to create a Root, the + * If {@link BrowserDetails} are required to create a UI, the * implementation can throw a {@link RootRequiresMoreInformationException} * exception. In this case, the framework will instruct the browser to send * the additional details, whereupon this method is invoked again with the @@ -1854,10 +1854,10 @@ public class Application implements Terminal.ErrorListener, Serializable { * *

* The default implementation in {@link Application} creates a new instance - * of the Root class returned by {@link #getRootClassName(WrappedRequest)}, + * of the UI class returned by {@link #getRootClassName(WrappedRequest)}, * which in turn uses the {@value #ROOT_PARAMETER} parameter from web.xml. * If {@link DeploymentConfiguration#getClassLoader()} for the request - * returns a {@link ClassLoader}, it is used for loading the Root class. + * returns a {@link ClassLoader}, it is used for loading the UI class. * Otherwise the {@link ClassLoader} used to load this class is used. *

* @@ -1869,20 +1869,20 @@ public class Application implements Terminal.ErrorListener, Serializable { * {@link BrowserDetails} are required to create a root * * @see #getRootClassName(WrappedRequest) - * @see Root + * @see UI * @see RootRequiresMoreInformationException * @see WrappedRequest#getBrowserDetails() * * @since 7.0 */ - protected Root getRoot(WrappedRequest request) + protected UI getRoot(WrappedRequest request) throws RootRequiresMoreInformationException { // Iterate in reverse order - test check newest provider first for (int i = rootProviders.size() - 1; i >= 0; i--) { RootProvider provider = rootProviders.get(i); - Class rootClass = provider.getRootClass(this, + Class rootClass = provider.getRootClass(this, request); if (rootClass != null) { @@ -1900,15 +1900,15 @@ public class Application implements Terminal.ErrorListener, Serializable { * * TODO Tell what the default implementation does once it does something. * - * @param root + * @param uI * the root to get a theme for * @return the name of the theme, or null if the default theme * should be used * * @since 7.0 */ - public String getThemeForRoot(Root root) { - Theme rootTheme = getAnnotationFor(root.getClass(), Theme.class); + public String getThemeForRoot(UI uI) { + Theme rootTheme = getAnnotationFor(uI.getClass(), Theme.class); if (rootTheme != null) { return rootTheme.value(); } else { @@ -1922,15 +1922,15 @@ public class Application implements Terminal.ErrorListener, Serializable { * * TODO Tell what the default implementation does once it does something. * - * @param root + * @param uI * the root to get a widgetset for * @return the name of the widgetset, or null if the default * widgetset should be used * * @since 7.0 */ - public String getWidgetsetForRoot(Root root) { - Widgetset rootWidgetset = getAnnotationFor(root.getClass(), + public String getWidgetsetForRoot(UI uI) { + Widgetset rootWidgetset = getAnnotationFor(uI.getClass(), Widgetset.class); if (rootWidgetset != null) { return rootWidgetset.value(); @@ -2148,16 +2148,16 @@ public class Application implements Terminal.ErrorListener, Serializable { } /** - * Finds the {@link Root} to which a particular request belongs. If the - * request originates from an existing Root, that root is returned. In other + * Finds the {@link UI} to which a particular request belongs. If the + * request originates from an existing UI, that root is returned. In other * cases, the method attempts to create and initialize a new root and might * throw a {@link RootRequiresMoreInformationException} if all required * information is not available. *

* Please note that this method can also return a newly created - * Root which has not yet been initialized. You can use + * UI which has not yet been initialized. You can use * {@link #isRootInitPending(int)} with the root's id ( - * {@link Root#getRootId()} to check whether the initialization is still + * {@link UI#getRootId()} to check whether the initialization is still * pending. *

* @@ -2173,11 +2173,11 @@ public class Application implements Terminal.ErrorListener, Serializable { * * @since 7.0 */ - public Root getRootForRequest(WrappedRequest request) + public UI getRootForRequest(WrappedRequest request) throws RootRequiresMoreInformationException { - Root root = Root.getCurrent(); - if (root != null) { - return root; + UI uI = UI.getCurrent(); + if (uI != null) { + return uI; } Integer rootId = getRootId(request); @@ -2186,9 +2186,9 @@ public class Application implements Terminal.ErrorListener, Serializable { boolean hasBrowserDetails = browserDetails != null && browserDetails.getUriFragment() != null; - root = roots.get(rootId); + uI = uIs.get(rootId); - if (root == null && isRootPreserved()) { + if (uI == null && isRootPreserved()) { // Check for a known root if (!retainOnRefreshRoots.isEmpty()) { @@ -2202,39 +2202,39 @@ public class Application implements Terminal.ErrorListener, Serializable { if (retainedRootId != null) { rootId = retainedRootId; - root = roots.get(rootId); + uI = uIs.get(rootId); } } } - if (root == null) { + if (uI == null) { // Throws exception if root can not yet be created - root = getRoot(request); + uI = getRoot(request); // Initialize some fields for a newly created root - if (root.getApplication() == null) { - root.setApplication(this); + if (uI.getApplication() == null) { + uI.setApplication(this); } - if (root.getRootId() < 0) { + if (uI.getRootId() < 0) { if (rootId == null) { // Get the next id if none defined rootId = Integer.valueOf(nextRootId++); } - root.setRootId(rootId.intValue()); - roots.put(rootId, root); + uI.setRootId(rootId.intValue()); + uIs.put(rootId, uI); } } // Set thread local here so it is available in init - Root.setCurrent(root); + UI.setCurrent(uI); if (!initedRoots.contains(rootId)) { boolean initRequiresBrowserDetails = isRootPreserved() - || !root.getClass() + || !uI.getClass() .isAnnotationPresent(EagerInit.class); if (!initRequiresBrowserDetails || hasBrowserDetails) { - root.doInit(request); + uI.doInit(request); // Remember that this root has been initialized initedRoots.add(rootId); @@ -2250,7 +2250,7 @@ public class Application implements Terminal.ErrorListener, Serializable { } } // end synchronized block - return root; + return uI; } /** @@ -2276,7 +2276,7 @@ public class Application implements Terminal.ErrorListener, Serializable { } /** - * Sets whether the same Root state should be reused if the framework can + * Sets whether the same UI state should be reused if the framework can * detect that the application is opened in a browser window where it has * previously been open. The framework attempts to discover this by checking * the value of window.name in the browser. @@ -2286,7 +2286,7 @@ public class Application implements Terminal.ErrorListener, Serializable { *

* * @param rootPreserved - * trueif the same Root instance should be reused + * trueif the same UI instance should be reused * e.g. when the browser window is refreshed. */ public void setRootPreserved(boolean rootPreserved) { @@ -2297,12 +2297,12 @@ public class Application implements Terminal.ErrorListener, Serializable { } /** - * Checks whether the same Root state should be reused if the framework can + * Checks whether the same UI state should be reused if the framework can * detect that the application is opened in a browser window where it has * previously been open. The framework attempts to discover this by checking * the value of window.name in the browser. * - * @return trueif the same Root instance should be reused e.g. + * @return trueif the same UI instance should be reused e.g. * when the browser window is refreshed. */ public boolean isRootPreserved() { @@ -2326,21 +2326,21 @@ public class Application implements Terminal.ErrorListener, Serializable { } /** - * Gets all the roots of this application. This includes roots that have - * been requested but not yet initialized. Please note, that roots are not + * Gets all the uIs of this application. This includes uIs that have + * been requested but not yet initialized. Please note, that uIs are not * automatically removed e.g. if the browser window is closed and that there - * is no way to manually remove a root. Inactive roots will thus not be + * is no way to manually remove a root. Inactive uIs will thus not be * released for GC until the entire application is released when the session * has timed out (unless there are dangling references). Improved support - * for releasing unused roots is planned for an upcoming alpha release of + * for releasing unused uIs is planned for an upcoming alpha release of * Vaadin 7. * - * @return a collection of roots belonging to this application + * @return a collection of uIs belonging to this application * * @since 7.0 */ - public Collection getRoots() { - return Collections.unmodifiableCollection(roots.values()); + public Collection getRoots() { + return Collections.unmodifiableCollection(uIs.values()); } private int connectorIdSequence = 0; @@ -2362,7 +2362,7 @@ public class Application implements Terminal.ErrorListener, Serializable { } /** - * Returns a Root with the given id. + * Returns a UI with the given id. *

* This is meant for framework internal use. *

@@ -2371,8 +2371,8 @@ public class Application implements Terminal.ErrorListener, Serializable { * The root id * @return The root with the given id or null if not found */ - public Root getRootById(int rootId) { - return roots.get(rootId); + public UI getRootById(int rootId) { + return uIs.get(rootId); } /** diff --git a/server/src/com/vaadin/annotations/EagerInit.java b/server/src/com/vaadin/annotations/EagerInit.java index 5131a79576..462c6bb5ac 100644 --- a/server/src/com/vaadin/annotations/EagerInit.java +++ b/server/src/com/vaadin/annotations/EagerInit.java @@ -21,15 +21,15 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import com.vaadin.terminal.WrappedRequest; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** - * Indicates that the init method in a Root class can be called before full + * Indicates that the init method in a UI class can be called before full * browser details ({@link WrappedRequest#getBrowserDetails()}) are available. * This will make the UI appear more quickly, as ensuring the availability of * this information typically requires an additional round trip to the client. * - * @see Root#init(com.vaadin.terminal.WrappedRequest) + * @see UI#init(com.vaadin.terminal.WrappedRequest) * @see WrappedRequest#getBrowserDetails() * * @since 7.0 diff --git a/server/src/com/vaadin/annotations/Theme.java b/server/src/com/vaadin/annotations/Theme.java index e2610d2b3f..052bc245fd 100644 --- a/server/src/com/vaadin/annotations/Theme.java +++ b/server/src/com/vaadin/annotations/Theme.java @@ -21,10 +21,10 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** - * Defines a specific theme for a {@link Root}. + * Defines a specific theme for a {@link UI}. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/server/src/com/vaadin/annotations/Widgetset.java b/server/src/com/vaadin/annotations/Widgetset.java index e80f887691..69e3e19319 100644 --- a/server/src/com/vaadin/annotations/Widgetset.java +++ b/server/src/com/vaadin/annotations/Widgetset.java @@ -21,10 +21,10 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** - * Defines a specific theme for a {@link Root}. + * Defines a specific theme for a {@link UI}. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) diff --git a/server/src/com/vaadin/terminal/AbstractClientConnector.java b/server/src/com/vaadin/terminal/AbstractClientConnector.java index d2490225fb..87e1dbaa38 100644 --- a/server/src/com/vaadin/terminal/AbstractClientConnector.java +++ b/server/src/com/vaadin/terminal/AbstractClientConnector.java @@ -43,7 +43,7 @@ import com.vaadin.terminal.gwt.server.RpcManager; import com.vaadin.terminal.gwt.server.RpcTarget; import com.vaadin.terminal.gwt.server.ServerRpcManager; import com.vaadin.ui.HasComponents; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * An abstract base class for ClientConnector implementations. This class @@ -94,9 +94,9 @@ public abstract class AbstractClientConnector implements ClientConnector { /* Documentation copied from interface */ @Override public void markAsDirty() { - Root root = getRoot(); - if (root != null) { - root.getConnectorTracker().markDirty(this); + UI uI = getRoot(); + if (uI != null) { + uI.getConnectorTracker().markDirty(this); } } @@ -154,8 +154,8 @@ public abstract class AbstractClientConnector implements ClientConnector { sharedState = createState(); } - Root root = getRoot(); - if (root != null && !root.getConnectorTracker().isDirty(this)) { + UI uI = getRoot(); + if (uI != null && !uI.getConnectorTracker().isDirty(this)) { requestRepaint(); } @@ -363,28 +363,28 @@ public abstract class AbstractClientConnector implements ClientConnector { * @return The connector's application, or null if not attached */ protected Application getApplication() { - Root root = getRoot(); - if (root == null) { + UI uI = getRoot(); + if (uI == null) { return null; } else { - return root.getApplication(); + return uI.getApplication(); } } /** - * Finds a Root ancestor of this connector. null is returned if - * no Root ancestor is found (typically because the connector is not + * Finds a UI ancestor of this connector. null is returned if + * no UI ancestor is found (typically because the connector is not * attached to a proper hierarchy). * - * @return the Root ancestor of this connector, or null if none + * @return the UI ancestor of this connector, or null if none * is found. */ @Override - public Root getRoot() { + public UI getRoot() { ClientConnector connector = this; while (connector != null) { - if (connector instanceof Root) { - return (Root) connector; + if (connector instanceof UI) { + return (UI) connector; } connector = connector.getParent(); } diff --git a/server/src/com/vaadin/terminal/AbstractRootProvider.java b/server/src/com/vaadin/terminal/AbstractRootProvider.java index 0b63003440..b340c62448 100644 --- a/server/src/com/vaadin/terminal/AbstractRootProvider.java +++ b/server/src/com/vaadin/terminal/AbstractRootProvider.java @@ -17,13 +17,13 @@ package com.vaadin.terminal; import com.vaadin.Application; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; public abstract class AbstractRootProvider implements RootProvider { @Override - public Root instantiateRoot(Application application, - Class type, WrappedRequest request) { + public UI instantiateRoot(Application application, + Class type, WrappedRequest request) { try { return type.newInstance(); } catch (InstantiationException e) { diff --git a/server/src/com/vaadin/terminal/DefaultRootProvider.java b/server/src/com/vaadin/terminal/DefaultRootProvider.java index cbf8c98828..07533949a0 100644 --- a/server/src/com/vaadin/terminal/DefaultRootProvider.java +++ b/server/src/com/vaadin/terminal/DefaultRootProvider.java @@ -18,12 +18,12 @@ package com.vaadin.terminal; import com.vaadin.Application; import com.vaadin.RootRequiresMoreInformationException; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; public class DefaultRootProvider extends AbstractRootProvider { @Override - public Class getRootClass(Application application, + public Class getRootClass(Application application, WrappedRequest request) throws RootRequiresMoreInformationException { Object rootClassNameObj = application .getProperty(Application.ROOT_PARAMETER); @@ -37,8 +37,8 @@ public class DefaultRootProvider extends AbstractRootProvider { classLoader = getClass().getClassLoader(); } try { - Class rootClass = Class.forName(rootClassName, - true, classLoader).asSubclass(Root.class); + Class rootClass = Class.forName(rootClassName, + true, classLoader).asSubclass(UI.class); return rootClass; } catch (ClassNotFoundException e) { diff --git a/server/src/com/vaadin/terminal/DeploymentConfiguration.java b/server/src/com/vaadin/terminal/DeploymentConfiguration.java index 14a5a3724f..8da088969d 100644 --- a/server/src/com/vaadin/terminal/DeploymentConfiguration.java +++ b/server/src/com/vaadin/terminal/DeploymentConfiguration.java @@ -97,7 +97,7 @@ public interface DeploymentConfiguration extends Serializable { /** * Get the class loader to use for loading classes loaded by name, e.g. - * custom Root classes. null indicates that the default class + * custom UI classes. null indicates that the default class * loader should be used. * * @return the class loader to use, or null diff --git a/server/src/com/vaadin/terminal/Page.java b/server/src/com/vaadin/terminal/Page.java index 41ab8cc8b6..95f9a7b3ec 100644 --- a/server/src/com/vaadin/terminal/Page.java +++ b/server/src/com/vaadin/terminal/Page.java @@ -33,19 +33,19 @@ import com.vaadin.terminal.gwt.server.WebBrowser; import com.vaadin.tools.ReflectTools; import com.vaadin.ui.JavaScript; import com.vaadin.ui.Notification; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; public class Page implements Serializable { /** * Listener that gets notified when the size of the browser window - * containing the root has changed. + * containing the uI has changed. * - * @see Root#addListener(BrowserWindowResizeListener) + * @see UI#addListener(BrowserWindowResizeListener) */ public interface BrowserWindowResizeListener extends Serializable { /** - * Invoked when the browser window containing a Root has been resized. + * Invoked when the browser window containing a UI has been resized. * * @param event * a browser window resize event @@ -54,7 +54,7 @@ public class Page implements Serializable { } /** - * Event that is fired when a browser window containing a root is resized. + * Event that is fired when a browser window containing a uI is resized. */ public class BrowserWindowResizeEvent extends EventObject { @@ -65,7 +65,7 @@ public class Page implements Serializable { * Creates a new event * * @param source - * the root for which the browser window has been resized + * the uI for which the browser window has been resized * @param width * the new width of the browser window * @param height @@ -254,9 +254,9 @@ public class Page implements Serializable { } /** - * Gets the root in which the fragment has changed. + * Gets the uI in which the fragment has changed. * - * @return the root in which the fragment has changed + * @return the uI in which the fragment has changed */ public Page getPage() { return (Page) getSource(); @@ -279,15 +279,15 @@ public class Page implements Serializable { */ private String fragment; - private final Root root; + private final UI uI; private int browserWindowWidth = -1; private int browserWindowHeight = -1; private JavaScript javaScript; - public Page(Root root) { - this.root = root; + public Page(UI uI) { + this.uI = uI; } private void addListener(Class eventType, Object target, Method method) { @@ -332,7 +332,7 @@ public class Page implements Serializable { if (fireEvents) { fireEvent(new FragmentChangedEvent(this, newFragment)); } - root.markAsDirty(); + uI.markAsDirty(); } } @@ -374,7 +374,7 @@ public class Page implements Serializable { } public WebBrowser getWebBrowser() { - return ((WebApplicationContext) root.getApplication().getContext()) + return ((WebApplicationContext) uI.getApplication().getContext()) .getBrowser(); } @@ -399,8 +399,8 @@ public class Page implements Serializable { } /** - * Adds a new {@link BrowserWindowResizeListener} to this root. The listener - * will be notified whenever the browser window within which this root + * Adds a new {@link BrowserWindowResizeListener} to this uI. The listener + * will be notified whenever the browser window within which this uI * resides is resized. * * @param resizeListener @@ -415,7 +415,7 @@ public class Page implements Serializable { } /** - * Removes a {@link BrowserWindowResizeListener} from this root. The + * Removes a {@link BrowserWindowResizeListener} from this uI. The * listener will no longer be notified when the browser window is resized. * * @param resizeListener @@ -427,7 +427,7 @@ public class Page implements Serializable { } /** - * Gets the last known height of the browser window in which this root + * Gets the last known height of the browser window in which this uI * resides. * * @return the browser window height in pixels @@ -437,7 +437,7 @@ public class Page implements Serializable { } /** - * Gets the last known width of the browser window in which this root + * Gets the last known width of the browser window in which this uI * resides. * * @return the browser window width in pixels @@ -450,7 +450,7 @@ public class Page implements Serializable { if (javaScript == null) { // Create and attach on first use javaScript = new JavaScript(); - javaScript.extend(root); + javaScript.extend(uI); } return javaScript; @@ -515,15 +515,15 @@ public class Page implements Serializable { } /** - * Opens the given resource in this root. The contents of this Root is + * Opens the given resource in this uI. The contents of this UI is * replaced by the {@code Resource}. * * @param resource - * the resource to show in this root + * the resource to show in this uI */ public void open(Resource resource) { openList.add(new OpenResource(resource, null, -1, -1, BORDER_DEFAULT)); - root.markAsDirty(); + uI.markAsDirty(); } /** @@ -566,7 +566,7 @@ public class Page implements Serializable { public void open(Resource resource, String windowName) { openList.add(new OpenResource(resource, windowName, -1, -1, BORDER_DEFAULT)); - root.markAsDirty(); + uI.markAsDirty(); } /** @@ -589,7 +589,7 @@ public class Page implements Serializable { int height, BorderStyle border) { openList.add(new OpenResource(resource, windowName, width, height, border)); - root.markAsDirty(); + uI.markAsDirty(); } /** @@ -603,7 +603,7 @@ public class Page implements Serializable { notifications = new LinkedList(); } notifications.add(notification); - root.markAsDirty(); + uI.markAsDirty(); } /** @@ -622,17 +622,17 @@ public class Page implements Serializable { } /** - * Gets the Page to which the current root belongs. This is automatically + * Gets the Page to which the current uI belongs. This is automatically * defined when processing requests to the server. In other cases, (e.g. - * from background threads), the current root is not automatically defined. + * from background threads), the current uI is not automatically defined. * - * @see Root#getCurrent() + * @see UI#getCurrent() * * @return the current page instance if available, otherwise * null */ public static Page getCurrent() { - Root currentRoot = Root.getCurrent(); + UI currentRoot = UI.getCurrent(); if (currentRoot == null) { return null; } @@ -647,7 +647,7 @@ public class Page implements Serializable { * the new page title to set */ public void setTitle(String title) { - root.getRpcProxy(PageClientRpc.class).setTitle(title); + uI.getRpcProxy(PageClientRpc.class).setTitle(title); } } diff --git a/server/src/com/vaadin/terminal/RootProvider.java b/server/src/com/vaadin/terminal/RootProvider.java index 476cf1bd78..53173b6b94 100644 --- a/server/src/com/vaadin/terminal/RootProvider.java +++ b/server/src/com/vaadin/terminal/RootProvider.java @@ -18,12 +18,12 @@ package com.vaadin.terminal; import com.vaadin.Application; import com.vaadin.RootRequiresMoreInformationException; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; public interface RootProvider { - public Class getRootClass(Application application, + public Class getRootClass(Application application, WrappedRequest request) throws RootRequiresMoreInformationException; - public Root instantiateRoot(Application application, - Class type, WrappedRequest request); + public UI instantiateRoot(Application application, + Class type, WrappedRequest request); } diff --git a/server/src/com/vaadin/terminal/WrappedRequest.java b/server/src/com/vaadin/terminal/WrappedRequest.java index c317eae048..1186d678b0 100644 --- a/server/src/com/vaadin/terminal/WrappedRequest.java +++ b/server/src/com/vaadin/terminal/WrappedRequest.java @@ -30,7 +30,7 @@ import com.vaadin.Application; import com.vaadin.RootRequiresMoreInformationException; import com.vaadin.annotations.EagerInit; import com.vaadin.terminal.gwt.server.WebBrowser; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * A generic request to the server, wrapping a more specific request type, e.g. @@ -221,7 +221,7 @@ public interface WrappedRequest extends Serializable { * This information is only guaranteed to be available in some special * cases, for instance when {@link Application#getRoot} is called again * after throwing {@link RootRequiresMoreInformationException} or in - * {@link Root#init(WrappedRequest)} for a Root class not annotated with + * {@link UI#init(WrappedRequest)} for a UI class not annotated with * {@link EagerInit} * * @return the browser details, or null if details are not diff --git a/server/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java b/server/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java index bd39504237..2315a9c1d6 100644 --- a/server/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java +++ b/server/src/com/vaadin/terminal/gwt/server/AbstractApplicationPortlet.java @@ -62,7 +62,7 @@ import com.vaadin.terminal.Terminal; import com.vaadin.terminal.WrappedRequest; import com.vaadin.terminal.WrappedResponse; import com.vaadin.terminal.gwt.server.AbstractCommunicationManager.Callback; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * Portlet 2.0 base class. This replaces the servlet in servlet/portlet 1.0 @@ -488,17 +488,17 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet /* Notify listeners */ // Finds the window within the application - Root root = null; + UI uI = null; synchronized (application) { if (application.isRunning()) { switch (requestType) { case RENDER: case ACTION: // Both action requests and render requests are ok - // without a Root as they render the initial HTML + // without a UI as they render the initial HTML // and then do a second request try { - root = application + uI = application .getRootForRequest(wrappedRequest); } catch (RootRequiresMoreInformationException e) { // Ignore problem and continue without root @@ -516,7 +516,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // root = application.getRoot(); break; default: - root = application + uI = application .getRootForRequest(wrappedRequest); } // if window not found, not a problem - use null @@ -527,25 +527,25 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet // starts? if (request instanceof RenderRequest) { applicationContext.firePortletRenderRequest(application, - root, (RenderRequest) request, + uI, (RenderRequest) request, (RenderResponse) response); } else if (request instanceof ActionRequest) { applicationContext.firePortletActionRequest(application, - root, (ActionRequest) request, + uI, (ActionRequest) request, (ActionResponse) response); } else if (request instanceof EventRequest) { applicationContext.firePortletEventRequest(application, - root, (EventRequest) request, + uI, (EventRequest) request, (EventResponse) response); } else if (request instanceof ResourceRequest) { applicationContext.firePortletResourceRequest(application, - root, (ResourceRequest) request, + uI, (ResourceRequest) request, (ResourceResponse) response); } /* Handle the request */ if (requestType == RequestType.FILE_UPLOAD) { - // Root is resolved in handleFileUpload by + // UI is resolved in handleFileUpload by // PortletCommunicationManager applicationManager.handleFileUpload(application, wrappedRequest, wrappedResponse); @@ -557,7 +557,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } else if (requestType == RequestType.UIDL) { // Handles AJAX UIDL requests applicationManager.handleUidlRequest(wrappedRequest, - wrappedResponse, portletWrapper, root); + wrappedResponse, portletWrapper, uI); return; } else { /* @@ -599,7 +599,7 @@ public abstract class AbstractApplicationPortlet extends GenericPortlet } } finally { - Root.setCurrent(null); + UI.setCurrent(null); Application.setCurrent(null); PortletSession session = request diff --git a/server/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java b/server/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java index 062ba6cdf7..b17ef20cde 100644 --- a/server/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java +++ b/server/src/com/vaadin/terminal/gwt/server/AbstractApplicationServlet.java @@ -56,7 +56,7 @@ import com.vaadin.terminal.ThemeResource; import com.vaadin.terminal.WrappedRequest; import com.vaadin.terminal.WrappedResponse; import com.vaadin.terminal.gwt.server.AbstractCommunicationManager.Callback; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * Abstract implementation of the ApplicationServlet which handles all @@ -314,18 +314,18 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements /* Handle the request */ if (requestType == RequestType.FILE_UPLOAD) { - // Root is resolved in communication manager + // UI is resolved in communication manager applicationManager.handleFileUpload(application, request, response); return; } else if (requestType == RequestType.UIDL) { - Root root = application.getRootForRequest(request); - if (root == null) { + UI uI = application.getRootForRequest(request); + if (uI == null) { throw new ServletException(ERROR_NO_ROOT_FOUND); } // Handles AJAX UIDL requests applicationManager.handleUidlRequest(request, response, - servletWrapper, root); + servletWrapper, uI); return; } else if (requestType == RequestType.BROWSER_DETAILS) { // Browser details - not related to a specific root @@ -369,7 +369,7 @@ public abstract class AbstractApplicationServlet extends HttpServlet implements .onRequestEnd(request, response); } } finally { - Root.setCurrent(null); + UI.setCurrent(null); Application.setCurrent(null); HttpSession session = request.getSession(false); diff --git a/server/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java b/server/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java index b2436b2ce4..39475f3131 100644 --- a/server/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java +++ b/server/src/com/vaadin/terminal/gwt/server/AbstractCommunicationManager.java @@ -97,7 +97,7 @@ import com.vaadin.ui.AbstractField; import com.vaadin.ui.Component; import com.vaadin.ui.ConnectorTracker; import com.vaadin.ui.HasComponents; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; import com.vaadin.ui.Window; /** @@ -506,7 +506,7 @@ public abstract class AbstractCommunicationManager implements Serializable { * Internally process a UIDL request from the client. * * This method calls - * {@link #handleVariables(WrappedRequest, WrappedResponse, Callback, Application, Root)} + * {@link #handleVariables(WrappedRequest, WrappedResponse, Callback, Application, UI)} * to process any changes to variables by the client and then repaints * affected components using {@link #paintAfterVariableChanges()}. * @@ -520,7 +520,7 @@ public abstract class AbstractCommunicationManager implements Serializable { * @param request * @param response * @param callback - * @param root + * @param uI * target window for the UIDL request, can be null if target not * found * @throws IOException @@ -528,7 +528,7 @@ public abstract class AbstractCommunicationManager implements Serializable { * @throws JSONException */ public void handleUidlRequest(WrappedRequest request, - WrappedResponse response, Callback callback, Root root) + WrappedResponse response, Callback callback, UI uI) throws IOException, InvalidUIDLSecurityKeyException, JSONException { checkWidgetsetVersion(request); @@ -550,7 +550,7 @@ public abstract class AbstractCommunicationManager implements Serializable { if (request.getParameter(GET_PARAM_HIGHLIGHT_COMPONENT) != null) { String pid = request .getParameter(GET_PARAM_HIGHLIGHT_COMPONENT); - highlightedConnector = root.getConnectorTracker().getConnector( + highlightedConnector = uI.getConnectorTracker().getConnector( pid); highlightConnector(highlightedConnector); } @@ -567,7 +567,7 @@ public abstract class AbstractCommunicationManager implements Serializable { // Finds the window within the application if (application.isRunning()) { // Returns if no window found - if (root == null) { + if (uI == null) { // This should not happen, no windows exists but // application is still open. getLogger().warning("Could not get root for application"); @@ -580,7 +580,7 @@ public abstract class AbstractCommunicationManager implements Serializable { } // Change all variables based on request parameters - if (!handleVariables(request, response, callback, application, root)) { + if (!handleVariables(request, response, callback, application, uI)) { // var inconsistency; the client is probably out-of-sync SystemMessages ci = null; @@ -611,8 +611,8 @@ public abstract class AbstractCommunicationManager implements Serializable { } paintAfterVariableChanges(request, response, callback, repaintAll, - outWriter, root, analyzeLayouts); - postPaint(root); + outWriter, uI, analyzeLayouts); + postPaint(uI); } outWriter.close(); @@ -645,20 +645,20 @@ public abstract class AbstractCommunicationManager implements Serializable { * Method called after the paint phase while still being synchronized on the * application * - * @param root + * @param uI * */ - protected void postPaint(Root root) { + protected void postPaint(UI uI) { // Remove connectors that have been detached from the application during // handling of the request - root.getConnectorTracker().cleanConnectorMap(); + uI.getConnectorTracker().cleanConnectorMap(); if (pidToNameToStreamVariable != null) { Iterator iterator = pidToNameToStreamVariable.keySet() .iterator(); while (iterator.hasNext()) { String connectorId = iterator.next(); - if (root.getConnectorTracker().getConnector(connectorId) == null) { + if (uI.getConnectorTracker().getConnector(connectorId) == null) { // Owner is no longer attached to the application Map removed = pidToNameToStreamVariable .get(connectorId); @@ -746,7 +746,7 @@ public abstract class AbstractCommunicationManager implements Serializable { */ private void paintAfterVariableChanges(WrappedRequest request, WrappedResponse response, Callback callback, boolean repaintAll, - final PrintWriter outWriter, Root root, boolean analyzeLayouts) + final PrintWriter outWriter, UI uI, boolean analyzeLayouts) throws PaintException, IOException, JSONException { // Removes application if it has stopped during variable changes @@ -765,7 +765,7 @@ public abstract class AbstractCommunicationManager implements Serializable { outWriter.print(getSecurityKeyUIDL(request)); } - writeUidlResponse(request, repaintAll, outWriter, root, analyzeLayouts); + writeUidlResponse(request, repaintAll, outWriter, uI, analyzeLayouts); closeJsonMessage(outWriter); @@ -810,15 +810,15 @@ public abstract class AbstractCommunicationManager implements Serializable { @SuppressWarnings("unchecked") public void writeUidlResponse(WrappedRequest request, boolean repaintAll, - final PrintWriter outWriter, Root root, boolean analyzeLayouts) + final PrintWriter outWriter, UI uI, boolean analyzeLayouts) throws PaintException, JSONException { ArrayList dirtyVisibleConnectors = new ArrayList(); - Application application = root.getApplication(); + Application application = uI.getApplication(); // Paints components - ConnectorTracker rootConnectorTracker = root.getConnectorTracker(); + ConnectorTracker rootConnectorTracker = uI.getConnectorTracker(); getLogger().log(Level.FINE, "* Creating response to client"); if (repaintAll) { - getClientCache(root).clear(); + getClientCache(uI).clear(); rootConnectorTracker.markAllConnectorsDirty(); rootConnectorTracker.markAllClientSidesUninitialized(); @@ -851,12 +851,12 @@ public abstract class AbstractCommunicationManager implements Serializable { if (analyzeLayouts) { invalidComponentRelativeSizes = ComponentSizeValidator - .validateComponentRelativeSizes(root.getContent(), null, + .validateComponentRelativeSizes(uI.getContent(), null, null); // Also check any existing subwindows - if (root.getWindows() != null) { - for (Window subWindow : root.getWindows()) { + if (uI.getWindows() != null) { + for (Window subWindow : uI.getWindows()) { invalidComponentRelativeSizes = ComponentSizeValidator .validateComponentRelativeSizes( subWindow.getContent(), @@ -985,7 +985,7 @@ public abstract class AbstractCommunicationManager implements Serializable { // } paramJson.put(JsonCodec.encode( invocation.getParameters()[i], referenceParameter, - parameterType, root.getConnectorTracker())); + parameterType, uI.getConnectorTracker())); } invocationJson.put(paramJson); rpcCalls.put(invocationJson); @@ -1087,7 +1087,7 @@ public abstract class AbstractCommunicationManager implements Serializable { final String resource = (String) i.next(); InputStream is = null; try { - is = getThemeResourceAsStream(root, getTheme(root), resource); + is = getThemeResourceAsStream(uI, getTheme(uI), resource); } catch (final Exception e) { // FIXME: Handle exception getLogger().log(Level.FINER, @@ -1124,7 +1124,7 @@ public abstract class AbstractCommunicationManager implements Serializable { Collection> usedClientConnectors = paintTarget .getUsedClientConnectors(); boolean typeMappingsOpen = false; - ClientCache clientCache = getClientCache(root); + ClientCache clientCache = getClientCache(uI); List> newConnectorTypes = new ArrayList>(); @@ -1245,8 +1245,8 @@ public abstract class AbstractCommunicationManager implements Serializable { public static JSONObject encodeState(ClientConnector connector, SharedState state) throws JSONException { - Root root = connector.getRoot(); - ConnectorTracker connectorTracker = root.getConnectorTracker(); + UI uI = connector.getRoot(); + ConnectorTracker connectorTracker = uI.getConnectorTracker(); Class stateType = connector.getStateType(); Object diffState = connectorTracker.getDiffState(connector); if (diffState == null) { @@ -1260,7 +1260,7 @@ public abstract class AbstractCommunicationManager implements Serializable { try { SharedState referenceState = stateType.newInstance(); diffState = JsonCodec.encode(referenceState, null, - stateType, root.getConnectorTracker()); + stateType, uI.getConnectorTracker()); } catch (Exception e) { getLogger().log( Level.WARNING, @@ -1271,7 +1271,7 @@ public abstract class AbstractCommunicationManager implements Serializable { } } JSONObject stateJson = (JSONObject) JsonCodec.encode(state, diffState, - stateType, root.getConnectorTracker()); + stateType, uI.getConnectorTracker()); return stateJson; } @@ -1389,8 +1389,8 @@ public abstract class AbstractCommunicationManager implements Serializable { } - private ClientCache getClientCache(Root root) { - Integer rootId = Integer.valueOf(root.getRootId()); + private ClientCache getClientCache(UI uI) { + Integer rootId = Integer.valueOf(uI.getRootId()); ClientCache cache = rootToClientCache.get(rootId); if (cache == null) { cache = new ClientCache(); @@ -1440,7 +1440,7 @@ public abstract class AbstractCommunicationManager implements Serializable { HasComponents parent = child.getParent(); if (parent == null) { - if (child instanceof Root) { + if (child instanceof UI) { return child.isVisible(); } else { return false; @@ -1507,15 +1507,15 @@ public abstract class AbstractCommunicationManager implements Serializable { return pendingInvocations; } - protected abstract InputStream getThemeResourceAsStream(Root root, + protected abstract InputStream getThemeResourceAsStream(UI uI, String themeName, String resource); private int getTimeoutInterval() { return maxInactiveInterval; } - private String getTheme(Root root) { - String themeName = root.getApplication().getThemeForRoot(root); + private String getTheme(UI uI) { + String themeName = uI.getApplication().getThemeForRoot(uI); String requestThemeName = getRequestTheme(); if (requestThemeName != null) { @@ -1554,7 +1554,7 @@ public abstract class AbstractCommunicationManager implements Serializable { */ private boolean handleVariables(WrappedRequest request, WrappedResponse response, Callback callback, - Application application2, Root root) throws IOException, + Application application2, UI uI) throws IOException, InvalidUIDLSecurityKeyException, JSONException { boolean success = true; @@ -1590,7 +1590,7 @@ public abstract class AbstractCommunicationManager implements Serializable { for (int bi = 1; bi < bursts.length; bi++) { // unescape any encoded separator characters in the burst final String burst = unescapeBurst(bursts[bi]); - success &= handleBurst(request, root, burst); + success &= handleBurst(request, uI, burst); // In case that there were multiple bursts, we know that this is // a special synchronous case for closing window. Thus we are @@ -1605,7 +1605,7 @@ public abstract class AbstractCommunicationManager implements Serializable { new CharArrayWriter()); paintAfterVariableChanges(request, response, callback, - true, outWriter, root, false); + true, outWriter, uI, false); } @@ -1632,23 +1632,23 @@ public abstract class AbstractCommunicationManager implements Serializable { * directly. * * @param source - * @param root + * @param uI * the root receiving the burst * @param burst * the content of the burst as a String to be parsed * @return true if the processing of the burst was successful and there were * no messages to non-existent components */ - public boolean handleBurst(WrappedRequest source, Root root, + public boolean handleBurst(WrappedRequest source, UI uI, final String burst) { boolean success = true; try { Set enabledConnectors = new HashSet(); List invocations = parseInvocations( - root.getConnectorTracker(), burst); + uI.getConnectorTracker(), burst); for (MethodInvocation invocation : invocations) { - final ClientConnector connector = getConnector(root, + final ClientConnector connector = getConnector(uI, invocation.getConnectorId()); if (connector != null && connector.isConnectorEnabled()) { @@ -1659,7 +1659,7 @@ public abstract class AbstractCommunicationManager implements Serializable { for (int i = 0; i < invocations.size(); i++) { MethodInvocation invocation = invocations.get(i); - final ClientConnector connector = getConnector(root, + final ClientConnector connector = getConnector(uI, invocation.getConnectorId()); if (connector == null) { @@ -1715,7 +1715,7 @@ public abstract class AbstractCommunicationManager implements Serializable { if (connector instanceof Component) { errorComponent = (Component) connector; } - handleChangeVariablesError(root.getApplication(), + handleChangeVariablesError(uI.getApplication(), errorComponent, realException, null); } } else { @@ -1747,7 +1747,7 @@ public abstract class AbstractCommunicationManager implements Serializable { errorComponent = (Component) dropHandlerOwner; } } - handleChangeVariablesError(root.getApplication(), + handleChangeVariablesError(uI.getApplication(), errorComponent, e, changes); } } @@ -1877,8 +1877,8 @@ public abstract class AbstractCommunicationManager implements Serializable { owner.changeVariables(source, m); } - protected ClientConnector getConnector(Root root, String connectorId) { - ClientConnector c = root.getConnectorTracker() + protected ClientConnector getConnector(UI uI, String connectorId) { + ClientConnector c = uI.getConnectorTracker() .getConnector(connectorId); if (c == null && connectorId.equals(getDragAndDropService().getConnectorId())) { @@ -2417,18 +2417,18 @@ public abstract class AbstractCommunicationManager implements Serializable { // if we do not yet have a currentRoot, it should be initialized // shortly, and we should send the initial UIDL - boolean sendUIDL = Root.getCurrent() == null; + boolean sendUIDL = UI.getCurrent() == null; try { CombinedRequest combinedRequest = new CombinedRequest(request); - Root root = application.getRootForRequest(combinedRequest); + UI uI = application.getRootForRequest(combinedRequest); response.setContentType("application/json; charset=UTF-8"); // Use the same logic as for determined roots BootstrapHandler bootstrapHandler = getBootstrapHandler(); BootstrapContext context = bootstrapHandler.createContext( - combinedRequest, response, application, root.getRootId()); + combinedRequest, response, application, uI.getRootId()); String widgetset = context.getWidgetsetName(); String theme = context.getThemeName(); @@ -2439,10 +2439,10 @@ public abstract class AbstractCommunicationManager implements Serializable { JSONObject params = new JSONObject(); params.put("widgetset", widgetset); params.put("themeUri", themeUri); - // Root id might have changed based on e.g. window.name - params.put(ApplicationConstants.ROOT_ID_PARAMETER, root.getRootId()); + // UI id might have changed based on e.g. window.name + params.put(ApplicationConstants.ROOT_ID_PARAMETER, uI.getRootId()); if (sendUIDL) { - String initialUIDL = getInitialUIDL(combinedRequest, root); + String initialUIDL = getInitialUIDL(combinedRequest, uI); params.put("uidl", initialUIDL); } @@ -2473,7 +2473,7 @@ public abstract class AbstractCommunicationManager implements Serializable { * * @param request * the request that caused the initialization - * @param root + * @param uI * the root for which the UIDL should be generated * @return a string with the initial UIDL message * @throws PaintException @@ -2481,16 +2481,16 @@ public abstract class AbstractCommunicationManager implements Serializable { * @throws JSONException * if an exception occurs while encoding output */ - protected String getInitialUIDL(WrappedRequest request, Root root) + protected String getInitialUIDL(WrappedRequest request, UI uI) throws PaintException, JSONException { // TODO maybe unify writeUidlResponse()? StringWriter sWriter = new StringWriter(); PrintWriter pWriter = new PrintWriter(sWriter); pWriter.print("{"); - if (isXSRFEnabled(root.getApplication())) { + if (isXSRFEnabled(uI.getApplication())) { pWriter.print(getSecurityKeyUIDL(request)); } - writeUidlResponse(request, true, pWriter, root, false); + writeUidlResponse(request, true, pWriter, uI, false); pWriter.print("}"); String initialUIDL = sWriter.toString(); getLogger().log(Level.FINE, "Initial UIDL:" + initialUIDL); @@ -2628,15 +2628,15 @@ public abstract class AbstractCommunicationManager implements Serializable { String rootId = parts[0]; String connectorId = parts[1]; String variableName = parts[2]; - Root root = application.getRootById(Integer.parseInt(rootId)); - Root.setCurrent(root); + UI uI = application.getRootById(Integer.parseInt(rootId)); + UI.setCurrent(uI); StreamVariable streamVariable = getStreamVariable(connectorId, variableName); String secKey = streamVariableToSeckey.get(streamVariable); if (secKey.equals(parts[3])) { - ClientConnector source = getConnector(root, connectorId); + ClientConnector source = getConnector(uI, connectorId); String contentType = request.getContentType(); if (contentType.contains("boundary")) { // Multipart requests contain boundary string diff --git a/server/src/com/vaadin/terminal/gwt/server/BootstrapFragmentResponse.java b/server/src/com/vaadin/terminal/gwt/server/BootstrapFragmentResponse.java index fabb69784f..df77600150 100644 --- a/server/src/com/vaadin/terminal/gwt/server/BootstrapFragmentResponse.java +++ b/server/src/com/vaadin/terminal/gwt/server/BootstrapFragmentResponse.java @@ -49,7 +49,7 @@ public class BootstrapFragmentResponse extends BootstrapResponse { * the application for which the bootstrap page should be * generated * @param rootId - * the generated id of the Root that will be displayed on the + * the generated id of the UI that will be displayed on the * page * @param fragmentNodes * a mutable list containing the DOM nodes that will make up the diff --git a/server/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java b/server/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java index fad80cacaa..b6953da35e 100644 --- a/server/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java +++ b/server/src/com/vaadin/terminal/gwt/server/BootstrapHandler.java @@ -47,7 +47,7 @@ import com.vaadin.terminal.PaintException; import com.vaadin.terminal.RequestHandler; import com.vaadin.terminal.WrappedRequest; import com.vaadin.terminal.WrappedResponse; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; public abstract class BootstrapHandler implements RequestHandler { @@ -82,14 +82,14 @@ public abstract class BootstrapHandler implements RequestHandler { return bootstrapResponse.getRootId(); } - public Root getRoot() { + public UI getRoot() { return bootstrapResponse.getRoot(); } public String getWidgetsetName() { if (widgetsetName == null) { - Root root = getRoot(); - if (root != null) { + UI uI = getRoot(); + if (uI != null) { widgetsetName = getWidgetsetForRoot(this); } } @@ -98,8 +98,8 @@ public abstract class BootstrapHandler implements RequestHandler { public String getThemeName() { if (themeName == null) { - Root root = getRoot(); - if (root != null) { + UI uI = getRoot(); + if (uI != null) { themeName = findAndEscapeThemeName(this); } } @@ -127,13 +127,13 @@ public abstract class BootstrapHandler implements RequestHandler { // TODO Should all urls be handled here? Integer rootId = null; try { - Root root = application.getRootForRequest(request); - if (root == null) { - writeError(response, new Throwable("No Root found")); + UI uI = application.getRootForRequest(request); + if (uI == null) { + writeError(response, new Throwable("No UI found")); return true; } - rootId = Integer.valueOf(root.getRootId()); + rootId = Integer.valueOf(uI.getRootId()); } catch (RootRequiresMoreInformationException e) { // Just keep going without rootId } @@ -246,8 +246,8 @@ public abstract class BootstrapHandler implements RequestHandler { head.appendElement("meta").attr("http-equiv", "X-UA-Compatible") .attr("content", "chrome=1"); - Root root = context.getRoot(); - String title = ((root == null || root.getCaption() == null) ? "" : root + UI uI = context.getRoot(); + String title = ((uI == null || uI.getCaption() == null) ? "" : uI .getCaption()); head.appendElement("title").appendText(title); @@ -294,10 +294,10 @@ public abstract class BootstrapHandler implements RequestHandler { protected abstract String getApplicationId(BootstrapContext context); public String getWidgetsetForRoot(BootstrapContext context) { - Root root = context.getRoot(); + UI uI = context.getRoot(); WrappedRequest request = context.getRequest(); - String widgetset = root.getApplication().getWidgetsetForRoot(root); + String widgetset = uI.getApplication().getWidgetsetForRoot(uI); if (widgetset == null) { widgetset = request.getDeploymentConfiguration() .getConfiguredWidgetset(request); @@ -568,7 +568,7 @@ public abstract class BootstrapHandler implements RequestHandler { * * @param request * the originating request - * @param root + * @param uI * the root for which the UIDL should be generated * @return a string with the initial UIDL message * @throws PaintException @@ -576,7 +576,7 @@ public abstract class BootstrapHandler implements RequestHandler { * @throws JSONException * if an exception occurs while formatting the output */ - protected abstract String getInitialUIDL(WrappedRequest request, Root root) + protected abstract String getInitialUIDL(WrappedRequest request, UI uI) throws PaintException, JSONException; } diff --git a/server/src/com/vaadin/terminal/gwt/server/BootstrapPageResponse.java b/server/src/com/vaadin/terminal/gwt/server/BootstrapPageResponse.java index e7440f4c22..535ab23c92 100644 --- a/server/src/com/vaadin/terminal/gwt/server/BootstrapPageResponse.java +++ b/server/src/com/vaadin/terminal/gwt/server/BootstrapPageResponse.java @@ -52,7 +52,7 @@ public class BootstrapPageResponse extends BootstrapResponse { * the application for which the bootstrap page should be * generated * @param rootId - * the generated id of the Root that will be displayed on the + * the generated id of the UI that will be displayed on the * page * @param document * the DOM document making up the HTML page diff --git a/server/src/com/vaadin/terminal/gwt/server/BootstrapResponse.java b/server/src/com/vaadin/terminal/gwt/server/BootstrapResponse.java index 10f97e7e79..4f69dda48b 100644 --- a/server/src/com/vaadin/terminal/gwt/server/BootstrapResponse.java +++ b/server/src/com/vaadin/terminal/gwt/server/BootstrapResponse.java @@ -21,7 +21,7 @@ import java.util.EventObject; import com.vaadin.Application; import com.vaadin.RootRequiresMoreInformationException; import com.vaadin.terminal.WrappedRequest; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * Base class providing common functionality used in different bootstrap @@ -47,7 +47,7 @@ public abstract class BootstrapResponse extends EventObject { * the application for which the bootstrap page should be * generated * @param rootId - * the generated id of the Root that will be displayed on the + * the generated id of the UI that will be displayed on the * page */ public BootstrapResponse(BootstrapHandler handler, WrappedRequest request, @@ -93,7 +93,7 @@ public abstract class BootstrapResponse extends EventObject { /** * Gets the root id that has been generated for this response. Please note * that if {@link Application#isRootPreserved()} is enabled, a previously - * created Root with a different id might eventually end up being used. + * created UI with a different id might eventually end up being used. * * @return the root id */ @@ -102,21 +102,21 @@ public abstract class BootstrapResponse extends EventObject { } /** - * Gets the Root for which this page is being rendered, if available. Some - * features of the framework will postpone the Root selection until after + * Gets the UI for which this page is being rendered, if available. Some + * features of the framework will postpone the UI selection until after * the bootstrap page has been rendered and required information from the * browser has been sent back. This method will return null if - * no Root instance is yet available. + * no UI instance is yet available. * * @see Application#isRootPreserved() * @see Application#getRoot(WrappedRequest) * @see RootRequiresMoreInformationException * - * @return The Root that will be displayed in the page being generated, or + * @return The UI that will be displayed in the page being generated, or * null if all required information is not yet * available. */ - public Root getRoot() { - return Root.getCurrent(); + public UI getRoot() { + return UI.getCurrent(); } } diff --git a/server/src/com/vaadin/terminal/gwt/server/ClientConnector.java b/server/src/com/vaadin/terminal/gwt/server/ClientConnector.java index 24675c9e45..3a18dbd6f4 100644 --- a/server/src/com/vaadin/terminal/gwt/server/ClientConnector.java +++ b/server/src/com/vaadin/terminal/gwt/server/ClientConnector.java @@ -26,7 +26,7 @@ import com.vaadin.terminal.AbstractClientConnector; import com.vaadin.terminal.Extension; import com.vaadin.ui.Component; import com.vaadin.ui.ComponentContainer; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * Interface implemented by all connectors that are capable of communicating @@ -177,10 +177,10 @@ public interface ClientConnector extends Connector, RpcTarget { /** * Returns the root this connector is attached to * - * @return The Root this connector is attached to or null if it is not - * attached to any Root + * @return The UI this connector is attached to or null if it is not + * attached to any UI */ - public Root getRoot(); + public UI getRoot(); /** * Called before the shared state and RPC invocations are sent to the diff --git a/server/src/com/vaadin/terminal/gwt/server/ClientMethodInvocation.java b/server/src/com/vaadin/terminal/gwt/server/ClientMethodInvocation.java index 25d0b23725..7cc5159bc0 100644 --- a/server/src/com/vaadin/terminal/gwt/server/ClientMethodInvocation.java +++ b/server/src/com/vaadin/terminal/gwt/server/ClientMethodInvocation.java @@ -34,7 +34,7 @@ public class ClientMethodInvocation implements Serializable, private final Object[] parameters; private Type[] parameterTypes; - // used for sorting calls between different connectors in the same Root + // used for sorting calls between different connectors in the same UI private final long sequenceNumber; // TODO may cause problems when clustering etc. private static long counter = 0; diff --git a/server/src/com/vaadin/terminal/gwt/server/CommunicationManager.java b/server/src/com/vaadin/terminal/gwt/server/CommunicationManager.java index e0386b51b4..7551e849a1 100644 --- a/server/src/com/vaadin/terminal/gwt/server/CommunicationManager.java +++ b/server/src/com/vaadin/terminal/gwt/server/CommunicationManager.java @@ -25,7 +25,7 @@ import com.vaadin.Application; import com.vaadin.external.json.JSONException; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.WrappedRequest; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * Application manager processes changes and paints for single application @@ -111,17 +111,17 @@ public class CommunicationManager extends AbstractCommunicationManager { } @Override - protected String getInitialUIDL(WrappedRequest request, Root root) + protected String getInitialUIDL(WrappedRequest request, UI uI) throws PaintException, JSONException { - return CommunicationManager.this.getInitialUIDL(request, root); + return CommunicationManager.this.getInitialUIDL(request, uI); } }; } @Override - protected InputStream getThemeResourceAsStream(Root root, String themeName, + protected InputStream getThemeResourceAsStream(UI uI, String themeName, String resource) { - WebApplicationContext context = (WebApplicationContext) root + WebApplicationContext context = (WebApplicationContext) uI .getApplication().getContext(); ServletContext servletContext = context.getHttpSession() .getServletContext(); diff --git a/server/src/com/vaadin/terminal/gwt/server/DragAndDropService.java b/server/src/com/vaadin/terminal/gwt/server/DragAndDropService.java index 221598171c..42312b72fd 100644 --- a/server/src/com/vaadin/terminal/gwt/server/DragAndDropService.java +++ b/server/src/com/vaadin/terminal/gwt/server/DragAndDropService.java @@ -40,7 +40,7 @@ import com.vaadin.terminal.Extension; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.VariableOwner; import com.vaadin.ui.Component; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; public class DragAndDropService implements VariableOwner, ClientConnector { @@ -327,7 +327,7 @@ public class DragAndDropService implements VariableOwner, ClientConnector { } @Override - public Root getRoot() { + public UI getRoot() { return null; } diff --git a/server/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java b/server/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java index eba7d6e3a3..a5a3e94954 100644 --- a/server/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java +++ b/server/src/com/vaadin/terminal/gwt/server/PortletApplicationContext2.java @@ -46,7 +46,7 @@ import javax.xml.namespace.QName; import com.vaadin.Application; import com.vaadin.terminal.ExternalResource; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * TODO Write documentation, fix JavaDoc tags. @@ -180,18 +180,18 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { } } - public void firePortletRenderRequest(Application app, Root root, + public void firePortletRenderRequest(Application app, UI uI, RenderRequest request, RenderResponse response) { Set listeners = portletListeners.get(app); if (listeners != null) { for (PortletListener l : listeners) { l.handleRenderRequest(request, new RestrictedRenderResponse( - response), root); + response), uI); } } } - public void firePortletActionRequest(Application app, Root root, + public void firePortletActionRequest(Application app, UI uI, ActionRequest request, ActionResponse response) { String key = request.getParameter(ActionRequest.ACTION_NAME); if (eventActionDestinationMap.containsKey(key)) { @@ -213,28 +213,28 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { Set listeners = portletListeners.get(app); if (listeners != null) { for (PortletListener l : listeners) { - l.handleActionRequest(request, response, root); + l.handleActionRequest(request, response, uI); } } } } - public void firePortletEventRequest(Application app, Root root, + public void firePortletEventRequest(Application app, UI uI, EventRequest request, EventResponse response) { Set listeners = portletListeners.get(app); if (listeners != null) { for (PortletListener l : listeners) { - l.handleEventRequest(request, response, root); + l.handleEventRequest(request, response, uI); } } } - public void firePortletResourceRequest(Application app, Root root, + public void firePortletResourceRequest(Application app, UI uI, ResourceRequest request, ResourceResponse response) { Set listeners = portletListeners.get(app); if (listeners != null) { for (PortletListener l : listeners) { - l.handleResourceRequest(request, response, root); + l.handleResourceRequest(request, response, uI); } } } @@ -242,16 +242,16 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { public interface PortletListener extends Serializable { public void handleRenderRequest(RenderRequest request, - RenderResponse response, Root root); + RenderResponse response, UI uI); public void handleActionRequest(ActionRequest request, - ActionResponse response, Root root); + ActionResponse response, UI uI); public void handleEventRequest(EventRequest request, - EventResponse response, Root root); + EventResponse response, UI uI); public void handleResourceRequest(ResourceRequest request, - ResourceResponse response, Root root); + ResourceResponse response, UI uI); } /** @@ -295,7 +295,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { * Event names for events sent and received by a portlet need to be declared * in portlet.xml . * - * @param root + * @param uI * a window in which a temporary action URL can be opened if * necessary * @param name @@ -304,7 +304,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { * event value object that is Serializable and, if appropriate, * has a valid JAXB annotation */ - public void sendPortletEvent(Root root, QName name, Serializable value) + public void sendPortletEvent(UI uI, QName name, Serializable value) throws IllegalStateException { if (response instanceof MimeResponse) { String actionKey = "" + System.currentTimeMillis(); @@ -315,7 +315,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { if (actionUrl != null) { eventActionDestinationMap.put(actionKey, name); eventActionValueMap.put(actionKey, value); - root.getPage().open(new ExternalResource(actionUrl.toString())); + uI.getPage().open(new ExternalResource(actionUrl.toString())); } else { // this should never happen as we already know the response is a // MimeResponse @@ -342,7 +342,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { * Shared parameters set or read by a portlet need to be declared in * portlet.xml . * - * @param root + * @param uI * a window in which a temporary action URL can be opened if * necessary * @param name @@ -350,7 +350,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { * @param value * parameter value */ - public void setSharedRenderParameter(Root root, String name, String value) + public void setSharedRenderParameter(UI uI, String name, String value) throws IllegalStateException { if (response instanceof MimeResponse) { String actionKey = "" + System.currentTimeMillis(); @@ -361,7 +361,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { if (actionUrl != null) { sharedParameterActionNameMap.put(actionKey, name); sharedParameterActionValueMap.put(actionKey, value); - root.getPage().open(new ExternalResource(actionUrl.toString())); + uI.getPage().open(new ExternalResource(actionUrl.toString())); } else { // this should never happen as we already know the response is a // MimeResponse @@ -381,7 +381,7 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { * * Portlet modes used by a portlet need to be declared in portlet.xml . * - * @param root + * @param uI * a window in which the render URL can be opened if necessary * @param portletMode * the portlet mode to switch to @@ -389,12 +389,12 @@ public class PortletApplicationContext2 extends AbstractWebApplicationContext { * if the portlet mode is not allowed for some reason * (configuration, permissions etc.) */ - public void setPortletMode(Root root, PortletMode portletMode) + public void setPortletMode(UI uI, PortletMode portletMode) throws IllegalStateException, PortletModeException { if (response instanceof MimeResponse) { PortletURL url = ((MimeResponse) response).createRenderURL(); url.setPortletMode(portletMode); - throw new RuntimeException("Root.open has not yet been implemented"); + throw new RuntimeException("UI.open has not yet been implemented"); // root.open(new ExternalResource(url.toString())); } else if (response instanceof StateAwareResponse) { ((StateAwareResponse) response).setPortletMode(portletMode); diff --git a/server/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java b/server/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java index b6fbbec298..e127425786 100644 --- a/server/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java +++ b/server/src/com/vaadin/terminal/gwt/server/PortletCommunicationManager.java @@ -34,7 +34,7 @@ import com.vaadin.terminal.DeploymentConfiguration; import com.vaadin.terminal.PaintException; import com.vaadin.terminal.WrappedRequest; import com.vaadin.terminal.WrappedResponse; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /** * TODO document me! @@ -142,10 +142,10 @@ public class PortletCommunicationManager extends AbstractCommunicationManager { } @Override - protected String getInitialUIDL(WrappedRequest request, Root root) + protected String getInitialUIDL(WrappedRequest request, UI uI) throws PaintException, JSONException { return PortletCommunicationManager.this.getInitialUIDL(request, - root); + uI); } @Override @@ -168,9 +168,9 @@ public class PortletCommunicationManager extends AbstractCommunicationManager { } @Override - protected InputStream getThemeResourceAsStream(Root root, String themeName, + protected InputStream getThemeResourceAsStream(UI uI, String themeName, String resource) { - PortletApplicationContext2 context = (PortletApplicationContext2) root + PortletApplicationContext2 context = (PortletApplicationContext2) uI .getApplication().getContext(); PortletContext portletContext = context.getPortletSession() .getPortletContext(); diff --git a/server/src/com/vaadin/terminal/gwt/server/ServletPortletHelper.java b/server/src/com/vaadin/terminal/gwt/server/ServletPortletHelper.java index 200f9a9103..13d558e66e 100644 --- a/server/src/com/vaadin/terminal/gwt/server/ServletPortletHelper.java +++ b/server/src/com/vaadin/terminal/gwt/server/ServletPortletHelper.java @@ -6,7 +6,7 @@ import com.vaadin.Application; import com.vaadin.shared.ApplicationConstants; import com.vaadin.terminal.DeploymentConfiguration; import com.vaadin.terminal.WrappedRequest; -import com.vaadin.ui.Root; +import com.vaadin.ui.UI; /* * Copyright 2011 Vaadin Ltd. @@ -76,9 +76,9 @@ class ServletPortletHelper implements Serializable { // Check that the root layout class can be found try { Class rootClass = classLoader.loadClass(className); - if (!Root.class.isAssignableFrom(rootClass)) { + if (!UI.class.isAssignableFrom(rootClass)) { throw new ApplicationClassException(className - + " does not implement Root"); + + " does not implement UI"); } // Try finding a default constructor, else throw exception rootClass.getConstructor(); diff --git a/server/src/com/vaadin/ui/AbstractComponent.java b/server/src/com/vaadin/ui/AbstractComponent.java index b1393488f7..147034fe6b 100644 --- a/server/src/com/vaadin/ui/AbstractComponent.java +++ b/server/src/com/vaadin/ui/AbstractComponent.java @@ -561,7 +561,7 @@ public abstract class AbstractComponent extends AbstractClientConnector * here, we use the default documentation from implemented interface. */ @Override - public Root getRoot() { + public UI getRoot() { // Just make method from implemented Component interface public return super.getRoot(); } @@ -588,9 +588,9 @@ public abstract class AbstractComponent extends AbstractClientConnector public void detach() { super.detach(); if (actionManager != null) { - // Remove any existing viewer. Root cast is just to make the + // Remove any existing viewer. UI cast is just to make the // compiler happy - actionManager.setViewer((Root) null); + actionManager.setViewer((UI) null); } } diff --git a/server/src/com/vaadin/ui/Component.java b/server/src/com/vaadin/ui/Component.java index 89e282d4e1..7406303af9 100644 --- a/server/src/com/vaadin/ui/Component.java +++ b/server/src/com/vaadin/ui/Component.java @@ -507,18 +507,18 @@ public interface Component extends ClientConnector, Sizeable, Serializable { public void setIcon(Resource icon); /** - * Gets the Root the component is attached to. + * Gets the UI the component is attached to. * *

- * If the component is not attached to a Root through a component + * If the component is not attached to a UI through a component * containment hierarchy, null is returned. *

* - * @return the Root of the component or null if it is not - * attached to a Root + * @return the UI of the component or null if it is not + * attached to a UI */ @Override - public Root getRoot(); + public UI getRoot(); /** * Gets the application object to which the component is attached. @@ -574,8 +574,8 @@ public interface Component extends ClientConnector, Sizeable, Serializable { * {@link #setParent(Component)}. *

*

- * This method must call {@link Root#componentAttached(Component)} to let - * the Root know that a new Component has been attached. + * This method must call {@link UI#componentAttached(Component)} to let + * the UI know that a new Component has been attached. *

* * diff --git a/server/src/com/vaadin/ui/ConnectorTracker.java b/server/src/com/vaadin/ui/ConnectorTracker.java index 72879e0a25..3a6e1e4ea8 100644 --- a/server/src/com/vaadin/ui/ConnectorTracker.java +++ b/server/src/com/vaadin/ui/ConnectorTracker.java @@ -30,7 +30,7 @@ import com.vaadin.terminal.gwt.server.ClientConnector; /** * A class which takes care of book keeping of {@link ClientConnector}s for a - * Root. + * UI. *

* Provides {@link #getConnector(String)} which can be used to lookup a * connector from its id. This is for framework use only and should not be @@ -54,7 +54,7 @@ public class ConnectorTracker implements Serializable { private Set dirtyConnectors = new HashSet(); private Set uninitializedConnectors = new HashSet(); - private Root root; + private UI uI; private Map diffStates = new HashMap(); /** @@ -68,15 +68,15 @@ public class ConnectorTracker implements Serializable { } /** - * Creates a new ConnectorTracker for the given root. A tracker is always - * attached to a root and the root cannot be changed during the lifetime of + * Creates a new ConnectorTracker for the given uI. A tracker is always + * attached to a uI and the uI cannot be changed during the lifetime of * a {@link ConnectorTracker}. * - * @param root - * The root to attach to. Cannot be null. + * @param uI + * The uI to attach to. Cannot be null. */ - public ConnectorTracker(Root root) { - this.root = root; + public ConnectorTracker(UI uI) { + this.uI = uI; } /** @@ -210,8 +210,8 @@ public class ConnectorTracker implements Serializable { while (iterator.hasNext()) { String connectorId = iterator.next(); ClientConnector connector = connectorIdToConnector.get(connectorId); - if (getRootForConnector(connector) != root) { - // If connector is no longer part of this root, + if (getRootForConnector(connector) != uI) { + // If connector is no longer part of this uI, // remove it from the map. If it is re-attached to the // application at some point it will be re-added through // registerConnector(connector) @@ -232,14 +232,14 @@ public class ConnectorTracker implements Serializable { } /** - * Finds the root that the connector is attached to. + * Finds the uI that the connector is attached to. * * @param connector * The connector to lookup - * @return The root the connector is attached to or null if it is not - * attached to any root. + * @return The uI the connector is attached to or null if it is not + * attached to any uI. */ - private Root getRootForConnector(ClientConnector connector) { + private UI getRootForConnector(ClientConnector connector) { if (connector == null) { return null; } @@ -330,15 +330,15 @@ public class ConnectorTracker implements Serializable { } /** - * Mark all connectors in this root as dirty. + * Mark all connectors in this uI as dirty. */ public void markAllConnectorsDirty() { - markConnectorsDirtyRecursively(root); + markConnectorsDirtyRecursively(uI); getLogger().fine("All connectors are now dirty"); } /** - * Mark all connectors in this root as clean. + * Mark all connectors in this uI as clean. */ public void markAllConnectorsClean() { dirtyConnectors.clear(); @@ -370,7 +370,7 @@ public class ConnectorTracker implements Serializable { * client in the following request. *

* - * @return A collection of all dirty connectors for this root. This list may + * @return A collection of all dirty connectors for this uI. This list may * contain invisible connectors. */ public Collection getDirtyConnectors() { diff --git a/server/src/com/vaadin/ui/LoginForm.java b/server/src/com/vaadin/ui/LoginForm.java index bb7767084c..f127a2705b 100644 --- a/server/src/com/vaadin/ui/LoginForm.java +++ b/server/src/com/vaadin/ui/LoginForm.java @@ -99,8 +99,8 @@ public class LoginForm extends CustomComponent { throws IOException { String requestPathInfo = request.getRequestPathInfo(); if ("/loginHandler".equals(requestPathInfo)) { - // Ensure Root.getCurrent() works in listeners - Root.setCurrent(getRoot()); + // Ensure UI.getCurrent() works in listeners + UI.setCurrent(getRoot()); response.setCacheTime(-1); response.setContentType("text/html; charset=utf-8"); diff --git a/server/src/com/vaadin/ui/Root.java b/server/src/com/vaadin/ui/Root.java deleted file mode 100644 index 67f2e04a65..0000000000 --- a/server/src/com/vaadin/ui/Root.java +++ /dev/null @@ -1,1241 +0,0 @@ -/* - * Copyright 2011 Vaadin Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package com.vaadin.ui; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.LinkedHashSet; -import java.util.Map; - -import com.vaadin.Application; -import com.vaadin.annotations.EagerInit; -import com.vaadin.event.Action; -import com.vaadin.event.Action.Handler; -import com.vaadin.event.ActionManager; -import com.vaadin.event.MouseEvents.ClickEvent; -import com.vaadin.event.MouseEvents.ClickListener; -import com.vaadin.shared.EventId; -import com.vaadin.shared.MouseEventDetails; -import com.vaadin.shared.ui.BorderStyle; -import com.vaadin.shared.ui.root.RootConstants; -import com.vaadin.shared.ui.root.RootServerRpc; -import com.vaadin.shared.ui.root.RootState; -import com.vaadin.terminal.Page; -import com.vaadin.terminal.Page.BrowserWindowResizeEvent; -import com.vaadin.terminal.Page.BrowserWindowResizeListener; -import com.vaadin.terminal.PaintException; -import com.vaadin.terminal.PaintTarget; -import com.vaadin.terminal.Resource; -import com.vaadin.terminal.Vaadin6Component; -import com.vaadin.terminal.WrappedRequest; -import com.vaadin.terminal.WrappedRequest.BrowserDetails; -import com.vaadin.ui.Window.CloseListener; - -/** - * The topmost component in any component hierarchy. There is one root for every - * Vaadin instance in a browser window. A root may either represent an entire - * browser window (or tab) or some part of a html page where a Vaadin - * application is embedded. - *

- * The root is the server side entry point for various client side features that - * are not represented as components added to a layout, e.g notifications, sub - * windows, and executing javascript in the browser. - *

- *

- * When a new application instance is needed, typically because the user opens - * the application in a browser window, - * {@link Application#gerRoot(WrappedRequest)} is invoked to get a root. That - * method does by default create a root according to the - * {@value Application#ROOT_PARAMETER} parameter from web.xml. - *

- *

- * After a root has been created by the application, it is initialized using - * {@link #init(WrappedRequest)}. This method is intended to be overridden by - * the developer to add components to the user interface and initialize - * non-component functionality. The component hierarchy is initialized by - * passing a {@link ComponentContainer} with the main layout of the view to - * {@link #setContent(ComponentContainer)}. - *

- *

- * If a {@link EagerInit} annotation is present on a class extending - * Root, the framework will use a faster initialization method - * which will not ensure that {@link BrowserDetails} are present in the - * {@link WrappedRequest} passed to the init method. - *

- * - * @see #init(WrappedRequest) - * @see Application#getRoot(WrappedRequest) - * - * @since 7.0 - */ -public abstract class Root extends AbstractComponentContainer implements - Action.Container, Action.Notifier, Vaadin6Component { - - /** - * Helper class to emulate the main window from Vaadin 6 using roots. This - * class should be used in the same way as Window used as a browser level - * window in Vaadin 6 with {@link com.vaadin.Application.LegacyApplication} - */ - @Deprecated - @EagerInit - public static class LegacyWindow extends Root { - private String name; - - /** - * Create a new legacy window - */ - public LegacyWindow() { - super(); - } - - /** - * Creates a new legacy window with the given caption - * - * @param caption - * the caption of the window - */ - public LegacyWindow(String caption) { - super(caption); - } - - /** - * Creates a legacy window with the given caption and content layout - * - * @param caption - * @param content - */ - public LegacyWindow(String caption, ComponentContainer content) { - super(caption, content); - } - - @Override - protected void init(WrappedRequest request) { - // Just empty - } - - /** - * Gets the unique name of the window. The name of the window is used to - * uniquely identify it. - *

- * The name also determines the URL that can be used for direct access - * to a window. All windows can be accessed through - * {@code http://host:port/app/win} where {@code http://host:port/app} - * is the application URL (as returned by {@link Application#getURL()} - * and {@code win} is the window name. - *

- *

- * Note! Portlets do not support direct window access through URLs. - *

- * - * @return the Name of the Window. - */ - public String getName() { - return name; - } - - /** - * Sets the unique name of the window. The name of the window is used to - * uniquely identify it inside the application. - *

- * The name also determines the URL that can be used for direct access - * to a window. All windows can be accessed through - * {@code http://host:port/app/win} where {@code http://host:port/app} - * is the application URL (as returned by {@link Application#getURL()} - * and {@code win} is the window name. - *

- *

- * This method can only be called before the window is added to an - * application. - *

- * Note! Portlets do not support direct window access through URLs. - *

- * - * @param name - * the new name for the window or null if the application - * should automatically assign a name to it - * @throws IllegalStateException - * if the window is attached to an application - */ - public void setName(String name) { - this.name = name; - // The name can not be changed in application - if (getApplication() != null) { - throw new IllegalStateException( - "Window name can not be changed while " - + "the window is in application"); - } - - } - - /** - * Gets the full URL of the window. The returned URL is window specific - * and can be used to directly refer to the window. - *

- * Note! This method can not be used for portlets. - *

- * - * @return the URL of the window or null if the window is not attached - * to an application - */ - public URL getURL() { - Application application = getApplication(); - if (application == null) { - return null; - } - - try { - return new URL(application.getURL(), getName() + "/"); - } catch (MalformedURLException e) { - throw new RuntimeException( - "Internal problem getting window URL, please report"); - } - } - - /** - * Opens the given resource in this root. The contents of this Root is - * replaced by the {@code Resource}. - * - * @param resource - * the resource to show in this root - * - * @deprecated As of 7.0, use getPage().open instead - */ - @Deprecated - public void open(Resource resource) { - getPage().open(resource); - } - - /* ********************************************************************* */ - - /** - * Opens the given resource in a window with the given name. - *

- * The supplied {@code windowName} is used as the target name in a - * window.open call in the client. This means that special values such - * as "_blank", "_self", "_top", "_parent" have special meaning. An - * empty or null window name is also a special case. - *

- *

- * "", null and "_self" as {@code windowName} all causes the resource to - * be opened in the current window, replacing any old contents. For - * downloadable content you should avoid "_self" as "_self" causes the - * client to skip rendering of any other changes as it considers them - * irrelevant (the page will be replaced by the resource). This can - * speed up the opening of a resource, but it might also put the client - * side into an inconsistent state if the window content is not - * completely replaced e.g., if the resource is downloaded instead of - * displayed in the browser. - *

- *

- * "_blank" as {@code windowName} causes the resource to always be - * opened in a new window or tab (depends on the browser and browser - * settings). - *

- *

- * "_top" and "_parent" as {@code windowName} works as specified by the - * HTML standard. - *

- *

- * Any other {@code windowName} will open the resource in a window with - * that name, either by opening a new window/tab in the browser or by - * replacing the contents of an existing window with that name. - *

- * - * @param resource - * the resource. - * @param windowName - * the name of the window. - * @deprecated As of 7.0, use getPage().open instead - */ - @Deprecated - public void open(Resource resource, String windowName) { - getPage().open(resource, windowName); - } - - /** - * Opens the given resource in a window with the given size, border and - * name. For more information on the meaning of {@code windowName}, see - * {@link #open(Resource, String)}. - * - * @param resource - * the resource. - * @param windowName - * the name of the window. - * @param width - * the width of the window in pixels - * @param height - * the height of the window in pixels - * @param border - * the border style of the window. - * @deprecated As of 7.0, use getPage().open instead - */ - @Deprecated - public void open(Resource resource, String windowName, int width, - int height, BorderStyle border) { - getPage().open(resource, windowName, width, height, border); - } - - /** - * Adds a new {@link BrowserWindowResizeListener} to this root. The - * listener will be notified whenever the browser window within which - * this root resides is resized. - * - * @param resizeListener - * the listener to add - * - * @see BrowserWindowResizeListener#browserWindowResized(BrowserWindowResizeEvent) - * @see #setResizeLazy(boolean) - * - * @deprecated As of 7.0, use the similarly named api in Page instead - */ - @Deprecated - public void addListener(BrowserWindowResizeListener resizeListener) { - getPage().addListener(resizeListener); - } - - /** - * Removes a {@link BrowserWindowResizeListener} from this root. The - * listener will no longer be notified when the browser window is - * resized. - * - * @param resizeListener - * the listener to remove - * @deprecated As of 7.0, use the similarly named api in Page instead - */ - @Deprecated - public void removeListener(BrowserWindowResizeListener resizeListener) { - getPage().removeListener(resizeListener); - } - - /** - * Gets the last known height of the browser window in which this root - * resides. - * - * @return the browser window height in pixels - * @deprecated As of 7.0, use the similarly named api in Page instead - */ - @Deprecated - public int getBrowserWindowHeight() { - return getPage().getBrowserWindowHeight(); - } - - /** - * Gets the last known width of the browser window in which this root - * resides. - * - * @return the browser window width in pixels - * - * @deprecated As of 7.0, use the similarly named api in Page instead - */ - @Deprecated - public int getBrowserWindowWidth() { - return getPage().getBrowserWindowWidth(); - } - - /** - * Executes JavaScript in this window. - * - *

- * This method allows one to inject javascript from the server to - * client. A client implementation is not required to implement this - * functionality, but currently all web-based clients do implement this. - *

- * - *

- * Executing javascript this way often leads to cross-browser - * compatibility issues and regressions that are hard to resolve. Use of - * this method should be avoided and instead it is recommended to create - * new widgets with GWT. For more info on creating own, reusable - * client-side widgets in Java, read the corresponding chapter in Book - * of Vaadin. - *

- * - * @param script - * JavaScript snippet that will be executed. - * - * @deprecated as of 7.0, use JavaScript.getCurrent().execute(String) - * instead - */ - @Deprecated - public void executeJavaScript(String script) { - getPage().getJavaScript().execute(script); - } - - @Override - public void setCaption(String caption) { - // Override to provide backwards compatibility - getState().setCaption(caption); - getPage().setTitle(caption); - } - - } - - /** - * The application to which this root belongs - */ - private Application application; - - /** - * List of windows in this root. - */ - private final LinkedHashSet windows = new LinkedHashSet(); - - /** - * The component that should be scrolled into view after the next repaint. - * Null if nothing should be scrolled into view. - */ - private Component scrollIntoView; - - /** - * The id of this root, used to find the server side instance of the root - * form which a request originates. A negative value indicates that the root - * id has not yet been assigned by the Application. - * - * @see Application#nextRootId - */ - private int rootId = -1; - - /** - * Keeps track of the Actions added to this component, and manages the - * painting and handling as well. - */ - protected ActionManager actionManager; - - /** - * Thread local for keeping track of the current root. - */ - private static final ThreadLocal currentRoot = new ThreadLocal(); - - /** Identifies the click event */ - private ConnectorTracker connectorTracker = new ConnectorTracker(this); - - private Page page = new Page(this); - - private RootServerRpc rpc = new RootServerRpc() { - @Override - public void click(MouseEventDetails mouseDetails) { - fireEvent(new ClickEvent(Root.this, mouseDetails)); - } - - @Override - public void resize(int viewWidth, int viewHeight, int windowWidth, - int windowHeight) { - // TODO We're not doing anything with the view dimensions - getPage().setBrowserWindowSize(windowWidth, windowHeight); - } - }; - - /** - * Creates a new empty root without a caption. This root will have a - * {@link VerticalLayout} with margins enabled as its content. - */ - public Root() { - this((ComponentContainer) null); - } - - /** - * Creates a new root with the given component container as its content. - * - * @param content - * the content container to use as this roots content. - * - * @see #setContent(ComponentContainer) - */ - public Root(ComponentContainer content) { - registerRpc(rpc); - setSizeFull(); - setContent(content); - } - - /** - * Creates a new empty root with the given caption. This root will have a - * {@link VerticalLayout} with margins enabled as its content. - * - * @param caption - * the caption of the root, used as the page title if there's - * nothing but the application on the web page - * - * @see #setCaption(String) - */ - public Root(String caption) { - this((ComponentContainer) null); - setCaption(caption); - } - - /** - * Creates a new root with the given caption and content. - * - * @param caption - * the caption of the root, used as the page title if there's - * nothing but the application on the web page - * @param content - * the content container to use as this roots content. - * - * @see #setContent(ComponentContainer) - * @see #setCaption(String) - */ - public Root(String caption, ComponentContainer content) { - this(content); - setCaption(caption); - } - - @Override - protected RootState getState() { - return (RootState) super.getState(); - } - - @Override - public Class getStateType() { - // This is a workaround for a problem with creating the correct state - // object during build - return RootState.class; - } - - /** - * Overridden to return a value instead of referring to the parent. - * - * @return this root - * - * @see com.vaadin.ui.AbstractComponent#getRoot() - */ - @Override - public Root getRoot() { - return this; - } - - @Override - public void replaceComponent(Component oldComponent, Component newComponent) { - throw new UnsupportedOperationException(); - } - - @Override - public Application getApplication() { - return application; - } - - @Override - public void paintContent(PaintTarget target) throws PaintException { - page.paintContent(target); - - if (scrollIntoView != null) { - target.addAttribute("scrollTo", scrollIntoView); - scrollIntoView = null; - } - - if (pendingFocus != null) { - // ensure focused component is still attached to this main window - if (pendingFocus.getRoot() == this - || (pendingFocus.getRoot() != null && pendingFocus - .getRoot().getParent() == this)) { - target.addAttribute("focused", pendingFocus); - } - pendingFocus = null; - } - - if (actionManager != null) { - actionManager.paintActions(null, target); - } - - if (isResizeLazy()) { - target.addAttribute(RootConstants.RESIZE_LAZY, true); - } - } - - /** - * Fire a click event to all click listeners. - * - * @param object - * The raw "value" of the variable change from the client side. - */ - private void fireClick(Map parameters) { - MouseEventDetails mouseDetails = MouseEventDetails - .deSerialize((String) parameters.get("mouseDetails")); - fireEvent(new ClickEvent(this, mouseDetails)); - } - - @Override - @SuppressWarnings("unchecked") - public void changeVariables(Object source, Map variables) { - if (variables.containsKey(EventId.CLICK_EVENT_IDENTIFIER)) { - fireClick((Map) variables - .get(EventId.CLICK_EVENT_IDENTIFIER)); - } - - // Actions - if (actionManager != null) { - actionManager.handleActions(variables, this); - } - - if (variables.containsKey(RootConstants.FRAGMENT_VARIABLE)) { - String fragment = (String) variables - .get(RootConstants.FRAGMENT_VARIABLE); - getPage().setFragment(fragment, true); - } - } - - /* - * (non-Javadoc) - * - * @see com.vaadin.ui.ComponentContainer#getComponentIterator() - */ - @Override - public Iterator getComponentIterator() { - // TODO could directly create some kind of combined iterator instead of - // creating a new ArrayList - ArrayList components = new ArrayList(); - - if (getContent() != null) { - components.add(getContent()); - } - - components.addAll(windows); - - return components.iterator(); - } - - /* - * (non-Javadoc) - * - * @see com.vaadin.ui.ComponentContainer#getComponentCount() - */ - @Override - public int getComponentCount() { - return windows.size() + (getContent() == null ? 0 : 1); - } - - /** - * Sets the application to which this root is assigned. It is not legal to - * change the application once it has been set nor to set a - * null application. - *

- * This method is mainly intended for internal use by the framework. - *

- * - * @param application - * the application to set - * - * @throws IllegalStateException - * if the application has already been set - * - * @see #getApplication() - */ - public void setApplication(Application application) { - if ((application == null) == (this.application == null)) { - throw new IllegalStateException("Application has already been set"); - } else { - this.application = application; - } - - if (application != null) { - attach(); - } else { - detach(); - } - } - - /** - * Sets the id of this root within its application. The root id is used to - * route requests to the right root. - *

- * This method is mainly intended for internal use by the framework. - *

- * - * @param rootId - * the id of this root - * - * @throws IllegalStateException - * if the root id has already been set - * - * @see #getRootId() - */ - public void setRootId(int rootId) { - if (this.rootId != -1) { - throw new IllegalStateException("Root id has already been defined"); - } - this.rootId = rootId; - } - - /** - * Gets the id of the root, used to identify this root within its - * application when processing requests. The root id should be present in - * every request to the server that originates from this root. - * {@link Application#getRootForRequest(WrappedRequest)} uses this id to - * find the route to which the request belongs. - * - * @return - */ - public int getRootId() { - return rootId; - } - - /** - * Adds a window as a subwindow inside this root. To open a new browser - * window or tab, you should instead use {@link open(Resource)} with an url - * pointing to this application and ensure - * {@link Application#getRoot(WrappedRequest)} returns an appropriate root - * for the request. - * - * @param window - * @throws IllegalArgumentException - * if the window is already added to an application - * @throws NullPointerException - * if the given Window is null. - */ - public void addWindow(Window window) throws IllegalArgumentException, - NullPointerException { - - if (window == null) { - throw new NullPointerException("Argument must not be null"); - } - - if (window.getApplication() != null) { - throw new IllegalArgumentException( - "Window is already attached to an application."); - } - - attachWindow(window); - } - - /** - * Helper method to attach a window. - * - * @param w - * the window to add - */ - private void attachWindow(Window w) { - windows.add(w); - w.setParent(this); - markAsDirty(); - } - - /** - * Remove the given subwindow from this root. - * - * Since Vaadin 6.5, {@link CloseListener}s are called also when explicitly - * removing a window by calling this method. - * - * Since Vaadin 6.5, returns a boolean indicating if the window was removed - * or not. - * - * @param window - * Window to be removed. - * @return true if the subwindow was removed, false otherwise - */ - public boolean removeWindow(Window window) { - if (!windows.remove(window)) { - // Window window is not a subwindow of this root. - return false; - } - window.setParent(null); - window.fireClose(); - markAsDirty(); - - return true; - } - - /** - * Gets all the windows added to this root. - * - * @return an unmodifiable collection of windows - */ - public Collection getWindows() { - return Collections.unmodifiableCollection(windows); - } - - @Override - public void focus() { - super.focus(); - } - - /** - * Component that should be focused after the next repaint. Null if no focus - * change should take place. - */ - private Focusable pendingFocus; - - private boolean resizeLazy = false; - - /** - * This method is used by Component.Focusable objects to request focus to - * themselves. Focus renders must be handled at window level (instead of - * Component.Focusable) due we want the last focused component to be focused - * in client too. Not the one that is rendered last (the case we'd get if - * implemented in Focusable only). - * - * To focus component from Vaadin application, use Focusable.focus(). See - * {@link Focusable}. - * - * @param focusable - * to be focused on next paint - */ - public void setFocusedComponent(Focusable focusable) { - pendingFocus = focusable; - markAsDirty(); - } - - /** - * Scrolls any component between the component and root to a suitable - * position so the component is visible to the user. The given component - * must belong to this root. - * - * @param component - * the component to be scrolled into view - * @throws IllegalArgumentException - * if {@code component} does not belong to this root - */ - public void scrollIntoView(Component component) - throws IllegalArgumentException { - if (component.getRoot() != this) { - throw new IllegalArgumentException( - "The component where to scroll must belong to this root."); - } - scrollIntoView = component; - markAsDirty(); - } - - /** - * Gets the content of this root. The content is a component container that - * serves as the outermost item of the visual contents of this root. - * - * @return a component container to use as content - * - * @see #setContent(ComponentContainer) - * @see #createDefaultLayout() - */ - public ComponentContainer getContent() { - return (ComponentContainer) getState().getContent(); - } - - /** - * Helper method to create the default content layout that is used if no - * content has not been explicitly defined. - * - * @return a newly created layout - */ - private static VerticalLayout createDefaultLayout() { - VerticalLayout layout = new VerticalLayout(); - layout.setMargin(true); - return layout; - } - - /** - * Sets the content of this root. The content is a component container that - * serves as the outermost item of the visual contents of this root. If no - * content has been set, a {@link VerticalLayout} with margins enabled will - * be used by default - see {@link #createDefaultLayout()}. The content can - * also be set in a constructor. - * - * @return a component container to use as content - * - * @see #Root(ComponentContainer) - * @see #createDefaultLayout() - */ - public void setContent(ComponentContainer content) { - if (content == null) { - content = createDefaultLayout(); - } - - if (getState().getContent() != null) { - super.removeComponent((Component) getState().getContent()); - } - getState().setContent(content); - if (content != null) { - super.addComponent(content); - } - } - - /** - * Adds a component to this root. The component is not added directly to the - * root, but instead to the content container ({@link #getContent()}). - * - * @param component - * the component to add to this root - * - * @see #getContent() - */ - @Override - public void addComponent(Component component) { - getContent().addComponent(component); - } - - /** - * This implementation removes the component from the content container ( - * {@link #getContent()}) instead of from the actual root. - */ - @Override - public void removeComponent(Component component) { - getContent().removeComponent(component); - } - - /** - * This implementation removes the components from the content container ( - * {@link #getContent()}) instead of from the actual root. - */ - @Override - public void removeAllComponents() { - getContent().removeAllComponents(); - } - - /** - * Internal initialization method, should not be overridden. This method is - * not declared as final because that would break compatibility with e.g. - * CDI. - * - * @param request - * the initialization request - */ - public void doInit(WrappedRequest request) { - getPage().init(request); - - // Call the init overridden by the application developer - init(request); - } - - /** - * Initializes this root. This method is intended to be overridden by - * subclasses to build the view and configure non-component functionality. - * Performing the initialization in a constructor is not suggested as the - * state of the root is not properly set up when the constructor is invoked. - *

- * The {@link WrappedRequest} can be used to get information about the - * request that caused this root to be created. By default, the - * {@link BrowserDetails} will be available in the request. If the browser - * details are not required, loading the application in the browser can take - * some shortcuts giving a faster initial rendering. This can be indicated - * by adding the {@link EagerInit} annotation to the Root class. - *

- * - * @param request - * the wrapped request that caused this root to be created - */ - protected abstract void init(WrappedRequest request); - - /** - * Sets the thread local for the current root. This method is used by the - * framework to set the current application whenever a new request is - * processed and it is cleared when the request has been processed. - *

- * The application developer can also use this method to define the current - * root outside the normal request handling, e.g. when initiating custom - * background threads. - *

- * - * @param root - * the root to register as the current root - * - * @see #getCurrent() - * @see ThreadLocal - */ - public static void setCurrent(Root root) { - currentRoot.set(root); - } - - /** - * Gets the currently used root. The current root is automatically defined - * when processing requests to the server. In other cases, (e.g. from - * background threads), the current root is not automatically defined. - * - * @return the current root instance if available, otherwise - * null - * - * @see #setCurrent(Root) - */ - public static Root getCurrent() { - return currentRoot.get(); - } - - public void setScrollTop(int scrollTop) { - throw new RuntimeException("Not yet implemented"); - } - - @Override - protected ActionManager getActionManager() { - if (actionManager == null) { - actionManager = new ActionManager(this); - } - return actionManager; - } - - @Override - public void addAction( - T action) { - getActionManager().addAction(action); - } - - @Override - public void removeAction( - T action) { - if (actionManager != null) { - actionManager.removeAction(action); - } - } - - @Override - public void addActionHandler(Handler actionHandler) { - getActionManager().addActionHandler(actionHandler); - } - - @Override - public void removeActionHandler(Handler actionHandler) { - if (actionManager != null) { - actionManager.removeActionHandler(actionHandler); - } - } - - /** - * Should resize operations be lazy, i.e. should there be a delay before - * layout sizes are recalculated. Speeds up resize operations in slow UIs - * with the penalty of slightly decreased usability. - *

- * Default value: false - * - * @param resizeLazy - * true to use a delay before recalculating sizes, false to - * calculate immediately. - */ - public void setResizeLazy(boolean resizeLazy) { - this.resizeLazy = resizeLazy; - markAsDirty(); - } - - /** - * Checks whether lazy resize is enabled. - * - * @return true if lazy resize is enabled, false - * if lazy resize is not enabled - */ - public boolean isResizeLazy() { - return resizeLazy; - } - - /** - * Add a click listener to the Root. The listener is called whenever the - * user clicks inside the Root. Also when the click targets a component - * inside the Root, provided the targeted component does not prevent the - * click event from propagating. - * - * Use {@link #removeListener(ClickListener)} to remove the listener. - * - * @param listener - * The listener to add - */ - public void addListener(ClickListener listener) { - addListener(EventId.CLICK_EVENT_IDENTIFIER, ClickEvent.class, listener, - ClickListener.clickMethod); - } - - /** - * Remove a click listener from the Root. The listener should earlier have - * been added using {@link #addListener(ClickListener)}. - * - * @param listener - * The listener to remove - */ - public void removeListener(ClickListener listener) { - removeListener(EventId.CLICK_EVENT_IDENTIFIER, ClickEvent.class, - listener); - } - - @Override - public boolean isConnectorEnabled() { - // TODO How can a Root be invisible? What does it mean? - return isVisible() && isEnabled(); - } - - public ConnectorTracker getConnectorTracker() { - return connectorTracker; - } - - public Page getPage() { - return page; - } - - /** - * Setting the caption of a Root is not supported. To set the title of the - * HTML page, use Page.setTitle - * - * @deprecated as of 7.0.0, use {@link Page#setTitle(String)} - */ - @Override - @Deprecated - public void setCaption(String caption) { - throw new IllegalStateException( - "You can not set the title of a Root. To set the title of the HTML page, use Page.setTitle"); - } - - /** - * Shows a notification message on the middle of the root. The message - * automatically disappears ("humanized message"). - * - * Care should be taken to to avoid XSS vulnerabilities as the caption is - * rendered as html. - * - * @see #showNotification(Notification) - * @see Notification - * - * @param caption - * The message - * - * @deprecated As of 7.0, use Notification.show instead but be aware that - * Notification.show does not allow HTML. - */ - @Deprecated - public void showNotification(String caption) { - Notification notification = new Notification(caption); - notification.setHtmlContentAllowed(true);// Backwards compatibility - getPage().showNotification(notification); - } - - /** - * Shows a notification message the root. The position and behavior of the - * message depends on the type, which is one of the basic types defined in - * {@link Notification}, for instance Notification.TYPE_WARNING_MESSAGE. - * - * Care should be taken to to avoid XSS vulnerabilities as the caption is - * rendered as html. - * - * @see #showNotification(Notification) - * @see Notification - * - * @param caption - * The message - * @param type - * The message type - * - * @deprecated As of 7.0, use Notification.show instead but be aware that - * Notification.show does not allow HTML. - */ - @Deprecated - public void showNotification(String caption, Notification.Type type) { - Notification notification = new Notification(caption, type); - notification.setHtmlContentAllowed(true);// Backwards compatibility - getPage().showNotification(notification); - } - - /** - * Shows a notification consisting of a bigger caption and a smaller - * description on the middle of the root. The message automatically - * disappears ("humanized message"). - * - * Care should be taken to to avoid XSS vulnerabilities as the caption and - * description are rendered as html. - * - * @see #showNotification(Notification) - * @see Notification - * - * @param caption - * The caption of the message - * @param description - * The message description - * - * @deprecated As of 7.0, use new Notification(...).show(Page) instead but - * be aware that HTML by default not allowed. - */ - @Deprecated - public void showNotification(String caption, String description) { - Notification notification = new Notification(caption, description); - notification.setHtmlContentAllowed(true);// Backwards compatibility - getPage().showNotification(notification); - } - - /** - * Shows a notification consisting of a bigger caption and a smaller - * description. The position and behavior of the message depends on the - * type, which is one of the basic types defined in {@link Notification} , - * for instance Notification.TYPE_WARNING_MESSAGE. - * - * Care should be taken to to avoid XSS vulnerabilities as the caption and - * description are rendered as html. - * - * @see #showNotification(Notification) - * @see Notification - * - * @param caption - * The caption of the message - * @param description - * The message description - * @param type - * The message type - * - * @deprecated As of 7.0, use new Notification(...).show(Page) instead but - * be aware that HTML by default not allowed. - */ - @Deprecated - public void showNotification(String caption, String description, - Notification.Type type) { - Notification notification = new Notification(caption, description, type); - notification.setHtmlContentAllowed(true);// Backwards compatibility - getPage().showNotification(notification); - } - - /** - * Shows a notification consisting of a bigger caption and a smaller - * description. The position and behavior of the message depends on the - * type, which is one of the basic types defined in {@link Notification} , - * for instance Notification.TYPE_WARNING_MESSAGE. - * - * Care should be taken to avoid XSS vulnerabilities if html content is - * allowed. - * - * @see #showNotification(Notification) - * @see Notification - * - * @param caption - * The message caption - * @param description - * The message description - * @param type - * The type of message - * @param htmlContentAllowed - * Whether html in the caption and description should be - * displayed as html or as plain text - * - * @deprecated As of 7.0, use new Notification(...).show(Page). - */ - @Deprecated - public void showNotification(String caption, String description, - Notification.Type type, boolean htmlContentAllowed) { - getPage() - .showNotification( - new Notification(caption, description, type, - htmlContentAllowed)); - } - - /** - * Shows a notification message. - * - * @see Notification - * @see #showNotification(String) - * @see #showNotification(String, int) - * @see #showNotification(String, String) - * @see #showNotification(String, String, int) - * - * @param notification - * The notification message to show - * - * @deprecated As of 7.0, use Notification.show instead - */ - @Deprecated - public void showNotification(Notification notification) { - getPage().showNotification(notification); - } - -} diff --git a/server/src/com/vaadin/ui/UI.java b/server/src/com/vaadin/ui/UI.java new file mode 100644 index 0000000000..33eefff485 --- /dev/null +++ b/server/src/com/vaadin/ui/UI.java @@ -0,0 +1,1241 @@ +/* + * Copyright 2011 Vaadin Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +package com.vaadin.ui; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.Map; + +import com.vaadin.Application; +import com.vaadin.annotations.EagerInit; +import com.vaadin.event.Action; +import com.vaadin.event.Action.Handler; +import com.vaadin.event.ActionManager; +import com.vaadin.event.MouseEvents.ClickEvent; +import com.vaadin.event.MouseEvents.ClickListener; +import com.vaadin.shared.EventId; +import com.vaadin.shared.MouseEventDetails; +import com.vaadin.shared.ui.BorderStyle; +import com.vaadin.shared.ui.root.RootConstants; +import com.vaadin.shared.ui.root.RootServerRpc; +import com.vaadin.shared.ui.root.RootState; +import com.vaadin.terminal.Page; +import com.vaadin.terminal.Page.BrowserWindowResizeEvent; +import com.vaadin.terminal.Page.BrowserWindowResizeListener; +import com.vaadin.terminal.PaintException; +import com.vaadin.terminal.PaintTarget; +import com.vaadin.terminal.Resource; +import com.vaadin.terminal.Vaadin6Component; +import com.vaadin.terminal.WrappedRequest; +import com.vaadin.terminal.WrappedRequest.BrowserDetails; +import com.vaadin.ui.Window.CloseListener; + +/** + * The topmost component in any component hierarchy. There is one root for every + * Vaadin instance in a browser window. A root may either represent an entire + * browser window (or tab) or some part of a html page where a Vaadin + * application is embedded. + *

+ * The root is the server side entry point for various client side features that + * are not represented as components added to a layout, e.g notifications, sub + * windows, and executing javascript in the browser. + *

+ *

+ * When a new application instance is needed, typically because the user opens + * the application in a browser window, + * {@link Application#gerRoot(WrappedRequest)} is invoked to get a root. That + * method does by default create a root according to the + * {@value Application#ROOT_PARAMETER} parameter from web.xml. + *

+ *

+ * After a root has been created by the application, it is initialized using + * {@link #init(WrappedRequest)}. This method is intended to be overridden by + * the developer to add components to the user interface and initialize + * non-component functionality. The component hierarchy is initialized by + * passing a {@link ComponentContainer} with the main layout of the view to + * {@link #setContent(ComponentContainer)}. + *

+ *

+ * If a {@link EagerInit} annotation is present on a class extending + * UI, the framework will use a faster initialization method + * which will not ensure that {@link BrowserDetails} are present in the + * {@link WrappedRequest} passed to the init method. + *

+ * + * @see #init(WrappedRequest) + * @see Application#getRoot(WrappedRequest) + * + * @since 7.0 + */ +public abstract class UI extends AbstractComponentContainer implements + Action.Container, Action.Notifier, Vaadin6Component { + + /** + * Helper class to emulate the main window from Vaadin 6 using roots. This + * class should be used in the same way as Window used as a browser level + * window in Vaadin 6 with {@link com.vaadin.Application.LegacyApplication} + */ + @Deprecated + @EagerInit + public static class LegacyWindow extends UI { + private String name; + + /** + * Create a new legacy window + */ + public LegacyWindow() { + super(); + } + + /** + * Creates a new legacy window with the given caption + * + * @param caption + * the caption of the window + */ + public LegacyWindow(String caption) { + super(caption); + } + + /** + * Creates a legacy window with the given caption and content layout + * + * @param caption + * @param content + */ + public LegacyWindow(String caption, ComponentContainer content) { + super(caption, content); + } + + @Override + protected void init(WrappedRequest request) { + // Just empty + } + + /** + * Gets the unique name of the window. The name of the window is used to + * uniquely identify it. + *

+ * The name also determines the URL that can be used for direct access + * to a window. All windows can be accessed through + * {@code http://host:port/app/win} where {@code http://host:port/app} + * is the application URL (as returned by {@link Application#getURL()} + * and {@code win} is the window name. + *

+ *

+ * Note! Portlets do not support direct window access through URLs. + *

+ * + * @return the Name of the Window. + */ + public String getName() { + return name; + } + + /** + * Sets the unique name of the window. The name of the window is used to + * uniquely identify it inside the application. + *

+ * The name also determines the URL that can be used for direct access + * to a window. All windows can be accessed through + * {@code http://host:port/app/win} where {@code http://host:port/app} + * is the application URL (as returned by {@link Application#getURL()} + * and {@code win} is the window name. + *

+ *

+ * This method can only be called before the window is added to an + * application. + *

+ * Note! Portlets do not support direct window access through URLs. + *

+ * + * @param name + * the new name for the window or null if the application + * should automatically assign a name to it + * @throws IllegalStateException + * if the window is attached to an application + */ + public void setName(String name) { + this.name = name; + // The name can not be changed in application + if (getApplication() != null) { + throw new IllegalStateException( + "Window name can not be changed while " + + "the window is in application"); + } + + } + + /** + * Gets the full URL of the window. The returned URL is window specific + * and can be used to directly refer to the window. + *

+ * Note! This method can not be used for portlets. + *

+ * + * @return the URL of the window or null if the window is not attached + * to an application + */ + public URL getURL() { + Application application = getApplication(); + if (application == null) { + return null; + } + + try { + return new URL(application.getURL(), getName() + "/"); + } catch (MalformedURLException e) { + throw new RuntimeException( + "Internal problem getting window URL, please report"); + } + } + + /** + * Opens the given resource in this root. The contents of this UI is + * replaced by the {@code Resource}. + * + * @param resource + * the resource to show in this root + * + * @deprecated As of 7.0, use getPage().open instead + */ + @Deprecated + public void open(Resource resource) { + getPage().open(resource); + } + + /* ********************************************************************* */ + + /** + * Opens the given resource in a window with the given name. + *

+ * The supplied {@code windowName} is used as the target name in a + * window.open call in the client. This means that special values such + * as "_blank", "_self", "_top", "_parent" have special meaning. An + * empty or null window name is also a special case. + *

+ *

+ * "", null and "_self" as {@code windowName} all causes the resource to + * be opened in the current window, replacing any old contents. For + * downloadable content you should avoid "_self" as "_self" causes the + * client to skip rendering of any other changes as it considers them + * irrelevant (the page will be replaced by the resource). This can + * speed up the opening of a resource, but it might also put the client + * side into an inconsistent state if the window content is not + * completely replaced e.g., if the resource is downloaded instead of + * displayed in the browser. + *

+ *

+ * "_blank" as {@code windowName} causes the resource to always be + * opened in a new window or tab (depends on the browser and browser + * settings). + *

+ *

+ * "_top" and "_parent" as {@code windowName} works as specified by the + * HTML standard. + *

+ *

+ * Any other {@code windowName} will open the resource in a window with + * that name, either by opening a new window/tab in the browser or by + * replacing the contents of an existing window with that name. + *

+ * + * @param resource + * the resource. + * @param windowName + * the name of the window. + * @deprecated As of 7.0, use getPage().open instead + */ + @Deprecated + public void open(Resource resource, String windowName) { + getPage().open(resource, windowName); + } + + /** + * Opens the given resource in a window with the given size, border and + * name. For more information on the meaning of {@code windowName}, see + * {@link #open(Resource, String)}. + * + * @param resource + * the resource. + * @param windowName + * the name of the window. + * @param width + * the width of the window in pixels + * @param height + * the height of the window in pixels + * @param border + * the border style of the window. + * @deprecated As of 7.0, use getPage().open instead + */ + @Deprecated + public void open(Resource resource, String windowName, int width, + int height, BorderStyle border) { + getPage().open(resource, windowName, width, height, border); + } + + /** + * Adds a new {@link BrowserWindowResizeListener} to this root. The + * listener will be notified whenever the browser window within which + * this root resides is resized. + * + * @param resizeListener + * the listener to add + * + * @see BrowserWindowResizeListener#browserWindowResized(BrowserWindowResizeEvent) + * @see #setResizeLazy(boolean) + * + * @deprecated As of 7.0, use the similarly named api in Page instead + */ + @Deprecated + public void addListener(BrowserWindowResizeListener resizeListener) { + getPage().addListener(resizeListener); + } + + /** + * Removes a {@link BrowserWindowResizeListener} from this root. The + * listener will no longer be notified when the browser window is + * resized. + * + * @param resizeListener + * the listener to remove + * @deprecated As of 7.0, use the similarly named api in Page instead + */ + @Deprecated + public void removeListener(BrowserWindowResizeListener resizeListener) { + getPage().removeListener(resizeListener); + } + + /** + * Gets the last known height of the browser window in which this root + * resides. + * + * @return the browser window height in pixels + * @deprecated As of 7.0, use the similarly named api in Page instead + */ + @Deprecated + public int getBrowserWindowHeight() { + return getPage().getBrowserWindowHeight(); + } + + /** + * Gets the last known width of the browser window in which this root + * resides. + * + * @return the browser window width in pixels + * + * @deprecated As of 7.0, use the similarly named api in Page instead + */ + @Deprecated + public int getBrowserWindowWidth() { + return getPage().getBrowserWindowWidth(); + } + + /** + * Executes JavaScript in this window. + * + *

+ * This method allows one to inject javascript from the server to + * client. A client implementation is not required to implement this + * functionality, but currently all web-based clients do implement this. + *

+ * + *

+ * Executing javascript this way often leads to cross-browser + * compatibility issues and regressions that are hard to resolve. Use of + * this method should be avoided and instead it is recommended to create + * new widgets with GWT. For more info on creating own, reusable + * client-side widgets in Java, read the corresponding chapter in Book + * of Vaadin. + *

+ * + * @param script + * JavaScript snippet that will be executed. + * + * @deprecated as of 7.0, use JavaScript.getCurrent().execute(String) + * instead + */ + @Deprecated + public void executeJavaScript(String script) { + getPage().getJavaScript().execute(script); + } + + @Override + public void setCaption(String caption) { + // Override to provide backwards compatibility + getState().setCaption(caption); + getPage().setTitle(caption); + } + + } + + /** + * The application to which this root belongs + */ + private Application application; + + /** + * List of windows in this root. + */ + private final LinkedHashSet windows = new LinkedHashSet(); + + /** + * The component that should be scrolled into view after the next repaint. + * Null if nothing should be scrolled into view. + */ + private Component scrollIntoView; + + /** + * The id of this root, used to find the server side instance of the root + * form which a request originates. A negative value indicates that the root + * id has not yet been assigned by the Application. + * + * @see Application#nextRootId + */ + private int rootId = -1; + + /** + * Keeps track of the Actions added to this component, and manages the + * painting and handling as well. + */ + protected ActionManager actionManager; + + /** + * Thread local for keeping track of the current root. + */ + private static final ThreadLocal currentRoot = new ThreadLocal(); + + /** Identifies the click event */ + private ConnectorTracker connectorTracker = new ConnectorTracker(this); + + private Page page = new Page(this); + + private RootServerRpc rpc = new RootServerRpc() { + @Override + public void click(MouseEventDetails mouseDetails) { + fireEvent(new ClickEvent(UI.this, mouseDetails)); + } + + @Override + public void resize(int viewWidth, int viewHeight, int windowWidth, + int windowHeight) { + // TODO We're not doing anything with the view dimensions + getPage().setBrowserWindowSize(windowWidth, windowHeight); + } + }; + + /** + * Creates a new empty root without a caption. This root will have a + * {@link VerticalLayout} with margins enabled as its content. + */ + public UI() { + this((ComponentContainer) null); + } + + /** + * Creates a new root with the given component container as its content. + * + * @param content + * the content container to use as this roots content. + * + * @see #setContent(ComponentContainer) + */ + public UI(ComponentContainer content) { + registerRpc(rpc); + setSizeFull(); + setContent(content); + } + + /** + * Creates a new empty root with the given caption. This root will have a + * {@link VerticalLayout} with margins enabled as its content. + * + * @param caption + * the caption of the root, used as the page title if there's + * nothing but the application on the web page + * + * @see #setCaption(String) + */ + public UI(String caption) { + this((ComponentContainer) null); + setCaption(caption); + } + + /** + * Creates a new root with the given caption and content. + * + * @param caption + * the caption of the root, used as the page title if there's + * nothing but the application on the web page + * @param content + * the content container to use as this roots content. + * + * @see #setContent(ComponentContainer) + * @see #setCaption(String) + */ + public UI(String caption, ComponentContainer content) { + this(content); + setCaption(caption); + } + + @Override + protected RootState getState() { + return (RootState) super.getState(); + } + + @Override + public Class getStateType() { + // This is a workaround for a problem with creating the correct state + // object during build + return RootState.class; + } + + /** + * Overridden to return a value instead of referring to the parent. + * + * @return this root + * + * @see com.vaadin.ui.AbstractComponent#getRoot() + */ + @Override + public UI getRoot() { + return this; + } + + @Override + public void replaceComponent(Component oldComponent, Component newComponent) { + throw new UnsupportedOperationException(); + } + + @Override + public Application getApplication() { + return application; + } + + @Override + public void paintContent(PaintTarget target) throws PaintException { + page.paintContent(target); + + if (scrollIntoView != null) { + target.addAttribute("scrollTo", scrollIntoView); + scrollIntoView = null; + } + + if (pendingFocus != null) { + // ensure focused component is still attached to this main window + if (pendingFocus.getRoot() == this + || (pendingFocus.getRoot() != null && pendingFocus + .getRoot().getParent() == this)) { + target.addAttribute("focused", pendingFocus); + } + pendingFocus = null; + } + + if (actionManager != null) { + actionManager.paintActions(null, target); + } + + if (isResizeLazy()) { + target.addAttribute(RootConstants.RESIZE_LAZY, true); + } + } + + /** + * Fire a click event to all click listeners. + * + * @param object + * The raw "value" of the variable change from the client side. + */ + private void fireClick(Map parameters) { + MouseEventDetails mouseDetails = MouseEventDetails + .deSerialize((String) parameters.get("mouseDetails")); + fireEvent(new ClickEvent(this, mouseDetails)); + } + + @Override + @SuppressWarnings("unchecked") + public void changeVariables(Object source, Map variables) { + if (variables.containsKey(EventId.CLICK_EVENT_IDENTIFIER)) { + fireClick((Map) variables + .get(EventId.CLICK_EVENT_IDENTIFIER)); + } + + // Actions + if (actionManager != null) { + actionManager.handleActions(variables, this); + } + + if (variables.containsKey(RootConstants.FRAGMENT_VARIABLE)) { + String fragment = (String) variables + .get(RootConstants.FRAGMENT_VARIABLE); + getPage().setFragment(fragment, true); + } + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.ui.ComponentContainer#getComponentIterator() + */ + @Override + public Iterator getComponentIterator() { + // TODO could directly create some kind of combined iterator instead of + // creating a new ArrayList + ArrayList components = new ArrayList(); + + if (getContent() != null) { + components.add(getContent()); + } + + components.addAll(windows); + + return components.iterator(); + } + + /* + * (non-Javadoc) + * + * @see com.vaadin.ui.ComponentContainer#getComponentCount() + */ + @Override + public int getComponentCount() { + return windows.size() + (getContent() == null ? 0 : 1); + } + + /** + * Sets the application to which this root is assigned. It is not legal to + * change the application once it has been set nor to set a + * null application. + *

+ * This method is mainly intended for internal use by the framework. + *

+ * + * @param application + * the application to set + * + * @throws IllegalStateException + * if the application has already been set + * + * @see #getApplication() + */ + public void setApplication(Application application) { + if ((application == null) == (this.application == null)) { + throw new IllegalStateException("Application has already been set"); + } else { + this.application = application; + } + + if (application != null) { + attach(); + } else { + detach(); + } + } + + /** + * Sets the id of this root within its application. The root id is used to + * route requests to the right root. + *

+ * This method is mainly intended for internal use by the framework. + *

+ * + * @param rootId + * the id of this root + * + * @throws IllegalStateException + * if the root id has already been set + * + * @see #getRootId() + */ + public void setRootId(int rootId) { + if (this.rootId != -1) { + throw new IllegalStateException("UI id has already been defined"); + } + this.rootId = rootId; + } + + /** + * Gets the id of the root, used to identify this root within its + * application when processing requests. The root id should be present in + * every request to the server that originates from this root. + * {@link Application#getRootForRequest(WrappedRequest)} uses this id to + * find the route to which the request belongs. + * + * @return + */ + public int getRootId() { + return rootId; + } + + /** + * Adds a window as a subwindow inside this root. To open a new browser + * window or tab, you should instead use {@link open(Resource)} with an url + * pointing to this application and ensure + * {@link Application#getRoot(WrappedRequest)} returns an appropriate root + * for the request. + * + * @param window + * @throws IllegalArgumentException + * if the window is already added to an application + * @throws NullPointerException + * if the given Window is null. + */ + public void addWindow(Window window) throws IllegalArgumentException, + NullPointerException { + + if (window == null) { + throw new NullPointerException("Argument must not be null"); + } + + if (window.getApplication() != null) { + throw new IllegalArgumentException( + "Window is already attached to an application."); + } + + attachWindow(window); + } + + /** + * Helper method to attach a window. + * + * @param w + * the window to add + */ + private void attachWindow(Window w) { + windows.add(w); + w.setParent(this); + markAsDirty(); + } + + /** + * Remove the given subwindow from this root. + * + * Since Vaadin 6.5, {@link CloseListener}s are called also when explicitly + * removing a window by calling this method. + * + * Since Vaadin 6.5, returns a boolean indicating if the window was removed + * or not. + * + * @param window + * Window to be removed. + * @return true if the subwindow was removed, false otherwise + */ + public boolean removeWindow(Window window) { + if (!windows.remove(window)) { + // Window window is not a subwindow of this root. + return false; + } + window.setParent(null); + window.fireClose(); + markAsDirty(); + + return true; + } + + /** + * Gets all the windows added to this root. + * + * @return an unmodifiable collection of windows + */ + public Collection getWindows() { + return Collections.unmodifiableCollection(windows); + } + + @Override + public void focus() { + super.focus(); + } + + /** + * Component that should be focused after the next repaint. Null if no focus + * change should take place. + */ + private Focusable pendingFocus; + + private boolean resizeLazy = false; + + /** + * This method is used by Component.Focusable objects to request focus to + * themselves. Focus renders must be handled at window level (instead of + * Component.Focusable) due we want the last focused component to be focused + * in client too. Not the one that is rendered last (the case we'd get if + * implemented in Focusable only). + * + * To focus component from Vaadin application, use Focusable.focus(). See + * {@link Focusable}. + * + * @param focusable + * to be focused on next paint + */ + public void setFocusedComponent(Focusable focusable) { + pendingFocus = focusable; + markAsDirty(); + } + + /** + * Scrolls any component between the component and root to a suitable + * position so the component is visible to the user. The given component + * must belong to this root. + * + * @param component + * the component to be scrolled into view + * @throws IllegalArgumentException + * if {@code component} does not belong to this root + */ + public void scrollIntoView(Component component) + throws IllegalArgumentException { + if (component.getRoot() != this) { + throw new IllegalArgumentException( + "The component where to scroll must belong to this root."); + } + scrollIntoView = component; + markAsDirty(); + } + + /** + * Gets the content of this root. The content is a component container that + * serves as the outermost item of the visual contents of this root. + * + * @return a component container to use as content + * + * @see #setContent(ComponentContainer) + * @see #createDefaultLayout() + */ + public ComponentContainer getContent() { + return (ComponentContainer) getState().getContent(); + } + + /** + * Helper method to create the default content layout that is used if no + * content has not been explicitly defined. + * + * @return a newly created layout + */ + private static VerticalLayout createDefaultLayout() { + VerticalLayout layout = new VerticalLayout(); + layout.setMargin(true); + return layout; + } + + /** + * Sets the content of this root. The content is a component container that + * serves as the outermost item of the visual contents of this root. If no + * content has been set, a {@link VerticalLayout} with margins enabled will + * be used by default - see {@link #createDefaultLayout()}. The content can + * also be set in a constructor. + * + * @return a component container to use as content + * + * @see #UI(ComponentContainer) + * @see #createDefaultLayout() + */ + public void setContent(ComponentContainer content) { + if (content == null) { + content = createDefaultLayout(); + } + + if (getState().getContent() != null) { + super.removeComponent((Component) getState().getContent()); + } + getState().setContent(content); + if (content != null) { + super.addComponent(content); + } + } + + /** + * Adds a component to this root. The component is not added directly to the + * root, but instead to the content container ({@link #getContent()}). + * + * @param component + * the component to add to this root + * + * @see #getContent() + */ + @Override + public void addComponent(Component component) { + getContent().addComponent(component); + } + + /** + * This implementation removes the component from the content container ( + * {@link #getContent()}) instead of from the actual root. + */ + @Override + public void removeComponent(Component component) { + getContent().removeComponent(component); + } + + /** + * This implementation removes the components from the content container ( + * {@link #getContent()}) instead of from the actual root. + */ + @Override + public void removeAllComponents() { + getContent().removeAllComponents(); + } + + /** + * Internal initialization method, should not be overridden. This method is + * not declared as final because that would break compatibility with e.g. + * CDI. + * + * @param request + * the initialization request + */ + public void doInit(WrappedRequest request) { + getPage().init(request); + + // Call the init overridden by the application developer + init(request); + } + + /** + * Initializes this root. This method is intended to be overridden by + * subclasses to build the view and configure non-component functionality. + * Performing the initialization in a constructor is not suggested as the + * state of the root is not properly set up when the constructor is invoked. + *

+ * The {@link WrappedRequest} can be used to get information about the + * request that caused this root to be created. By default, the + * {@link BrowserDetails} will be available in the request. If the browser + * details are not required, loading the application in the browser can take + * some shortcuts giving a faster initial rendering. This can be indicated + * by adding the {@link EagerInit} annotation to the UI class. + *

+ * + * @param request + * the wrapped request that caused this root to be created + */ + protected abstract void init(WrappedRequest request); + + /** + * Sets the thread local for the current root. This method is used by the + * framework to set the current application whenever a new request is + * processed and it is cleared when the request has been processed. + *

+ * The application developer can also use this method to define the current + * root outside the normal request handling, e.g. when initiating custom + * background threads. + *

+ * + * @param uI + * the root to register as the current root + * + * @see #getCurrent() + * @see ThreadLocal + */ + public static void setCurrent(UI uI) { + currentRoot.set(uI); + } + + /** + * Gets the currently used root. The current root is automatically defined + * when processing requests to the server. In other cases, (e.g. from + * background threads), the current root is not automatically defined. + * + * @return the current root instance if available, otherwise + * null + * + * @see #setCurrent(UI) + */ + public static UI getCurrent() { + return currentRoot.get(); + } + + public void setScrollTop(int scrollTop) { + throw new RuntimeException("Not yet implemented"); + } + + @Override + protected ActionManager getActionManager() { + if (actionManager == null) { + actionManager = new ActionManager(this); + } + return actionManager; + } + + @Override + public void addAction( + T action) { + getActionManager().addAction(action); + } + + @Override + public void removeAction( + T action) { + if (actionManager != null) { + actionManager.removeAction(action); + } + } + + @Override + public void addActionHandler(Handler actionHandler) { + getActionManager().addActionHandler(actionHandler); + } + + @Override + public void removeActionHandler(Handler actionHandler) { + if (actionManager != null) { + actionManager.removeActionHandler(actionHandler); + } + } + + /** + * Should resize operations be lazy, i.e. should there be a delay before + * layout sizes are recalculated. Speeds up resize operations in slow UIs + * with the penalty of slightly decreased usability. + *

+ * Default value: false + * + * @param resizeLazy + * true to use a delay before recalculating sizes, false to + * calculate immediately. + */ + public void setResizeLazy(boolean resizeLazy) { + this.resizeLazy = resizeLazy; + markAsDirty(); + } + + /** + * Checks whether lazy resize is enabled. + * + * @return true if lazy resize is enabled, false + * if lazy resize is not enabled + */ + public boolean isResizeLazy() { + return resizeLazy; + } + + /** + * Add a click listener to the UI. The listener is called whenever the + * user clicks inside the UI. Also when the click targets a component + * inside the UI, provided the targeted component does not prevent the + * click event from propagating. + * + * Use {@link #removeListener(ClickListener)} to remove the listener. + * + * @param listener + * The listener to add + */ + public void addListener(ClickListener listener) { + addListener(EventId.CLICK_EVENT_IDENTIFIER, ClickEvent.class, listener, + ClickListener.clickMethod); + } + + /** + * Remove a click listener from the UI. The listener should earlier have + * been added using {@link #addListener(ClickListener)}. + * + * @param listener + * The listener to remove + */ + public void removeListener(ClickListener listener) { + removeListener(EventId.CLICK_EVENT_IDENTIFIER, ClickEvent.class, + listener); + } + + @Override + public boolean isConnectorEnabled() { + // TODO How can a UI be invisible? What does it mean? + return isVisible() && isEnabled(); + } + + public ConnectorTracker getConnectorTracker() { + return connectorTracker; + } + + public Page getPage() { + return page; + } + + /** + * Setting the caption of a UI is not supported. To set the title of the + * HTML page, use Page.setTitle + * + * @deprecated as of 7.0.0, use {@link Page#setTitle(String)} + */ + @Override + @Deprecated + public void setCaption(String caption) { + throw new IllegalStateException( + "You can not set the title of a UI. To set the title of the HTML page, use Page.setTitle"); + } + + /** + * Shows a notification message on the middle of the root. The message + * automatically disappears ("humanized message"). + * + * Care should be taken to to avoid XSS vulnerabilities as the caption is + * rendered as html. + * + * @see #showNotification(Notification) + * @see Notification + * + * @param caption + * The message + * + * @deprecated As of 7.0, use Notification.show instead but be aware that + * Notification.show does not allow HTML. + */ + @Deprecated + public void showNotification(String caption) { + Notification notification = new Notification(caption); + notification.setHtmlContentAllowed(true);// Backwards compatibility + getPage().showNotification(notification); + } + + /** + * Shows a notification message the root. The position and behavior of the + * message depends on the type, which is one of the basic types defined in + * {@link Notification}, for instance Notification.TYPE_WARNING_MESSAGE. + * + * Care should be taken to to avoid XSS vulnerabilities as the caption is + * rendered as html. + * + * @see #showNotification(Notification) + * @see Notification + * + * @param caption + * The message + * @param type + * The message type + * + * @deprecated As of 7.0, use Notification.show instead but be aware that + * Notification.show does not allow HTML. + */ + @Deprecated + public void showNotification(String caption, Notification.Type type) { + Notification notification = new Notification(caption, type); + notification.setHtmlContentAllowed(true);// Backwards compatibility + getPage().showNotification(notification); + } + + /** + * Shows a notification consisting of a bigger caption and a smaller + * description on the middle of the root. The message automatically + * disappears ("humanized message"). + * + * Care should be taken to to avoid XSS vulnerabilities as the caption and + * description are rendered as html. + * + * @see #showNotification(Notification) + * @see Notification + * + * @param caption + * The caption of the message + * @param description + * The message description + * + * @deprecated As of 7.0, use new Notification(...).show(Page) instead but + * be aware that HTML by default not allowed. + */ + @Deprecated + public void showNotification(String caption, String description) { + Notification notification = new Notification(caption, description); + notification.setHtmlContentAllowed(true);// Backwards compatibility + getPage().showNotification(notification); + } + + /** + * Shows a notification consisting of a bigger caption and a smaller + * description. The position and behavior of the message depends on the + * type, which is one of the basic types defined in {@link Notification} , + * for instance Notification.TYPE_WARNING_MESSAGE. + * + * Care should be taken to to avoid XSS vulnerabilities as the caption and + * description are rendered as html. + * + * @see #showNotification(Notification) + * @see Notification + * + * @param caption + * The caption of the message + * @param description + * The message description + * @param type + * The message type + * + * @deprecated As of 7.0, use new Notification(...).show(Page) instead but + * be aware that HTML by default not allowed. + */ + @Deprecated + public void showNotification(String caption, String description, + Notification.Type type) { + Notification notification = new Notification(caption, description, type); + notification.setHtmlContentAllowed(true);// Backwards compatibility + getPage().showNotification(notification); + } + + /** + * Shows a notification consisting of a bigger caption and a smaller + * description. The position and behavior of the message depends on the + * type, which is one of the basic types defined in {@link Notification} , + * for instance Notification.TYPE_WARNING_MESSAGE. + * + * Care should be taken to avoid XSS vulnerabilities if html content is + * allowed. + * + * @see #showNotification(Notification) + * @see Notification + * + * @param caption + * The message caption + * @param description + * The message description + * @param type + * The type of message + * @param htmlContentAllowed + * Whether html in the caption and description should be + * displayed as html or as plain text + * + * @deprecated As of 7.0, use new Notification(...).show(Page). + */ + @Deprecated + public void showNotification(String caption, String description, + Notification.Type type, boolean htmlContentAllowed) { + getPage() + .showNotification( + new Notification(caption, description, type, + htmlContentAllowed)); + } + + /** + * Shows a notification message. + * + * @see Notification + * @see #showNotification(String) + * @see #showNotification(String, int) + * @see #showNotification(String, String) + * @see #showNotification(String, String, int) + * + * @param notification + * The notification message to show + * + * @deprecated As of 7.0, use Notification.show instead + */ + @Deprecated + public void showNotification(Notification notification) { + getPage().showNotification(notification); + } + +} diff --git a/server/src/com/vaadin/ui/Window.java b/server/src/com/vaadin/ui/Window.java index d79588cc63..335f7fd67d 100644 --- a/server/src/com/vaadin/ui/Window.java +++ b/server/src/com/vaadin/ui/Window.java @@ -40,8 +40,8 @@ import com.vaadin.terminal.Vaadin6Component; /** * A component that represents a floating popup window that can be added to a - * {@link Root}. A window is added to a {@code Root} using - * {@link Root#addWindow(Window)}.

+ * {@link UI}. A window is added to a {@code UI} using + * {@link UI#addWindow(Window)}.

*

* The contents of a window is set using {@link #setContent(ComponentContainer)} * or by using the {@link #Window(String, ComponentContainer)} constructor. The @@ -57,7 +57,7 @@ import com.vaadin.terminal.Vaadin6Component; *

*

* In Vaadin versions prior to 7.0.0, Window was also used as application level - * windows. This function is now covered by the {@link Root} class. + * windows. This function is now covered by the {@link UI} class. *

* * @author Vaadin Ltd. @@ -222,14 +222,14 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier, *

*/ public void close() { - Root root = getRoot(); + UI uI = getRoot(); // Don't do anything if not attached to a root - if (root != null) { + if (uI != null) { // focus is restored to the parent window - root.focus(); + uI.focus(); // subwindow is removed from the root - root.removeWindow(this); + uI.removeWindow(this); } } @@ -476,13 +476,13 @@ public class Window extends Panel implements FocusNotifier, BlurNotifier, *

*/ public void bringToFront() { - Root root = getRoot(); - if (root == null) { + UI uI = getRoot(); + if (uI == null) { throw new IllegalStateException( "Window must be attached to parent before calling bringToFront method."); } int maxBringToFront = -1; - for (Window w : root.getWindows()) { + for (Window w : uI.getWindows()) { if (!isModal() && w.isModal()) { throw new IllegalStateException( "The root contains modal windows, non-modal window cannot be brought to front."); diff --git a/server/src/org/jsoup/select/Evaluator.java b/server/src/org/jsoup/select/Evaluator.java index 16a083bd77..bd0cee481d 100644 --- a/server/src/org/jsoup/select/Evaluator.java +++ b/server/src/org/jsoup/select/Evaluator.java @@ -18,7 +18,7 @@ public abstract class Evaluator { /** * Test if the element meets the evaluator's requirements. * - * @param root Root of the matching subtree + * @param root UI of the matching subtree * @param element tested element */ public abstract boolean matches(Element root, Element element); -- cgit v1.2.3