public void onSelectTab(StackItem item) {
final int index = stack.indexOf(item);
if (index != activeTabIndex && !disabled && !readonly) {
- if (getSelectedStack() == null)
- return;
- getSelectedStack().close();
+ if (getSelectedStack() != null) {
+ getSelectedStack().close();
+ }
addStyleDependentName("loading");
// run updating variables in deferred command to bypass some FF
// optimization issues
return;
if (height != null && height != "") {
- // Detach visible widget from document flow for a while to calculate used height correctly
+ // Detach visible widget from document flow for a while to calculate
+ // used height correctly
Widget w = item.getContent().getContainedWidget();
String originalPositioning = "";
- if(w != null) {
- originalPositioning = DOM.getStyleAttribute(w.getElement(), "position");
+ if (w != null) {
+ originalPositioning = DOM.getStyleAttribute(w.getElement(),
+ "position");
DOM.setStyleAttribute(w.getElement(), "visibility", "hidden");
DOM.setStyleAttribute(w.getElement(), "position", "absolute");
}
item.getContent().setHeight("");
-
// Calculate target height
super.setHeight(height);
- int targetHeight = getOffsetHeight();
+ int targetHeight = DOM.getElementPropertyInt(DOM
+ .getParent(getElement()), "offsetHeight");
super.setHeight("");
// Calculate used height
if (h < 0)
h = 0;
item.getContent().setHeight(h + "px");
-
+
// Put widget back into normal flow
- if(w != null) {
- DOM.setStyleAttribute(w.getElement(), "position", originalPositioning);
+ if (w != null) {
+ DOM.setStyleAttribute(w.getElement(), "position",
+ originalPositioning);
DOM.setStyleAttribute(w.getElement(), "visibility", "");
}
} else {
protected class StackContent extends UIObject {
private Widget widget;
-
+
protected StackContent() {
setElement(DOM.createDiv());
setVisible(false);
(content).updateFromUIDL(contentUidl, client);
widget = (Widget) content;
}
-
+
public Widget getContainedWidget() {
return widget;
}
final Caption c = (Caption) w;
// captions go into same container element as their
// owners
- final Element container = DOM.getParent(((UIObject) c.getOwner())
- .getElement());
+ final Element container = getWidgetWrapperFor((Widget) c.getOwner())
+ .getContainerElement();
final Element captionContainer = DOM.createDiv();
DOM.insertChild(container, captionContainer, 0);
insert(w, captionContainer, beforeIndex, false);
} else {
- final Element wrapper = createWidgetWrappper();
- DOM.insertChild(childContainer, wrapper, beforeIndex);
- insert(w, wrapper, beforeIndex, false);
- }
- }
-
- /**
- * creates an Element which will contain child widget
- */
- protected Element createWidgetWrappper() {
- switch (orientationMode) {
- case ORIENTATION_HORIZONTAL:
- final Element td = DOM.createTD();
- return td;
- default:
- final Element div = DOM.createDiv();
- return div;
+ WidgetWrapper wr = new WidgetWrapper();
+ DOM.insertChild(childContainer, wr.getElement(), beforeIndex);
+ insert(w, wr.getContainerElement(), beforeIndex, false);
}
}
}
public void add(Widget w) {
- final Element wrapper = createWidgetWrappper();
- DOM.appendChild(childContainer, wrapper);
- super.add(w, wrapper);
+ WidgetWrapper wr = new WidgetWrapper();
+ DOM.appendChild(childContainer, wr.getElement());
+ super.add(w, wr.getContainerElement());
}
public boolean remove(int index) {
}
public boolean remove(Widget w) {
- final Element wrapper = DOM.getParent(w.getElement());
+ final Element wrapper = getWidgetWrapperFor(w).getElement();
final boolean removed = super.remove(w);
if (removed) {
if (!(w instanceof Caption)) {
final AlignmentInfo ai = new AlignmentInfo(
alignments[alignmentIndex++]);
- final Element wrapper = DOM.getParent(((Widget) it.next())
- .getElement());
- if (Util.isIE()) {
- DOM.setElementAttribute(wrapper, "vAlign", ai
- .getVerticalAlignment());
+ final WidgetWrapper wr = getWidgetWrapperFor((Widget) it.next());
+ wr.setAlignment(ai.getVerticalAlignment(), ai
+ .getHorizontalAlignment());
+
+ // Handle spacing in this loop as well
+ if (first) {
+ wr.setSpacingEnabled(false);
+ first = false;
} else {
- DOM.setStyleAttribute(wrapper, "verticalAlign", ai
- .getVerticalAlignment());
+ wr.setSpacingEnabled(hasComponentSpacing);
}
- // TODO use one-cell table to implement horizontal alignments
- if (Util.isIE()) {
- DOM.setElementAttribute(wrapper, "align", ai
- .getHorizontalAlignment());
+ }
+ }
+
+ /**
+ * WidgetWrapper classe. Helper classe for spacing and alignment handling.
+ *
+ */
+ class WidgetWrapper extends UIObject {
+
+ Element td;
+
+ public WidgetWrapper() {
+ if (orientationMode == ORIENTATION_VERTICAL) {
+ setElement(DOM.createDiv());
+ // Apply 'hasLayout' for IE (needed to get accurate dimension
+ // calculations)
+ if (Util.isIE()) {
+ DOM.setStyleAttribute(getElement(), "zoom", "1");
+ }
} else {
- DOM.setStyleAttribute(wrapper, "textAlign", ai
- .getHorizontalAlignment());
+ setElement(DOM.createTD());
}
+ }
- if (first) {
- setSpacingEnabled(wrapper, false);
- first = false;
+ public WidgetWrapper(Element element) {
+ if (DOM.getElementProperty(element, "className").equals("i_align")) {
+ td = element;
+ setElement(DOM.getParent(DOM.getParent(DOM.getParent(DOM
+ .getParent(td)))));
} else {
- setSpacingEnabled(wrapper, hasComponentSpacing);
+ setElement(element);
}
}
+
+ Element getContainerElement() {
+ if (td != null) {
+ return td;
+ } else {
+ return getElement();
+ }
+ }
+
+ void setAlignment(String verticalAlignment, String horizontalAlignment) {
+
+ // Set vertical alignment
+ if (Util.isIE()) {
+ DOM.setElementAttribute(getElement(), "vAlign",
+ verticalAlignment);
+ } else {
+ DOM.setStyleAttribute(getElement(), "verticalAlign",
+ verticalAlignment);
+ }
+
+ // Set horizontal alignment
+ if (Util.isIE()) {
+ DOM.setElementAttribute(getElement(), "align",
+ horizontalAlignment);
+ } else if (!horizontalAlignment.equals("left")) {
+ // use one-cell table to implement horizontal alignments, only
+ // for values other than "left" (which is default)
+ // build one cell table
+ if (td == null) {
+ final Element table = DOM.createTable();
+ final Element tBody = DOM.createTBody();
+ final Element tr = DOM.createTR();
+ td = DOM.createTD();
+ DOM.appendChild(table, tBody);
+ DOM.appendChild(tBody, tr);
+ DOM.appendChild(tr, td);
+ DOM.setElementAttribute(table, "cellpadding", "0");
+ DOM.setElementAttribute(table, "cellspacing", "0");
+ DOM.setStyleAttribute(table, "width", "100%");
+ // use className for identification
+ DOM.setElementProperty(td, "className", "i_align");
+ // move possible content to cell
+ while (DOM.getChildCount(getElement()) > 0) {
+ final Element content = DOM.getFirstChild(getElement());
+ if (content != null) {
+ DOM.removeChild(getElement(), content);
+ DOM.appendChild(td, content);
+ }
+ }
+ DOM.appendChild(getElement(), table);
+ }
+ // set alignment
+ DOM.setElementAttribute(td, "align", horizontalAlignment);
+ }
+ }
+
+ void setSpacingEnabled(boolean b) {
+ setStyleName(
+ getElement(),
+ CLASSNAME
+ + "-"
+ + (orientationMode == ORIENTATION_HORIZONTAL ? StyleConstants.HORIZONTAL_SPACING
+ : StyleConstants.VERTICAL_SPACING), b);
+ }
+
}
- private void setSpacingEnabled(Element e, boolean b) {
- setStyleName(
- e,
- CLASSNAME
- + "-"
- + (orientationMode == ORIENTATION_HORIZONTAL ? StyleConstants.HORIZONTAL_SPACING
- : StyleConstants.VERTICAL_SPACING), b);
+ /**
+ * Returns given widgets WidgetWrapper
+ *
+ * @param child
+ * @return
+ */
+ public WidgetWrapper getWidgetWrapperFor(Widget child) {
+ final Element containerElement = DOM.getParent(child.getElement());
+ return new WidgetWrapper(containerElement);
}
}