*
* Used in JSNI functions
*
- * @SuppressWarnings
*/
+ @SuppressWarnings("unused")
private final JavaScriptObject ttClientWrapper = null;
private int activeRequests = 0;
/**
* Helper for tt initialization
*/
+ @SuppressWarnings("unused")
private JavaScriptObject getVersionInfo() {
return configuration.getVersionInfoJSObject();
}
endRequest();
if (!applicationRunning) {
// start failed, let's try to start the next app
- configuration.startNextApplication();
+ ApplicationConfiguration.startNextApplication();
}
}
} else {
applicationRunning = true;
handleWhenCSSLoaded(response);
- configuration.startNextApplication();
+ ApplicationConfiguration.startNextApplication();
}
}
float relativeWidth = Util.parseRelativeSize(w);
float relativeHeight = Util.parseRelativeSize(h);
+ // first set absolute sizes
+ if (relativeHeight < 0.0) {
+ component.setHeight(h);
+ }
+ if (relativeWidth < 0.0) {
+ component.setWidth(w);
+ }
+
if (relativeHeight >= 0.0 || relativeWidth >= 0.0) {
// One or both is relative
FloatSize relativeSize = new FloatSize(relativeWidth,
componentRelativeSizes.remove(component);
}
- if (relativeHeight < 0.0) {
- component.setHeight(h);
- }
- if (relativeWidth < 0.0) {
- component.setWidth(w);
- }
}
/**
return;
}
- Size availPixels = Util.getLayout(widget).getAllocatedSpace(widget);
- if (relativeSize.getWidth() >= 0) {
+ boolean horizontalScrollBar = false;
+ boolean verticalScrollBar = false;
- if (availPixels != null) {
+ RenderSpace renderSpace = Util.getLayout(widget).getAllocatedSpace(
+ widget);
+
+ if (relativeSize.getHeight() >= 0) {
+ if (renderSpace != null) {
+
+ if (renderSpace.getScrollbarSize() > 0) {
+ if (relativeSize.getWidth() > 100) {
+ horizontalScrollBar = true;
+ } else if (relativeSize.getWidth() < 0
+ && renderSpace.getWidth() > 0) {
+ int offsetWidth = widget.getOffsetWidth();
+ int width = renderSpace.getWidth();
+ if (offsetWidth > width) {
+ horizontalScrollBar = true;
+ }
+ }
+ }
- int width = availPixels.getWidth();
- width *= relativeSize.getWidth() / 100.0;
+ int height = renderSpace.getHeight();
+ if (horizontalScrollBar) {
+ height -= renderSpace.getScrollbarSize();
+ }
+ height = (int) (height * relativeSize.getHeight() / 100.0);
- if (width >= 0) {
- // getConsole().log(
- // "Widget " + widget.getClass().getName() + "/"
- // + widget.hashCode() + " relative width "
- // + relativeSize.getWidth() + "%: " + width
- // + "px");
- widget.setWidth(width + "px");
+ if (height < 0) {
+ height = 0;
}
+ // getConsole().log(
+ // "Widget " + widget.getClass().getName() + "/"
+ // + widget.hashCode() + " relative height "
+ // + relativeSize.getHeight() + "%: " + height
+ // + "px");
+ widget.setHeight(height + "px");
} else {
- widget.setWidth(relativeSize.getWidth() + "%");
+ widget.setHeight(relativeSize.getHeight() + "%");
ApplicationConnection.getConsole().error(
Util.getLayout(widget).getClass().getName()
+ " did not produce allocatedSpace for "
+ widget.getClass().getName());
}
}
- if (relativeSize.getHeight() >= 0) {
- if (availPixels != null) {
-
- int height = availPixels.getHeight();
- height *= relativeSize.getHeight() / 100.0;
-
- if (height >= 0) {
- // getConsole().log(
- // "Widget " + widget.getClass().getName() + "/"
- // + widget.hashCode() + " relative height "
- // + relativeSize.getHeight() + "%: " + height
- // + "px");
- widget.setHeight(height + "px");
+
+ if (relativeSize.getWidth() >= 0) {
+
+ if (renderSpace != null) {
+
+ int width = renderSpace.getWidth();
+
+ if (renderSpace.getScrollbarSize() > 0) {
+ if (relativeSize.getHeight() > 100) {
+ verticalScrollBar = true;
+ } else if (relativeSize.getHeight() < 0
+ && renderSpace.getHeight() > 0
+ && widget.getOffsetHeight() > renderSpace
+ .getHeight()) {
+ verticalScrollBar = true;
+ }
}
+
+ if (verticalScrollBar) {
+ width -= renderSpace.getScrollbarSize();
+ }
+ width = (int) (width * relativeSize.getWidth() / 100.0);
+
+ if (width < 0) {
+ width = 0;
+ }
+
+ // getConsole().log(
+ // "Widget " + widget.getClass().getName() + "/"
+ // + widget.hashCode() + " relative width "
+ // + relativeSize.getWidth() + "%: " + width
+ // + "px");
+ widget.setWidth(width + "px");
} else {
- widget.setHeight(relativeSize.getHeight() + "%");
+ widget.setWidth(relativeSize.getWidth() + "%");
ApplicationConnection.getConsole().error(
Util.getLayout(widget).getClass().getName()
+ " did not produce allocatedSpace for "
import java.util.Set;
import com.google.gwt.user.client.ui.Widget;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public interface Container extends Paintable {
* @param child
* @return
*/
- Size getAllocatedSpace(Widget child);
+ RenderSpace getAllocatedSpace(Widget child);
}
*/\r
public class RenderInformation {\r
\r
- private Size contentArea = new Size(0, 0);\r
+ private RenderSpace contentArea = new RenderSpace();\r
private Size renderedSize = new Size(-1, -1);\r
\r
public void setContentAreaWidth(int w) {\r
contentArea.setHeight(h);\r
}\r
\r
- public Size getContentAreaSize() {\r
+ public RenderSpace getContentAreaSize() {\r
return contentArea;\r
\r
}\r
return other.width == width && other.height == height;\r
}\r
\r
+ public Size() {\r
+ }\r
+\r
public Size(int width, int height) {\r
this.height = height;\r
this.width = width;\r
--- /dev/null
+package com.itmill.toolkit.terminal.gwt.client;
+
+import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
+
+/**
+ * Contains information about render area.
+ */
+public class RenderSpace extends Size {
+
+ private int scrollBarSize = 0;
+
+ public RenderSpace(int width, int height) {
+ super(width, height);
+ }
+
+ public RenderSpace() {
+ }
+
+ public RenderSpace(int width, int height, boolean useNativeScrollbarSize) {
+ super(width, height);
+ if (useNativeScrollbarSize) {
+ scrollBarSize = Util.getNativeScrollbarSize();
+ }
+ }
+
+ /**
+ * Returns pixels available vertically for contained widget, including
+ * possible scrollbars.
+ */
+ public int getHeight() {
+ return super.getHeight();
+ }
+
+ /**
+ * Returns pixels available horizontally for contained widget, including
+ * possible scrollbars.
+ */
+ public int getWidth() {
+ return super.getWidth();
+ }
+
+ /**
+ * In case containing block has oveflow: auto, this method must return
+ * number of pixels used by scrollbar. Returning zero means either that no
+ * scrollbar will be visible.
+ */
+ public int getScrollbarSize() {
+ return scrollBarSize;
+ }
+
+}
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.Widget;
public class Util {
debugger;
}-*/;
- /**
- * Nulls oncontextmenu function on given element. We need to manually clear
- * context menu events due bad browsers memory leaks, since GWT don't
- * support them.
- *
- * @param el
- */
- public native static void removeContextMenuEvent(Element el)
- /*-{
- el.oncontextmenu = null;
- }-*/;
-
/**
* Called when the size of one or more widgets have changed during
* rendering. Finds parent container and notifies them of the size change.
}
+ private static int detectedScrollbarSize = -1;
+
+ public static int getNativeScrollbarSize() {
+ if (detectedScrollbarSize < 0) {
+ Element scroller = DOM.createDiv();
+ scroller.getStyle().setProperty("width", "50px");
+ scroller.getStyle().setProperty("height", "50px");
+ scroller.getStyle().setProperty("overflow", "scroll");
+ scroller.getStyle().setProperty("position", "absolute");
+ scroller.getStyle().setProperty("marginLeft", "-5000px");
+ RootPanel.getBodyElement().appendChild(scroller);
+ detectedScrollbarSize = scroller.getOffsetWidth()
+ - scroller.getPropertyInt("clientWidth");
+ assert detectedScrollbarSize != 0;
+ RootPanel.getBodyElement().removeChild(scroller);
+
+ }
+ return detectedScrollbarSize;
+ }
+
}
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
+import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.ComplexPanel;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public class IAccordion extends ITabsheetBase implements
ContainerResizedListener {
private HashMap lazyUpdateMap = new HashMap();
+ private RenderSpace renderSpace = new RenderSpace(0, 0, true);
+
public IAccordion() {
super(CLASSNAME);
// IE6 needs this to calculate offsetHeight correctly
}
client.runDescendentsLayout(item);
+
+ if (BrowserInfo.get().getWebkitVersion() > 0) {
+ final Element selectedTabContent = getSelectedStack()
+ .getContainerElement();
+ DeferredCommand.addCommand(new Command() {
+ public void execute() {
+ // Dough, safari scoll auto means actually just a moped
+ selectedTabContent.getStyle().setProperty("overflow",
+ "hidden");
+ (new Timer() {
+ @Override
+ public void run() {
+ selectedTabContent.getStyle().setProperty(
+ "overflow", "auto");
+ }
+ }).schedule(1);
+ }
+ });
+ }
}
/**
fixContentNodeSize(contentSpace);
} else {
DOM.setStyleAttribute(content, "height", "");
+ renderSpace.setHeight(0);
+ renderSpace.setWidth(content.getOffsetWidth());
}
}
DOM
.setStyleAttribute(content, "width", getOffsetWidth()
+ "px");
+ } else {
+ // update render information
+ renderSpace.setHeight(contentHeight);
+ renderSpace.setWidth(content.getOffsetWidth());
}
}
return false;
}
- public Size getAllocatedSpace(Widget child) {
- // TODO Auto-generated method stub
- return null;
+ public RenderSpace getAllocatedSpace(Widget child) {
+ return renderSpace;
}
}
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public class ICoordinateLayout extends ComplexPanel implements Container,
ContainerResizedListener {
* @return
*/
protected native String getMargin(Element e, String CSSProp)/*-{
- return $wnd.getComputedStyle(e,null).getPropertyValue(CSSProp);
- }-*/;
+ return $wnd.getComputedStyle(e,null).getPropertyValue(CSSProp);
+ }-*/;
/**
* Retrieves margin info in IE
* @return
*/
protected native String getIEMargin(Element e)/*-{
- return e.currentStyle.margin;
- }-*/;
+ return e.currentStyle.margin;
+ }-*/;
/**
* @return all components that are not captions
return true;
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
Element area = componentToArea.get(child);
if (area != null) {
- return new Size(area.getOffsetWidth(), area.getOffsetHeight());
+ return new RenderSpace(area.getOffsetWidth(), area
+ .getOffsetHeight());
} else {
- return new Size(layout[WIDTH], layout[HEIGHT]);
+ return new RenderSpace(layout[WIDTH], layout[HEIGHT]);
}
}
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public class ICustomComponent extends SimplePanel implements Container {
return false;
}
- public Size getAllocatedSpace(Widget child) {
- Size space = new Size(getElement().getOffsetWidth(), getElement()
+ public RenderSpace getAllocatedSpace(Widget child) {
+ return new RenderSpace(getElement().getOffsetWidth(), getElement()
.getOffsetHeight());
-
- return space;
}
}
import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
/**
* Custom Layout implements complex layout defined with HTML template.
return false;
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
// TODO Auto-generated method stub
return null;
}
import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.StyleConstants;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
/**
* @author IT Mill Ltd
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
int width = 0, height = 0;
if (orientationMode == ORIENTATION_HORIZONTAL) {
}
}
- return new Size(width, height);
+ return new RenderSpace(width, height, child == expandedWidget);
}
}
import com.itmill.toolkit.terminal.gwt.client.IErrorMessage;\r
import com.itmill.toolkit.terminal.gwt.client.Paintable;\r
import com.itmill.toolkit.terminal.gwt.client.RenderInformation;\r
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;\r
import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;\r
\r
public class IForm extends ComplexPanel implements Container,\r
ContainerResizedListener {\r
client.runDescendentsLayout(this);\r
}\r
\r
- public Size getAllocatedSpace(Widget child) {\r
+ public RenderSpace getAllocatedSpace(Widget child) {\r
return renderInformation.getContentAreaSize();\r
}\r
\r
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.StyleConstants;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
/**
* Two col Layout that places caption on left col and field on right col
return false;
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
// TODO Auto-generated method stub
return null;
}
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.StyleConstants;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public class IGridLayout extends SimplePanel implements Paintable, Container,
ContainerResizedListener {
return false;
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
// TODO Auto-generated method stub
return null;
}
return false;
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
// TODO Auto-generated method stub
return null;
}
import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
* Furthermore, enable/disable fixed mode
*/
public void setWidth(String newWidth) {
+ super.setWidth(newWidth);
if (newWidth == null || newWidth.equals("")) {
width = null;
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
final int index = childWidgets.indexOf(child);
if (index >= 0) {
WidgetWrapper wrapper = childWidgetWrappers.get(index);
int w = wrapper.getAllocatedWidth();
int h = wrapper.getAllocatedHeight();
- return new Size(w, h);
+ return new RenderSpace(w, h);
+ } else {
+ return new RenderSpace();
}
-
- return new Size(0, 0);
}
}
import java.util.Set;
+import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
-import com.itmill.toolkit.terminal.gwt.client.ClientExceptionHandler;
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.IErrorMessage;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public class IPanel extends SimplePanel implements Container,
ContainerResizedListener {
private RenderInformation renderInformation = new RenderInformation();
- private int borderPaddingHorizontal = 0;
+ private int borderPaddingHorizontal = -1;
+
+ private int borderPaddingVertical = -1;
public IPanel() {
super();
}
- if (height != null && height != "") {
- final boolean hasChildren = getWidget() != null;
- Element contentEl = null;
- String origPositioning = null;
-
- if (hasChildren) {
- // Remove children temporary form normal flow to detect proper
- // size
- contentEl = getWidget().getElement();
- origPositioning = DOM.getStyleAttribute(contentEl, "position");
- DOM.setStyleAttribute(contentEl, "position", "absolute");
- }
-
- // Set defaults
- DOM.setStyleAttribute(contentNode, "overflow", "hidden");
- DOM.setStyleAttribute(contentNode, "height", "");
-
- // Calculate target height
- super.setHeight(height);
- final int targetHeight = getOffsetHeight();
-
- // Calculate used height
- super.setHeight("");
- if (BrowserInfo.get().isIE() && !hasChildren) {
- DOM.setStyleAttribute(contentNode, "height", "0px");
- }
-
- final int bottomTop = DOM.getElementPropertyInt(bottomDecoration,
- "offsetTop");
- final int bottomHeight = DOM.getElementPropertyInt(
- bottomDecoration, "offsetHeight");
- final int elementTop = DOM.getElementPropertyInt(getElement(),
- "offsetTop");
-
- final int usedHeight = bottomTop + bottomHeight - elementTop;
-
- // Calculate content area height (don't allow negative values)
- int contentAreaHeight = targetHeight - usedHeight;
- if (contentAreaHeight < 0) {
- contentAreaHeight = 0;
- }
-
- renderInformation.setContentAreaHeight(contentAreaHeight);
-
- // Set proper values for content element
- DOM.setStyleAttribute(contentNode, "height", contentAreaHeight
- + "px");
- DOM.setStyleAttribute(contentNode, "overflow", "auto");
-
- // Restore content to flow
- if (hasChildren) {
- DOM.setStyleAttribute(contentEl, "position", origPositioning);
- }
-
- // restore scroll position
- DOM.setElementPropertyInt(contentNode, "scrollTop", scrollTop);
- DOM.setElementPropertyInt(contentNode, "scrollLeft", scrollLeft);
-
- } else {
- DOM.setStyleAttribute(contentNode, "height", "");
- }
-
- if (width != null && !width.equals("")) {
- renderInformation.setContentAreaWidth(renderInformation
- .getRenderedSize().getWidth()
- - borderPaddingHorizontal);
- }
-
if (runGeckoFix && BrowserInfo.get().isGecko()) {
// workaround for #1764
if (width == null || width.equals("")) {
}
}
+ if (BrowserInfo.get().getWebkitVersion() > 0) {
+ DeferredCommand.addCommand(new Command() {
+ public void execute() {
+ // Dough, safari scoll auto means actually just a moped
+ contentNode.getStyle().setProperty("overflow", "hidden");
+ (new Timer() {
+ @Override
+ public void run() {
+ contentNode.getStyle().setProperty("overflow",
+ "auto");
+ }
+ }).schedule(1);
+ }
+ });
+ }
+
client.runDescendentsLayout(this);
}
client.updateVariable(id, "scrollLeft", scrollLeft, false);
}
} else if (errorIndicatorElement != null
- && DOM.compare(target, errorIndicatorElement)) {
+ && target == errorIndicatorElement) {
switch (type) {
case Event.ONMOUSEOVER:
if (errorMessage != null) {
}
}
- /**
- * Panel handles dimensions by itself.
- */
@Override
public void setHeight(String height) {
this.height = height;
+ super.setHeight(height);
+ if (height != null && height != "") {
+ final int targetHeight = getOffsetHeight();
+ int containerHeight = targetHeight - captionNode.getOffsetHeight()
+ - bottomDecoration.getOffsetHeight()
+ - getContainerBorderHeight();
+ if (containerHeight < 0) {
+ containerHeight = 0;
+ }
+ DOM
+ .setStyleAttribute(contentNode, "height", containerHeight
+ + "px");
+ } else {
+ DOM.setStyleAttribute(contentNode, "height", "");
+ }
+ }
+
+ private int getContainerBorderHeight() {
+ if (borderPaddingVertical < 0) {
+ detectContainerBorders();
+ }
+ return borderPaddingVertical;
}
- /**
- * Panel handles dimensions by itself.
- */
@Override
public void setWidth(String width) {
this.width = width;
super.setWidth(width);
- if (width.endsWith("px")) {
- try {
- // FIXME: More sane implementation
- borderPaddingHorizontal = Util.measureHorizontalPadding(
- contentNode, -2);
- if (borderPaddingHorizontal < 0) {
- borderPaddingHorizontal = -borderPaddingHorizontal;
- }
- } catch (Exception e) {
- ClientExceptionHandler.displayError(e);
- }
+ }
+
+ private int getContainerBorderWidth() {
+ if (borderPaddingHorizontal < 0) {
+ detectContainerBorders();
}
+ return borderPaddingHorizontal;
+ }
+ private void detectContainerBorders() {
+ DOM.setStyleAttribute(contentNode, "overflow", "hidden");
+ borderPaddingHorizontal = contentNode.getOffsetWidth()
+ - contentNode.getPropertyInt("clientWidth");
+ assert borderPaddingHorizontal >= 0;
+ borderPaddingVertical = contentNode.getOffsetHeight()
+ - contentNode.getPropertyInt("clientHeight");
+ assert borderPaddingVertical >= 0;
+
+ DOM.setStyleAttribute(contentNode, "overflow", "auto");
}
public boolean hasChildComponent(Widget component) {
// TODO
}
- public Size getAllocatedSpace(Widget child) {
- return renderInformation.getContentAreaSize();
+ private RenderSpace contentNodeSize;
+
+ public RenderSpace getAllocatedSpace(Widget child) {
+ if (contentNodeSize == null) {
+ contentNodeSize = new RenderSpace(-1, -1) {
+
+ @Override
+ public int getHeight() {
+ return contentNode.getOffsetHeight()
+ - getContainerBorderHeight();
+ }
+
+ @Override
+ public int getWidth() {
+ return contentNode.getOffsetWidth()
+ - getContainerBorderWidth();
+ }
+
+ @Override
+ public int getScrollbarSize() {
+ return Util.getNativeScrollbarSize();
+ }
+
+ };
+ }
+ return contentNodeSize;
}
public boolean requestLayout(Set<Paintable> child) {
-
if (height != null && width != null) {
/*
* If the height and width has been specified the child components
* cannot make the size of the layout change
*/
-
return true;
}
-
- if (renderInformation.updateSize(getElement())) {
- return false;
- } else {
- return true;
- }
-
+ return !renderInformation.updateSize(getElement());
}
public void updateCaption(Paintable component, UIDL uidl) {
- // TODO
+ // NOP: layouts caption, errors etc not rendered in Panel
}
}
import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.ICaptionWrapper;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public class IPopupView extends HTML implements Paintable {
}
public static native void nativeBlur(Element e) /*-{
- if(e.focus) {
- e.blur();
- }
- }-*/;
+ if(e.focus) {
+ e.blur();
+ }
+ }-*/;
private class CustomPopup extends IToolkitOverlay implements Container {
return false;
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
// TODO Auto-generated method stub
return null;
}
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public class ISplitPanel extends ComplexPanel implements Container,
ContainerResizedListener {
private String height = null;
- private RenderInformation renderInformationFirst = new RenderInformation();
- private RenderInformation renderInformationSecond = new RenderInformation();
+ private RenderSpace firstRenderSpace = new RenderSpace(0, 0, true);
+ private RenderSpace secondRenderSpace = new RenderSpace(0, 0, true);
+
+ RenderInformation renderInformation = new RenderInformation();
public ISplitPanel() {
this(ORIENTATION_HORIZONTAL);
DOM.setStyleAttribute(firstContainer, "overflow", "auto");
DOM.setStyleAttribute(secondContainer, "overflow", "auto");
- if (Util.isIE7()) {
+ if (BrowserInfo.get().isIE7()) {
/*
* Part I of IE7 weirdness hack, will be set to auto in layout phase
*
return;
}
- renderInformationFirst.updateSize(getElement());
+ renderInformation.updateSize(getElement());
setSplitPosition(uidl.getStringAttribute("position"));
return;
}
- renderInformationFirst.updateSize(getElement());
+ renderInformation.updateSize(getElement());
int wholeSize;
int pixelPosition;
DOM.setStyleAttribute(secondContainer, "left",
(pixelPosition + getSplitterSize()) + "px");
- int contentHeight = renderInformationFirst.getRenderedSize()
- .getHeight();
- renderInformationFirst.setContentAreaHeight(contentHeight);
- renderInformationFirst.setContentAreaWidth(pixelPosition);
- renderInformationSecond.setContentAreaHeight(contentHeight);
- renderInformationSecond.setContentAreaWidth(secondContainerWidth);
+ int contentHeight = renderInformation.getRenderedSize().getHeight();
+ firstRenderSpace.setHeight(contentHeight);
+ firstRenderSpace.setWidth(pixelPosition);
+ secondRenderSpace.setHeight(contentHeight);
+ secondRenderSpace.setWidth(secondContainerWidth);
break;
case ORIENTATION_VERTICAL:
DOM.setStyleAttribute(secondContainer, "top",
(pixelPosition + getSplitterSize()) + "px");
- int contentWidth = renderInformationFirst.getRenderedSize()
- .getWidth();
- renderInformationFirst.setContentAreaHeight(pixelPosition);
- renderInformationFirst.setContentAreaWidth(contentWidth);
- renderInformationSecond.setContentAreaHeight(secondContainerHeight);
- renderInformationSecond.setContentAreaWidth(contentWidth);
+ int contentWidth = renderInformation.getRenderedSize().getWidth();
+ firstRenderSpace.setHeight(pixelPosition);
+ firstRenderSpace.setWidth(contentWidth);
+ secondRenderSpace.setHeight(secondContainerHeight);
+ secondRenderSpace.setWidth(contentWidth);
break;
}
}
}
- renderInformationFirst.updateSize(getElement());
+ renderInformation.updateSize(getElement());
}
super.setWidth(width);
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
if (child == firstChild) {
- return renderInformationFirst.getContentAreaSize();
+ return firstRenderSpace;
} else if (child == secondChild) {
- return renderInformationSecond.getContentAreaSize();
+ return secondRenderSpace;
}
return null;
return true;
}
- if (renderInformationFirst.updateSize(getElement())) {
+ if (renderInformation.updateSize(getElement())) {
return false;
} else {
return true;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.Event;
+import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.ComplexPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
+import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
import com.itmill.toolkit.terminal.gwt.client.ContainerResizedListener;
import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
public class ITabsheet extends ITabsheetBase implements
ContainerResizedListener {
private final Element scrollerPrev; // tab-scroller prev button element
private int scrollerIndex = 0;
- private final TabBar tb;
- private final ITabsheetPanel tp;
+ private final TabBar tb = new TabBar();
+ private final ITabsheetPanel tp = new ITabsheetPanel();
private final Element contentNode, deco;
private final HashMap captions = new HashMap();
DOM.appendChild(getElement(), tabs);
// Tabs
- tb = new TabBar();
- tp = new ITabsheetPanel();
tp.setStyleName(CLASSNAME + "-tabsheetpanel");
contentNode = DOM.createDiv();
public void onBrowserEvent(Event event) {
// Tab scrolling
- if (isScrolledTabs()
- && DOM.compare(DOM.eventGetTarget(event), scrollerPrev)) {
+ if (isScrolledTabs() && DOM.eventGetTarget(event) == scrollerPrev) {
if (scrollerIndex > 0) {
scrollerIndex--;
DOM.setStyleAttribute(DOM.getChild(DOM.getFirstChild(DOM
"display", "");
updateTabScroller();
}
- } else if (isClippedTabs()
- && DOM.compare(DOM.eventGetTarget(event), scrollerNext)) {
+ } else if (isClippedTabs() && DOM.eventGetTarget(event) == scrollerNext) {
int tabs = tb.getTabCount();
if (scrollerIndex + 1 <= tabs) {
DOM.setStyleAttribute(DOM.getChild(DOM.getFirstChild(DOM
}
public void setHeight(String height) {
- if (this.height == null && height == null) {
- return;
- }
- String oldHeight = this.height;
+ super.setHeight(height);
this.height = height;
- if ((this.height != null && height == null)
- || (this.height == null && height != null)
- || !height.equals(oldHeight)) {
- iLayout();
- }
- }
-
- public void setWidth(String width) {
- String oldWidth = this.width;
- this.width = width;
- if ("100%".equals(width)) {
- // Allow browser to calculate width
- super.setWidth("");
- } else {
- super.setWidth(width);
- }
- if ((this.width != null && width == null)
- || (this.width == null && width != null)
- || !width.equals(oldWidth)) {
- // Run descendant layout functions
- client.runDescendentsLayout(this);
- }
- }
-
- public void iLayout() {
- renderInformation.updateSize(getElement());
-
- if (height != null && height != "") {
- super.setHeight(height);
-
+ if (height != null && !"".equals(height)) {
int contentHeight = getOffsetHeight()
- DOM.getElementPropertyInt(deco, "offsetHeight")
- - tb.getOffsetHeight();
+ - tb.getOffsetHeight() - 5;
if (contentHeight < 0) {
contentHeight = 0;
}
// Set proper values for content element
DOM.setStyleAttribute(contentNode, "height", contentHeight + "px");
+ renderSpace.setHeight(contentHeight);
DOM.setStyleAttribute(contentNode, "overflow", "auto");
- tp.setHeight("100%");
-
} else {
DOM.setStyleAttribute(contentNode, "height", "");
DOM.setStyleAttribute(contentNode, "overflow", "");
+ renderSpace.setHeight(0);
+ }
+ iLayout();
+ }
+
+ public void setWidth(String width) {
+ super.setWidth(width);
+ this.width = width;
+ if ("".equals(width)) {
+ renderSpace.setWidth(0);
+ contentNode.getStyle().setProperty("width", "");
+ } else {
+ int contentWidth = getOffsetWidth() - getContentAreaBorderWidth();
+ contentNode.getStyle().setProperty("width", contentWidth + "px");
+ renderSpace.setWidth(contentWidth);
}
+ iLayout();
+ }
+
+ public void iLayout() {
+ renderInformation.updateSize(getElement());
if (client != null) {
client.runDescendentsLayout(this);
}
- renderInformation.setContentAreaWidth(tp.getElement().getOffsetWidth());
- renderInformation.setContentAreaHeight(tp.getElement()
- .getOffsetHeight());
-
updateTabScroller();
+ if (BrowserInfo.get().getWebkitVersion() > 0) {
+ DeferredCommand.addCommand(new Command() {
+ public void execute() {
+ // Dough, safari scoll auto means actually just a moped
+ contentNode.getStyle().setProperty("overflow", "hidden");
+ (new Timer() {
+ @Override
+ public void run() {
+ contentNode.getStyle().setProperty("overflow",
+ "auto");
+ }
+ }).schedule(100);
+ }
+ });
+ }
+
}
/**
}
- public Size getAllocatedSpace(Widget child) {
- // All tabs have equal amount of space allocated
+ private int borderW = -1;
+
+ private void detectBorder() {
+ String property = contentNode.getStyle().getProperty("overflow");
+ contentNode.getStyle().setProperty("overflow", "hidden");
+ borderW = contentNode.getOffsetWidth()
+ - contentNode.getPropertyInt("clientWidth");
+ contentNode.getStyle().setProperty("overflow", property);
+ }
- return renderInformation.getContentAreaSize();
+ private int getContentAreaBorderWidth() {
+ if (borderW < 0) {
+ detectBorder();
+ }
+ return borderW;
+ }
+
+ private RenderSpace renderSpace = new RenderSpace(0, 0, true);
+
+ public RenderSpace getAllocatedSpace(Widget child) {
+ // All tabs have equal amount of space allocated
+ return renderSpace;
}
}
public class ITabsheetPanel extends ComplexPanel {\r
\r
private Widget visibleWidget;\r
- private boolean fullheight = false;\r
+ private int contentHeight;\r
\r
/**\r
* Creates an empty tabsheet panel.\r
\r
private Element createContainerElement() {\r
Element el = DOM.createDiv();\r
- if (fullheight) {\r
- DOM.setStyleAttribute(el, "height", "100%");\r
- }\r
hide(el);\r
return el;\r
}\r
}\r
}\r
\r
- /*\r
- * Gets only called with 100% or ""\r
- */\r
- public void setHeight(String height) {\r
- super.setHeight(height);\r
- if ("100%".equals(height)) {\r
- if (!fullheight) {\r
- int childCount = DOM.getChildCount(getElement());\r
- for (int i = 0; i < childCount; i++) {\r
- DOM.setStyleAttribute(DOM.getChild(getElement(), i),\r
- "height", "100%");\r
- }\r
- fullheight = true;\r
- }\r
- } else if (fullheight) {\r
- int childCount = DOM.getChildCount(getElement());\r
- for (int i = 0; i < childCount; i++) {\r
- DOM.setStyleAttribute(DOM.getChild(getElement(), i), "height",\r
- "");\r
- }\r
- fullheight = false;\r
- }\r
- }\r
-\r
private void hide(Element e) {\r
- DOM.setStyleAttribute(e, "width", getOffsetWidth() + "px");\r
- DOM.setStyleAttribute(e, "height", getOffsetHeight() + "px");\r
+ DOM.setStyleAttribute(e, "width", "0px");\r
+ DOM.setStyleAttribute(e, "height", "0px");\r
DOM.setStyleAttribute(e, "overflow", "hidden");\r
DOM.setStyleAttribute(e, "visibility", "hidden");\r
DOM.setStyleAttribute(e, "position", "absolute");\r
}\r
\r
private void unHide(Element e) {\r
+ DOM.setStyleAttribute(e, "marginLeft", "0px");\r
+ DOM.setStyleAttribute(e, "marginTop", "0px");\r
DOM.setStyleAttribute(e, "position", "");\r
DOM.setStyleAttribute(e, "top", "");\r
DOM.setStyleAttribute(e, "left", "");\r
DOM.setStyleAttribute(e, "visibility", "");\r
DOM.setStyleAttribute(e, "width", "");\r
- if (fullheight) {\r
- DOM.setStyleAttribute(e, "height", "100%");\r
- } else {\r
- DOM.setStyleAttribute(e, "height", "");\r
- }\r
+ DOM.setStyleAttribute(e, "height", "");\r
DOM.setStyleAttribute(e, "overflow", "");\r
\r
}\r
+\r
}\r
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.Focusable;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
/**
*
*/
private Timer resizeTimer;
- private RenderInformation renderInformation = new RenderInformation();
-
public IView(String elementId) {
super();
setStyleName(CLASSNAME);
layout = lo;
}
- updateContentAreaSize();
-
layout.updateFromUIDL(childUidl, client);
// Update subwindows
}
- private void updateContentAreaSize() {
- renderInformation.setContentAreaWidth(getElement().getOffsetWidth());
-
- // For some reason IView has a 1 pixel padding
- renderInformation
- .setContentAreaHeight(getElement().getOffsetHeight() - 1);
- }
-
@Override
public void onBrowserEvent(Event event) {
super.onBrowserEvent(event);
"window h" + IView.this.height);
}
if (changed) {
- updateContentAreaSize();
-
ApplicationConnection
.getConsole()
.log(
ApplicationConnection.getConsole().log(
"Running layout functions due window resize");
- updateContentAreaSize();
connection.runDescendentsLayout(this);
DOM.setStyleAttribute(getElement(), "overflow", overflow);
connection.sendPendingVariableChangesSync();
}
- private static native void focusElement(Element e)
- /*-{
- e.focus();
- }-*/;
-
public String onWindowClosing() {
return null;
}
- public Size getAllocatedSpace(Widget child) {
- return renderInformation.getContentAreaSize();
+ private final RenderSpace myRenderSpace = new RenderSpace() {
+ private int excessHeight = -1;
+ private int excessWidth = -1;
+
+ @Override
+ public int getHeight() {
+ return getElement().getOffsetHeight() - getExcessHeight();
+ }
+
+ private int getExcessHeight() {
+ if (excessHeight < 0) {
+ detetExessSize();
+ }
+ return excessHeight;
+ }
+
+ private void detetExessSize() {
+ getElement().getStyle().setProperty("overflow", "hidden");
+ excessHeight = getElement().getOffsetHeight()
+ - getElement().getPropertyInt("clientHeight");
+ excessWidth = getElement().getOffsetWidth()
+ - getElement().getPropertyInt("clientWidth");
+ }
+
+ @Override
+ public int getWidth() {
+ return getElement().getOffsetWidth() - getExcessWidth();
+ }
+
+ private int getExcessWidth() {
+ if (excessWidth < 0) {
+ detetExessSize();
+ }
+ return excessWidth;
+ }
+
+ @Override
+ public int getScrollbarSize() {
+ return Util.getNativeScrollbarSize();
+ }
+ };
+
+ public RenderSpace getAllocatedSpace(Widget child) {
+ return myRenderSpace;
}
public boolean hasChildComponent(Widget component) {
package com.itmill.toolkit.terminal.gwt.client.ui;
import java.util.Iterator;
+import java.util.Set;
import java.util.Vector;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.ui.Widget;
import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
import com.itmill.toolkit.terminal.gwt.client.BrowserInfo;
+import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
import com.itmill.toolkit.terminal.gwt.client.Util;
*
* @author IT Mill Ltd
*/
-public class IWindow extends IToolkitOverlay implements Paintable,
+public class IWindow extends IToolkitOverlay implements Container,
ScrollListener {
private static final int MIN_HEIGHT = 60;
}
} else if (!showingUrl) {
contentPanel.setWidget((Widget) lo);
+ layout = lo;
}
lo.updateFromUIDL(childUidl, client);
borderWidthHorizontal = windowWidth - contentWidth;
}
+ public RenderSpace getAllocatedSpace(Widget child) {
+ if (child == layout) {
+ return new RenderSpace() {
+ @Override
+ public int getHeight() {
+ return contentPanel.getOffsetHeight();
+ }
+
+ @Override
+ public int getWidth() {
+ return contentPanel.getOffsetWidth();
+ }
+
+ @Override
+ public int getScrollbarSize() {
+ return Util.getNativeScrollbarSize();
+ }
+ };
+ } else {
+ // Exception ??
+ return null;
+ }
+ }
+
+ public boolean hasChildComponent(Widget component) {
+ if (component == layout) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public void replaceChildComponent(Widget oldComponent, Widget newComponent) {
+ contentPanel.setWidget(newComponent);
+ }
+
+ public boolean requestLayout(Set<Paintable> child) {
+ return true;
+ }
+
+ public void updateCaption(Paintable component, UIDL uidl) {
+ // NOP, window has own caption, layout captio not rendered
+ }
+
}
cell.render();
cell.vAling();
}
- client.runDescendentsLayout(ap);
+ if (client != null) {
+ client.runDescendentsLayout(ap);
+ }
}
}
import com.itmill.toolkit.terminal.gwt.client.Container;
import com.itmill.toolkit.terminal.gwt.client.ICaption;
import com.itmill.toolkit.terminal.gwt.client.Paintable;
+import com.itmill.toolkit.terminal.gwt.client.RenderSpace;
import com.itmill.toolkit.terminal.gwt.client.UIDL;
-import com.itmill.toolkit.terminal.gwt.client.RenderInformation.Size;
import com.itmill.toolkit.terminal.gwt.client.ui.MarginInfo;
/**
return false;
}
- public Size getAllocatedSpace(Widget child) {
+ public RenderSpace getAllocatedSpace(Widget child) {
// TODO Auto-generated method stub
return null;
}