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