package org.greenstone.client; import java.util.ArrayList; import com.google.gwt.event.dom.client.MouseOutHandler; import com.google.gwt.event.dom.client.MouseOverHandler; import com.google.gwt.user.client.DOM; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.ui.HTML; import com.google.gwt.user.client.ui.Label; public class Menu { protected Element _parent = null; protected ArrayList _childMenus = new ArrayList(); protected ArrayList _menuItems = new ArrayList(); protected HTML _menuDiv = new HTML(); protected MouseOverHandler _onMouseOver = null; protected MouseOutHandler _onMouseOut = null; public Menu(Element parent, MouseOverHandler onMouseOver, MouseOutHandler onMouseOut) { _parent = parent; parent.appendChild(_menuDiv.getElement()); _menuDiv.getElement().getStyle().setProperty("background", "#FFFFFF"); _menuDiv.getElement().getStyle().setProperty("padding", "2px"); _menuDiv.getElement().getStyle().setProperty("position", "absolute"); _onMouseOver = onMouseOver; _onMouseOut = onMouseOut; } public void addMenuItems(ArrayList menuItems) { _menuItems = menuItems; int maxWidth = -1; for(int i = 0; i < menuItems.size(); i++) { if(!menuItems.get(i).condition()) { continue; } Element item = menuItems.get(i).getMenuElement(); item.getStyle().setProperty("background", "#FFFFFF"); item.getStyle().setProperty("color", "#000000"); item.getStyle().setProperty("border", "1px solid"); item.getStyle().setProperty("padding", "2px"); Label newLabel = Label.wrap(item); newLabel.addMouseOverHandler(_onMouseOver); newLabel.addMouseOutHandler(_onMouseOut); newLabel.addClickHandler(menuItems.get(i).getClickHandler()); _menuDiv.getElement().appendChild(item); if(item.getOffsetWidth() > maxWidth) { maxWidth = item.getOffsetWidth(); } } for(int i = 0; i < menuItems.size(); i++) { menuItems.get(i).getMenuElement().getStyle().setProperty("width", maxWidth + "px"); } } public void moveMenu(final int x, final int y) { _menuDiv.setVisible(false); _menuDiv.getElement().getStyle().setProperty("left", x + "px"); _menuDiv.getElement().getStyle().setProperty("top", y + "px"); Timer pause = new Timer() { public void run() { if (_menuDiv.getOffsetHeight() > GS3MapLibrary.getElementById("GSContent").getOffsetHeight()) { _menuDiv.getElement().getStyle().setProperty("top", GS3MapLibrary.getElementById("GSContent").getAbsoluteTop() + "px"); _menuDiv.getElement().getStyle().setProperty("overflow", "auto"); _menuDiv.getElement().getStyle().setProperty("height", GS3MapLibrary.getElementById("GSContent").getOffsetHeight() + "px"); } else if(y + _menuDiv.getOffsetHeight() > GS3MapLibrary.getElementById("GSFooter").getAbsoluteTop()) { _menuDiv.getElement().getStyle().setProperty("top", (y - ( y + _menuDiv.getOffsetHeight() - GS3MapLibrary.getElementById("GSFooter").getAbsoluteTop()) + "px")); } _menuDiv.setVisible(true); } }; pause.schedule(100); } public void addChildMenu(Menu menu) { _childMenus.add(menu); } public void hideMenu() { _menuDiv.setVisible(false); for(Menu m : _childMenus) { if(m != null) { m.hideMenu(); } } } public void refreshMenu() { _parent.removeChild(_menuDiv.getElement()); _menuDiv = new HTML(); _parent.appendChild(_menuDiv.getElement()); _menuDiv.getElement().getStyle().setProperty("background", "#FFFFFF"); _menuDiv.getElement().getStyle().setProperty("padding", "2px"); _menuDiv.getElement().getStyle().setProperty("position", "absolute"); addMenuItems(_menuItems); } public void showMenu() { _menuDiv.setVisible(true); } public HTML getMenuDiv() { return _menuDiv; } }