/*
   * 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);
  }