public String getToolTipText(Point p) { ConnectionFigure f = (ConnectionFigure) getOwner(); if (f.getLiner() == null && savedLiner == null) { ResourceBundleUtil labels = ResourceBundleUtil.getLAFBundle("org.jhotdraw.draw.Labels"); BezierPath.Node node = getBezierNode(); return (node == null) ? null : labels.getFormatted( "bezierNodeHandle.tip", labels.getFormatted( (node.getMask() == 0) ? "bezierNode.linearNode" : ((node.getMask() == BezierPath.C1C2_MASK) ? "bezierNode.cubicNode" : "bezierNode.quadraticNode"))); } else { return null; } }
public Point2D.Double findEnd(ConnectionFigure connection) { Figure endFigure = connection.getEndConnector().getOwner(); Point2D.Double from; if (connection.getPointCount() <= 2 || connection.getLiner() != null) { if (connection.getStartConnector() == null) { from = connection.getStartPoint(); } else { Rectangle2D.Double r1 = getConnectorTarget(connection.getStartConnector().getOwner()).getBounds(); from = new Point2D.Double(r1.x + r1.width / 2, r1.y + r1.height / 2); } } else { from = connection.getPoint(connection.getPointCount() - 2); } return chop(endFigure, from); }
/** * Connects the figure to the new connectableConnector. If there is no new connectableConnector * the connection reverts to its original one. */ public void trackEnd(Point anchor, Point lead, int modifiersEx) { ConnectionFigure f = getOwner(); // Change node type if ((modifiersEx & (InputEvent.META_DOWN_MASK | InputEvent.CTRL_DOWN_MASK | InputEvent.ALT_DOWN_MASK | InputEvent.SHIFT_DOWN_MASK)) != 0 && (modifiersEx & InputEvent.BUTTON2_DOWN_MASK) == 0) { f.willChange(); int index = getBezierNodeIndex(); BezierPath.Node v = f.getNode(index); if (index > 0 && index < f.getNodeCount()) { v.mask = (v.mask + 3) % 4; } else if (index == 0) { v.mask = ((v.mask & BezierPath.C2_MASK) == 0) ? BezierPath.C2_MASK : 0; } else { v.mask = ((v.mask & BezierPath.C1_MASK) == 0) ? BezierPath.C1_MASK : 0; } f.setNode(index, v); f.changed(); fireHandleRequestSecondaryHandles(); } Point2D.Double p = view.viewToDrawing(lead); view.getConstrainer().constrainPoint(p); Connector target = findConnectionTarget(p, view.getDrawing()); if (target == null) { target = savedTarget; } setLocation(p); if (target != savedTarget) { disconnect(); connect(target); } getOwner().setLiner(savedLiner); getOwner().updateConnection(); connectableConnector = null; connectors = Collections.emptyList(); }
public void lineout(ConnectionFigure figure) { BezierPath path = ((LineConnectionFigure) figure).getBezierPath(); Connector start = figure.getStartConnector(); Connector end = figure.getEndConnector(); if (start == null || end == null || path == null) { return; } // Special treatment if the connection connects the same figure if (figure.getStartFigure() == figure.getEndFigure()) { // Ensure path has exactly 4 nodes while (path.size() < 4) { path.add(1, new BezierPath.Node(0, 0)); } while (path.size() > 4) { path.remove(1); } Point2D.Double sp = start.findStart(figure); Point2D.Double ep = end.findEnd(figure); Rectangle2D.Double sb = start.getBounds(); Rectangle2D.Double eb = end.getBounds(); int soutcode = sb.outcode(sp); if (soutcode == 0) { soutcode = Geom.outcode(sb, eb); } int eoutcode = eb.outcode(ep); if (eoutcode == 0) { eoutcode = Geom.outcode(sb, eb); } path.get(0).moveTo(sp); path.get(path.size() - 1).moveTo(ep); switch (soutcode) { case Geom.OUT_TOP: eoutcode = Geom.OUT_LEFT; break; case Geom.OUT_RIGHT: eoutcode = Geom.OUT_TOP; break; case Geom.OUT_BOTTOM: eoutcode = Geom.OUT_RIGHT; break; case Geom.OUT_LEFT: eoutcode = Geom.OUT_BOTTOM; break; default: eoutcode = Geom.OUT_TOP; soutcode = Geom.OUT_RIGHT; break; } // path.get(0).moveTo(sp.x + shoulderSize, sp.y); path.get(0).mask = BezierPath.C2_MASK; if ((soutcode & Geom.OUT_RIGHT) != 0) { path.get(0).x[2] = sp.x + shoulderSize; path.get(0).y[2] = sp.y; } else if ((soutcode & Geom.OUT_LEFT) != 0) { path.get(0).x[2] = sp.x - shoulderSize; path.get(0).y[2] = sp.y; } else if ((soutcode & Geom.OUT_BOTTOM) != 0) { path.get(0).x[2] = sp.x; path.get(0).y[2] = sp.y + shoulderSize; } else { path.get(0).x[2] = sp.x; path.get(0).y[2] = sp.y - shoulderSize; } path.get(1).mask = BezierPath.C2_MASK; path.get(1).moveTo(sp.x + shoulderSize, (sp.y + ep.y) / 2); path.get(1).x[2] = sp.x + shoulderSize; path.get(1).y[2] = ep.y - shoulderSize; path.get(2).mask = BezierPath.C1_MASK; path.get(2).moveTo((sp.x + ep.x) / 2, ep.y - shoulderSize); path.get(2).x[1] = sp.x + shoulderSize; path.get(2).y[1] = ep.y - shoulderSize; path.get(3).mask = BezierPath.C1_MASK; if ((eoutcode & Geom.OUT_RIGHT) != 0) { path.get(3).x[1] = ep.x + shoulderSize; path.get(3).y[1] = ep.y; } else if ((eoutcode & Geom.OUT_LEFT) != 0) { path.get(3).x[1] = ep.x - shoulderSize; path.get(3).y[1] = ep.y; } else if ((eoutcode & Geom.OUT_BOTTOM) != 0) { path.get(3).x[1] = ep.x; path.get(3).y[1] = ep.y + shoulderSize; } else { path.get(3).x[1] = ep.x; path.get(3).y[1] = ep.y - shoulderSize; } } else { Point2D.Double sp = start.findStart(figure); Point2D.Double ep = end.findEnd(figure); path.clear(); if (sp.x == ep.x || sp.y == ep.y) { path.add(new BezierPath.Node(ep.x, ep.y)); } else { Rectangle2D.Double sb = start.getBounds(); sb.x += 5d; sb.y += 5d; sb.width -= 10d; sb.height -= 10d; Rectangle2D.Double eb = end.getBounds(); eb.x += 5d; eb.y += 5d; eb.width -= 10d; eb.height -= 10d; int soutcode = sb.outcode(sp); if (soutcode == 0) { soutcode = Geom.outcode(sb, eb); } int eoutcode = eb.outcode(ep); if (eoutcode == 0) { eoutcode = Geom.outcode(eb, sb); } if ((soutcode & (Geom.OUT_TOP | Geom.OUT_BOTTOM)) != 0 && (eoutcode & (Geom.OUT_TOP | Geom.OUT_BOTTOM)) != 0) { path.add( new BezierPath.Node( BezierPath.C2_MASK, sp.x, sp.y, sp.x, sp.y, sp.x, (sp.y + ep.y) / 2)); path.add( new BezierPath.Node( BezierPath.C1_MASK, ep.x, ep.y, ep.x, (sp.y + ep.y) / 2, ep.x, ep.y)); } else if ((soutcode & (Geom.OUT_LEFT | Geom.OUT_RIGHT)) != 0 && (eoutcode & (Geom.OUT_LEFT | Geom.OUT_RIGHT)) != 0) { path.add( new BezierPath.Node( BezierPath.C2_MASK, sp.x, sp.y, sp.x, sp.y, (sp.x + ep.x) / 2, sp.y)); path.add( new BezierPath.Node( BezierPath.C1_MASK, ep.x, ep.y, (sp.x + ep.x) / 2, ep.y, ep.x, ep.y)); } else if (soutcode == Geom.OUT_BOTTOM || soutcode == Geom.OUT_TOP) { path.add(new BezierPath.Node(BezierPath.C2_MASK, sp.x, sp.y, sp.x, sp.y, sp.x, ep.y)); path.add(new BezierPath.Node(ep.x, ep.y)); } else { path.add(new BezierPath.Node(BezierPath.C2_MASK, sp.x, sp.y, sp.x, sp.y, ep.x, sp.y)); path.add(new BezierPath.Node(ep.x, ep.y)); } } } path.invalidatePath(); }