sclass CirclesRelater extends MouseAdapter { Canvas canvas; CirclesAndLines cal; Circle circle; Point p; componentPopupMenu_Adapter popupMenu; int minDist = 20; *(Canvas *canvas, CirclesAndLines *cal) { if (containsInstance(canvas.tools, CirclesRelater)) ret; canvas.tools.add(this); canvas.addMouseListener(this); canvas.addMouseMotionListener(this); popupMenu = findMouseListener(canvas, componentPopupMenu_Adapter); canvas.removeMouseListener(popupMenu); } public void mousePressed(MouseEvent e) { if (e.getButton() != MouseEvent.BUTTON1) circle = findCircle(p = canvas.pointFromEvent(e)); } public void mouseDragged(MouseEvent e) { } public void mouseReleased(MouseEvent e) { Point pt = canvas.pointFromEvent(e); if (circle == null || pointDistance(new Pt(p), new Pt(pt)) < minDist) { popup.displayMenu(e); ret; } if (circle != null) { final Circle circle2 = findCircle(pt); final Circle circle1 = circle; if (circle1 != circle2 && circle2 != null) { final JTextField tf = jTextField(); showFormTitled("Link nodes", "Node 1", circle1.text, "Connection Name", tf, "Node 2", circle2.text, r { cal.arrow(circle1, toUpper(getTextTrim(tf)), circle2); canvas.update(); }); } } circle = null; } Circle findCircle(Pt p) { ret cal.findCircle(canvas, p); } }