Package org.gwtoolbox.widget.client.panel.split.horizontal.dble

Source Code of org.gwtoolbox.widget.client.panel.split.horizontal.dble.DoubleSplitPanel

package org.gwtoolbox.widget.client.panel.split.horizontal.dble;

import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.event.dom.client.*;
import org.gwtoolbox.widget.client.panel.LayoutPanel;
import org.gwtoolbox.widget.client.panel.split.WidgetIterators;
import org.gwtoolbox.commons.ui.client.event.CompoundHandlerRegistration;

import java.util.Iterator;

/**
* @author Uri Boness
* @deprecated use {@link org.gwtoolbox.widget.client.panel.layout.SplitLayout} instead.
*/
@Deprecated
public abstract class DoubleSplitPanel extends LayoutPanel {

    // The enclosed widgets.
    private final Widget[] widgets = new Widget[3];

    // The elements containing the widgets.
    private final Element[] elements = new Element[3];

    // The elements that acts as the splitter.
    private final Element leftSplitElement;
    private final Element rightSplitElement;

    // Indicates whether drag resizing is active.
    private boolean isResizingLeft = false;
    private boolean isResizingRight = false;

    private CompoundHandlerRegistration internalHandlerRegistration;

    /**
     * Initializes the split panel.
     *
     * @param mainElem the root element for the split panel
     * @param leftSplitElement the element that acts as the left splitter
     * @param rightSplitElement the element that acts as the right splitter
     * @param headElement the element to contain the top or left most widget
     * @param centerElement the element to contain the center widget
     * @param tailElement the element to contain the bottom or right most widget
     */
    DoubleSplitPanel(Element mainElem, Element leftSplitElement, Element rightSplitElement, Element headElement, Element centerElement, Element tailElement) {
        setElement(mainElem);
        this.leftSplitElement = leftSplitElement;
        this.rightSplitElement = rightSplitElement;
        elements[0] = headElement;
        elements[1] = centerElement;
        elements[2] = tailElement;
    }

    @Override
    public void add(Widget w) {
        if (getWidget(0) == null) {
            setWidget(0, w);
        } else if (getWidget(1) == null) {
            setWidget(1, w);
        } else if (getWidget(2) == null) {
            setWidget(2, w);
        } else {
            throw new IllegalStateException("A Splitter can only contain two Widgets.");
        }
    }

    /**
     * Indicates whether the split panel is being resized.
     *
     * @return <code>true</code> if the user is dragging the splitter,
     *         <code>false</code> otherwise
     */
    public boolean isResizingLeft() {
        return isResizingLeft;
    }

    public boolean isResizingRight() {
        return isResizingRight;
    }

    public Iterator<Widget> iterator() {
        return WidgetIterators.createWidgetIterator(this, widgets);
    }

    @Override
    public boolean remove(Widget widget) {
        if (widgets[0] == widget) {
            setWidget(0, null);
            return true;
        } else if (widgets[1] == widget) {
            setWidget(1, null);
            return true;
        } else if (widgets[2] == widget) {
            setWidget(2, null);
            return true;
        }
        return false;
    }

    /**
     * Moves the position of the splitter.
     *
     * @param size the new size of the left region in CSS units (e.g. "10px",
     * "1em")
     */
    public abstract void setLeftSplitPosition(String size);

    public abstract void setRightSplitPosition(String size);


    //================================================ Helper Methods ==================================================

    @Override
    protected void onLoad() {
        super.onLoad();

        internalHandlerRegistration = new CompoundHandlerRegistration();

        internalHandlerRegistration.addRegistration(addDomHandler(new MouseDownHandler() {
            public void onMouseDown(MouseDownEvent event) {
                Element target = event.getNativeEvent().getEventTarget().cast();
                if (DOM.isOrHasChild(leftSplitElement, target)) {
                    startResizingLeftFrom(event.getClientX() - getAbsoluteLeft(), event.getClientY() - getAbsoluteTop());
                    DOM.setCapture(getElement());
                    event.preventDefault();
                }
                if (DOM.isOrHasChild(rightSplitElement, target)) {
                    startResizingRightFrom(event.getClientX() - getAbsoluteLeft(), event.getClientY() - getAbsoluteTop());
                    DOM.setCapture(getElement());
                    event.preventDefault();
                }
            }
        }, MouseDownEvent.getType()));

        internalHandlerRegistration.addRegistration(addDomHandler(new MouseUpHandler() {
            public void onMouseUp(MouseUpEvent event) {
                DOM.releaseCapture(getElement());
                if (isResizingLeft()) {
                    stopResizingLeft(event.getClientX() - getAbsoluteLeft(), event.getClientY() - getAbsoluteTop());
                }
                if (isResizingRight()) {
                    stopResizingRight(event.getClientX() - getAbsoluteLeft(), event.getClientY() - getAbsoluteTop());
                }
            }
        }, MouseUpEvent.getType()));

        internalHandlerRegistration.addRegistration(addDomHandler(new MouseMoveHandler() {
            public void onMouseMove(MouseMoveEvent event) {
                if (isResizingLeft()) {
                    assert DOM.getCaptureElement() != null;
                    onLeftSplitterResize(event.getClientX() - getAbsoluteLeft(), event.getClientY() - getAbsoluteTop());
                    event.preventDefault();
                } else if (isResizingRight()) {
                    assert DOM.getCaptureElement() != null;
                    onRightSplitterResize(event.getClientX() - getAbsoluteLeft(), event.getClientY() - getAbsoluteTop());
                    event.preventDefault();
                }
            }
        }, MouseMoveEvent.getType()));
    }

    @Override
    protected void onUnload() {
        super.onUnload();
        if (internalHandlerRegistration != null) {
            internalHandlerRegistration.removeHandler();
        }
        internalHandlerRegistration = null;
    }
//
//    @Override
//    public void onBrowserEvent(Event event) {
//        switch (DOM.eventGetType(event)) {
//
//            case Event.ONMOUSEDOWN: {
//                Element target = DOM.eventGetTarget(event);
//                if (DOM.isOrHasChild(leftSplitElement, target)) {
//                    startResizingLeftFrom(DOM.eventGetClientX(event) - getAbsoluteLeft(), DOM.eventGetClientY(event) - getAbsoluteTop());
//                    DOM.setCapture(getElement());
//                    DOM.eventPreventDefault(event);
//                }
//                if (DOM.isOrHasChild(rightSplitElement, target)) {
//                    startResizingRightFrom(DOM.eventGetClientX(event) - getAbsoluteLeft(), DOM.eventGetClientY(event) - getAbsoluteTop());
//                    DOM.setCapture(getElement());
//                    DOM.eventPreventDefault(event);
//                }
//                break;
//            }
//
//            case Event.ONMOUSEUP: {
//                DOM.releaseCapture(getElement());
//                if (isResizingLeft()) {
//                    stopResizingLeft(DOM.eventGetClientX(event) - getAbsoluteLeft(), DOM.eventGetClientY(event) - getAbsoluteTop());
//                }
//                if (isResizingRight()) {
//                    stopResizingRight(DOM.eventGetClientX(event) - getAbsoluteLeft(), DOM.eventGetClientY(event) - getAbsoluteTop());
//                }
//                break;
//            }
//
//            case Event.ONMOUSEMOVE: {
//                if (isResizingLeft()) {
//                    assert DOM.getCaptureElement() != null;
//                    onLeftSplitterResize(DOM.eventGetClientX(event) - getAbsoluteLeft(), DOM.eventGetClientY(event) - getAbsoluteTop());
//                    DOM.eventPreventDefault(event);
//                }
//                if (isResizingRight()) {
//                    assert DOM.getCaptureElement() != null;
//                    onRightSplitterResize(DOM.eventGetClientX(event) - getAbsoluteLeft(), DOM.eventGetClientY(event) - getAbsoluteTop());
//                    DOM.eventPreventDefault(event);
//                }
//                break;
//            }
//        }
//    }

    /**
     * Gets the content element for the given index.
     *
     * @param index the index of the element, only 0 and 1 are valid.
     * @return the element
     */
    protected Element getElement(int index) {
        return elements[index];
    }

    /**
     * Gets the element that is acting as the splitter.
     *
     * @return the element
     */
    public Element getLeftSplitElement() {
        return leftSplitElement;
    }

    public Element getRightSplitElement() {
        return rightSplitElement;
    }

    /**
     * Gets one of the contained widgets.
     *
     * @param index the index of the widget, only 0 and 1 are valid.
     * @return the widget
     */
    protected Widget getWidget(int index) {
        return widgets[index];
    }

    /**
     * <b>Affected Elements:</b>
     * <ul>
     * <li>-splitter = the container containing the splitter element.</li>
     * </ul>
     *
     * @see com.google.gwt.user.client.ui.UIObject#onEnsureDebugId(String)
     */
    @Override
    protected void onEnsureDebugId(String baseID) {
        super.onEnsureDebugId(baseID);
        ensureDebugId(leftSplitElement, baseID, "lsplitter");
        ensureDebugId(rightSplitElement, baseID, "rsplitter");
    }
   
    /**
     * Sets one of the contained widgets.
     *
     * @param index the index, only 0 and 1 are valid
     * @param w the widget
     */
    protected void setWidget(int index, Widget w) {
        Widget oldWidget = widgets[index];

        // Validate.
        if (oldWidget == w) {
            return;
        }

        // Detach the new child.
        if (w != null) {
            w.removeFromParent();
        }

        // Remove the old child.
        if (oldWidget != null) {
            // Orphan old.
            orphan(oldWidget);
            // Physical detach old.
            DOM.removeChild(elements[index], oldWidget.getElement());
        }

        // Logical detach old / attach new.
        widgets[index] = w;

        if (w != null) {
            // Physical attach new.
            DOM.appendChild(elements[index], w.getElement());

            // Adopt new.
            adopt(w);
        }
    }

    /**
     * Called on each mouse drag event as the user is dragging the splitter.
     *
     * @param x the x coordinate of the mouse relative to the panel's extent
     * @param y the y coordinate of the mosue relative to the panel's extent
     */
    abstract void onLeftSplitterResize(int x, int y);

    abstract void onRightSplitterResize(int x, int y);

    /**
     * Called when the user starts dragging the splitter.
     *
     * @param x the x coordinate of the mouse relative to the panel's extent
     * @param y the y coordinate of the mouse relative to the panel's extent
     */
    abstract void onLeftSplitterResizeStarted(int x, int y);

    abstract void onRightSplitterResizeStarted(int x, int y);

    abstract void onLeftSplitterResizeStopped(int x, int y);

    abstract void onRightSplitterResizeStopped(int x, int y);

    private void startResizingLeftFrom(int x, int y) {
        isResizingLeft = true;
        onLeftSplitterResizeStarted(x, y);
    }

    private void startResizingRightFrom(int x, int y) {
        isResizingRight = true;
        onRightSplitterResizeStarted(x, y);
    }

    private void stopResizingLeft(int x, int y) {
        isResizingLeft = false;
        onLeftSplitterResizeStopped(x, y);
    }

    private void stopResizingRight(int x, int y) {
        isResizingRight = false;
        onRightSplitterResizeStopped(x, y);
    }
}
TOP

Related Classes of org.gwtoolbox.widget.client.panel.split.horizontal.dble.DoubleSplitPanel

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.