package org.ovirt.engine.ui.common.widget; import org.ovirt.engine.ui.common.utils.PopupUtils; 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.MenuItem; import com.google.gwt.user.client.ui.PopupPanel; /** * MenuBar that adjusts sub menu popup location to fit the screen. * <p> * See <a href="https://code.google.com/p/google-web-toolkit/issues/detail?id=3924"> * this GWT issue</a> (not planned to be fixed in GWT) for details. */ public class MenuBar extends com.google.gwt.user.client.ui.MenuBar { public MenuBar() { super(); setAutoOpen(true); } public MenuBar(boolean vertical) { super(vertical); setAutoOpen(true); } private native PopupPanel getSubMenuPopup() /*-{ return this.@com.google.gwt.user.client.ui.MenuBar::getPopup()(); }-*/; private native MenuItem findItem(Element hItem) /*-{ return this.@com.google.gwt.user.client.ui.MenuBar::findItem(Lcom/google/gwt/dom/client/Element;)(hItem); }-*/; @Override public void onBrowserEvent(Event event) { super.onBrowserEvent(event); switch (DOM.eventGetType(event)) { case Event.ONMOUSEOVER: case Event.ONCLICK: MenuItem item = findItem(DOM.eventGetTarget(event)); if (item !=null){ PopupPanel subMenuPopup = getSubMenuPopup(); if (subMenuPopup != null) { PopupUtils.adjustPopupLocationToFitScreenAndShow(subMenuPopup, subMenuPopup.getAbsoluteLeft(), subMenuPopup.getAbsoluteTop(), this, item.getOffsetHeight()); } } break; default: break; } } public boolean isEmpty(){ return getItems() == null || getItems().isEmpty(); } public int getItemCount() { return getItems() == null ? 0 : getItems().size(); } public MenuItem getItem(int index) { return getItems() == null ? null : getItems().get(index); } }