]> source.dussan.org Git - vaadin-framework.git/commitdiff
Merge commit 'c3bba'
authorJohannes Dahlström <johannesd@vaadin.com>
Mon, 11 Jun 2012 10:10:07 +0000 (13:10 +0300)
committerJohannes Dahlström <johannesd@vaadin.com>
Mon, 11 Jun 2012 10:10:07 +0000 (13:10 +0300)
Conflicts:
src/com/vaadin/terminal/gwt/client/ui/tabsheet/VTabsheetPanel.java

1  2 
src/com/vaadin/terminal/gwt/client/ui/tabsheet/VTabsheetPanel.java

index f2b37c3a1ce74d0ab6925b855037e1f78ecdc73d,0000000000000000000000000000000000000000..a462753474ba5c406860d6b7d162bbd7d777dd3e
mode 100644,000000..100644
--- /dev/null
@@@ -1,213 -1,0 +1,190 @@@
- import com.google.gwt.dom.client.Node;
- import com.google.gwt.dom.client.NodeList;
- import com.google.gwt.event.dom.client.TouchStartEvent;
- import com.google.gwt.event.dom.client.TouchStartHandler;
 +/* 
 +@VaadinApache2LicenseForJavaFiles@
 + */
 +
 +package com.vaadin.terminal.gwt.client.ui.tabsheet;
 +
-     private TouchScrollDelegate touchScrollDelegate;
 +import com.google.gwt.user.client.DOM;
 +import com.google.gwt.user.client.Element;
 +import com.google.gwt.user.client.Event;
 +import com.google.gwt.user.client.ui.ComplexPanel;
 +import com.google.gwt.user.client.ui.Widget;
 +import com.vaadin.terminal.gwt.client.ui.TouchScrollDelegate;
++import com.vaadin.terminal.gwt.client.ui.TouchScrollDelegate.TouchScrollHandler;
 +
 +/**
 + * A panel that displays all of its child widgets in a 'deck', where only one
 + * can be visible at a time. It is used by
 + * {@link com.vaadin.terminal.gwt.client.ui.tabsheet.VTabsheet}.
 + * 
 + * This class has the same basic functionality as the GWT DeckPanel
 + * {@link com.google.gwt.user.client.ui.DeckPanel}, with the exception that it
 + * doesn't manipulate the child widgets' width and height attributes.
 + */
 +public class VTabsheetPanel extends ComplexPanel {
 +
 +    private Widget visibleWidget;
-         addDomHandler(new TouchStartHandler() {
-             public void onTouchStart(TouchStartEvent event) {
-                 /*
-                  * All container elements needs to be scrollable by one finger.
-                  * Update the scrollable element list of touch delegate on each
-                  * touch start.
-                  */
-                 NodeList<Node> childNodes = getElement().getChildNodes();
-                 Element[] elements = new Element[childNodes.getLength()];
-                 for (int i = 0; i < elements.length; i++) {
-                     elements[i] = (Element) childNodes.getItem(i);
-                 }
-                 getTouchScrollDelegate().setElements(elements);
-                 getTouchScrollDelegate().onTouchStart(event);
-             }
-         }, TouchStartEvent.getType());
-     }
-     protected TouchScrollDelegate getTouchScrollDelegate() {
-         if (touchScrollDelegate == null) {
-             touchScrollDelegate = new TouchScrollDelegate();
-         }
-         return touchScrollDelegate;
++
++    private TouchScrollHandler touchScrollHandler;
 +
 +    /**
 +     * Creates an empty tabsheet panel.
 +     */
 +    public VTabsheetPanel() {
 +        setElement(DOM.createDiv());
 +        sinkEvents(Event.TOUCHEVENTS);
-         DOM.setStyleAttribute(el, "overflow", "auto");
 +
++        touchScrollHandler = TouchScrollDelegate.enableTouchScrolling(this);
 +    }
 +
 +    /**
 +     * Adds the specified widget to the deck.
 +     * 
 +     * @param w
 +     *            the widget to be added
 +     */
 +    @Override
 +    public void add(Widget w) {
 +        Element el = createContainerElement();
 +        DOM.appendChild(getElement(), el);
 +        super.add(w, el);
 +    }
 +
 +    private Element createContainerElement() {
 +        Element el = DOM.createDiv();
 +        DOM.setStyleAttribute(el, "position", "absolute");
 +        hide(el);
 +        return el;
 +    }
 +
 +    /**
 +     * Gets the index of the currently-visible widget.
 +     * 
 +     * @return the visible widget's index
 +     */
 +    public int getVisibleWidget() {
 +        return getWidgetIndex(visibleWidget);
 +    }
 +
 +    /**
 +     * Inserts a widget before the specified index.
 +     * 
 +     * @param w
 +     *            the widget to be inserted
 +     * @param beforeIndex
 +     *            the index before which it will be inserted
 +     * @throws IndexOutOfBoundsException
 +     *             if <code>beforeIndex</code> is out of range
 +     */
 +    public void insert(Widget w, int beforeIndex) {
 +        Element el = createContainerElement();
 +        DOM.insertChild(getElement(), el, beforeIndex);
 +        super.insert(w, el, beforeIndex, false);
 +    }
 +
 +    @Override
 +    public boolean remove(Widget w) {
 +        Element child = w.getElement();
 +        Element parent = null;
 +        if (child != null) {
 +            parent = DOM.getParent(child);
 +        }
 +        final boolean removed = super.remove(w);
 +        if (removed) {
 +            if (visibleWidget == w) {
 +                visibleWidget = null;
 +            }
 +            if (parent != null) {
 +                DOM.removeChild(getElement(), parent);
 +            }
 +        }
 +        return removed;
 +    }
 +
 +    /**
 +     * Shows the widget at the specified index. This causes the currently-
 +     * visible widget to be hidden.
 +     * 
 +     * @param index
 +     *            the index of the widget to be shown
 +     */
 +    public void showWidget(int index) {
 +        checkIndexBoundsForAccess(index);
 +        Widget newVisible = getWidget(index);
 +        if (visibleWidget != newVisible) {
 +            if (visibleWidget != null) {
 +                hide(DOM.getParent(visibleWidget.getElement()));
 +            }
 +            visibleWidget = newVisible;
++            touchScrollHandler.setElements(visibleWidget.getElement()
++                    .getParentElement());
 +        }
 +        // Always ensure the selected tab is visible. If server prevents a tab
 +        // change we might end up here with visibleWidget == newVisible but its
 +        // parent is still hidden.
 +        unHide(DOM.getParent(visibleWidget.getElement()));
 +    }
 +
 +    private void hide(Element e) {
 +        DOM.setStyleAttribute(e, "visibility", "hidden");
 +        DOM.setStyleAttribute(e, "top", "-100000px");
 +        DOM.setStyleAttribute(e, "left", "-100000px");
 +    }
 +
 +    private void unHide(Element e) {
 +        DOM.setStyleAttribute(e, "top", "0px");
 +        DOM.setStyleAttribute(e, "left", "0px");
 +        DOM.setStyleAttribute(e, "visibility", "");
 +    }
 +
 +    public void fixVisibleTabSize(int width, int height, int minWidth) {
 +        if (visibleWidget == null) {
 +            return;
 +        }
 +
 +        boolean dynamicHeight = false;
 +
 +        if (height < 0) {
 +            height = visibleWidget.getOffsetHeight();
 +            dynamicHeight = true;
 +        }
 +        if (width < 0) {
 +            width = visibleWidget.getOffsetWidth();
 +        }
 +        if (width < minWidth) {
 +            width = minWidth;
 +        }
 +
 +        Element wrapperDiv = (Element) visibleWidget.getElement()
 +                .getParentElement();
 +
 +        // width first
 +        getElement().getStyle().setPropertyPx("width", width);
 +        wrapperDiv.getStyle().setPropertyPx("width", width);
 +
 +        if (dynamicHeight) {
 +            // height of widget might have changed due wrapping
 +            height = visibleWidget.getOffsetHeight();
 +        }
 +        // v-tabsheet-tabsheetpanel height
 +        getElement().getStyle().setPropertyPx("height", height);
 +
 +        // widget wrapper height
 +        if (dynamicHeight) {
 +            wrapperDiv.getStyle().clearHeight();
 +        } else {
 +            // widget wrapper height
 +            wrapperDiv.getStyle().setPropertyPx("height", height);
 +        }
 +    }
 +
 +    public void replaceComponent(Widget oldComponent, Widget newComponent) {
 +        boolean isVisible = (visibleWidget == oldComponent);
 +        int widgetIndex = getWidgetIndex(oldComponent);
 +        remove(oldComponent);
 +        insert(newComponent, widgetIndex);
 +        if (isVisible) {
 +            showWidget(widgetIndex);
 +        }
 +    }
 +}