package org.geogebra.web.web.gui;
import java.util.ArrayList;
import java.util.TreeSet;
import org.geogebra.common.awt.GPoint;
import org.geogebra.common.euclidian.EuclidianConstants;
import org.geogebra.common.euclidian.EuclidianView;
import org.geogebra.common.kernel.geos.FromMeta;
import org.geogebra.common.kernel.geos.GeoElement;
import org.geogebra.common.main.Localization;
import org.geogebra.common.util.debug.Log;
import org.geogebra.web.html5.main.AppW;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.EventListener;
import com.google.gwt.user.client.ui.MenuBar;
import com.google.gwt.user.client.ui.MenuItem;
public class ContextMenuChooseGeoW extends ContextMenuGeoElementW {
/**
*
*/
protected EuclidianView view;
/**
* polygons/polyhedra parents of segments, polygons, ...
*/
private TreeSet<GeoElement> metas;
private ArrayList<GeoElement> selectedGeos;
private GPoint loc;
private MenuBar selectAnotherMenu;
private ArrayList<GeoElement> tmpAnotherMenuItemList;
/**
*
* @param app
* application
* @param view
* view
* @param selectedGeos
* selected geos
* @param geos
* geos
* @param invokerLocation
* place to show
*/
public ContextMenuChooseGeoW(AppW app, EuclidianView view,
ArrayList<GeoElement> selectedGeos, ArrayList<GeoElement> geos,
GPoint invokerLocation) {
super(app, selectedGeos);
// return if just one geo, or if first geos more than one
if (geos.size() < 2 || selectedGeos.size() > 1) {
justOneGeo = false;
addOtherItems();
return;
}
justOneGeo = true;
// section to choose a geo
// addSeparator();
// addSelectAnotherMenu(view.getMode());
this.loc = invokerLocation;
this.selectedGeos = selectedGeos;
this.setGeos(geos);
this.view = view;
GeoElement geoSelected = selectedGeos.get(0);
// add geos
metas = new TreeSet<GeoElement>();
// first collect geos in tmp list
addGeosToTmpAnotherMenuItemList(metas, geos, geoSelected);
// if tmp list not empty
if (!tmpAnotherMenuItemList.isEmpty()) {
// add menu item
addSelectAnotherMenu(view.getMode());
for (GeoElement geo : tmpAnotherMenuItemList) {
// add geos to submenu
addGeo(geo);
}
}
addOtherItems();
}
private void addGeosToTmpAnotherMenuItemList(TreeSet<GeoElement> metas,
ArrayList<GeoElement> geos, GeoElement geoSelected) {
tmpAnotherMenuItemList = new ArrayList<GeoElement>();
for (GeoElement geo1 : geos) {
// do not add xoy plane or selected geo
if (geo1 != geoSelected && geo1 != app.getKernel().getXOYPlane()) {
tmpAnotherMenuItemList.add(geo1);
}
if (geo1.getMetasLength() > 0) {
for (GeoElement meta : ((FromMeta) geo1).getMetas()) {
if (!metas.contains(meta)) {
tmpAnotherMenuItemList.add(meta);
}
}
}
}
}
private class MyMouseOverListener implements EventListener {
private GeoElement geo;
public MyMouseOverListener(GeoElement geo) {
this.geo = geo;
}
@Override
public void onBrowserEvent(Event event) {
view.getEuclidianController().doSingleHighlighting(geo);
Log.debug(
"view.getEuclidianController().doSingleHighlighting(geo) called");
}
}
private void addGeo(GeoElement geo) {
// prevent selection of xOy plane
if (geo == app.getKernel().getXOYPlane()) {
return;
}
GeoAction chooser = new GeoAction(geo);
MenuItem mi = new MenuItem(getDescription(geo, false), true, chooser);
DOM.setEventListener(mi.getElement(), new MyMouseOverListener(geo));
DOM.sinkEvents(mi.getElement(), Event.ONMOUSEOVER);
selectAnotherMenu.addItem(mi);
metas.add(geo);
}
private class GeoAction implements Command {
private GeoElement geo;
public GeoAction(GeoElement geo) {
this.geo = geo;
}
@Override
public void execute() {
geoActionCmd(this.geo, selectedGeos, getGeos(), view, loc);
}
}
private void addSelectAnotherMenu(int mode) {
selectAnotherMenu = new MenuBar(true);
MenuItem selectAnotherMenuItem;
Localization l10n = app.getLocalization();
if (mode == EuclidianConstants.MODE_MOVE) {
selectAnotherMenuItem = new MenuItem(l10n.getMenu("SelectAnother"),
selectAnotherMenu);
} else {
selectAnotherMenuItem = new MenuItem(l10n.getMenu("PerformToolOn"),
selectAnotherMenu);
}
selectAnotherMenuItem.addStyleName("mi_no_image");
wrappedPopup.addItem(selectAnotherMenuItem);
}
}