/*
   * MouseListener implementation for popup menus
   */
  public void mouseClicked(java.awt.event.MouseEvent e) {
    // right click is consumed in mousePressed, but in GeoGebra 3D,
    // where heavyweight popup menus are enabled this doesn't work
    // so make sure that this is no right click as well (ticket #302)
    if (e.isConsumed() || AppD.isRightClick(e)) {
      return;
    }

    // get GeoElement at mouse location
    TreePath tp = tree.getPathForLocation(e.getX(), e.getY());
    GeoElement geo = AlgebraTree.getGeoElementForPath(tp);

    ArrayList<GeoElement> groupedGeos = null;

    // check if we clicked on the 16x16 show/hide icon
    if (geo != null) {
      Rectangle rect = tree.getPathBounds(tp);
      boolean iconClicked = rect != null && e.getX() - rect.x < 16; // distance from left border		
      if (iconClicked) {
        // icon clicked: toggle show/hide
        geo.setEuclidianVisible(!geo.isSetEuclidianVisible());
        geo.updateVisualStyle();
        app.storeUndoInfo();
        kernel.notifyRepaint();
        return;
      }

    } else { // try group action
      groupedGeos = groupAction(e, tp, false);
    }

    // check double click
    if (checkDoubleClick(geo, e)) return;

    EuclidianViewInterfaceCommon ev = app.getActiveEuclidianView();
    int mode = ev.getMode();
    if (!skipSelection && isSelectionModeForClick(mode)) {
      // update selection
      if (geo == null) {
        if (!AppD.isControlDown(e) && !e.isShiftDown()) app.clearSelectedGeos();

        if (groupedGeos != null) app.addSelectedGeos(groupedGeos, true);

      } else {
        // handle selecting geo
        if (AppD.isControlDown(e)) {
          app.toggleSelectedGeo(geo);
          if (app.getSelectedGeos().contains(geo)) lastSelectedGeo = geo;
        } else if (e.isShiftDown() && lastSelectedGeo != null) {
          ArrayList<GeoElement> geos = tree.getGeosBetween(lastSelectedGeo, geo);
          if (geos != null) {
            app.clearSelectedGeos(false); // repaint will be done next step
            app.addSelectedGeos(geos, true);
          }

        } else {
          app.clearSelectedGeos(false); // repaint will be done next step
          app.addSelectedGeo(geo);
          lastSelectedGeo = geo;
        }
      }
    } else if (mode != EuclidianConstants.MODE_SELECTION_LISTENER) {
      euclidianViewClick(ev, geo, e);
    } else
      // tell selection listener about click
      app.geoElementSelected(geo, false);

    // Alt click: copy definition to input field
    if (geo != null && e.isAltDown() && app.showAlgebraInput()) {
      // F3 key: copy definition to input bar
      app.getGlobalKeyDispatcher().handleFunctionKeyForAlgebraInput(3, geo);
    }

    ev.mouseMovedOver(null);
  }
  public void mouseClicked(AbstractEvent e) {
    // right click is consumed in mousePressed, but in GeoGebra 3D,
    // where heavyweight popup menus are enabled this doesn't work
    // so make sure that this is no right click as well (ticket #302)
    if (
    /*e.isConsumed() FIXME||*/ e.isRightClick()) {
      return;
    }

    // get GeoElement at mouse location
    Object tp = view.getPathForLocation(e.getX(), e.getY());
    GeoElement geo = view.getGeoElementForPath(tp);

    // check if we clicked on the 16x16 show/hide icon
    if (geo != null) {
      GRectangle rect = (GRectangle) view.getPathBounds(tp);
      boolean iconClicked =
          rect != null && e.getX() - rect.getX() < 16; // distance from left border			
      if (iconClicked) {
        // icon clicked: toggle show/hide
        geo.setEuclidianVisible(!geo.isSetEuclidianVisible());
        geo.updateVisualStyle();
        app.storeUndoInfo();
        kernel.notifyRepaint();
        return;
      }
    }

    // check double click
    int clicks = e.getClickCount();
    // EuclidianView ev = app.getEuclidianView();
    EuclidianViewInterfaceCommon ev = app.getActiveEuclidianView();
    if (clicks == 2) {
      app.clearSelectedGeos();
      ev.resetMode();
      if (geo != null && !e.isControlDown()) {
        view.startEditing(geo, e.isShiftDown());
      }
      return;
    }

    int mode = ev.getMode();
    if (!skipSelection
        && (mode == EuclidianConstants.MODE_MOVE
            || mode == EuclidianConstants.MODE_RECORD_TO_SPREADSHEET)) {
      // update selection
      if (geo == null) {
        app.clearSelectedGeos();
      } else {
        // handle selecting geo
        if (e.isControlDown()) {
          app.toggleSelectedGeo(geo);
          if (app.getSelectedGeos().contains(geo)) lastSelectedGeo = geo;
        } else if (e.isShiftDown() && lastSelectedGeo != null) {
          boolean nowSelecting = true;
          boolean selecting = false;
          boolean aux = geo.isAuxiliaryObject();
          boolean ind = geo.isIndependent();
          boolean aux2 = lastSelectedGeo.isAuxiliaryObject();
          boolean ind2 = lastSelectedGeo.isIndependent();

          if ((aux == aux2 && aux) || (aux == aux2 && ind == ind2)) {

            Iterator<GeoElement> it = kernel.getConstruction().getGeoSetLabelOrder().iterator();

            boolean direction =
                geo.getLabel(StringTemplate.defaultTemplate)
                        .compareTo(lastSelectedGeo.getLabel(StringTemplate.defaultTemplate))
                    < 0;

            while (it.hasNext()) {
              GeoElement geo2 = it.next();
              if ((geo2.isAuxiliaryObject() == aux && aux)
                  || (geo2.isAuxiliaryObject() == aux && geo2.isIndependent() == ind)) {

                if (direction && geo2.equals(lastSelectedGeo)) selecting = !selecting;
                if (!direction && geo2.equals(geo)) selecting = !selecting;

                if (selecting) {
                  app.toggleSelectedGeo(geo2);
                  nowSelecting = app.getSelectedGeos().contains(geo2);
                }

                if (!direction && geo2.equals(lastSelectedGeo)) selecting = !selecting;
                if (direction && geo2.equals(geo)) selecting = !selecting;
              }
            }
          }

          if (nowSelecting) {
            app.addSelectedGeo(geo);
            lastSelectedGeo = geo;
          } else {
            app.removeSelectedGeo(lastSelectedGeo);
            lastSelectedGeo = null;
          }

        } else {
          app.clearSelectedGeos(false); // repaint will be done next step
          app.addSelectedGeo(geo);
          lastSelectedGeo = geo;
        }
      }
    } else if (mode != EuclidianConstants.MODE_SELECTION_LISTENER) {
      // let euclidianView know about the click
      AbstractEvent event = e;
      ev.clickedGeo(geo, event);
      event.release();
    } else
      // tell selection listener about click
      app.geoElementSelected(geo, false);

    // Alt click: copy definition to input field
    if (geo != null && e.isAltDown() && app.showAlgebraInput()) {
      // F3 key: copy definition to input bar
      app.getGlobalKeyDispatcher().handleFunctionKeyForAlgebraInput(3, geo);
    }

    ev.mouseMovedOver(null);
  }