]> source.dussan.org Git - vaadin-framework.git/commitdiff
Report child sizes to LayoutManager to improve propagation
authorLeif Åstrand <leif@vaadin.com>
Tue, 3 Apr 2012 14:30:26 +0000 (17:30 +0300)
committerLeif Åstrand <leif@vaadin.com>
Tue, 3 Apr 2012 14:30:26 +0000 (17:30 +0300)
src/com/vaadin/terminal/gwt/client/ui/AbstractSplitPanelConnector.java
src/com/vaadin/terminal/gwt/client/ui/VAbstractSplitPanel.java

index 65018aaadfa192f32a4d5dc420dcc43560f03076..cf683b94cfd9382fd190ca440a01407f1339f195 100644 (file)
@@ -18,6 +18,7 @@ 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.ConnectorHierarchyChangedEvent;
+import com.vaadin.terminal.gwt.client.LayoutManager;
 import com.vaadin.terminal.gwt.client.MouseEventDetails;
 import com.vaadin.terminal.gwt.client.communication.ServerRpc;
 import com.vaadin.terminal.gwt.client.communication.StateChangeEvent;
@@ -236,6 +237,27 @@ public abstract class AbstractSplitPanelConnector extends
         VAbstractSplitPanel splitPanel = getWidget();
         splitPanel.setSplitPosition(splitPanel.position);
         splitPanel.updateSizes();
+        // Report relative sizes in other direction for quicker propagation
+        for (ComponentConnector child : children) {
+            reportOtherDimension(child);
+        }
+    }
+
+    private void reportOtherDimension(ComponentConnector child) {
+        LayoutManager layoutManager = getLayoutManager();
+        if (this instanceof HorizontalSplitPanelConnector) {
+            if (child.isRelativeHeight()) {
+                int height = layoutManager.getInnerHeight(getWidget()
+                        .getElement());
+                layoutManager.reportHeightAssignedToRelative(child, height);
+            }
+        } else {
+            if (child.isRelativeWidth()) {
+                int width = layoutManager.getInnerWidth(getWidget()
+                        .getElement());
+                layoutManager.reportWidthAssignedToRelative(child, width);
+            }
+        }
     }
 
     @Override
index 736937cac262d8a5df8c61571ad79f72365d327c..ac715633237bdab3f81db0772c868ebd719cc726 100644 (file)
@@ -25,6 +25,8 @@ import com.google.gwt.user.client.ui.ComplexPanel;
 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.ConnectorMap;
+import com.vaadin.terminal.gwt.client.LayoutManager;
 import com.vaadin.terminal.gwt.client.Util;
 import com.vaadin.terminal.gwt.client.VConsole;
 import com.vaadin.terminal.gwt.client.ui.VAbstractSplitPanel.SplitterMoveHandler.SplitterMoveEvent;
@@ -297,6 +299,20 @@ public class VAbstractSplitPanel extends ComplexPanel {
             DOM.setStyleAttribute(secondContainer, "left",
                     (pixelPosition + getSplitterSize()) + "px");
 
+            LayoutManager layoutManager = LayoutManager.get(client);
+            if (layoutManager.isLayoutRunning()) {
+                ConnectorMap connectorMap = ConnectorMap.get(client);
+                if (firstChild != null) {
+                    layoutManager.reportWidthAssignedToRelative(
+                            connectorMap.getConnector(firstChild),
+                            pixelPosition);
+                }
+                if (secondChild != null) {
+                    layoutManager.reportWidthAssignedToRelative(
+                            connectorMap.getConnector(secondChild),
+                            secondContainerWidth);
+                }
+            }
             break;
         case ORIENTATION_VERTICAL:
             wholeSize = DOM.getElementPropertyInt(wrapper, "clientHeight");
@@ -324,9 +340,23 @@ public class VAbstractSplitPanel extends ComplexPanel {
             DOM.setStyleAttribute(secondContainer, "top",
                     (pixelPosition + getSplitterSize()) + "px");
 
+            layoutManager = LayoutManager.get(client);
+            if (layoutManager.isLayoutRunning()) {
+                ConnectorMap connectorMap = ConnectorMap.get(client);
+                if (firstChild != null) {
+                    layoutManager.reportHeightAssignedToRelative(
+                            connectorMap.getConnector(firstChild),
+                            pixelPosition);
+                }
+                if (secondChild != null) {
+                    layoutManager.reportHeightAssignedToRelative(
+                            connectorMap.getConnector(secondChild),
+                            secondContainerHeight);
+                }
+            }
+
             break;
         }
-
     }
 
     void setFirstWidget(Widget w) {