]> source.dussan.org Git - vaadin-framework.git/commitdiff
Extract API from Root to Page (#8907)
authorLeif Åstrand <leif@vaadin.com>
Tue, 19 Jun 2012 09:23:33 +0000 (12:23 +0300)
committerLeif Åstrand <leif@vaadin.com>
Tue, 19 Jun 2012 09:23:33 +0000 (12:23 +0300)
45 files changed:
src/com/vaadin/navigator/Navigator.java
src/com/vaadin/terminal/Page.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/root/PageClientRpc.java [new file with mode: 0644]
src/com/vaadin/terminal/gwt/client/ui/root/RootConnector.java
src/com/vaadin/ui/HelloWorldExtension.java
src/com/vaadin/ui/JavaScript.java
src/com/vaadin/ui/Link.java
src/com/vaadin/ui/Notification.java
src/com/vaadin/ui/Root.java
tests/server-side/com/vaadin/tests/server/navigator/NavigatorTest.java
tests/server-side/com/vaadin/tests/server/navigator/UriFragmentManagerTest.java
tests/testbench/com/vaadin/tests/TestBench.java
tests/testbench/com/vaadin/tests/TestComponentAddAndRecursion.java
tests/testbench/com/vaadin/tests/TestForWindowOpen.java
tests/testbench/com/vaadin/tests/appengine/GAESyncTest.java
tests/testbench/com/vaadin/tests/components/AbstractTestRoot.java
tests/testbench/com/vaadin/tests/components/TouchScrollables.java
tests/testbench/com/vaadin/tests/components/customfield/AddressFormExample.java
tests/testbench/com/vaadin/tests/components/customfield/BooleanFieldExample.java
tests/testbench/com/vaadin/tests/components/javascriptcomponent/BasicJavaScriptComponent.java
tests/testbench/com/vaadin/tests/components/notification/Notifications.java
tests/testbench/com/vaadin/tests/components/notification/NotificationsHtmlAllowed.java
tests/testbench/com/vaadin/tests/components/richtextarea/RichTextAreaWithKeyboardShortcuts.java
tests/testbench/com/vaadin/tests/components/root/UriFragmentTest.java
tests/testbench/com/vaadin/tests/components/table/MultiSelectWithNotIdentityEqualIds.java
tests/testbench/com/vaadin/tests/components/table/TableContextMenu.java
tests/testbench/com/vaadin/tests/components/table/TableShouldNotEatValueChanges.java
tests/testbench/com/vaadin/tests/components/treetable/ProgrammaticCollapse.java
tests/testbench/com/vaadin/tests/components/window/LazyWindowResize.java
tests/testbench/com/vaadin/tests/components/window/SubWindowFocusAndBlurListeners.java
tests/testbench/com/vaadin/tests/components/window/WindowResizeListener.java
tests/testbench/com/vaadin/tests/extensions/SimpleJavaScriptExtensionTest.java
tests/testbench/com/vaadin/tests/fieldgroup/AbstractBeanFieldGroupTest.java
tests/testbench/com/vaadin/tests/fieldgroup/BasicPersonForm.java
tests/testbench/com/vaadin/tests/fieldgroup/FieldBinderWithBeanValidation.java
tests/testbench/com/vaadin/tests/integration/EmbedSizeTest.java
tests/testbench/com/vaadin/tests/integration/JSR286PortletRoot.java
tests/testbench/com/vaadin/tests/integration/LiferayThemeDemo.java
tests/testbench/com/vaadin/tests/minitutorials/IntegerTextFieldDataSource.java
tests/testbench/com/vaadin/tests/minitutorials/IntegerTextFieldStandalone.java
tests/testbench/com/vaadin/tests/minitutorials/StringMyTypeConverter.java
tests/testbench/com/vaadin/tests/tickets/Ticket1465ModalNotification.java
tests/testbench/com/vaadin/tests/tickets/Ticket2998.java
tests/testbench/com/vaadin/tests/tickets/Ticket34.java
tests/testbench/com/vaadin/tests/util/TestUtils.java

index 9d9acf9ed3bc4573db85ab4d4c931c92b8872ae6..387f1d4eaea157bb2f52c26b1e294219b7374791 100644 (file)
@@ -10,12 +10,13 @@ import java.util.LinkedList;
 import java.util.List;
 
 import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
+import com.vaadin.terminal.Page;
+import com.vaadin.terminal.Page.FragmentChangedEvent;
+import com.vaadin.terminal.Page.FragmentChangedListener;
 import com.vaadin.ui.Component;
 import com.vaadin.ui.CssLayout;
 import com.vaadin.ui.CustomComponent;
 import com.vaadin.ui.Root;
-import com.vaadin.ui.Root.FragmentChangedEvent;
-import com.vaadin.ui.Root.FragmentChangedListener;
 
 /**
  * Navigator utility that allows switching of views in a part of an application.
@@ -67,7 +68,7 @@ public class Navigator implements Serializable {
      */
     public static class UriFragmentManager implements FragmentManager,
             FragmentChangedListener {
-        private final Root root;
+        private final Page page;
         private final Navigator navigator;
 
         /**
@@ -80,20 +81,20 @@ public class Navigator implements Serializable {
          *            {@link Navigator} to notify of fragment changes (using
          *            {@link Navigator#navigateTo(String)}
          */
-        public UriFragmentManager(Root root, Navigator navigator) {
-            this.root = root;
+        public UriFragmentManager(Page page, Navigator navigator) {
+            this.page = page;
             this.navigator = navigator;
 
-            root.addListener(this);
+            page.addListener(this);
         }
 
         public String getFragment() {
-            return root.getFragment();
+            return page.getFragment();
         }
 
         public void setFragment(String fragment) {
             // TODO ", false" ???
-            root.setFragment(fragment);
+            page.setFragment(fragment);
         }
 
         public void fragmentChanged(FragmentChangedEvent event) {
@@ -276,9 +277,9 @@ public class Navigator implements Serializable {
      * @param display
      *            where to display the views
      */
-    public Navigator(Root root, ViewDisplay display) {
+    public Navigator(Page page, ViewDisplay display) {
         this.display = display;
-        fragmentManager = new UriFragmentManager(root, this);
+        fragmentManager = new UriFragmentManager(page, this);
     }
 
     /**
@@ -289,9 +290,9 @@ public class Navigator implements Serializable {
      * @param root
      *            whose URI fragments are used
      */
-    public Navigator(Root root) {
+    public Navigator(Page page) {
         display = new SimpleViewDisplay();
-        fragmentManager = new UriFragmentManager(root, this);
+        fragmentManager = new UriFragmentManager(page, this);
     }
 
     /**
diff --git a/src/com/vaadin/terminal/Page.java b/src/com/vaadin/terminal/Page.java
new file mode 100644 (file)
index 0000000..65fa500
--- /dev/null
@@ -0,0 +1,630 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.terminal;
+
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.util.EventObject;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import com.vaadin.event.EventRouter;
+import com.vaadin.terminal.WrappedRequest.BrowserDetails;
+import com.vaadin.terminal.gwt.client.ui.notification.VNotification;
+import com.vaadin.terminal.gwt.client.ui.root.PageClientRpc;
+import com.vaadin.terminal.gwt.client.ui.root.VRoot;
+import com.vaadin.terminal.gwt.server.WebApplicationContext;
+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;
+
+public class Page implements Serializable {
+
+    /**
+     * Listener that gets notified when the size of the browser window
+     * containing the root has changed.
+     * 
+     * @see Root#addListener(BrowserWindowResizeListener)
+     */
+    public interface BrowserWindowResizeListener extends Serializable {
+        /**
+         * Invoked when the browser window containing a Root has been resized.
+         * 
+         * @param event
+         *            a browser window resize event
+         */
+        public void browserWindowResized(BrowserWindowResizeEvent event);
+    }
+
+    /**
+     * Event that is fired when a browser window containing a root is resized.
+     */
+    public class BrowserWindowResizeEvent extends EventObject {
+
+        private final int width;
+        private final int height;
+
+        /**
+         * Creates a new event
+         * 
+         * @param source
+         *            the root for which the browser window has been resized
+         * @param width
+         *            the new width of the browser window
+         * @param height
+         *            the new height of the browser window
+         */
+        public BrowserWindowResizeEvent(Page source, int width, int height) {
+            super(source);
+            this.width = width;
+            this.height = height;
+        }
+
+        @Override
+        public Page getSource() {
+            return (Page) super.getSource();
+        }
+
+        /**
+         * Gets the new browser window height
+         * 
+         * @return an integer with the new pixel height of the browser window
+         */
+        public int getHeight() {
+            return height;
+        }
+
+        /**
+         * Gets the new browser window width
+         * 
+         * @return an integer with the new pixel width of the browser window
+         */
+        public int getWidth() {
+            return width;
+        }
+    }
+
+    /**
+     * Private class for storing properties related to opening resources.
+     */
+    private class OpenResource implements Serializable {
+
+        /**
+         * The resource to open
+         */
+        private final Resource resource;
+
+        /**
+         * The name of the target window
+         */
+        private final String name;
+
+        /**
+         * The width of the target window
+         */
+        private final int width;
+
+        /**
+         * The height of the target window
+         */
+        private final int height;
+
+        /**
+         * The border style of the target window
+         */
+        private final int border;
+
+        /**
+         * Creates a new open resource.
+         * 
+         * @param resource
+         *            The resource to open
+         * @param name
+         *            The name of the target window
+         * @param width
+         *            The width of the target window
+         * @param height
+         *            The height of the target window
+         * @param border
+         *            The border style of the target window
+         */
+        private OpenResource(Resource resource, String name, int width,
+                int height, int border) {
+            this.resource = resource;
+            this.name = name;
+            this.width = width;
+            this.height = height;
+            this.border = border;
+        }
+
+        /**
+         * Paints the open request. Should be painted inside the window.
+         * 
+         * @param target
+         *            the paint target
+         * @throws PaintException
+         *             if the paint operation fails
+         */
+        private void paintContent(PaintTarget target) throws PaintException {
+            target.startTag("open");
+            target.addAttribute("src", resource);
+            if (name != null && name.length() > 0) {
+                target.addAttribute("name", name);
+            }
+            if (width >= 0) {
+                target.addAttribute("width", width);
+            }
+            if (height >= 0) {
+                target.addAttribute("height", height);
+            }
+            switch (border) {
+            case BORDER_MINIMAL:
+                target.addAttribute("border", "minimal");
+                break;
+            case BORDER_NONE:
+                target.addAttribute("border", "none");
+                break;
+            }
+
+            target.endTag("open");
+        }
+    }
+
+    private static final Method BROWSWER_RESIZE_METHOD = ReflectTools
+            .findMethod(BrowserWindowResizeListener.class,
+                    "browserWindowResized", BrowserWindowResizeEvent.class);
+
+    /**
+     * A border style used for opening resources in a window without a border.
+     */
+    public static final int BORDER_NONE = 0;
+
+    /**
+     * A border style used for opening resources in a window with a minimal
+     * border.
+     */
+    public static final int BORDER_MINIMAL = 1;
+
+    /**
+     * A border style that indicates that the default border style should be
+     * used when opening resources.
+     */
+    public static final int BORDER_DEFAULT = 2;
+
+    /**
+     * Listener that listens changes in URI fragment.
+     */
+    public interface FragmentChangedListener extends Serializable {
+        public void fragmentChanged(FragmentChangedEvent event);
+    }
+
+    private static final Method FRAGMENT_CHANGED_METHOD = ReflectTools
+            .findMethod(Page.FragmentChangedListener.class, "fragmentChanged",
+                    FragmentChangedEvent.class);
+
+    /**
+     * Resources to be opened automatically on next repaint. The list is
+     * automatically cleared when it has been sent to the client.
+     */
+    private final LinkedList<OpenResource> openList = new LinkedList<OpenResource>();
+
+    /**
+     * A list of notifications that are waiting to be sent to the client.
+     * Cleared (set to null) when the notifications have been sent.
+     */
+    private List<Notification> notifications;
+
+    /**
+     * Event fired when uri fragment changes.
+     */
+    public class FragmentChangedEvent extends EventObject {
+
+        /**
+         * The new uri fragment
+         */
+        private final String fragment;
+
+        /**
+         * Creates a new instance of UriFragmentReader change event.
+         * 
+         * @param source
+         *            the Source of the event.
+         */
+        public FragmentChangedEvent(Page source, String fragment) {
+            super(source);
+            this.fragment = fragment;
+        }
+
+        /**
+         * Gets the root in which the fragment has changed.
+         * 
+         * @return the root in which the fragment has changed
+         */
+        public Page getPage() {
+            return (Page) getSource();
+        }
+
+        /**
+         * Get the new fragment
+         * 
+         * @return the new fragment
+         */
+        public String getFragment() {
+            return fragment;
+        }
+    }
+
+    private EventRouter eventRouter;
+
+    /**
+     * The current URI fragment.
+     */
+    private String fragment;
+
+    private final Root root;
+
+    private int browserWindowWidth = -1;
+    private int browserWindowHeight = -1;
+
+    private JavaScript javaScript;
+
+    public Page(Root root) {
+        this.root = root;
+    }
+
+    private void addListener(Class<?> eventType, Object target, Method method) {
+        if (eventRouter == null) {
+            eventRouter = new EventRouter();
+        }
+        eventRouter.addListener(eventType, target, method);
+    }
+
+    private void removeListener(Class<?> eventType, Object target, Method method) {
+        if (eventRouter != null) {
+            eventRouter.removeListener(eventType, target, method);
+        }
+    }
+
+    public void addListener(Page.FragmentChangedListener listener) {
+        addListener(FragmentChangedEvent.class, listener,
+                FRAGMENT_CHANGED_METHOD);
+    }
+
+    public void removeListener(Page.FragmentChangedListener listener) {
+        removeListener(FragmentChangedEvent.class, listener,
+                FRAGMENT_CHANGED_METHOD);
+    }
+
+    /**
+     * Sets URI fragment. Optionally fires a {@link FragmentChangedEvent}
+     * 
+     * @param newFragment
+     *            id of the new fragment
+     * @param fireEvent
+     *            true to fire event
+     * @see FragmentChangedEvent
+     * @see Page.FragmentChangedListener
+     */
+    public void setFragment(String newFragment, boolean fireEvents) {
+        if (newFragment == null) {
+            throw new NullPointerException("The fragment may not be null");
+        }
+        if (!newFragment.equals(fragment)) {
+            fragment = newFragment;
+            if (fireEvents) {
+                fireEvent(new FragmentChangedEvent(this, newFragment));
+            }
+            root.requestRepaint();
+        }
+    }
+
+    private void fireEvent(EventObject event) {
+        if (eventRouter != null) {
+            eventRouter.fireEvent(event);
+        }
+    }
+
+    /**
+     * Sets URI fragment. This method fires a {@link FragmentChangedEvent}
+     * 
+     * @param newFragment
+     *            id of the new fragment
+     * @see FragmentChangedEvent
+     * @see Page.FragmentChangedListener
+     */
+    public void setFragment(String newFragment) {
+        setFragment(newFragment, true);
+    }
+
+    /**
+     * Gets currently set URI fragment.
+     * <p>
+     * To listen changes in fragment, hook a
+     * {@link Page.FragmentChangedListener}.
+     * 
+     * @return the current fragment in browser uri or null if not known
+     */
+    public String getFragment() {
+        return fragment;
+    }
+
+    public void init(WrappedRequest request) {
+        BrowserDetails browserDetails = request.getBrowserDetails();
+        if (browserDetails != null) {
+            fragment = browserDetails.getUriFragment();
+        }
+    }
+
+    public WebBrowser getWebBrowser() {
+        return ((WebApplicationContext) root.getApplication().getContext())
+                .getBrowser();
+    }
+
+    public void setBrowserWindowSize(Integer width, Integer height) {
+        boolean fireEvent = false;
+
+        if (width != null) {
+            int newWidth = width.intValue();
+            if (newWidth != browserWindowWidth) {
+                browserWindowWidth = newWidth;
+                fireEvent = true;
+            }
+        }
+
+        if (height != null) {
+            int newHeight = height.intValue();
+            if (newHeight != browserWindowHeight) {
+                browserWindowHeight = newHeight;
+                fireEvent = true;
+            }
+        }
+
+        if (fireEvent) {
+            fireEvent(new BrowserWindowResizeEvent(this, browserWindowWidth,
+                    browserWindowHeight));
+        }
+
+    }
+
+    /**
+     * 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)
+     */
+    public void addListener(BrowserWindowResizeListener resizeListener) {
+        addListener(BrowserWindowResizeEvent.class, resizeListener,
+                BROWSWER_RESIZE_METHOD);
+    }
+
+    /**
+     * 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
+     */
+    public void removeListener(BrowserWindowResizeListener resizeListener) {
+        removeListener(BrowserWindowResizeEvent.class, resizeListener,
+                BROWSWER_RESIZE_METHOD);
+    }
+
+    /**
+     * Gets the last known height of the browser window in which this root
+     * resides.
+     * 
+     * @return the browser window height in pixels
+     */
+    public int getBrowserWindowHeight() {
+        return browserWindowHeight;
+    }
+
+    /**
+     * Gets the last known width of the browser window in which this root
+     * resides.
+     * 
+     * @return the browser window width in pixels
+     */
+    public int getBrowserWindowWidth() {
+        return browserWindowWidth;
+    }
+
+    public JavaScript getJavaScript() {
+        if (javaScript == null) {
+            // Create and attach on first use
+            javaScript = new JavaScript();
+            javaScript.extend(root);
+        }
+
+        return javaScript;
+    }
+
+    public void paintContent(PaintTarget target) throws PaintException {
+        if (!openList.isEmpty()) {
+            for (final Iterator<OpenResource> i = openList.iterator(); i
+                    .hasNext();) {
+                (i.next()).paintContent(target);
+            }
+            openList.clear();
+        }
+
+        // Paint notifications
+        if (notifications != null) {
+            target.startTag("notifications");
+            for (final Iterator<Notification> it = notifications.iterator(); it
+                    .hasNext();) {
+                final Notification n = it.next();
+                target.startTag("notification");
+                if (n.getCaption() != null) {
+                    target.addAttribute(
+                            VNotification.ATTRIBUTE_NOTIFICATION_CAPTION,
+                            n.getCaption());
+                }
+                if (n.getDescription() != null) {
+                    target.addAttribute(
+                            VNotification.ATTRIBUTE_NOTIFICATION_MESSAGE,
+                            n.getDescription());
+                }
+                if (n.getIcon() != null) {
+                    target.addAttribute(
+                            VNotification.ATTRIBUTE_NOTIFICATION_ICON,
+                            n.getIcon());
+                }
+                if (!n.isHtmlContentAllowed()) {
+                    target.addAttribute(
+                            VRoot.NOTIFICATION_HTML_CONTENT_NOT_ALLOWED, true);
+                }
+                target.addAttribute(
+                        VNotification.ATTRIBUTE_NOTIFICATION_POSITION,
+                        n.getPosition());
+                target.addAttribute(VNotification.ATTRIBUTE_NOTIFICATION_DELAY,
+                        n.getDelayMsec());
+                if (n.getStyleName() != null) {
+                    target.addAttribute(
+                            VNotification.ATTRIBUTE_NOTIFICATION_STYLE,
+                            n.getStyleName());
+                }
+                target.endTag("notification");
+            }
+            target.endTag("notifications");
+            notifications = null;
+        }
+
+        if (fragment != null) {
+            target.addAttribute(VRoot.FRAGMENT_VARIABLE, fragment);
+        }
+
+    }
+
+    /**
+     * 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
+     */
+    public void open(Resource resource) {
+        openList.add(new OpenResource(resource, null, -1, -1, BORDER_DEFAULT));
+        root.requestRepaint();
+    }
+
+    /**
+     * Opens the given resource in a window with the given name.
+     * <p>
+     * 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
+     * <code>null</code> window name is also a special case.
+     * </p>
+     * <p>
+     * "", 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.
+     * </p>
+     * <p>
+     * "_blank" as {@code windowName} causes the resource to always be opened in
+     * a new window or tab (depends on the browser and browser settings).
+     * </p>
+     * <p>
+     * "_top" and "_parent" as {@code windowName} works as specified by the HTML
+     * standard.
+     * </p>
+     * <p>
+     * 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.
+     * </p>
+     * 
+     * @param resource
+     *            the resource.
+     * @param windowName
+     *            the name of the window.
+     */
+    public void open(Resource resource, String windowName) {
+        openList.add(new OpenResource(resource, windowName, -1, -1,
+                BORDER_DEFAULT));
+        root.requestRepaint();
+    }
+
+    /**
+     * 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. See {@link #BORDER_NONE
+     *            Window.BORDER_* constants}
+     */
+    public void open(Resource resource, String windowName, int width,
+            int height, int border) {
+        openList.add(new OpenResource(resource, windowName, width, height,
+                border));
+        root.requestRepaint();
+    }
+
+    /**
+     * Internal helper method to actually add a notification.
+     * 
+     * @param notification
+     *            the notification to add
+     */
+    private void addNotification(Notification notification) {
+        if (notifications == null) {
+            notifications = new LinkedList<Notification>();
+        }
+        notifications.add(notification);
+        root.requestRepaint();
+    }
+
+    /**
+     * 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
+     */
+    public void showNotification(Notification notification) {
+        addNotification(notification);
+    }
+
+    public static Page getCurrent() {
+        Root currentRoot = Root.getCurrentRoot();
+        if (currentRoot == null) {
+            return null;
+        }
+        return currentRoot.getPage();
+    }
+
+    public void setTitle(String title) {
+        root.getRpcProxy(PageClientRpc.class).setTitle(title);
+    }
+
+}
diff --git a/src/com/vaadin/terminal/gwt/client/ui/root/PageClientRpc.java b/src/com/vaadin/terminal/gwt/client/ui/root/PageClientRpc.java
new file mode 100644 (file)
index 0000000..a02ecc8
--- /dev/null
@@ -0,0 +1,13 @@
+/* 
+@VaadinApache2LicenseForJavaFiles@
+ */
+
+package com.vaadin.terminal.gwt.client.ui.root;
+
+import com.vaadin.terminal.gwt.client.communication.ClientRpc;
+
+public interface PageClientRpc extends ClientRpc {
+
+    public void setTitle(String title);
+
+}
index eebbe971a4012c8fadc4a81f23ae2bf4c3023889..5184f38ed97535a7fff74035d2d8803ea97dc71f 100644 (file)
@@ -61,6 +61,11 @@ public class RootConnector extends AbstractComponentContainerConnector
     @Override
     protected void init() {
         super.init();
+        registerRpc(PageClientRpc.class, new PageClientRpc() {
+            public void setTitle(String title) {
+                com.google.gwt.user.client.Window.setTitle(title);
+            }
+        });
     }
 
     public void updateFromUIDL(final UIDL uidl, ApplicationConnection client) {
@@ -95,11 +100,6 @@ public class RootConnector extends AbstractComponentContainerConnector
 
         clickEventHandler.handleEventHandlerRegistration();
 
-        if (!getWidget().isEmbedded() && getState().getCaption() != null) {
-            // only change window title if we're in charge of the whole page
-            com.google.gwt.user.client.Window.setTitle(getState().getCaption());
-        }
-
         // Process children
         int childIndex = 0;
 
index 6d9ce9bcf16107e3fd73677600b095e4c0faadd1..e705954f2e93e23b63b6480b9365f28a732f0822 100644 (file)
@@ -13,7 +13,7 @@ public class HelloWorldExtension extends AbstractExtension {
     public HelloWorldExtension() {
         registerRpc(new HelloWorldRpc() {
             public void onMessageSent(String message) {
-                getRoot().showNotification(message);
+                Notification.show(message);
             }
         });
     }
index 234f37f8a6e3fde1c4c339f612a84d1639faf5a1..241d477506caa1321b6f191fb40fb1a085a1b727 100644 (file)
@@ -10,6 +10,7 @@ import java.util.Map;
 import com.vaadin.external.json.JSONArray;
 import com.vaadin.external.json.JSONException;
 import com.vaadin.terminal.AbstractExtension;
+import com.vaadin.terminal.Page;
 import com.vaadin.terminal.gwt.client.communication.ServerRpc;
 import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.ExecuteJavaScriptRpc;
 import com.vaadin.terminal.gwt.client.extensions.javascriptmanager.JavaScriptManagerState;
@@ -61,7 +62,11 @@ public class JavaScript extends AbstractExtension {
     }
 
     public static JavaScript getCurrent() {
-        return Root.getCurrentRoot().getJavaScript();
+        Page page = Page.getCurrent();
+        if (page == null) {
+            return null;
+        }
+        return page.getJavaScript();
     }
 
 }
index ed5ffbba3a4c1e753b718d5970442c3f8e84f9aa..db0dc58e6b4b2240761bba45758f4a022b29fef1 100644 (file)
@@ -6,6 +6,7 @@ package com.vaadin.ui;
 
 import java.util.Map;
 
+import com.vaadin.terminal.Page;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
@@ -23,13 +24,13 @@ import com.vaadin.terminal.Vaadin6Component;
 public class Link extends AbstractComponent implements Vaadin6Component {
 
     /* Target window border type constant: No window border */
-    public static final int TARGET_BORDER_NONE = Root.BORDER_NONE;
+    public static final int TARGET_BORDER_NONE = Page.BORDER_NONE;
 
     /* Target window border type constant: Minimal window border */
-    public static final int TARGET_BORDER_MINIMAL = Root.BORDER_MINIMAL;
+    public static final int TARGET_BORDER_MINIMAL = Page.BORDER_MINIMAL;
 
     /* Target window border type constant: Default window border */
-    public static final int TARGET_BORDER_DEFAULT = Root.BORDER_DEFAULT;
+    public static final int TARGET_BORDER_DEFAULT = Page.BORDER_DEFAULT;
 
     private Resource resource = null;
 
index bb1f8746353f7c2e0ecefe2b039aefb35543be21..075ab50196397712320234f9ca008b8d57f63842 100644 (file)
@@ -6,6 +6,7 @@ package com.vaadin.ui;
 
 import java.io.Serializable;
 
+import com.vaadin.terminal.Page;
 import com.vaadin.terminal.Resource;
 
 /**
@@ -318,4 +319,118 @@ public class Notification implements Serializable {
     public boolean isHtmlContentAllowed() {
         return htmlContentAllowed;
     }
+
+    public void show() {
+        Page.getCurrent().showNotification(this);
+    }
+
+    /**
+     * Shows a notification message on the middle of the current page. 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
+     */
+    public static void show(String caption) {
+        new Notification(caption).show();
+    }
+
+    /**
+     * Shows a notification message the current page. 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
+     */
+    public static void show(String caption, int type) {
+        new Notification(caption, type).show();
+    }
+
+    /**
+     * Shows a notification consisting of a bigger caption and a smaller
+     * description on the middle of the current page. 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
+     * 
+     */
+    public static void show(String caption, String description) {
+        new Notification(caption, description).show();
+    }
+
+    /**
+     * 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
+     */
+    public static void show(String caption, String description, int type) {
+
+        new Notification(caption, description, type).show();
+    }
+
+    /**
+     * 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
+     */
+    public static void show(String caption, String description, int type,
+            boolean htmlContentAllowed) {
+        new Notification(caption, description, type, htmlContentAllowed).show();
+    }
 }
\ No newline at end of file
index 60408fe1dcb8b80bf319dc1ffe63c00c7c411070..50ad99571ee5bd3ca94574623a0332ad5f693aaa 100644 (file)
@@ -4,8 +4,6 @@
 
 package com.vaadin.ui;
 
-import java.io.Serializable;
-import java.lang.reflect.Method;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -13,8 +11,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 
 import com.vaadin.Application;
@@ -24,6 +20,9 @@ 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.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;
@@ -31,11 +30,9 @@ import com.vaadin.terminal.Vaadin6Component;
 import com.vaadin.terminal.WrappedRequest;
 import com.vaadin.terminal.WrappedRequest.BrowserDetails;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
-import com.vaadin.terminal.gwt.client.ui.notification.VNotification;
 import com.vaadin.terminal.gwt.client.ui.root.RootServerRpc;
 import com.vaadin.terminal.gwt.client.ui.root.RootState;
 import com.vaadin.terminal.gwt.client.ui.root.VRoot;
-import com.vaadin.tools.ReflectTools;
 import com.vaadin.ui.Window.CloseListener;
 
 /**
@@ -78,121 +75,6 @@ import com.vaadin.ui.Window.CloseListener;
 public abstract class Root extends AbstractComponentContainer implements
         Action.Container, Action.Notifier, Vaadin6Component {
 
-    /**
-     * Listener that gets notified when the size of the browser window
-     * containing the root has changed.
-     * 
-     * @see Root#addListener(BrowserWindowResizeListener)
-     */
-    public interface BrowserWindowResizeListener extends Serializable {
-        /**
-         * Invoked when the browser window containing a Root has been resized.
-         * 
-         * @param event
-         *            a browser window resize event
-         */
-        public void browserWindowResized(BrowserWindowResizeEvent event);
-    }
-
-    /**
-     * Event that is fired when a browser window containing a root is resized.
-     */
-    public class BrowserWindowResizeEvent extends Component.Event {
-
-        private final int width;
-        private final int height;
-
-        /**
-         * Creates a new event
-         * 
-         * @param source
-         *            the root for which the browser window has been resized
-         * @param width
-         *            the new width of the browser window
-         * @param height
-         *            the new height of the browser window
-         */
-        public BrowserWindowResizeEvent(Root source, int width, int height) {
-            super(source);
-            this.width = width;
-            this.height = height;
-        }
-
-        @Override
-        public Root getSource() {
-            return (Root) super.getSource();
-        }
-
-        /**
-         * Gets the new browser window height
-         * 
-         * @return an integer with the new pixel height of the browser window
-         */
-        public int getHeight() {
-            return height;
-        }
-
-        /**
-         * Gets the new browser window width
-         * 
-         * @return an integer with the new pixel width of the browser window
-         */
-        public int getWidth() {
-            return width;
-        }
-    }
-
-    private static final Method BROWSWER_RESIZE_METHOD = ReflectTools
-            .findMethod(BrowserWindowResizeListener.class,
-                    "browserWindowResized", BrowserWindowResizeEvent.class);
-
-    /**
-     * Listener that listens changes in URI fragment.
-     */
-    public interface FragmentChangedListener extends Serializable {
-        public void fragmentChanged(FragmentChangedEvent event);
-    }
-
-    /**
-     * Event fired when uri fragment changes.
-     */
-    public class FragmentChangedEvent extends Component.Event {
-
-        /**
-         * The new uri fragment
-         */
-        private final String fragment;
-
-        /**
-         * Creates a new instance of UriFragmentReader change event.
-         * 
-         * @param source
-         *            the Source of the event.
-         */
-        public FragmentChangedEvent(Root source, String fragment) {
-            super(source);
-            this.fragment = fragment;
-        }
-
-        /**
-         * Gets the root in which the fragment has changed.
-         * 
-         * @return the root in which the fragment has changed
-         */
-        public Root getRoot() {
-            return (Root) getComponent();
-        }
-
-        /**
-         * Get the new fragment
-         * 
-         * @return the new fragment
-         */
-        public String getFragment() {
-            return fragment;
-        }
-    }
-
     /**
      * 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
@@ -312,61 +194,343 @@ public abstract class Root extends AbstractComponentContainer implements
                         "Internal problem getting window URL, please report");
             }
         }
-    }
 
-    private static final Method FRAGMENT_CHANGED_METHOD;
-
-    static {
-        try {
-            FRAGMENT_CHANGED_METHOD = FragmentChangedListener.class
-                    .getDeclaredMethod("fragmentChanged",
-                            new Class[] { FragmentChangedEvent.class });
-        } catch (final java.lang.NoSuchMethodException e) {
-            // This should never happen
-            throw new java.lang.RuntimeException(
-                    "Internal error finding methods in FragmentChangedListener");
+        /**
+         * 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);
         }
-    }
 
-    /**
-     * A border style used for opening resources in a window without a border.
-     */
-    public static final int BORDER_NONE = 0;
+        /* ********************************************************************* */
 
-    /**
-     * A border style used for opening resources in a window with a minimal
-     * border.
-     */
-    public static final int BORDER_MINIMAL = 1;
+        /**
+         * Opens the given resource in a window with the given name.
+         * <p>
+         * 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 <code>null</code> window name is also a special case.
+         * </p>
+         * <p>
+         * "", 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.
+         * </p>
+         * <p>
+         * "_blank" as {@code windowName} causes the resource to always be
+         * opened in a new window or tab (depends on the browser and browser
+         * settings).
+         * </p>
+         * <p>
+         * "_top" and "_parent" as {@code windowName} works as specified by the
+         * HTML standard.
+         * </p>
+         * <p>
+         * 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.
+         * </p>
+         * 
+         * @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);
+        }
 
-    /**
-     * A border style that indicates that the default border style should be
-     * used when opening resources.
-     */
-    public static final int BORDER_DEFAULT = 2;
+        /**
+         * 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. See {@link #BORDER_NONE
+         *            Window.BORDER_* constants}
+         * @deprecated As of 7.0, use getPage().open instead
+         */
+        @Deprecated
+        public void open(Resource resource, String windowName, int width,
+                int height, int 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();
+        }
+
+        /**
+         * 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
+         */
+        @Deprecated
+        public void showNotification(String caption) {
+            getPage().showNotification(new Notification(caption));
+        }
+
+        /**
+         * 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
+         */
+        @Deprecated
+        public void showNotification(String caption, int type) {
+            getPage().showNotification(new Notification(caption, type));
+        }
+
+        /**
+         * 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 Notification.show instead
+         */
+        @Deprecated
+        public void showNotification(String caption, String description) {
+            getPage().showNotification(new Notification(caption, description));
+        }
+
+        /**
+         * 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 Notification.show instead
+         */
+        @Deprecated
+        public void showNotification(String caption, String description,
+                int type) {
+            getPage().showNotification(
+                    new Notification(caption, description, type));
+        }
+
+        /**
+         * 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 Notification.show instead
+         */
+        @Deprecated
+        public void showNotification(String caption, String description,
+                int 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);
+        }
+
+        /**
+         * Executes JavaScript in this window.
+         * 
+         * <p>
+         * 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.
+         * </p>
+         * 
+         * <p>
+         * 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.
+         * </p>
+         * 
+         * @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;
 
-    /**
-     * A list of notifications that are waiting to be sent to the client.
-     * Cleared (set to null) when the notifications have been sent.
-     */
-    private List<Notification> notifications;
-
     /**
      * List of windows in this root.
      */
     private final LinkedHashSet<Window> windows = new LinkedHashSet<Window>();
 
-    /**
-     * Resources to be opened automatically on next repaint. The list is
-     * automatically cleared when it has been sent to the client.
-     */
-    private final LinkedList<OpenResource> openList = new LinkedList<OpenResource>();
-
     /**
      * The component that should be scrolled into view after the next repaint.
      * Null if nothing should be scrolled into view.
@@ -393,16 +557,13 @@ public abstract class Root extends AbstractComponentContainer implements
      */
     private static final ThreadLocal<Root> currentRoot = new ThreadLocal<Root>();
 
-    private int browserWindowWidth = -1;
-    private int browserWindowHeight = -1;
-
     /** Identifies the click event */
     private static final String CLICK_EVENT_ID = VRoot.CLICK_EVENT_ID;
 
     private DirtyConnectorTracker dirtyConnectorTracker = new DirtyConnectorTracker(
             this);
 
-    private JavaScript javaScript;
+    private Page page = new Page(this);
 
     private RootServerRpc rpc = new RootServerRpc() {
         public void click(MouseEventDetails mouseDetails) {
@@ -498,58 +659,7 @@ public abstract class Root extends AbstractComponentContainer implements
     }
 
     public void paintContent(PaintTarget target) throws PaintException {
-        // Open requested resource
-        synchronized (openList) {
-            if (!openList.isEmpty()) {
-                for (final Iterator<OpenResource> i = openList.iterator(); i
-                        .hasNext();) {
-                    (i.next()).paintContent(target);
-                }
-                openList.clear();
-            }
-        }
-
-        // Paint notifications
-        if (notifications != null) {
-            target.startTag("notifications");
-            for (final Iterator<Notification> it = notifications.iterator(); it
-                    .hasNext();) {
-                final Notification n = it.next();
-                target.startTag("notification");
-                if (n.getCaption() != null) {
-                    target.addAttribute(
-                            VNotification.ATTRIBUTE_NOTIFICATION_CAPTION,
-                            n.getCaption());
-                }
-                if (n.getDescription() != null) {
-                    target.addAttribute(
-                            VNotification.ATTRIBUTE_NOTIFICATION_MESSAGE,
-                            n.getDescription());
-                }
-                if (n.getIcon() != null) {
-                    target.addAttribute(
-                            VNotification.ATTRIBUTE_NOTIFICATION_ICON,
-                            n.getIcon());
-                }
-                if (!n.isHtmlContentAllowed()) {
-                    target.addAttribute(
-                            VRoot.NOTIFICATION_HTML_CONTENT_NOT_ALLOWED, true);
-                }
-                target.addAttribute(
-                        VNotification.ATTRIBUTE_NOTIFICATION_POSITION,
-                        n.getPosition());
-                target.addAttribute(VNotification.ATTRIBUTE_NOTIFICATION_DELAY,
-                        n.getDelayMsec());
-                if (n.getStyleName() != null) {
-                    target.addAttribute(
-                            VNotification.ATTRIBUTE_NOTIFICATION_STYLE,
-                            n.getStyleName());
-                }
-                target.endTag("notification");
-            }
-            target.endTag("notifications");
-            notifications = null;
-        }
+        page.paintContent(target);
 
         if (scrollIntoView != null) {
             target.addAttribute("scrollTo", scrollIntoView);
@@ -570,10 +680,6 @@ public abstract class Root extends AbstractComponentContainer implements
             actionManager.paintActions(null, target);
         }
 
-        if (fragment != null) {
-            target.addAttribute(VRoot.FRAGMENT_VARIABLE, fragment);
-        }
-
         if (isResizeLazy()) {
             target.addAttribute(VRoot.RESIZE_LAZY, true);
         }
@@ -604,23 +710,14 @@ public abstract class Root extends AbstractComponentContainer implements
 
         if (variables.containsKey(VRoot.FRAGMENT_VARIABLE)) {
             String fragment = (String) variables.get(VRoot.FRAGMENT_VARIABLE);
-            setFragment(fragment, true);
+            getPage().setFragment(fragment, true);
         }
 
-        boolean sendResizeEvent = false;
-        if (variables.containsKey("height")) {
-            browserWindowHeight = ((Integer) variables.get("height"))
-                    .intValue();
-            sendResizeEvent = true;
-        }
-        if (variables.containsKey("width")) {
-            browserWindowWidth = ((Integer) variables.get("width")).intValue();
-            sendResizeEvent = true;
-        }
-        if (sendResizeEvent) {
-            fireEvent(new BrowserWindowResizeEvent(this, browserWindowWidth,
-                    browserWindowHeight));
+        if (variables.containsKey("height") || variables.containsKey("width")) {
+            getPage().setBrowserWindowSize((Integer) variables.get("width"),
+                    (Integer) variables.get("height"));
         }
+
     }
 
     /*
@@ -801,11 +898,6 @@ public abstract class Root extends AbstractComponentContainer implements
      */
     private Focusable pendingFocus;
 
-    /**
-     * The current URI fragment.
-     */
-    private String fragment;
-
     private boolean resizeLazy = false;
 
     /**
@@ -826,172 +918,6 @@ public abstract class Root extends AbstractComponentContainer implements
         requestRepaint();
     }
 
-    /**
-     * 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
-     */
-    public void showNotification(String caption) {
-        addNotification(new Notification(caption));
-    }
-
-    /**
-     * 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
-     */
-    public void showNotification(String caption, int type) {
-        addNotification(new Notification(caption, type));
-    }
-
-    /**
-     * 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
-     * 
-     */
-    public void showNotification(String caption, String description) {
-        addNotification(new Notification(caption, description));
-    }
-
-    /**
-     * 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
-     */
-    public void showNotification(String caption, String description, int type) {
-        addNotification(new Notification(caption, description, type));
-    }
-
-    /**
-     * 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
-     */
-    public void showNotification(String caption, String description, int type,
-            boolean htmlContentAllowed) {
-        addNotification(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
-     */
-    public void showNotification(Notification notification) {
-        addNotification(notification);
-    }
-
-    /**
-     * Internal helper method to actually add a notification.
-     * 
-     * @param notification
-     *            the notification to add
-     */
-    private void addNotification(Notification notification) {
-        if (notifications == null) {
-            notifications = new LinkedList<Notification>();
-        }
-        notifications.add(notification);
-        requestRepaint();
-    }
-
-    /**
-     * Executes JavaScript in this root.
-     * 
-     * <p>
-     * 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.
-     * </p>
-     * 
-     * <p>
-     * 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.
-     * </p>
-     * 
-     * @param script
-     *            JavaScript snippet that will be executed.
-     * 
-     * @deprecated as of 7.0, use getJavaScript().execute(String) instead
-     */
-    @Deprecated
-    public void executeJavaScript(String script) {
-        getJavaScript().execute(script);
-    }
-
     /**
      * Scrolls any component between the component and root to a suitable
      * position so the component is visible to the user. The given component
@@ -1106,10 +1032,7 @@ public abstract class Root extends AbstractComponentContainer implements
      *            the initialization request
      */
     public void doInit(WrappedRequest request) {
-        BrowserDetails browserDetails = request.getBrowserDetails();
-        if (browserDetails != null) {
-            fragment = browserDetails.getUriFragment();
-        }
+        getPage().init(request);
 
         // Call the init overridden by the application developer
         init(request);
@@ -1168,186 +1091,6 @@ public abstract class Root extends AbstractComponentContainer implements
         return currentRoot.get();
     }
 
-    /**
-     * 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
-     */
-    public void open(Resource resource) {
-        synchronized (openList) {
-            if (!openList.contains(resource)) {
-                openList.add(new OpenResource(resource, null, -1, -1,
-                        BORDER_DEFAULT));
-            }
-        }
-        requestRepaint();
-    }
-
-    /* ********************************************************************* */
-
-    /**
-     * Opens the given resource in a window with the given name.
-     * <p>
-     * 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
-     * <code>null</code> window name is also a special case.
-     * </p>
-     * <p>
-     * "", 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.
-     * </p>
-     * <p>
-     * "_blank" as {@code windowName} causes the resource to always be opened in
-     * a new window or tab (depends on the browser and browser settings).
-     * </p>
-     * <p>
-     * "_top" and "_parent" as {@code windowName} works as specified by the HTML
-     * standard.
-     * </p>
-     * <p>
-     * 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.
-     * </p>
-     * 
-     * @param resource
-     *            the resource.
-     * @param windowName
-     *            the name of the window.
-     */
-    public void open(Resource resource, String windowName) {
-        synchronized (openList) {
-            if (!openList.contains(resource)) {
-                openList.add(new OpenResource(resource, windowName, -1, -1,
-                        BORDER_DEFAULT));
-            }
-        }
-        requestRepaint();
-    }
-
-    /**
-     * 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. See {@link #BORDER_NONE
-     *            Window.BORDER_* constants}
-     */
-    public void open(Resource resource, String windowName, int width,
-            int height, int border) {
-        synchronized (openList) {
-            if (!openList.contains(resource)) {
-                openList.add(new OpenResource(resource, windowName, width,
-                        height, border));
-            }
-        }
-        requestRepaint();
-    }
-
-    /**
-     * Private class for storing properties related to opening resources.
-     */
-    private class OpenResource implements Serializable {
-
-        /**
-         * The resource to open
-         */
-        private final Resource resource;
-
-        /**
-         * The name of the target window
-         */
-        private final String name;
-
-        /**
-         * The width of the target window
-         */
-        private final int width;
-
-        /**
-         * The height of the target window
-         */
-        private final int height;
-
-        /**
-         * The border style of the target window
-         */
-        private final int border;
-
-        /**
-         * Creates a new open resource.
-         * 
-         * @param resource
-         *            The resource to open
-         * @param name
-         *            The name of the target window
-         * @param width
-         *            The width of the target window
-         * @param height
-         *            The height of the target window
-         * @param border
-         *            The border style of the target window
-         */
-        private OpenResource(Resource resource, String name, int width,
-                int height, int border) {
-            this.resource = resource;
-            this.name = name;
-            this.width = width;
-            this.height = height;
-            this.border = border;
-        }
-
-        /**
-         * Paints the open request. Should be painted inside the window.
-         * 
-         * @param target
-         *            the paint target
-         * @throws PaintException
-         *             if the paint operation fails
-         */
-        private void paintContent(PaintTarget target) throws PaintException {
-            target.startTag("open");
-            target.addAttribute("src", resource);
-            if (name != null && name.length() > 0) {
-                target.addAttribute("name", name);
-            }
-            if (width >= 0) {
-                target.addAttribute("width", width);
-            }
-            if (height >= 0) {
-                target.addAttribute("height", height);
-            }
-            switch (border) {
-            case BORDER_MINIMAL:
-                target.addAttribute("border", "minimal");
-                break;
-            case BORDER_NONE:
-                target.addAttribute("border", "none");
-                break;
-            }
-
-            target.endTag("open");
-        }
-    }
-
     public void setScrollTop(int scrollTop) {
         throw new RuntimeException("Not yet implemented");
     }
@@ -1435,110 +1178,6 @@ public abstract class Root extends AbstractComponentContainer implements
         removeListener(CLICK_EVENT_ID, ClickEvent.class, listener);
     }
 
-    public void addListener(FragmentChangedListener listener) {
-        addListener(FragmentChangedEvent.class, listener,
-                FRAGMENT_CHANGED_METHOD);
-    }
-
-    public void removeListener(FragmentChangedListener listener) {
-        removeListener(FragmentChangedEvent.class, listener,
-                FRAGMENT_CHANGED_METHOD);
-    }
-
-    /**
-     * Sets URI fragment. Optionally fires a {@link FragmentChangedEvent}
-     * 
-     * @param newFragment
-     *            id of the new fragment
-     * @param fireEvent
-     *            true to fire event
-     * @see FragmentChangedEvent
-     * @see FragmentChangedListener
-     */
-    public void setFragment(String newFragment, boolean fireEvents) {
-        if (newFragment == null) {
-            throw new NullPointerException("The fragment may not be null");
-        }
-        if (!newFragment.equals(fragment)) {
-            fragment = newFragment;
-            if (fireEvents) {
-                fireEvent(new FragmentChangedEvent(this, newFragment));
-            }
-            requestRepaint();
-        }
-    }
-
-    /**
-     * Sets URI fragment. This method fires a {@link FragmentChangedEvent}
-     * 
-     * @param newFragment
-     *            id of the new fragment
-     * @see FragmentChangedEvent
-     * @see FragmentChangedListener
-     */
-    public void setFragment(String newFragment) {
-        setFragment(newFragment, true);
-    }
-
-    /**
-     * Gets currently set URI fragment.
-     * <p>
-     * To listen changes in fragment, hook a {@link FragmentChangedListener}.
-     * 
-     * @return the current fragment in browser uri or null if not known
-     */
-    public String getFragment() {
-        return fragment;
-    }
-
-    /**
-     * 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)
-     */
-    public void addListener(BrowserWindowResizeListener resizeListener) {
-        addListener(BrowserWindowResizeEvent.class, resizeListener,
-                BROWSWER_RESIZE_METHOD);
-    }
-
-    /**
-     * 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
-     */
-    public void removeListener(BrowserWindowResizeListener resizeListener) {
-        removeListener(BrowserWindowResizeEvent.class, resizeListener,
-                BROWSWER_RESIZE_METHOD);
-    }
-
-    /**
-     * Gets the last known height of the browser window in which this root
-     * resides.
-     * 
-     * @return the browser window height in pixels
-     */
-    public int getBrowserWindowHeight() {
-        return browserWindowHeight;
-    }
-
-    /**
-     * Gets the last known width of the browser window in which this root
-     * resides.
-     * 
-     * @return the browser window width in pixels
-     */
-    public int getBrowserWindowWidth() {
-        return browserWindowWidth;
-    }
-
     /**
      * Notifies the child components and windows that the root is attached to
      * the application.
@@ -1573,14 +1212,21 @@ public abstract class Root extends AbstractComponentContainer implements
         return dirtyConnectorTracker;
     }
 
-    public JavaScript getJavaScript() {
-        if (javaScript == null) {
-            // Create and attach on first use
-            javaScript = new JavaScript();
-            addExtension(javaScript);
-        }
+    public Page getPage() {
+        return page;
+    }
 
-        return javaScript;
+    /**
+     * 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");
     }
 
 }
index ab983b402245550133960d394e86c576396f1c24..03f49d4ab62b31eb34bd0f0d536db2526fde8858 100644 (file)
@@ -19,9 +19,9 @@ import com.vaadin.navigator.ViewChangeListener;
 import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
 import com.vaadin.navigator.ViewDisplay;
 import com.vaadin.navigator.ViewProvider;
+import com.vaadin.terminal.Page;
 import com.vaadin.tests.server.navigator.ClassBasedViewProviderTest.TestView;
 import com.vaadin.tests.server.navigator.ClassBasedViewProviderTest.TestView2;
-import com.vaadin.ui.Root;
 
 public class NavigatorTest extends TestCase {
 
@@ -366,9 +366,9 @@ public class NavigatorTest extends TestCase {
 
     public void testDefaultDisplayType() {
         IMocksControl control = EasyMock.createControl();
-        Root root = control.createMock(Root.class);
+        Page page = control.createMock(Page.class);
 
-        Navigator navigator = new Navigator(root);
+        Navigator navigator = new Navigator(page);
 
         assertEquals("Default display should be a SimpleViewDisplay",
                 SimpleViewDisplay.class, navigator.getDisplay().getClass());
index cfbf50f256d5d4b1f3e391dc81c7c86a1fe6cd94..65294b2913265e95fb62d49e4d5d7acc63d19c34 100644 (file)
@@ -11,20 +11,20 @@ import org.easymock.IMocksControl;
 
 import com.vaadin.navigator.Navigator;
 import com.vaadin.navigator.Navigator.UriFragmentManager;
-import com.vaadin.ui.Root;
-import com.vaadin.ui.Root.FragmentChangedEvent;
+import com.vaadin.terminal.Page;
+import com.vaadin.terminal.Page.FragmentChangedEvent;
 
 public class UriFragmentManagerTest extends TestCase {
 
     public void testGetSetFragment() {
-        Root root = EasyMock.createMock(Root.class);
-        UriFragmentManager manager = new UriFragmentManager(root, null);
+        Page page = EasyMock.createMock(Page.class);
+        UriFragmentManager manager = new UriFragmentManager(page, null);
 
         // prepare mock
-        EasyMock.expect(root.getFragment()).andReturn("");
-        root.setFragment("test");
-        EasyMock.expect(root.getFragment()).andReturn("test");
-        EasyMock.replay(root);
+        EasyMock.expect(page.getFragment()).andReturn("");
+        page.setFragment("test");
+        EasyMock.expect(page.getFragment()).andReturn("test");
+        EasyMock.replay(page);
 
         // test manager using the mock
         assertEquals("Incorrect fragment value", "", manager.getFragment());
@@ -36,15 +36,15 @@ public class UriFragmentManagerTest extends TestCase {
         // create mocks
         IMocksControl control = EasyMock.createControl();
         Navigator navigator = control.createMock(Navigator.class);
-        Root root = control.createMock(Root.class);
+        Page page = control.createMock(Page.class);
 
-        UriFragmentManager manager = new UriFragmentManager(root, navigator);
+        UriFragmentManager manager = new UriFragmentManager(page, navigator);
 
-        EasyMock.expect(root.getFragment()).andReturn("test");
+        EasyMock.expect(page.getFragment()).andReturn("test");
         navigator.navigateTo("test");
         control.replay();
 
-        FragmentChangedEvent event = root.new FragmentChangedEvent(root,
+        FragmentChangedEvent event = page.new FragmentChangedEvent(page,
                 "oldtest");
         manager.fragmentChanged(event);
     }
index c3bb24cbef2980b331875f2f1069db860ea51819..1ac497e574d36352658c65010d5147a1af00a0c2 100644 (file)
@@ -16,6 +16,8 @@ import com.vaadin.Application;
 import com.vaadin.data.Property;
 import com.vaadin.data.util.HierarchicalContainer;
 import com.vaadin.terminal.ExternalResource;
+import com.vaadin.terminal.Page;
+import com.vaadin.terminal.Page.FragmentChangedEvent;
 import com.vaadin.ui.Component;
 import com.vaadin.ui.CustomComponent;
 import com.vaadin.ui.HorizontalSplitPanel;
@@ -23,8 +25,6 @@ import com.vaadin.ui.Label;
 import com.vaadin.ui.Layout;
 import com.vaadin.ui.Link;
 import com.vaadin.ui.Panel;
-import com.vaadin.ui.Root;
-import com.vaadin.ui.Root.FragmentChangedEvent;
 import com.vaadin.ui.Root.LegacyWindow;
 import com.vaadin.ui.Tree;
 import com.vaadin.ui.VerticalLayout;
@@ -119,7 +119,7 @@ public class TestBench extends com.vaadin.Application.LegacyApplication
         VerticalLayout lo = new VerticalLayout();
         lo.addComponent(menu);
 
-        mainWindow.addListener(new Root.FragmentChangedListener() {
+        mainWindow.getPage().addListener(new Page.FragmentChangedListener() {
             public void fragmentChanged(FragmentChangedEvent source) {
                 String fragment = source.getFragment();
                 if (fragment != null && !"".equals(fragment)) {
index 48eff0336e5db40f6f44499186172f0fbe49e610..c63c0caf160417731b74835aeb2ed48437a525a7 100644 (file)
@@ -10,7 +10,6 @@ import com.vaadin.ui.GridLayout;
 import com.vaadin.ui.Label;
 import com.vaadin.ui.Notification;
 import com.vaadin.ui.Panel;
-import com.vaadin.ui.Root;
 import com.vaadin.ui.VerticalLayout;
 
 /**
@@ -92,12 +91,10 @@ public class TestComponentAddAndRecursion extends CustomComponent {
             public void buttonClick(ClickEvent event) {
                 try {
                     p3.addComponent(p2);
-                    Root.getCurrentRoot().showNotification("ERROR",
-                            "This should have failed",
+                    Notification.show("ERROR", "This should have failed",
                             Notification.TYPE_ERROR_MESSAGE);
                 } catch (Exception e) {
-                    Root.getCurrentRoot().showNotification("OK",
-                            "threw, as expected",
+                    Notification.show("OK", "threw, as expected",
                             Notification.TYPE_ERROR_MESSAGE);
                 }
             }
@@ -111,12 +108,10 @@ public class TestComponentAddAndRecursion extends CustomComponent {
                 p.addComponent(p2);
                 try {
                     p3.addComponent(p);
-                    Root.getCurrentRoot().showNotification("ERROR",
-                            "This should have failed",
+                    Notification.show("ERROR", "This should have failed",
                             Notification.TYPE_ERROR_MESSAGE);
                 } catch (Exception e) {
-                    Root.getCurrentRoot().showNotification("OK",
-                            "threw, as expected",
+                    Notification.show("OK", "threw, as expected",
                             Notification.TYPE_ERROR_MESSAGE);
                 }
             }
index c9dbf8dabea8d0763f9aa5ab3ba041fb99987694..76154f24196ea0eb7ee757585b8335995c77bf85 100644 (file)
@@ -24,7 +24,7 @@ public class TestForWindowOpen extends CustomComponent {
                     public void buttonClick(ClickEvent event) {
                         final ExternalResource r = new ExternalResource(
                                 "http://www.google.com");
-                        Root.getCurrentRoot().open(r);
+                        Root.getCurrentRoot().getPage().open(r);
 
                     }
 
@@ -36,7 +36,7 @@ public class TestForWindowOpen extends CustomComponent {
                     public void buttonClick(ClickEvent event) {
                         final ExternalResource r = new ExternalResource(
                                 "http://www.google.com");
-                        Root.getCurrentRoot().open(r, "mytarget");
+                        Root.getCurrentRoot().getPage().open(r, "mytarget");
 
                     }
 
@@ -48,7 +48,7 @@ public class TestForWindowOpen extends CustomComponent {
                     public void buttonClick(ClickEvent event) {
                         final ExternalResource r = new ExternalResource(
                                 "http://www.google.com");
-                        Root.getCurrentRoot().open(r, "secondtarget");
+                        Root.getCurrentRoot().getPage().open(r, "secondtarget");
 
                     }
 
index 7d5e2982865a44729216afc4defd8a9f622e256f..58faec35f033a37036557874052b57b977855064 100644 (file)
@@ -91,7 +91,8 @@ public class GAESyncTest extends Application.LegacyApplication {
 
                     public void buttonClick(ClickEvent event) {
                         if (getRoot() == getMainWindow()) {
-                            getRoot().showNotification("main");
+                            getRoot().getPage().showNotification(
+                                    new Notification("main"));
                             try {
                                 Thread.sleep((5000));
                             } catch (InterruptedException e) {
index fd90cf2d6eb3d196aa23b2cf8e44323a560605d4..72cbcd386eab6fe4e9d56c15549c9fea2d18e863 100644 (file)
@@ -15,7 +15,7 @@ public abstract class AbstractTestRoot extends Root {
 
     @Override
     public void init(WrappedRequest request) {
-        setCaption(getClass().getName());
+        getPage().setTitle(getClass().getName());
 
         Label label = new Label(getTestDescription(), ContentMode.XHTML);
         label.setWidth("100%");
index 053691e7380bfbcd79aa8a0c663005d03080363b..8ad12da85faf6d8201ca33b3abe44d2bfd3b6a63 100644 (file)
@@ -24,6 +24,7 @@ import com.vaadin.ui.CssLayout;
 import com.vaadin.ui.HorizontalSplitPanel;
 import com.vaadin.ui.Label;
 import com.vaadin.ui.Layout;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.Panel;
 import com.vaadin.ui.TabSheet;
 import com.vaadin.ui.Table;
@@ -189,7 +190,7 @@ public class TouchScrollables extends TestBase {
             }
 
             public void handleAction(Action action, Object sender, Object target) {
-                getLayout().getRoot().showNotification(action.getCaption());
+                Notification.show(action.getCaption());
 
             }
         });
index 55e61e3980f849212f373410241a79ca36e838b7..02c080e8fd94fb57337ef48e9dceff676675314d 100644 (file)
@@ -4,6 +4,7 @@ import com.vaadin.tests.components.TestBase;
 import com.vaadin.tests.util.Address;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Notification;
 
 /**
  * Demonstrate a custom field which is a form, and contains another custom field
@@ -23,10 +24,9 @@ public class AddressFormExample extends TestBase {
             public void buttonClick(ClickEvent event) {
                 field.commit();
                 Address address = field.getValue();
-                field.getRoot().showNotification(
-                        "Address saved: " + address.getStreetAddress() + ", "
-                                + address.getPostalCode() + ", "
-                                + address.getCity());
+                Notification.show("Address saved: "
+                        + address.getStreetAddress() + ", "
+                        + address.getPostalCode() + ", " + address.getCity());
             }
         });
         addComponent(commitButton);
index 2f9720a1c18245c55794498393a890cdef091322..694c5b54f9cc94400361e97dca4a22312aa0194c 100644 (file)
@@ -10,6 +10,7 @@ import com.vaadin.ui.Component;
 import com.vaadin.ui.DefaultFieldFactory;
 import com.vaadin.ui.Field;
 import com.vaadin.ui.Form;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.VerticalLayout;
 
 public class BooleanFieldExample extends TestBase {
@@ -62,13 +63,10 @@ public class BooleanFieldExample extends TestBase {
         Button submit = new Button("Submit", new ClickListener() {
             public void buttonClick(ClickEvent event) {
                 form.commit();
-                layout.getRoot()
-                        .showNotification(
-                                "The custom boolean field value is "
-                                        + data.isCustom()
-                                        + ".<br>"
-                                        + "The checkbox (default boolean field) value is "
-                                        + data.isNormal() + ".");
+                Notification.show("The custom boolean field value is "
+                        + data.isCustom() + ".<br>"
+                        + "The checkbox (default boolean field) value is "
+                        + data.isNormal() + ".");
             }
         });
         layout.addComponent(submit);
index 6519e4ae74bdc829cb32f5676fa9e364d1e4fa84..5f2f945c8b4e138d9316159393ee04469b765941 100644 (file)
@@ -15,7 +15,7 @@ import com.vaadin.terminal.gwt.client.ui.JavaScriptComponentState;
 import com.vaadin.tests.components.AbstractTestRoot;
 import com.vaadin.ui.AbstractJavaScriptComponent;
 import com.vaadin.ui.JavaScriptCallback;
-import com.vaadin.ui.Root;
+import com.vaadin.ui.Notification;
 
 @LoadScripts({ "/statictestfiles/jsconnector.js" })
 public class BasicJavaScriptComponent extends AbstractTestRoot {
@@ -40,14 +40,13 @@ public class BasicJavaScriptComponent extends AbstractTestRoot {
         public ExampleWidget() {
             registerRpc(new ExampleClickRpc() {
                 public void onClick(String message) {
-                    Root.getCurrentRoot().showNotification(
-                            "Got a click: " + message);
+                    Notification.show("Got a click: " + message);
                 }
             });
             registerCallback("onclick", new JavaScriptCallback() {
                 public void call(JSONArray arguments) throws JSONException {
-                    Root.getCurrentRoot().showNotification(
-                            "Got a callback: " + arguments.getString(0));
+                    Notification.show("Got a callback: "
+                            + arguments.getString(0));
                 }
             });
             getState().setData(Arrays.asList("a", "b", "c"));
index 27aef918d1da54948a6d87ff17e87d7f12e668f8..a36fbe3121b27749d5ba7b4abeae386ca370cf70 100644 (file)
@@ -6,7 +6,6 @@ import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Button.ClickListener;
 import com.vaadin.ui.NativeSelect;
 import com.vaadin.ui.Notification;
-import com.vaadin.ui.Root;
 import com.vaadin.ui.TextArea;
 
 public class Notifications extends TestBase implements ClickListener {
@@ -53,7 +52,6 @@ public class Notifications extends TestBase implements ClickListener {
     public void buttonClick(ClickEvent event) {
         Notification n = new Notification(tf.getValue(),
                 (Integer) type.getValue());
-        Root.getCurrentRoot().showNotification(n);
-
+        n.show();
     }
 }
index 152688d109944ea8435608b376d4baac2f666cd3..a16b8edcdebf4b445bfc4afbfdcff440090f5eae 100644 (file)
@@ -6,7 +6,6 @@ import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Button.ClickListener;
 import com.vaadin.ui.CheckBox;
 import com.vaadin.ui.Notification;
-import com.vaadin.ui.Root;
 import com.vaadin.ui.TextArea;
 import com.vaadin.ui.TextField;
 
@@ -46,15 +45,13 @@ public class NotificationsHtmlAllowed extends TestBase implements ClickListener
 
     public void buttonClick(ClickEvent event) {
         Notification n = makeNotification();
-        Root.getCurrentRoot().showNotification(n);
-
+        n.show();
     }
 
     private Notification makeNotification() {
-        Notification n = new Notification((String) captionField.getValue(),
-                (String) messageField.getValue(),
-                Notification.TYPE_HUMANIZED_MESSAGE,
-                (Boolean) htmlAllowedBox.getValue());
+        Notification n = new Notification(captionField.getValue(),
+                messageField.getValue(), Notification.TYPE_HUMANIZED_MESSAGE,
+                htmlAllowedBox.getValue());
         return n;
     }
 }
index 95691ef9d77a9e678b0027b488d8b60d005a2a72..98f31cd68c4e53a74dafffb121f0c3c1ae3a1f10 100644 (file)
@@ -6,6 +6,7 @@ import com.vaadin.event.ShortcutAction;
 import com.vaadin.tests.components.TestBase;
 import com.vaadin.ui.AbstractField;
 import com.vaadin.ui.Component;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.Panel;
 import com.vaadin.ui.RichTextArea;
 import com.vaadin.ui.Window;
@@ -30,7 +31,7 @@ public class RichTextAreaWithKeyboardShortcuts extends TestBase {
             String string = f.getValue().toString();
 
             msg += " Value: " + string;
-            f.getRoot().showNotification(msg);
+            Notification.show(msg);
 
         }
 
index 60781619966594f15a160996cec35416e866b62b..251672fb9adc9577d3504919b8283340af893455 100644 (file)
@@ -1,5 +1,7 @@
 package com.vaadin.tests.components.root;
 
+import com.vaadin.terminal.Page;
+import com.vaadin.terminal.Page.FragmentChangedEvent;
 import com.vaadin.terminal.WrappedRequest;
 import com.vaadin.tests.components.AbstractTestRoot;
 import com.vaadin.ui.Button;
@@ -14,7 +16,7 @@ public class UriFragmentTest extends AbstractTestRoot {
     protected void setup(WrappedRequest request) {
         addComponent(fragmentLabel);
         updateLabel();
-        addListener(new FragmentChangedListener() {
+        getPage().addListener(new Page.FragmentChangedListener() {
             public void fragmentChanged(FragmentChangedEvent event) {
                 updateLabel();
             }
@@ -22,13 +24,13 @@ public class UriFragmentTest extends AbstractTestRoot {
         addComponent(new Button("Navigate to #test",
                 new Button.ClickListener() {
                     public void buttonClick(ClickEvent event) {
-                        setFragment("test");
+                        getPage().setFragment("test");
                     }
                 }));
     }
 
     private void updateLabel() {
-        String fragment = getFragment();
+        String fragment = getPage().getFragment();
         if (fragment == null) {
             fragmentLabel.setValue("No URI fragment set");
         } else {
index 9178b284f37d120c3cfdfb6962cd3fd7fb7a2cf0..6773f0a96c3447e641054964d2d067e80ffba08d 100644 (file)
@@ -5,6 +5,7 @@ import com.vaadin.data.Property;
 import com.vaadin.data.Property.ValueChangeEvent;
 import com.vaadin.data.util.IndexedContainer;
 import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.Table;
 
 @SuppressWarnings("serial")
@@ -20,8 +21,7 @@ public class MultiSelectWithNotIdentityEqualIds extends TestBase {
         t.setImmediate(true);
         t.addListener(new Property.ValueChangeListener() {
             public void valueChange(ValueChangeEvent event) {
-                t.getRoot()
-                        .showNotification("Selected: " + event.getProperty());
+                Notification.show("Selected: " + event.getProperty());
 
             }
         });
index 16323e5024699a11d1ac7e1ce08fa26e4e0a8582..06afd406efa28d2106f4482a1883e70451b8b5fb 100644 (file)
@@ -2,6 +2,7 @@ package com.vaadin.tests.components.table;
 
 import com.vaadin.event.Action;
 import com.vaadin.tests.components.TestBase;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.Table;
 
 public class TableContextMenu extends TestBase {
@@ -16,7 +17,7 @@ public class TableContextMenu extends TestBase {
 
         table.addActionHandler(new Action.Handler() {
             public void handleAction(Action action, Object sender, Object target) {
-                getLayout().getRoot().showNotification("Done that :-)");
+                Notification.show("Done that :-)");
             }
 
             public Action[] getActions(Object target, Object sender) {
index a1686dee3f5cf2a37729b88bd33c33f969548b87..d64bc0035dd92b16b2cafe9bb10209dea526fae3 100644 (file)
@@ -27,10 +27,8 @@ public class TableShouldNotEatValueChanges extends TestBase {
         ItemClickListener l = new ItemClickListener() {
 
             public void itemClick(ItemClickEvent event) {
-                tf.getRoot().showNotification(
-                        "TF Value on the server:" + tf.getValue(),
+                Notification.show("TF Value on the server:" + tf.getValue(),
                         Notification.TYPE_WARNING_MESSAGE);
-
             }
         };
         t.addListener(l);
index 2f84c8a68d93c45aded06ef02d5fd0504fb385f5..447ce6c4650cb72a92af9ea30f360afab8577fd0 100644 (file)
@@ -4,6 +4,7 @@ import com.vaadin.tests.components.TestBase;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.TreeTable;
 import com.vaadin.ui.VerticalLayout;
 
@@ -31,8 +32,7 @@ public class ProgrammaticCollapse extends TestBase {
                 new ClickListener() {
                     public void buttonClick(ClickEvent event) {
                         boolean collapsed = !table.isCollapsed(1);
-                        table.getRoot().showNotification(
-                                "set collapsed: " + collapsed);
+                        Notification.show("set collapsed: " + collapsed);
                         table.setCollapsed(1, collapsed);
                     }
                 }));
@@ -40,8 +40,7 @@ public class ProgrammaticCollapse extends TestBase {
                 new ClickListener() {
                     public void buttonClick(ClickEvent event) {
                         boolean collapsed = !table.isCollapsed(100);
-                        table.getRoot().showNotification(
-                                "set collapsed: " + collapsed);
+                        Notification.show("set collapsed: " + collapsed);
                         table.setCollapsed(100, collapsed);
                     }
                 }));
@@ -51,8 +50,7 @@ public class ProgrammaticCollapse extends TestBase {
 
                     public void buttonClick(ClickEvent event) {
                         collapsed = !collapsed;
-                        table.getRoot().showNotification(
-                                "set collapsed: " + collapsed);
+                        Notification.show("set collapsed: " + collapsed);
                         for (int i = 0; i < 50; ++i) {
                             table.setCollapsed(i * 2, collapsed);
                         }
index 49da6758ea88e02184c0e4aa446f1fdd6a7235d8..9eaabf7340b152ddf22fcaad1b8d728faa5ba3cf 100644 (file)
@@ -2,14 +2,14 @@ package com.vaadin.tests.components.window;
 
 import com.vaadin.data.Property.ValueChangeEvent;
 import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.terminal.Page.BrowserWindowResizeEvent;
+import com.vaadin.terminal.Page.BrowserWindowResizeListener;
 import com.vaadin.terminal.gwt.client.ui.label.ContentMode;
 import com.vaadin.tests.components.AbstractTestCase;
 import com.vaadin.tests.util.Log;
 import com.vaadin.tests.util.LoremIpsum;
 import com.vaadin.ui.CheckBox;
 import com.vaadin.ui.Label;
-import com.vaadin.ui.Root.BrowserWindowResizeEvent;
-import com.vaadin.ui.Root.BrowserWindowResizeListener;
 import com.vaadin.ui.Root.LegacyWindow;
 import com.vaadin.ui.Window;
 import com.vaadin.ui.Window.ResizeEvent;
index 988d47e29f2b329cfc0f92abb6fd236f42c062b7..1e342abe0174a7a5f2304b64f5af0b3b08f7e30e 100644 (file)
@@ -10,6 +10,7 @@ import com.vaadin.event.ShortcutAction;
 import com.vaadin.tests.components.TestBase;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.Root;
 import com.vaadin.ui.TextField;
 import com.vaadin.ui.Window;
@@ -36,15 +37,13 @@ public class SubWindowFocusAndBlurListeners extends TestBase {
         window.addComponent(new TextField());
         window.addListener(new FocusListener() {
             public void focus(FocusEvent event) {
-                event.getComponent().getRoot()
-                        .showNotification("Focused window");
+                Notification.show("Focused window");
             }
         });
 
         window.addListener(new BlurListener() {
             public void blur(BlurEvent event) {
-                event.getComponent().getRoot()
-                        .showNotification("Blurred window");
+                Notification.show("Blurred window");
             }
         });
 
@@ -57,7 +56,7 @@ public class SubWindowFocusAndBlurListeners extends TestBase {
             }
 
             public void handleAction(Action action, Object sender, Object target) {
-                window.getRoot().showNotification("Action!");
+                Notification.show("Action!");
             }
         });
 
index c6563f200fc768fd987aef2f7f96c6992c7d55a9..ac6c313d298b256e6e38f3a502b0c2231b2947b2 100644 (file)
@@ -2,13 +2,13 @@ package com.vaadin.tests.components.window;
 
 import com.vaadin.data.Property;
 import com.vaadin.data.Property.ValueChangeEvent;
+import com.vaadin.terminal.Page;
+import com.vaadin.terminal.Page.BrowserWindowResizeEvent;
 import com.vaadin.tests.components.TestBase;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.CheckBox;
 import com.vaadin.ui.Label;
 import com.vaadin.ui.Layout;
-import com.vaadin.ui.Root;
-import com.vaadin.ui.Root.BrowserWindowResizeEvent;
 import com.vaadin.ui.Window;
 
 public class WindowResizeListener extends TestBase {
@@ -33,7 +33,7 @@ public class WindowResizeListener extends TestBase {
         final Label l = new Label();
         getLayout().addComponent(l);
 
-        getMainWindow().addListener(new Root.BrowserWindowResizeListener() {
+        getMainWindow().addListener(new Page.BrowserWindowResizeListener() {
             public void browserWindowResized(BrowserWindowResizeEvent event) {
                 l.setValue("Current browser window size: "
                         + getMainWindow().getBrowserWindowWidth() + " x "
index 8bcf873cd5dbe628e41e08bbe3a7346b5124ea9c..bbfe3f0f46e83e79c8e138690bd3ae24382644f3 100644 (file)
@@ -16,7 +16,7 @@ import com.vaadin.tests.components.AbstractTestRoot;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.JavaScriptCallback;
-import com.vaadin.ui.Root;
+import com.vaadin.ui.Notification;
 
 @LoadScripts({ "/statictestfiles/jsextension.js" })
 public class SimpleJavaScriptExtensionTest extends AbstractTestRoot {
@@ -50,14 +50,13 @@ public class SimpleJavaScriptExtensionTest extends AbstractTestRoot {
         public SimpleJavascriptExtension() {
             registerRpc(new SimpleJavaScriptExtensionServerRpc() {
                 public void greet(String message) {
-                    Root.getCurrentRoot().showNotification(
-                            getState().getPrefix() + message);
+                    Notification.show(getState().getPrefix() + message);
                 }
             });
             registerCallback("greetToServer", new JavaScriptCallback() {
                 public void call(JSONArray arguments) throws JSONException {
-                    Root.getCurrentRoot().showNotification(
-                            getState().getPrefix() + arguments.getString(0));
+                    Notification.show(getState().getPrefix()
+                            + arguments.getString(0));
                 }
             });
         }
index 584ce0ec36fb91be577a973ab9b23d538aa99d57..b73a29efeadb3d1dfe56e38b3ddebec804e3272a 100644 (file)
@@ -7,7 +7,7 @@ import com.vaadin.tests.util.Log;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Button.ClickListener;
-import com.vaadin.ui.Root;
+import com.vaadin.ui.Notification;
 
 public abstract class AbstractBeanFieldGroupTest extends TestBase {
 
@@ -64,7 +64,7 @@ public abstract class AbstractBeanFieldGroupTest extends TestBase {
                     } catch (CommitException e) {
                         msg = "Commit failed: " + e.getMessage();
                     }
-                    Root.getCurrentRoot().showNotification(msg);
+                    Notification.show(msg);
                     log.log(msg);
 
                 }
index f95c172348a6ebbb2d16323412a063d8010c8ff2..c86cb6f5e815fe56e72c29afff572743a3e115a2 100644 (file)
@@ -18,8 +18,8 @@ import com.vaadin.tests.data.bean.Sex;
 import com.vaadin.tests.util.Log;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.Panel;
-import com.vaadin.ui.Root;
 import com.vaadin.ui.Table;
 import com.vaadin.ui.TextArea;
 import com.vaadin.ui.TextField;
@@ -125,7 +125,7 @@ public class BasicPersonForm extends TestBase {
                 } catch (CommitException e) {
                     msg = "Commit failed: " + e.getMessage();
                 }
-                Root.getCurrentRoot().showNotification(msg);
+                Notification.show(msg);
                 log.log(msg);
 
             }
index 9ff553ce61d18b79235eb6f81b349584df51cdbb..6c6cd8024b9de734119219649385b0f08daf8e66 100644 (file)
@@ -13,7 +13,7 @@ import com.vaadin.tests.data.bean.Sex;
 import com.vaadin.tests.util.Log;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
-import com.vaadin.ui.Root;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.Table;
 import com.vaadin.ui.TextArea;
 import com.vaadin.ui.TextField;
@@ -52,7 +52,7 @@ public class FieldBinderWithBeanValidation extends TestBase {
                 } catch (CommitException e) {
                     msg = "Commit failed: " + e.getMessage();
                 }
-                Root.getCurrentRoot().showNotification(msg);
+                Notification.show(msg);
                 log.log(msg);
 
             }
index eb26faacc024885da3530c6c95a693d511415930..41225b25712f3a843dc609b242b7f79b87a666b1 100644 (file)
@@ -2,11 +2,12 @@ package com.vaadin.tests.integration;
 
 import com.vaadin.data.Property.ValueChangeEvent;
 import com.vaadin.data.Property.ValueChangeListener;
+import com.vaadin.terminal.Page;
+import com.vaadin.terminal.Page.BrowserWindowResizeEvent;
 import com.vaadin.tests.components.TestBase;
 import com.vaadin.tests.util.Log;
 import com.vaadin.ui.CheckBox;
-import com.vaadin.ui.Root;
-import com.vaadin.ui.Root.BrowserWindowResizeEvent;
+import com.vaadin.ui.Root.LegacyWindow;
 
 public class EmbedSizeTest extends TestBase {
 
@@ -14,7 +15,7 @@ public class EmbedSizeTest extends TestBase {
 
     @Override
     protected void setup() {
-        Root mainWindow = getMainWindow();
+        LegacyWindow mainWindow = getMainWindow();
         mainWindow.setSizeUndefined();
         mainWindow.getContent().setSizeUndefined();
         mainWindow.setImmediate(true);
@@ -34,7 +35,7 @@ public class EmbedSizeTest extends TestBase {
         addComponent(lazyCheckBox);
 
         addComponent(log);
-        mainWindow.addListener(new Root.BrowserWindowResizeListener() {
+        mainWindow.addListener(new Page.BrowserWindowResizeListener() {
             public void browserWindowResized(BrowserWindowResizeEvent event) {
                 log.log("Resize event: " + event.getWidth() + " x "
                         + event.getHeight());
index e022a8bf30fa4b61c9f22a5d4f3a49855659e73c..913ce8f54c9d42d94884a01cc55ca9819f10e4e2 100644 (file)
@@ -86,7 +86,7 @@ public class JSR286PortletRoot extends Root {
                     .getContext();
             ctx.addPortletListener(getApplication(), new DemoPortletListener());
         } else {
-            showNotification("Not inited via Portal!",
+            Notification.show("Not inited via Portal!",
                     Notification.TYPE_ERROR_MESSAGE);
         }
 
@@ -109,7 +109,7 @@ public class JSR286PortletRoot extends Root {
             tf.setEnabled((request.getPortletMode() == PortletMode.EDIT));
 
             // Show notification about current mode and state
-            showNotification(
+            Notification.show(
                     "Portlet status",
                     "Mode: " + request.getPortletMode() + " State: "
                             + request.getWindowState(),
index 0250658bc97ca36ec693168c05ee5f6d602196d8..8b7f498b0e4b8c9e277d295129c050a27c7ba497 100644 (file)
@@ -595,10 +595,7 @@ public class LiferayThemeDemo extends Application.LegacyApplication {
         Button show = new Button("Humanized Notification",
                 new Button.ClickListener() {
                     public void buttonClick(ClickEvent event) {
-                        event.getButton()
-                                .getRoot()
-                                .showNotification(title.getValue(),
-                                        message.getValue());
+                        Notification.show(title.getValue(), message.getValue());
 
                     }
                 });
@@ -607,10 +604,8 @@ public class LiferayThemeDemo extends Application.LegacyApplication {
         l.addComponent(new Label("Warning", ContentMode.XHTML));
         show = new Button("Warning Notification", new Button.ClickListener() {
             public void buttonClick(ClickEvent event) {
-                event.getButton()
-                        .getRoot()
-                        .showNotification(title.getValue(), message.getValue(),
-                                Notification.TYPE_WARNING_MESSAGE);
+                Notification.show(title.getValue(), message.getValue(),
+                        Notification.TYPE_WARNING_MESSAGE);
 
             }
         });
@@ -619,10 +614,8 @@ public class LiferayThemeDemo extends Application.LegacyApplication {
         l.addComponent(new Label("Error", ContentMode.XHTML));
         show = new Button("Error Notification", new Button.ClickListener() {
             public void buttonClick(ClickEvent event) {
-                event.getButton()
-                        .getRoot()
-                        .showNotification(title.getValue(), message.getValue(),
-                                Notification.TYPE_ERROR_MESSAGE);
+                Notification.show(title.getValue(), message.getValue(),
+                        Notification.TYPE_ERROR_MESSAGE);
 
             }
         });
@@ -631,10 +624,8 @@ public class LiferayThemeDemo extends Application.LegacyApplication {
         l.addComponent(new Label("Tray", ContentMode.XHTML));
         show = new Button("Tray Notification", new Button.ClickListener() {
             public void buttonClick(ClickEvent event) {
-                event.getButton()
-                        .getRoot()
-                        .showNotification(title.getValue(), message.getValue(),
-                                Notification.TYPE_TRAY_NOTIFICATION);
+                Notification.show(title.getValue(), message.getValue(),
+                        Notification.TYPE_TRAY_NOTIFICATION);
 
             }
         });
index 5c0efea3ea71095486f5d9ab69f01801252c4ee2..96b10d0415bf742741723f736ade1584a0b9704e 100644 (file)
@@ -8,7 +8,7 @@ import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Button.ClickListener;
 import com.vaadin.ui.Label;
-import com.vaadin.ui.Root;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.TextField;
 
 public class IntegerTextFieldDataSource extends AbstractTestRoot {
@@ -40,12 +40,9 @@ public class IntegerTextFieldDataSource extends AbstractTestRoot {
                 Integer propertyValue = integerProperty.getValue();
                 int dataModelValue = myBean.getValue();
 
-                Root.getCurrentRoot().showNotification(
-                        "UI value (String): " + uiValue
-                                + "<br />Property value (Integer): "
-                                + propertyValue
-                                + "<br />Data model value (int): "
-                                + dataModelValue);
+                Notification.show("UI value (String): " + uiValue
+                        + "<br />Property value (Integer): " + propertyValue
+                        + "<br />Data model value (int): " + dataModelValue);
             }
         });
 
index 45bc49ba72a84d3099dc3e98d606c93ec2277931..5a47bd7fb8c99f223808bc3ac8cb2e77a397e8cb 100644 (file)
@@ -8,7 +8,7 @@ import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Button.ClickListener;
 import com.vaadin.ui.Label;
-import com.vaadin.ui.Root;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.TextField;
 
 public class IntegerTextFieldStandalone extends AbstractTestRoot {
@@ -24,14 +24,12 @@ public class IntegerTextFieldStandalone extends AbstractTestRoot {
                 try {
                     Integer convertedValue = (Integer) textField
                             .getConvertedValue();
-                    Root.getCurrentRoot().showNotification(
-                            "UI value (String): " + uiValue
-                                    + "<br />Converted value (Integer): "
-                                    + convertedValue);
+                    Notification.show("UI value (String): " + uiValue
+                            + "<br />Converted value (Integer): "
+                            + convertedValue);
                 } catch (ConversionException e) {
                     e.printStackTrace();
-                    Root.getCurrentRoot().showNotification(
-                            "Could not convert value: " + uiValue);
+                    Notification.show("Could not convert value: " + uiValue);
                 }
             }
         });
index e28788f74323df4a593621f8cde37add3d6adbcb..33602ce4d5b709dcbb6a552f521be7ce27fda897 100644 (file)
@@ -9,6 +9,7 @@ import com.vaadin.tests.components.AbstractTestRoot;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.TextField;
 
 public class StringMyTypeConverter extends AbstractTestRoot {
@@ -26,12 +27,11 @@ public class StringMyTypeConverter extends AbstractTestRoot {
             public void buttonClick(ClickEvent event) {
                 try {
                     Name name = (Name) textField.getConvertedValue();
-                    getRoot().showNotification(
-                            "First name: " + name.getFirstName()
-                                    + "<br />Last name: " + name.getLastName());
+                    Notification.show("First name: " + name.getFirstName()
+                            + "<br />Last name: " + name.getLastName());
                 } catch (ConversionException e) {
                     e.printStackTrace();
-                    getRoot().showNotification(e.getCause().getMessage());
+                    Notification.show(e.getCause().getMessage());
                 }
             }
         }));
index 9459c7cc85928ae155e885b3a618c8e07f9dec73..9a777d655ce816fd7dacbfa6ea1d3f1f5734a9a5 100644 (file)
@@ -5,7 +5,6 @@ import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Label;
 import com.vaadin.ui.Notification;
-import com.vaadin.ui.Root;
 import com.vaadin.ui.Root.LegacyWindow;
 import com.vaadin.ui.Window;
 
@@ -25,7 +24,7 @@ public class Ticket1465ModalNotification extends Application.LegacyApplication {
                 new Button.ClickListener() {
 
                     public void buttonClick(ClickEvent event) {
-                        Root.getCurrentRoot().showNotification(
+                        Notification.show(
                                 "Try clicking the button in main window!",
                                 Notification.TYPE_ERROR_MESSAGE);
 
@@ -37,7 +36,7 @@ public class Ticket1465ModalNotification extends Application.LegacyApplication {
                 new Button.ClickListener() {
 
                     public void buttonClick(ClickEvent event) {
-                        Root.getCurrentRoot().showNotification(
+                        Notification.show(
                                 "Try clicking the button in main window!",
                                 Notification.TYPE_WARNING_MESSAGE);
                     }
@@ -48,7 +47,7 @@ public class Ticket1465ModalNotification extends Application.LegacyApplication {
                 new Button.ClickListener() {
 
                     public void buttonClick(ClickEvent event) {
-                        Root.getCurrentRoot().showNotification(
+                        Notification.show(
                                 "Try clicking the button in main window!",
                                 Notification.TYPE_HUMANIZED_MESSAGE);
                     }
index 6cf5c8f7541ff4bb238355f62a81f4a4697b9455..a3ff6808dce133f33d7587e0c268d989e72bb743 100644 (file)
@@ -20,6 +20,7 @@ import com.vaadin.ui.Field;
 import com.vaadin.ui.FormLayout;
 import com.vaadin.ui.Layout;
 import com.vaadin.ui.ListSelect;
+import com.vaadin.ui.Notification;
 import com.vaadin.ui.Panel;
 import com.vaadin.ui.Root.LegacyWindow;
 import com.vaadin.ui.Table;
@@ -181,8 +182,7 @@ public class Ticket2998 extends Application.LegacyApplication {
                                 @SuppressWarnings("unused")
                                 float f = Float.parseFloat((String) value);
                             } catch (Exception e) {
-                                f.getRoot()
-                                        .showNotification("Bad number value");
+                                Notification.show("Bad number value");
                                 f.setValue(0);
                             }
                         }
index 1c55bcbe7d65c7e8ec195c80253339ef1faa962f..f6fbe05e38d38ecb8d2c698038c02086973da3e4 100644 (file)
@@ -4,13 +4,13 @@ import java.util.HashMap;
 import java.util.Map;
 
 import com.vaadin.Application;
+import com.vaadin.terminal.Page;
+import com.vaadin.terminal.Page.FragmentChangedEvent;
 import com.vaadin.ui.Button;
 import com.vaadin.ui.Button.ClickEvent;
 import com.vaadin.ui.Component;
 import com.vaadin.ui.Label;
 import com.vaadin.ui.Panel;
-import com.vaadin.ui.Root;
-import com.vaadin.ui.Root.FragmentChangedEvent;
 import com.vaadin.ui.Root.LegacyWindow;
 import com.vaadin.ui.TextField;
 import com.vaadin.ui.VerticalLayout;
@@ -32,7 +32,7 @@ public class Ticket34 extends Application.LegacyApplication {
                 "Test app for URI fragment management/reading", mainLayout);
         setMainWindow(mainWin);
 
-        mainWin.addListener(new Root.FragmentChangedListener() {
+        mainWin.getPage().addListener(new Page.FragmentChangedListener() {
 
             public void fragmentChanged(FragmentChangedEvent event) {
                 getMainWindow().showNotification(
@@ -93,7 +93,7 @@ public class Ticket34 extends Application.LegacyApplication {
                 public void buttonClick(ClickEvent event) {
                     String viewName = tf.getValue().toString();
                     // fragmentChangedListener will change the view if possible
-                    event.getButton().getRoot().setFragment(viewName);
+                    event.getButton().getRoot().getPage().setFragment(viewName);
                 }
             });
 
index 551e7a7ed85b9cc7535525980a4a76a3bd118e51..a9e1518c542abea9cc1c2cc244cc02d2d7c9ff54 100644 (file)
@@ -112,7 +112,7 @@ public class TestUtils {
                 + "document.body.style.WebkitAppearance=='string') /* webkit only */ ? 'innerText' "
                 + ": 'innerHTML'] = '" + cssString + "';}";
 
-        w.executeJavaScript(script);
+        w.getPage().getJavaScript().execute(script);
     }
 
     public static IndexedContainer getISO3166Container() {