package org.vaadin.touchkit.gwt.client.ui; import com.google.gwt.dom.client.DivElement; import com.google.gwt.dom.client.Document; import com.google.gwt.dom.client.SpanElement; import com.google.gwt.dom.client.Style.Display; import com.google.gwt.dom.client.Style.Position; import com.google.gwt.user.client.ui.ComplexPanel; import com.google.gwt.user.client.ui.Widget; public class VNavigationBar extends ComplexPanel { private static final String CLASSNAME = "v-touchkit-navbar"; private DivElement caption = Document.get().createDivElement(); private DivElement rightComponentElement = Document.get() .createDivElement(); private DivElement leftComponentElement = Document.get().createDivElement(); private Widget leftComponent; private Widget rightComponent; private SpanElement captionText; public VNavigationBar() { setElement(Document.get().createDivElement()); setStyleName(CLASSNAME); getElement().appendChild(caption); caption.setClassName(CLASSNAME + "-caption"); captionText = Document.get().createSpanElement(); caption.appendChild(captionText); rightComponentElement.setClassName(CLASSNAME + "-right"); getElement().appendChild(rightComponentElement); leftComponentElement.setClassName(CLASSNAME + "-left"); getElement().appendChild(leftComponentElement); } public void setCaption(String stringAttribute) { captionText.setInnerText(stringAttribute); } /** * Does some magic to avoid situation where caption is overlapped by * components in case the caption is centered to the component. This happens * with long caption and big right/left component. */ public void avoidCaptionOverlap() { final int captionWidth = captionText.getOffsetWidth(); // cache the caption size int freeLeftCoordinate = leftComponent != null ? leftComponentElement .getAbsoluteRight() - getAbsoluteLeft() : 0; int freeRightCoordinate = rightComponent != null ? rightComponentElement .getAbsoluteLeft() - getAbsoluteLeft() : getOffsetWidth(); int maxCenteredSizeByRightComponent = getOffsetWidth() - 2 * (getOffsetWidth() - freeRightCoordinate); int maxCenteredSizeByLeftComponent = getOffsetWidth() - 2 * freeLeftCoordinate; boolean canBeCentered = captionWidth < maxCenteredSizeByRightComponent && captionWidth < maxCenteredSizeByLeftComponent; if (canBeCentered) { if (hasAbsolutelyPositionedCaption()) { makeCenteredCaption(); } return; } makeCaptionAbsolutelyPositioned(); boolean fitsWithoutClipping = freeRightCoordinate - freeLeftCoordinate > captionWidth; boolean fixLeft = false; boolean fixRight = false; if (fitsWithoutClipping) { if (freeLeftCoordinate < getOffsetWidth() - freeRightCoordinate) { fixRight = true; } else { fixLeft = true; } } else { fixLeft = true; fixRight = true; } caption.getStyle().setProperty("left", fixLeft ? freeLeftCoordinate + "px" : ""); caption.getStyle() .setProperty( "right", fixRight ? (getOffsetWidth() - freeRightCoordinate) + "px" : ""); } private void makeCenteredCaption() { caption.getStyle().setPosition(Position.STATIC); } private boolean hasAbsolutelyPositionedCaption() { return caption.getStyle().getPosition().equals("absolute"); } @Override public void setWidth(String width) { super.setWidth(width); } private void makeCaptionAbsolutelyPositioned() { caption.getStyle().setPosition(Position.ABSOLUTE); } private void clearBackComponent() { // ((Widget) leftComponent).removeFromParent(); // FIXME // client.unregisterPaintable(leftComponent); // leftComponent = null; } private void clearComponent() { // ((Widget) rightComponent).removeFromParent(); // FIXME // client.unregisterPaintable(rightComponent); // rightComponent = null; } public void replaceChildComponent(Widget oldComponent, Widget newComponent) { throw new UnsupportedOperationException(); } public boolean hasChildComponent(Widget component) { if (component == leftComponent || component == rightComponent) { return true; } return false; } // public boolean requestLayout(Set<Paintable> children) { // return true; // always 100% width + fixed height // } // // public RenderSpace getAllocatedSpace(Widget child) { // return new RenderSpace(getOffsetWidth(), getOffsetHeight()); // } public void setLeftWidget(Widget left) { if (left != null) { if (leftComponent != left && leftComponent != null) { clearBackComponent(); } leftComponent = left; if (!leftComponent.isAttached()) { add(leftComponent, (com.google.gwt.user.client.Element) leftComponentElement .cast()); } } else if (leftComponent != null) { clearBackComponent(); } } public void setRightWidget(Widget right) { rightComponentElement.getStyle().setDisplay( right != null ? Display.BLOCK : Display.NONE); if (right != null) { if (rightComponent != right && rightComponent != null) { clearComponent(); } rightComponent = right; if (!rightComponent.isAttached()) { add(rightComponent, (com.google.gwt.user.client.Element) rightComponentElement .cast()); } } else if (rightComponent != null) { clearComponent(); } } }