package com.eas.menu; import java.util.ArrayList; import java.util.List; import com.eas.core.HasPublished; import com.eas.core.XElement; import com.eas.ui.HasCustomParent; 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.google.gwt.core.client.JavaScriptObject; 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.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.RequiresResize; import com.google.gwt.user.client.ui.UIObject; public class PlatypusMenuBar extends MenuBar implements HasJsFacade, HasEnabled, HasEventsExecutor, HasShowHandlers, HasHideHandlers, HasResizeHandlers, RequiresResize, HasAddHandlers, HasRemoveHandlers, HasCustomParent { protected EventsExecutor eventsExecutor; protected boolean enabled = true; protected String name; protected JavaScriptObject published; protected List<UIObject> allItems = new ArrayList<>(); protected MenuItem parentItem; public PlatypusMenuBar() { this(false); } public PlatypusMenuBar(boolean aVertical) { super(aVertical); setStylePrimaryName("menu-bar"); } @Override public UIObject getCustomParent() { return parentItem != null ? parentItem : getParent(); } @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() { 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 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 MenuItem getParentItem() { return parentItem; } public void setParentItem(MenuItem aItem) { parentItem = aItem; } public UIObject getItem(int aIndex) { if (aIndex >= 0 && aIndex < allItems.size()) { UIObject item = allItems.get(aIndex); if (item instanceof MenuItem && ((MenuItem) item).getSubMenu() != null) return ((MenuItem) item).getSubMenu(); else return item; } else return null; } public int getCount() { return allItems.size(); } public boolean add(UIObject aChild) { boolean added; if (aChild instanceof MenuItemImageText) { addItem((MenuItemImageText) aChild); allItems.add(aChild); added = true; } else if (aChild instanceof PlatypusMenuItemSeparator) { addSeparator((PlatypusMenuItemSeparator) aChild); allItems.add(aChild); added = true; } else if (aChild instanceof PlatypusMenu) { PlatypusMenu subMenu = (PlatypusMenu) aChild; MenuItem item = new MenuItem(subMenu.getText(), false, subMenu); item.setStyleName("menu-item"); subMenu.setParentItem(item); addItem(item); allItems.add(aChild); added = true; } else added = false; if (added) { AddEvent.fire(this, aChild); } return added; } public boolean remove(UIObject aChild) { boolean removed = false; if (aChild instanceof MenuItem) { removeItem((MenuItem) aChild); allItems.remove(aChild); removed = true; } else if (aChild instanceof PlatypusMenuItemSeparator) { removeSeparator((PlatypusMenuItemSeparator) aChild); allItems.remove(aChild); removed = true; } else if (aChild instanceof PlatypusMenu) { removeItem(((PlatypusMenu) aChild).getParentItem()); allItems.remove(aChild); removed = true; } if (removed) { RemoveEvent.fire(this, aChild); } return removed; } @Override public void clearItems() { super.clearItems(); allItems.clear(); } @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)/*-{ published.add = function(toAdd){ if(toAdd && toAdd.unwrap){ if(toAdd.parent == published) throw 'A widget already added to this menu'; aWidget.@com.eas.menu.PlatypusMenuBar::add(Lcom/google/gwt/user/client/ui/UIObject;)(toAdd.unwrap()); } }; published.remove = function(aChild) { if (aChild && aChild.unwrap) { aWidget.@com.eas.menu.PlatypusMenuBar::remove(Lcom/google/gwt/user/client/ui/UIObject;)(aChild.unwrap()); } }; published.clear = function() { aWidget.@com.eas.menu.PlatypusMenuBar::clearItems()(); }; published.child = function(aIndex) { var comp = aWidget.@com.eas.menu.PlatypusMenuBar::getItem(I)(aIndex); return @com.eas.core.Utils::checkPublishedComponent(Ljava/lang/Object;)(comp); }; Object.defineProperty(published, "count", { get : function() { return aWidget.@com.eas.menu.PlatypusMenuBar::getCount()(); } }); Object.defineProperty(published, "children", { value : function(){ var ch = []; for(var i=0; i < published.count; i++) ch.push(published.child(i)); return ch; } }); }-*/; }