package org.geogebra.web.web.gui.toolbar; import java.util.Vector; import org.geogebra.common.kernel.ModeSetter; import org.geogebra.web.html5.gui.FastClickHandler; import org.geogebra.web.html5.gui.tooltip.ToolTipManagerW; import org.geogebra.web.html5.gui.util.CancelEventTimer; import org.geogebra.web.html5.gui.util.ListItem; import org.geogebra.web.html5.main.AppW; import org.geogebra.web.web.gui.ImageFactory; import org.geogebra.web.web.gui.images.PerspectiveResources; import org.geogebra.web.web.gui.util.StandardButton; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.DomEvent; import com.google.gwt.event.dom.client.HumanInputEvent; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseMoveEvent; import com.google.gwt.event.dom.client.MouseMoveHandler; import com.google.gwt.event.dom.client.MouseUpEvent; import com.google.gwt.event.dom.client.TouchEndEvent; import com.google.gwt.event.dom.client.TouchStartEvent; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.Widget; public class ModeToggleMenuP extends ModeToggleMenuW implements MouseMoveHandler { FlowPanel submenuPanel; StandardButton back; private int startPosition; private int endPosition; public ModeToggleMenuP(AppW appl, Vector<Integer> menu1, ToolBarW tb, int order) { super(appl, menu1, tb, order); } public ModeToggleMenuP(AppW appl, Vector<Integer> menu1, ToolBarW tb, int order, FlowPanel submenuPanel) { super(appl, menu1, tb, order); this.submenuPanel = submenuPanel; } @Override protected ToolbarSubmenuW createToolbarSubmenu(AppW app, int order) { return new ToolbarSubmenuP(app, order); } @Override public void addDomHandlers(Widget w) { super.addDomHandlers(w); w.addDomHandler(this, MouseMoveEvent.getType()); } @Override protected void buildButton() { super.buildButton(); tbutton.getElement().setAttribute("isMobile", "true"); } private void addBackButton() { PerspectiveResources pr = ((ImageFactory) GWT.create(ImageFactory.class)).getPerspectiveResources(); back = new StandardButton(pr.menu_header_back(), null, 32); back.addStyleName("submenuBack"); back.addFastClickHandler(new FastClickHandler() { @Override public void onClick(Widget source) { hideMenu(); } }); // submenuPanel.submenuScrollPanel.toolbarPanel.add ((FlowPanel) submenuPanel.getParent().getParent()).add(back); } public void removeBackButton() { if (back != null) { ((FlowPanel) submenuPanel.getParent().getParent()).remove(back); } } @Override protected void buildGui() { submenu = createToolbarSubmenu(app, order); for (int k = 0; k < menu.size(); k++) { final int addMode = menu.get(k).intValue(); if (addMode < 0) { // TODO // // separator within menu: // tm.addSeparator(); } else { // standard case: add mode // check mode if (!"".equals(app.getToolName(addMode))) { ListItem subLi = submenu.addItem(addMode); addDomHandlers(subLi); } } } } @Override public void showMenu() { // hide toolbar before showing submenu toolbar.setVisible(false); toolbar.getParent().setVisible(false); if (this.submenu == null) { this.buildGui(); } if (submenu != null) { submenuPanel.add(submenu); submenuPanel.getParent().setVisible(true); submenu.setVisible(true); addBackButton(); } toolbar.getGGWToolBar().setSubmenuDimensions(app.getWidth()); } @Override public void hideMenu() { if (submenu != null) { submenuPanel.remove(submenu); submenuPanel.getParent().setVisible(false); submenu.setVisible(false); } removeBackButton(); if (toolbar != null) { toolbar.getParent().setVisible(true); toolbar.setVisible(true); } } public int getButtonCount() { int count = submenu.getItemList().getWidgetCount(); return count; } @Override public void onStart(HumanInputEvent<?> event) { // own event handling for touch and mouse } @Override public void onTouchStart(TouchStartEvent event) { if (toolbar.isVisible()) { startPosition = toolbar.getAbsoluteLeft(); } else { startPosition = submenuPanel.getAbsoluteLeft(); } if (event.getSource() == tbutton) { tbutton.addStyleName("touched"); } if (toolbar.isVisible()) { startPosition = toolbar.getAbsoluteLeft(); } else { startPosition = submenuPanel.getAbsoluteLeft(); } if (event.getSource() == tbutton) { tbutton.addStyleName("touched"); } } @Override public void onTouchEnd(TouchEndEvent event) { if (toolbar.isVisible()) { endPosition = toolbar.getAbsoluteLeft(); } else { endPosition = submenuPanel.getAbsoluteLeft(); } if (event.getSource() == tbutton) { tbutton.removeStyleName("touched"); } onEnd(event); CancelEventTimer.touchEventOccured(); } @Override public void onEnd(DomEvent<?> event) { int mode = Integer.parseInt(event.getRelativeElement().getAttribute("mode")); if (mode < 999 || mode > 2000) { app.hideKeyboard(); } tbutton.getElement().focus(); event.stopPropagation(); // make sure it is a click, not a scroll if (startPosition == endPosition) { // if tool button was tapped && if there is a submenu if (event.getSource() == tbutton && menu.size() > 1) { showMenu(); // open submenu } else { // click ended on submenu item hideMenu(); event.stopPropagation(); } ToolTipManagerW.sharedInstance().setBlockToolTip(false); // if we click the toolbar button, only interpret it as real click // if there is only one tool in this menu app.setMode(mode, event.getSource() == tbutton && menu.size() > 1 ? ModeSetter.DOCK_PANEL : ModeSetter.TOOLBAR); ToolTipManagerW.sharedInstance().setBlockToolTip(true); } tbutton.getElement().focus(); } @Override public void onMouseDown(MouseDownEvent event) { event.preventDefault(); startPosition = event.getClientX(); if (toolbar.isVisible()) { toolbar.setStartPositions(startPosition, ((ScrollPanel) toolbar.getParent()).getHorizontalScrollPosition()); } else { toolbar.setStartPositions(startPosition, ((ScrollPanel) submenuPanel.getParent()).getHorizontalScrollPosition()); } toolbar.setMouseDown(true); } @Override public void onMouseUp(MouseUpEvent event) { toolbar.setMouseDown(false); endPosition = event.getClientX(); if (startPosition == endPosition) { super.onMouseUp(event); } } @Override public void onMouseMove(MouseMoveEvent event) { toolbar.setPosition(event.getClientX()); } }