private void handleMoveDrag(Canvas canvas, int dx, int dy, int modsEx) { boolean connect = shouldConnect(canvas, modsEx); drawConnections = connect; if (connect) { MoveGesture gesture = moveGesture; if (gesture == null) { gesture = new MoveGesture( new MoveRequestHandler(canvas), canvas.getCircuit(), canvas.getSelection().getAnchoredComponents()); moveGesture = gesture; } if (dx != 0 || dy != 0) { boolean queued = gesture.enqueueRequest(dx, dy); if (queued) { canvas.setErrorMessage(new ComputingMessage(dx, dy), COLOR_COMPUTING); // maybe CPU scheduled led the request to be satisfied // just before the "if(queued)" statement. In any case, it // doesn't hurt to check to ensure the message belongs. if (gesture.findResult(dx, dy) != null) { clearCanvasMessage(canvas, dx, dy); } } } } canvas.repaint(); }
@Override public Set<Component> getHiddenComponents(Canvas canvas) { if (state == MOVING) { int dx = curDx; int dy = curDy; if (dx == 0 && dy == 0) { return null; } Set<Component> sel = canvas.getSelection().getComponents(); MoveGesture gesture = moveGesture; if (gesture != null && drawConnections) { MoveResult result = gesture.findResult(dx, dy); if (result != null) { HashSet<Component> ret = new HashSet<Component>(sel); ret.addAll(result.getReplacementMap().getRemovals()); return ret; } } return sel; } else { return null; } }
@Override public void draw(Canvas canvas, ComponentDrawContext context) { Project proj = canvas.getProject(); int dx = curDx; int dy = curDy; if (state == MOVING) { proj.getSelection().drawGhostsShifted(context, dx, dy); MoveGesture gesture = moveGesture; if (gesture != null && drawConnections && (dx != 0 || dy != 0)) { MoveResult result = gesture.findResult(dx, dy); if (result != null) { Collection<Wire> wiresToAdd = result.getWiresToAdd(); Graphics g = context.getGraphics(); GraphicsUtil.switchToWidth(g, 3); g.setColor(Color.GRAY); for (Wire w : wiresToAdd) { Location loc0 = w.getEnd0(); Location loc1 = w.getEnd1(); g.drawLine(loc0.getX(), loc0.getY(), loc1.getX(), loc1.getY()); } GraphicsUtil.switchToWidth(g, 1); g.setColor(COLOR_UNMATCHED); for (Location conn : result.getUnconnectedLocations()) { int connX = conn.getX(); int connY = conn.getY(); g.fillOval(connX - 3, connY - 3, 6, 6); g.fillOval(connX + dx - 3, connY + dy - 3, 6, 6); } } } } else if (state == RECT_SELECT) { int left = start.getX(); int right = left + dx; if (left > right) { int i = left; left = right; right = i; } int top = start.getY(); int bot = top + dy; if (top > bot) { int i = top; top = bot; bot = i; } Graphics gBase = context.getGraphics(); int w = right - left - 1; int h = bot - top - 1; if (w > 2 && h > 2) { gBase.setColor(BACKGROUND_RECT_SELECT); gBase.fillRect(left + 1, top + 1, w - 1, h - 1); } Circuit circ = canvas.getCircuit(); Bounds bds = Bounds.create(left, top, right - left, bot - top); for (Component c : circ.getAllWithin(bds)) { Location cloc = c.getLocation(); Graphics gDup = gBase.create(); context.setGraphics(gDup); c.getFactory() .drawGhost(context, COLOR_RECT_SELECT, cloc.getX(), cloc.getY(), c.getAttributeSet()); gDup.dispose(); } gBase.setColor(COLOR_RECT_SELECT); GraphicsUtil.switchToWidth(gBase, 2); if (w < 0) w = 0; if (h < 0) h = 0; gBase.drawRect(left, top, w, h); } }