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);
}
}