From 01c44a6fa013793b5a4c4c2ddc80f5bb601ae954 Mon Sep 17 00:00:00 2001 From: Artur Signell Date: Tue, 30 Dec 2008 12:49:30 +0000 Subject: [PATCH] Test case and fix for #2406 - Sub window with undefined height and 100% high layout svn changeset:6366/svn branch:trunk --- .../terminal/gwt/client/ui/IWindow.java | 28 +++++++++-- .../toolkit/tests/tickets/Ticket2406.java | 47 +++++++++++++++++++ src/com/itmill/toolkit/ui/Window.java | 10 ++++ 3 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 src/com/itmill/toolkit/tests/tickets/Ticket2406.java diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IWindow.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IWindow.java index a40183cdb9..c033766309 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IWindow.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IWindow.java @@ -308,9 +308,9 @@ public class IWindow extends IToolkitOverlay implements Container, boolean dynamicHeight = !uidl.hasAttribute("height"); boolean widthHasBeenFixed = false; - String layoutWidth = childUidl.getStringAttribute("width"); - boolean layoutRelativeWidth = (layoutWidth != null && layoutWidth - .endsWith("%")); + boolean layoutRelativeWidth = uidl.hasAttribute("layoutRelativeWidth"); + boolean layoutRelativeHeight = uidl + .hasAttribute("layoutRelativeHeight"); if (dynamicWidth && layoutRelativeWidth) { /* @@ -328,7 +328,7 @@ public class IWindow extends IToolkitOverlay implements Container, * be able to take scrollbars into account (layout gets narrower * space if it is higher than the window) -> only vertical scrollbar */ - client.handleComponentRelativeSize((Widget) layout); + client.runDescendentsLayout(this); } /* @@ -340,6 +340,26 @@ public class IWindow extends IToolkitOverlay implements Container, widthHasBeenFixed = true; } + if (dynamicHeight && layoutRelativeHeight) { + /* + * Window height is undefined, layout is 100% high so the layout + * should define the initial window height but on resize the layout + * should be as high as the window. We fix the height immediately to + * deal with this. + */ + + int h = contents.getOffsetHeight() + getExtraHeight(); + int w = contents.getOffsetWidth(); + + // Prevent resizing until height has been fixed + resizable = false; + + client.updateVariable(id, "height", h, false); + client.updateVariable(id, "width", w, true); + // ApplicationConnection.getConsole().log("Fixing window size to " + + // w + "x" + h); + } + // we may have actions and notifications if (uidl.getChildCount() > 1) { final int cnt = uidl.getChildCount(); diff --git a/src/com/itmill/toolkit/tests/tickets/Ticket2406.java b/src/com/itmill/toolkit/tests/tickets/Ticket2406.java new file mode 100644 index 0000000000..4f33b59a1b --- /dev/null +++ b/src/com/itmill/toolkit/tests/tickets/Ticket2406.java @@ -0,0 +1,47 @@ +package com.itmill.toolkit.tests.tickets; + +import com.itmill.toolkit.Application; +import com.itmill.toolkit.ui.Button; +import com.itmill.toolkit.ui.VerticalLayout; +import com.itmill.toolkit.ui.Window; +import com.itmill.toolkit.ui.Button.ClickEvent; +import com.itmill.toolkit.ui.Button.ClickListener; + +public class Ticket2406 extends Application { + + private Window w; + + public void init() { + Window w = new Window(getClass().getSimpleName()); + setMainWindow(w); + // setTheme("tests-tickets"); + createUI((VerticalLayout) w.getLayout()); + } + + private void createUI(VerticalLayout layout) { + w = new Window("A sub window"); + w.setSizeUndefined(); + getMainWindow().addWindow(w); + + VerticalLayout l = new VerticalLayout(); + l.setSizeFull(); + w.setLayout(l); + + Button b = new Button("Button 1"); + b.setSizeFull(); + b.addListener(new ClickListener() { + + public void buttonClick(ClickEvent event) { + w.setHeight("200px"); + } + + }); + l.addComponent(b); + + for (int i = 0; i < 5; i++) { + b = new Button("Button number "+(i+2)); + b.setSizeFull(); + l.addComponent(b); + } + } +} diff --git a/src/com/itmill/toolkit/ui/Window.java b/src/com/itmill/toolkit/ui/Window.java index 8849d8e034..f255d717d2 100644 --- a/src/com/itmill/toolkit/ui/Window.java +++ b/src/com/itmill/toolkit/ui/Window.java @@ -20,6 +20,7 @@ import com.itmill.toolkit.terminal.PaintException; import com.itmill.toolkit.terminal.PaintTarget; import com.itmill.toolkit.terminal.ParameterHandler; import com.itmill.toolkit.terminal.Resource; +import com.itmill.toolkit.terminal.Sizeable; import com.itmill.toolkit.terminal.Terminal; import com.itmill.toolkit.terminal.URIHandler; @@ -496,6 +497,15 @@ public class Window extends Panel implements URIHandler, ParameterHandler { target.addAttribute("main", true); } + if (getLayout() != null) { + if (getLayout().getHeightUnits() == Sizeable.UNITS_PERCENTAGE) { + target.addAttribute("layoutRelativeHeight", true); + } + if (getLayout().getWidthUnits() == Sizeable.UNITS_PERCENTAGE) { + target.addAttribute("layoutRelativeWidth", true); + } + } + // Open requested resource synchronized (openList) { if (!openList.isEmpty()) { -- 2.39.5