package com.eas.widgets; import com.eas.core.HasPublished; import com.eas.core.XElement; import com.eas.menu.HasComponentPopupMenu; import com.eas.menu.PlatypusPopupMenu; import com.eas.ui.HasEventsExecutor; import com.eas.ui.HasJsFacade; import com.eas.ui.events.AddEvent; import com.eas.ui.events.AddHandler; import com.eas.ui.events.EventsExecutor; import com.eas.ui.events.HasAddHandlers; import com.eas.ui.events.HasHideHandlers; import com.eas.ui.events.HasRemoveHandlers; import com.eas.ui.events.HasShowHandlers; import com.eas.ui.events.HideEvent; import com.eas.ui.events.HideHandler; import com.eas.ui.events.RemoveEvent; import com.eas.ui.events.RemoveHandler; import com.eas.ui.events.ShowEvent; import com.eas.ui.events.ShowHandler; import com.eas.widgets.containers.SplittedPanel; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.dom.client.Style; import com.google.gwt.event.dom.client.ContextMenuEvent; import com.google.gwt.event.dom.client.ContextMenuHandler; import com.google.gwt.event.logical.shared.HasResizeHandlers; import com.google.gwt.event.logical.shared.ResizeEvent; import com.google.gwt.event.logical.shared.ResizeHandler; import com.google.gwt.event.shared.HandlerRegistration; import com.google.gwt.user.client.ui.HasEnabled; import com.google.gwt.user.client.ui.Widget; public class SplitPane extends SplittedPanel implements HasJsFacade, HasEnabled, HasComponentPopupMenu, HasEventsExecutor, HasShowHandlers, HasHideHandlers, HasResizeHandlers, HasAddHandlers, HasRemoveHandlers, HasChildrenPosition { public static int HORIZONTAL_SPLIT = 1; public static int VERTICAL_SPLIT = 0; protected EventsExecutor eventsExecutor; protected PlatypusPopupMenu menu; protected boolean enabled = true; protected String name; protected JavaScriptObject published; protected Widget firstWidget; protected Widget secondWidget; protected boolean oneTouchExpandable; protected int orientation = HORIZONTAL_SPLIT; protected int dividerLocation = 84; public SplitPane() { super(); getElement().getStyle().setOverflow(Style.Overflow.HIDDEN); getElement().getStyle().setPosition(Style.Position.RELATIVE); } @Override public HandlerRegistration addAddHandler(AddHandler handler) { return addHandler(handler, AddEvent.getType()); } @Override public HandlerRegistration addRemoveHandler(RemoveHandler handler) { return addHandler(handler, RemoveEvent.getType()); } @Override public HandlerRegistration addResizeHandler(ResizeHandler handler) { return addHandler(handler, ResizeEvent.getType()); } @Override public void onResize() { super.onResize(); if (isAttached()) { ResizeEvent.fire(this, getElement().getOffsetWidth(), getElement().getOffsetHeight()); } } @Override public HandlerRegistration addHideHandler(HideHandler handler) { return addHandler(handler, HideEvent.getType()); } @Override public HandlerRegistration addShowHandler(ShowHandler handler) { return addHandler(handler, ShowEvent.getType()); } @Override public void setVisible(boolean visible) { boolean oldValue = isVisible(); super.setVisible(visible); if (oldValue != visible) { if (visible) { ShowEvent.fire(this, this); } else { HideEvent.fire(this, this); } } } @Override public EventsExecutor getEventsExecutor() { return eventsExecutor; } @Override public void setEventsExecutor(EventsExecutor aExecutor) { eventsExecutor = aExecutor; } @Override public PlatypusPopupMenu getPlatypusPopupMenu() { return menu; } protected HandlerRegistration menuTriggerReg; @Override public void setPlatypusPopupMenu(PlatypusPopupMenu aMenu) { if (menu != aMenu) { if (menuTriggerReg != null) menuTriggerReg.removeHandler(); menu = aMenu; if (menu != null) { menuTriggerReg = super.addDomHandler(new ContextMenuHandler() { @Override public void onContextMenu(ContextMenuEvent event) { event.preventDefault(); event.stopPropagation(); menu.setPopupPosition(event.getNativeEvent().getClientX(), event.getNativeEvent().getClientY()); menu.show(); } }, ContextMenuEvent.getType()); } } } @Override public boolean isEnabled() { return enabled; } @Override public void setEnabled(boolean aValue) { boolean oldValue = enabled; enabled = aValue; if (!oldValue && enabled) { getElement().<XElement> cast().unmask(); } else if (oldValue && !enabled) { getElement().<XElement> cast().disabledMask(); } } @Override public String getJsName() { return name; } @Override public void setJsName(String aValue) { name = aValue; } public Widget getFirstWidget() { return firstWidget; } public void setFirstWidget(Widget aFirstWidget) { if (firstWidget != aFirstWidget) { if (firstWidget != null) firstWidget.removeFromParent(); firstWidget = aFirstWidget; if (firstWidget != null) { if (orientation == HORIZONTAL_SPLIT) { addWest(firstWidget, dividerLocation); } else addNorth(firstWidget, dividerLocation); } } } public Widget getSecondWidget() { return secondWidget; } public void setSecondWidget(Widget aSecondWidget) { if (secondWidget != aSecondWidget) { if (secondWidget != null) secondWidget.removeFromParent(); secondWidget = aSecondWidget; if (secondWidget != null) { add(secondWidget); } } } @Override public void addWest(Widget widget, double size) { widget.getElement().getStyle().clearWidth(); widget.getElement().getStyle().clearHeight(); super.addWest(widget, size); AddEvent.fire(this, widget); } @Override public void addEast(Widget widget, double size) { widget.getElement().getStyle().clearWidth(); widget.getElement().getStyle().clearHeight(); super.addEast(widget, size); AddEvent.fire(this, widget); } @Override public void addNorth(Widget widget, double size) { widget.getElement().getStyle().clearWidth(); widget.getElement().getStyle().clearHeight(); super.addNorth(widget, size); AddEvent.fire(this, widget); } @Override public void addSouth(Widget widget, double size) { widget.getElement().getStyle().clearWidth(); widget.getElement().getStyle().clearHeight(); super.addSouth(widget, size); AddEvent.fire(this, widget); } @Override public void add(Widget widget) { widget.getElement().getStyle().clearWidth(); widget.getElement().getStyle().clearHeight(); super.add(widget); AddEvent.fire(this, widget); } @Override public boolean remove(Widget child) { boolean res = super.remove(child); if (res) { RemoveEvent.fire(this, child); } return res; } public boolean isOneTouchExpandable() { return oneTouchExpandable; } public int getOrientation() { return orientation; } public int getDividerLocation() { return dividerLocation; } public void setOneTouchExpandable(boolean aValue) { if (oneTouchExpandable != aValue) { oneTouchExpandable = aValue; if (firstWidget != null) setWidgetToggleDisplayAllowed(firstWidget, oneTouchExpandable); if (secondWidget != null) setWidgetToggleDisplayAllowed(secondWidget, oneTouchExpandable); } } public void setOrientation(int aValue) { if (orientation != aValue) { orientation = aValue; if (firstWidget != null) { firstWidget.removeFromParent(); if (orientation == HORIZONTAL_SPLIT) { addWest(firstWidget, dividerLocation); } else { addNorth(firstWidget, dividerLocation); } } } } public void setDividerLocation(int aValue) { if (dividerLocation != aValue) { dividerLocation = aValue; if (firstWidget != null) super.setWidgetSize(firstWidget, aValue); } } @Override public JavaScriptObject getPublished() { return published; } @Override public void setPublished(JavaScriptObject aValue) { if (published != aValue) { published = aValue; if (published != null) { publish(this, aValue); } } } private native static void publish(HasPublished aWidget, JavaScriptObject published)/*-{ var Orientation = @com.eas.ui.JsUi::Orientation; Object.defineProperty(published, "orientation", { get : function() { var orientation = aWidget.@com.eas.widgets.SplitPane::getOrientation()(); if (orientation == @com.eas.widgets.SplitPane::VERTICAL_SPLIT) { return Orientation.VERTICAL; } else { return Orientation.HORIZONTAL; } }, set : function(aOrientation) { if (aOrientation == Orientation.VERTICAL) { aWidget.@com.eas.widgets.SplitPane::setOrientation(I)(@com.eas.widgets.SplitPane::VERTICAL_SPLIT); } else { aWidget.@com.eas.widgets.SplitPane::setOrientation(I)(@com.eas.widgets.SplitPane::HORIZONTAL_SPLIT); } } }); Object.defineProperty(published, "firstComponent", { get : function() { var comp = aWidget.@com.eas.widgets.SplitPane::getFirstWidget()(); return @com.eas.core.Utils::checkPublishedComponent(Ljava/lang/Object;)(comp); }, set : function(aChild) { var child = (aChild == null ? null: aChild.unwrap()); aWidget.@com.eas.widgets.SplitPane::setFirstWidget(Lcom/google/gwt/user/client/ui/Widget;)(child); } }); Object.defineProperty(published, "secondComponent", { get : function() { var comp = aWidget.@com.eas.widgets.SplitPane::getSecondWidget()(); return @com.eas.core.Utils::checkPublishedComponent(Ljava/lang/Object;)(comp); }, set : function(aChild) { var child = (aChild == null ? null: aChild.unwrap()); aWidget.@com.eas.widgets.SplitPane::setSecondWidget(Lcom/google/gwt/user/client/ui/Widget;)(child); } }); Object.defineProperty(published, "dividerLocation", { get : function() { return aWidget.@com.eas.widgets.SplitPane::getDividerLocation()(); }, set : function(aValue) { aWidget.@com.eas.widgets.SplitPane::setDividerLocation(I)(aValue); } }); Object.defineProperty(published, "oneTouchExpandable", { get : function() { return aWidget.@com.eas.widgets.SplitPane::isOneTouchExpandable()(); }, set : function(aValue) { aComponent.@com.eas.widgets.SplitPane::setOneTouchExpandable(Z)(false != aValue); } }); published.add = function(toAdd){ if(toAdd != undefined && toAdd != null && toAdd.unwrap != undefined) { if(toAdd.parent == published) throw 'A widget already added to this container'; if (published.firstComponent == null) { published.firstComponent = toAdd; }else { published.secondComponent = toAdd; } } } published.remove = function(aChild) { if (aChild != undefined && aChild != null && aChild.unwrap != undefined) { aWidget.@com.eas.widgets.SplitPane::remove(Lcom/google/gwt/user/client/ui/Widget;)(aChild.unwrap()); } }; published.child = function(aIndex) { var widget = aWidget.@com.eas.widgets.SplitPane::getWidget(I)(aIndex); return @com.eas.core.Utils::checkPublishedComponent(Ljava/lang/Object;)(widget); }; }-*/; @Override public int getTop(Widget aWidget) { assert aWidget.getParent() == this : "widget should be a child of this container"; return aWidget.getElement().getParentElement().getOffsetTop(); } @Override public int getLeft(Widget aWidget) { assert aWidget.getParent() == this : "widget should be a child of this container"; return aWidget.getElement().getParentElement().getOffsetLeft(); } }