package org.geogebra.web.web.gui.toolbar;
import org.geogebra.common.euclidian.event.PointerEventType;
import org.geogebra.web.html5.gui.util.ClickStartHandler;
import org.geogebra.web.html5.gui.util.ListItem;
import org.geogebra.web.html5.gui.util.NoDragImage;
import org.geogebra.web.html5.gui.util.UnorderedList;
import org.geogebra.web.html5.main.AppW;
import org.geogebra.web.web.css.GuiResources;
import org.geogebra.web.web.gui.app.GGWToolBar;
import org.geogebra.web.web.gui.laf.GLookAndFeel;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Image;
import com.google.gwt.user.client.ui.Label;
/**
* Submenu for ModeToggleMenu. This extension is needed so that
* this FlowPanel can act as a popup.
* @author bencze
*/
public class ToolbarSubmenuW extends FlowPanel {
/**
* Application
*/
protected AppW app;
/**
* Panel containing the arrow.
*/
private FlowPanel submenuArrow;
/**
* Item list containing the submenu items.
*/
protected UnorderedList itemList;
int order;
/**
* Creates the sub menu, sets the stylename, and creates the
* child elements.
*/
public ToolbarSubmenuW(AppW app, int order) {
this.app = app;
this.order = order;
setStyleName("toolbar_submenu");
initGui();
}
protected void initGui() {
submenuArrow = new FlowPanel();
submenuArrow.add(new Image(GuiResources.INSTANCE.arrow_submenu_up()));
submenuArrow.setStyleName("submenuArrow");
add(submenuArrow);
itemList = new UnorderedList();
itemList.setStyleName("submenuContent");
setMaxHeight((int)app.getHeight() - GLookAndFeel.TOOLBAR_OFFSET);
add(itemList);
//catch the events to make sure scrollbar is usable when present
ClickStartHandler.init(this, new ClickStartHandler(false, true) {
@Override
public void onClickStart(int x, int y, PointerEventType type) {
// nothing to do here
}
});
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
setStyleName("visible", visible);
if(visible){
app.invokeLater(new Runnable() {
@Override
public void run() {
if(itemList.getOffsetWidth() + ToolbarSubmenuW.this.order * 45 > app.getWidth()){
itemList.getElement().getStyle().setLeft(app.getWidth() - 45 * ToolbarSubmenuW.this.order - itemList.getOffsetWidth() -10, Unit.PX);
}
}});
}
}
@Override
public boolean isVisible() {
return getElement().hasClassName("visible");
}
/**
* Creates a list item, adds an image and a label with the specified mode,
* and adds it to the submenu list.
* @param addMode the mode to be used with this item
* @return the newly created {@code ListItem}
*/
public ListItem addItem(int addMode) {
ListItem listItem = createListItem(addMode);
listItem.getElement().setAttribute("mode", addMode + "");
itemList.add(listItem);
return listItem;
}
protected ListItem createListItem(int mode) {
ListItem listItem = new ListItem();
Image image = createImage(mode);
Label label = createLabel(mode);
listItem.add(image);
listItem.add(label);
return listItem;
}
protected Image createImage(int mode) {
Image img = new NoDragImage(((GGWToolBar) app.getToolbar()).getImageURL(mode), 32);
// temporary opacity fix until all the icons will be renewed
if (mode == 26 || mode == 61 || mode == 62 || mode == 73 || mode == 110) {
img.addStyleName("mowPanelButton");
}
return img;
}
protected Label createLabel(int mode) {
return new Label(app.getToolName(mode));
}
/**
* @return Item list containing the menu items
*/
public UnorderedList getItemList() {
return itemList;
}
public void setMaxHeight(int d) {
itemList.getElement().getStyle().setProperty("maxHeight", d+"px");
}
}