@Override public void mousePressed(Canvas canvas, Graphics g, MouseEvent e) { Project proj = canvas.getProject(); Selection sel = proj.getSelection(); Circuit circuit = canvas.getCircuit(); start = Location.create(e.getX(), e.getY()); curDx = 0; curDy = 0; moveGesture = null; // if the user clicks into the selection, // selection is being modified Collection<Component> in_sel = sel.getComponentsContaining(start, g); if (!in_sel.isEmpty()) { if ((e.getModifiers() & InputEvent.SHIFT_MASK) == 0) { setState(proj, MOVING); proj.repaintCanvas(); return; } else { Action act = SelectionActions.drop(sel, in_sel); if (act != null) { proj.doAction(act); } } } // if the user clicks into a component outside selection, user // wants to add/reset selection Collection<Component> clicked = circuit.getAllContaining(start, g); if (!clicked.isEmpty()) { if ((e.getModifiers() & InputEvent.SHIFT_MASK) == 0) { if (sel.getComponentsContaining(start).isEmpty()) { Action act = SelectionActions.dropAll(sel); if (act != null) { proj.doAction(act); } } } for (Component comp : clicked) { if (!in_sel.contains(comp)) { sel.add(comp); } } setState(proj, MOVING); proj.repaintCanvas(); return; } // The user clicked on the background. This is a rectangular // selection (maybe with the shift key down). if ((e.getModifiers() & InputEvent.SHIFT_MASK) == 0) { Action act = SelectionActions.dropAll(sel); if (act != null) { proj.doAction(act); } } setState(proj, RECT_SELECT); proj.repaintCanvas(); }
@Override public void mouseReleased(Canvas canvas, Graphics g, MouseEvent e) { Project proj = canvas.getProject(); if (state == MOVING) { setState(proj, IDLE); computeDxDy(proj, e, g); int dx = curDx; int dy = curDy; if (dx != 0 || dy != 0) { if (!proj.getLogisimFile().contains(canvas.getCircuit())) { canvas.setErrorMessage(Strings.getter("cannotModifyError")); } else if (proj.getSelection().hasConflictWhenMoved(dx, dy)) { canvas.setErrorMessage(Strings.getter("exclusiveError")); } else { boolean connect = shouldConnect(canvas, e.getModifiersEx()); drawConnections = false; ReplacementMap repl; if (connect) { MoveGesture gesture = moveGesture; if (gesture == null) { gesture = new MoveGesture( new MoveRequestHandler(canvas), canvas.getCircuit(), canvas.getSelection().getAnchoredComponents()); } canvas.setErrorMessage(new ComputingMessage(dx, dy), COLOR_COMPUTING); MoveResult result = gesture.forceRequest(dx, dy); clearCanvasMessage(canvas, dx, dy); repl = result.getReplacementMap(); } else { repl = null; } Selection sel = proj.getSelection(); proj.doAction(SelectionActions.translate(sel, dx, dy, repl)); } } moveGesture = null; proj.repaintCanvas(); } else if (state == RECT_SELECT) { Bounds bds = Bounds.create(start).add(start.getX() + curDx, start.getY() + curDy); Circuit circuit = canvas.getCircuit(); Selection sel = proj.getSelection(); Collection<Component> in_sel = sel.getComponentsWithin(bds, g); for (Component comp : circuit.getAllWithin(bds, g)) { if (!in_sel.contains(comp)) sel.add(comp); } Action act = SelectionActions.drop(sel, in_sel); if (act != null) { proj.doAction(act); } setState(proj, IDLE); proj.repaintCanvas(); } }
@Override public void keyPressed(Canvas canvas, KeyEvent e) { if (state == MOVING && e.getKeyCode() == KeyEvent.VK_SHIFT) { handleMoveDrag(canvas, curDx, curDy, e.getModifiersEx()); } else { switch (e.getKeyCode()) { case KeyEvent.VK_BACK_SPACE: case KeyEvent.VK_DELETE: if (!canvas.getSelection().isEmpty()) { Action act = SelectionActions.clear(canvas.getSelection()); canvas.getProject().doAction(act); e.consume(); } break; default: processKeyEvent(canvas, e, KeyConfigurationEvent.KEY_PRESSED); } } }