]> source.dussan.org Git - vaadin-framework.git/commitdiff
Updated Root to use hierarchy change event for content and windows
authorArtur Signell <artur@vaadin.com>
Wed, 11 Apr 2012 07:15:52 +0000 (10:15 +0300)
committerArtur Signell <artur@vaadin.com>
Thu, 12 Apr 2012 06:58:07 +0000 (09:58 +0300)
src/com/vaadin/terminal/gwt/client/ComponentLocator.java
src/com/vaadin/terminal/gwt/client/VDebugConsole.java
src/com/vaadin/terminal/gwt/client/ui/RootConnector.java
src/com/vaadin/terminal/gwt/client/ui/VView.java
src/com/vaadin/ui/Root.java

index f954105120b90046001fae4d6d7954e72b3abcab..9e5ed709c7206497642e42f57bc1d8b6a510b88e 100644 (file)
@@ -5,6 +5,7 @@ package com.vaadin.terminal.gwt.client;
 
 import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
@@ -17,6 +18,7 @@ import com.vaadin.terminal.gwt.client.ui.VMeasuringOrderedLayout;
 import com.vaadin.terminal.gwt.client.ui.VTabsheetPanel;
 import com.vaadin.terminal.gwt.client.ui.VView;
 import com.vaadin.terminal.gwt.client.ui.VWindow;
+import com.vaadin.terminal.gwt.client.ui.WindowConnector;
 
 /**
  * ComponentLocator provides methods for generating a String locator for a given
@@ -368,18 +370,14 @@ public class ComponentLocator {
             return null;
         }
 
-        String pid = ConnectorMap.get(client).getConnectorId(w.getElement());
-        if (isStaticPid(pid)) {
-            return pid;
-        }
-
         if (w instanceof VView) {
             return "";
         } else if (w instanceof VWindow) {
-            VWindow win = (VWindow) w;
-            ArrayList<VWindow> subWindowList = client.getView().getWidget()
-                    .getSubWindowList();
-            int indexOfSubWindow = subWindowList.indexOf(win);
+            Connector windowConnector = ConnectorMap.get(client)
+                    .getConnector(w);
+            List<WindowConnector> subWindowList = client.getView()
+                    .getSubWindows();
+            int indexOfSubWindow = subWindowList.indexOf(windowConnector);
             return PARENTCHILD_SEPARATOR + "VWindow[" + indexOfSubWindow + "]";
         } else if (w instanceof RootPanel) {
             return ROOT_ID;
@@ -543,8 +541,14 @@ public class ComponentLocator {
                  * compatibility
                  */
                 if (widgetClassName.equals("VWindow")) {
-                    iterator = client.getView().getWidget().getSubWindowList()
-                            .iterator();
+                    List<WindowConnector> windows = client.getView()
+                            .getSubWindows();
+                    List<VWindow> windowWidgets = new ArrayList<VWindow>(
+                            windows.size());
+                    for (WindowConnector wc : windows) {
+                        windowWidgets.add(wc.getWidget());
+                    }
+                    iterator = windowWidgets.iterator();
                 } else if (widgetClassName.equals("VContextMenu")) {
                     return client.getContextMenu();
                 } else {
@@ -603,19 +607,4 @@ public class ComponentLocator {
         return null;
     }
 
-    /**
-     * Checks if the given pid is a static pid.
-     * 
-     * @param pid
-     *            The pid to check
-     * @return true if the pid is a static pid, false otherwise
-     */
-    private boolean isStaticPid(String pid) {
-        if (pid == null) {
-            return false;
-        }
-
-        return pid.startsWith("PID_S");
-    }
-
 }
index c457044ea9f448872192bb2b34c49782a6405848..f815dc29fc590fddd26ebc02c43ad46b78494b83 100644 (file)
@@ -56,7 +56,7 @@ import com.vaadin.terminal.gwt.client.ui.RootConnector;
 import com.vaadin.terminal.gwt.client.ui.VLazyExecutor;
 import com.vaadin.terminal.gwt.client.ui.VNotification;
 import com.vaadin.terminal.gwt.client.ui.VOverlay;
-import com.vaadin.terminal.gwt.client.ui.VWindow;
+import com.vaadin.terminal.gwt.client.ui.WindowConnector;
 
 /**
  * A helper console for client side development. The debug console can also be
@@ -858,9 +858,8 @@ public class VDebugConsole extends VOverlay implements Console {
                 .getConnectors();
         log("Sub windows:");
         Set<ComponentConnector> subWindowHierarchyConnectors = new HashSet<ComponentConnector>();
-        for (VWindow w : root.getWidget().getSubWindowList()) {
-            SimpleTree windowHierachy = dumpConnectorHierarchy(
-                    connectorMap.getConnector(w), "",
+        for (WindowConnector wc : root.getSubWindows()) {
+            SimpleTree windowHierachy = dumpConnectorHierarchy(wc, "",
                     subWindowHierarchyConnectors);
             if (panel.isAttached()) {
                 windowHierachy.open(true);
index 392230aa7f55e74ae64dbe29602f84ac3851f5a7..21942ed96bd11265c21bdb9651b8a690d83fd5b9 100644 (file)
@@ -3,8 +3,9 @@
  */
 package com.vaadin.terminal.gwt.client.ui;
 
-import java.util.HashSet;
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.Scheduler;
@@ -22,6 +23,8 @@ import com.google.gwt.user.client.ui.Widget;
 import com.vaadin.terminal.gwt.client.ApplicationConnection;
 import com.vaadin.terminal.gwt.client.BrowserInfo;
 import com.vaadin.terminal.gwt.client.ComponentConnector;
+import com.vaadin.terminal.gwt.client.ComponentState;
+import com.vaadin.terminal.gwt.client.Connector;
 import com.vaadin.terminal.gwt.client.ConnectorHierarchyChangeEvent;
 import com.vaadin.terminal.gwt.client.ConnectorMap;
 import com.vaadin.terminal.gwt.client.Focusable;
@@ -41,6 +44,19 @@ import com.vaadin.ui.Root;
 public class RootConnector extends AbstractComponentContainerConnector
         implements Paintable {
 
+    public static class RootState extends ComponentState {
+        private Connector content;
+
+        public Connector getContent() {
+            return content;
+        }
+
+        public void setContent(Connector content) {
+            this.content = content;
+        }
+
+    }
+
     public interface RootServerRPC extends ClickRPC, ServerRpc {
 
     }
@@ -158,39 +174,8 @@ public class RootConnector extends AbstractComponentContainerConnector
             return;
         }
 
-        // Draw this application level window
-        UIDL childUidl = uidl.getChildUIDL(childIndex);
-        final ComponentConnector lo = client.getPaintable(childUidl);
-
-        boolean layoutChanged = getWidget().layout != lo;
-        if (getWidget().layout != null) {
-            if (layoutChanged) {
-                // remove old
-                if (childStateChangeHandlerRegistration != null) {
-                    childStateChangeHandlerRegistration.removeHandler();
-                    childStateChangeHandlerRegistration = null;
-                }
-                // add new
-                getWidget().setWidget(lo.getWidget());
-                getWidget().layout = lo;
-            }
-        } else {
-            getWidget().setWidget(lo.getWidget());
-            getWidget().layout = lo;
-            if (layoutChanged) {
-                childStateChangeHandlerRegistration = lo
-                        .addStateChangeHandler(childStateChangeHandler);
-                // Must handle new child here as state change events are already
-                // fired
-                onChildSizeChange();
-            }
-        }
-
-        // Save currently open subwindows to track which will need to be closed
-        final HashSet<VWindow> removedSubWindows = new HashSet<VWindow>(
-                getWidget().subWindows);
-
         // Handle other UIDL children
+        UIDL childUidl;
         while ((childUidl = uidl.getChildUIDL(++childIndex)) != null) {
             String tag = childUidl.getTag().intern();
             if (tag == "actions") {
@@ -208,28 +193,9 @@ public class RootConnector extends AbstractComponentContainerConnector
                     final UIDL notification = (UIDL) it.next();
                     VNotification.showNotification(client, notification);
                 }
-            } else {
-                // subwindows
-                final WindowConnector w = (WindowConnector) client
-                        .getPaintable(childUidl);
-                VWindow windowWidget = w.getWidget();
-                if (getWidget().subWindows.contains(windowWidget)) {
-                    removedSubWindows.remove(windowWidget);
-                } else {
-                    getWidget().subWindows.add(windowWidget);
-                }
-                w.updateFromUIDL(childUidl, client);
             }
         }
 
-        // Close old windows which where not in UIDL anymore
-        for (final Iterator<VWindow> rem = removedSubWindows.iterator(); rem
-                .hasNext();) {
-            final VWindow w = rem.next();
-            getWidget().subWindows.remove(w);
-            w.hide();
-        }
-
         if (uidl.hasAttribute("focused")) {
             // set focused component when render phase is finished
             Scheduler.get().scheduleDeferred(new Command() {
@@ -356,7 +322,7 @@ public class RootConnector extends AbstractComponentContainerConnector
     }
 
     protected void onChildSizeChange() {
-        ComponentConnector child = getWidget().layout;
+        ComponentConnector child = (ComponentConnector) getState().getContent();
         Style childStyle = child.getWidget().getElement().getStyle();
         /*
          * Must set absolute position if the child has relative height and
@@ -382,17 +348,70 @@ public class RootConnector extends AbstractComponentContainerConnector
      */
     @Deprecated
     public boolean hasSubWindow(WindowConnector wc) {
-        return getWidget().subWindows.contains(wc.getWidget());
+        return getChildren().contains(wc);
+    }
+
+    /**
+     * Return an iterator for current subwindows. This method is meant for
+     * testing purposes only.
+     * 
+     * @return
+     */
+    public List<WindowConnector> getSubWindows() {
+        ArrayList<WindowConnector> windows = new ArrayList<WindowConnector>();
+        for (ComponentConnector child : getChildren()) {
+            if (child instanceof WindowConnector) {
+                windows.add((WindowConnector) child);
+            }
+        }
+        return windows;
+    }
+
+    @Override
+    public RootState getState() {
+        return (RootState) super.getState();
     }
 
     @Override
     public void onConnectorHierarchyChange(ConnectorHierarchyChangeEvent event) {
         super.onConnectorHierarchyChange(event);
+
+        ComponentConnector oldChild = null;
+        ComponentConnector newChild = (ComponentConnector) getState()
+                .getContent();
+
+        for (ComponentConnector c : event.getOldChildren()) {
+            if (!(c instanceof WindowConnector)) {
+                oldChild = c;
+                break;
+            }
+        }
+
+        if (oldChild != newChild) {
+            if (childStateChangeHandlerRegistration != null) {
+                childStateChangeHandlerRegistration.removeHandler();
+                childStateChangeHandlerRegistration = null;
+            }
+            getWidget().setWidget(newChild.getWidget());
+            childStateChangeHandlerRegistration = newChild
+                    .addStateChangeHandler(childStateChangeHandler);
+            // Must handle new child here as state change events are already
+            // fired
+            onChildSizeChange();
+        }
+
         for (ComponentConnector c : getChildren()) {
             if (c instanceof WindowConnector) {
                 WindowConnector wc = (WindowConnector) c;
                 wc.setWindowOrderAndPosition();
             }
         }
+
+        // Close removed sub windows
+        for (ComponentConnector c : event.getOldChildren()) {
+            if (c.getParent() != this && c instanceof WindowConnector) {
+                ((WindowConnector) c).getWidget().hide();
+            }
+        }
     }
 }
index 014a016410d13771d36413eca1a930e6c01a1753..2cf446ae41fe1702ca47d0c74b33d001de16b139 100644 (file)
@@ -5,7 +5,6 @@
 package com.vaadin.terminal.gwt.client.ui;
 
 import java.util.ArrayList;
-import java.util.LinkedHashSet;
 
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
@@ -44,10 +43,6 @@ public class VView extends SimplePanel implements ResizeHandler,
 
     String theme;
 
-    ComponentConnector layout;
-
-    final LinkedHashSet<VWindow> subWindows = new LinkedHashSet<VWindow>();
-
     String id;
 
     ShortcutActionHandler actionHandler;
@@ -329,20 +324,6 @@ public class VView extends SimplePanel implements ResizeHandler,
          }
      }-*/;
 
-    /**
-     * Return an iterator for current subwindows. This method is meant for
-     * testing purposes only.
-     * 
-     * @return
-     */
-    public ArrayList<VWindow> getSubWindowList() {
-        ArrayList<VWindow> windows = new ArrayList<VWindow>(subWindows.size());
-        for (VWindow widget : subWindows) {
-            windows.add(widget);
-        }
-        return windows;
-    }
-
     public ShortcutActionHandler getShortcutActionHandler() {
         return actionHandler;
     }
index 32c40836c04b6e54029678441f9a9c407a27312b..3fcf70b922c42aa2653d0f3aea3a49301b81232b 100644 (file)
@@ -27,10 +27,12 @@ import com.vaadin.event.MouseEvents.ClickListener;
 import com.vaadin.terminal.PaintException;
 import com.vaadin.terminal.PaintTarget;
 import com.vaadin.terminal.Resource;
+import com.vaadin.terminal.Vaadin6Component;
 import com.vaadin.terminal.WrappedRequest;
 import com.vaadin.terminal.WrappedRequest.BrowserDetails;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.ui.RootConnector.RootServerRPC;
+import com.vaadin.terminal.gwt.client.ui.RootConnector.RootState;
 import com.vaadin.terminal.gwt.client.ui.VNotification;
 import com.vaadin.terminal.gwt.client.ui.VView;
 import com.vaadin.tools.ReflectTools;
@@ -74,7 +76,7 @@ import com.vaadin.ui.Window.CloseListener;
  * @since 7.0
  */
 public abstract class Root extends AbstractComponentContainer implements
-        Action.Container, Action.Notifier {
+        Action.Container, Action.Notifier, Vaadin6Component {
 
     /**
      * Listener that gets notified when the size of the browser window
@@ -343,11 +345,6 @@ public abstract class Root extends AbstractComponentContainer implements
      */
     public static final int BORDER_DEFAULT = 2;
 
-    /**
-     * The container in which the component hierarchy of the root starts.
-     */
-    private ComponentContainer content;
-
     /**
      * The application to which this root belongs
      */
@@ -422,8 +419,7 @@ public abstract class Root extends AbstractComponentContainer implements
      * {@link VerticalLayout} with margins enabled as its content.
      */
     public Root() {
-        registerRpc(rpc);
-        setSizeFull();
+        this((ComponentContainer) null);
     }
 
     /**
@@ -435,7 +431,8 @@ public abstract class Root extends AbstractComponentContainer implements
      * @see #setContent(ComponentContainer)
      */
     public Root(ComponentContainer content) {
-        this();
+        registerRpc(rpc);
+        setSizeFull();
         setContent(content);
     }
 
@@ -450,7 +447,7 @@ public abstract class Root extends AbstractComponentContainer implements
      * @see #setCaption(String)
      */
     public Root(String caption) {
-        this();
+        this((ComponentContainer) null);
         setCaption(caption);
     }
 
@@ -471,6 +468,11 @@ public abstract class Root extends AbstractComponentContainer implements
         setCaption(caption);
     }
 
+    @Override
+    public RootState getState() {
+        return (RootState) super.getState();
+    }
+
     /**
      * Overridden to return a value instead of referring to the parent.
      * 
@@ -505,17 +507,6 @@ public abstract class Root extends AbstractComponentContainer implements
             }
         }
 
-        ComponentContainer content = getContent();
-        if (content != null) {
-            content.paint(target);
-        }
-
-        // Paint subwindows
-        for (final Iterator<Window> i = windows.iterator(); i.hasNext();) {
-            final Window w = i.next();
-            w.paint(target);
-        }
-
         // Paint notifications
         if (notifications != null) {
             target.startTag("notifications");
@@ -1035,10 +1026,7 @@ public abstract class Root extends AbstractComponentContainer implements
      * @see #createDefaultLayout()
      */
     public ComponentContainer getContent() {
-        if (content == null) {
-            setContent(createDefaultLayout());
-        }
-        return content;
+        return (ComponentContainer) getState().getContent();
     }
 
     /**
@@ -1066,10 +1054,14 @@ public abstract class Root extends AbstractComponentContainer implements
      * @see #createDefaultLayout()
      */
     public void setContent(ComponentContainer content) {
-        if (this.content != null) {
-            super.removeComponent(this.content);
+        if (content == null) {
+            content = createDefaultLayout();
+        }
+
+        if (getState().getContent() != null) {
+            super.removeComponent((Component) getState().getContent());
         }
-        this.content = content;
+        getState().setContent(content);
         if (content != null) {
             super.addComponent(content);
         }