/* * @(#)NodeFigure.java * * Project: JHotdraw - a GUI framework for technical drawings * http://www.jhotdraw.org * http://jhotdraw.sourceforge.net * Copyright: (c) by the original author(s) and all contributors * License: Lesser GNU Public License (LGPL) * http://www.opensource.org/licenses/lgpl-license.html */ package org.jhotdraw.samples.offsetConnectors; import java.awt.Font; import java.awt.Graphics; import java.awt.Point; import java.awt.Rectangle; import java.util.Iterator; import java.util.List; import org.jhotdraw.figures.LineConnection; import org.jhotdraw.figures.TextFigure; import org.jhotdraw.framework.ConnectionFigure; import org.jhotdraw.framework.Connector; import org.jhotdraw.framework.HandleEnumeration; import org.jhotdraw.standard.ConnectionHandle; import org.jhotdraw.standard.HandleEnumerator; import org.jhotdraw.standard.LocatorConnector; import org.jhotdraw.standard.NullHandle; import org.jhotdraw.standard.RelativeLocator; import org.jhotdraw.util.CollectionsFactory; import org.jhotdraw.util.Geom; public class NodeFigure extends TextFigure { private static final int BORDER = 6; private List fConnectors; private boolean fConnectorsVisible; public NodeFigure() { initialize(); fConnectors = null; } public Rectangle displayBox() { Rectangle box = super.displayBox(); int d = BORDER; box.grow(d, d); return box; } public boolean containsPoint(int x, int y) { // add slop for connectors if (fConnectorsVisible) { Rectangle r = displayBox(); int d = LocatorConnector.SIZE / 2; r.grow(d, d); return r.contains(x, y); } return super.containsPoint(x, y); } private void drawBorder(Graphics g) { Rectangle r = displayBox(); g.setColor(getFrameColor()); g.drawRect(r.x, r.y, r.width - 1, r.height - 1); } public void draw(Graphics g) { super.draw(g); drawBorder(g); drawConnectors(g); } public HandleEnumeration handles() { ConnectionFigure prototype = new LineConnection(); List handles = CollectionsFactory.current().createList(); handles.add(new ConnectionHandle(this, RelativeLocator.east(), prototype)); handles.add(new ConnectionHandle(this, RelativeLocator.west(), prototype)); handles.add(new ConnectionHandle(this, RelativeLocator.south(), prototype)); handles.add(new ConnectionHandle(this, RelativeLocator.north(), prototype)); handles.add(new NullHandle(this, RelativeLocator.southEast())); handles.add(new NullHandle(this, RelativeLocator.southWest())); handles.add(new NullHandle(this, RelativeLocator.northEast())); handles.add(new NullHandle(this, RelativeLocator.northWest())); return new HandleEnumerator(handles); } private void drawConnectors(Graphics g) { if (fConnectorsVisible) { Iterator connectorsIterator = getConnectors().iterator(); while (connectorsIterator.hasNext()) ((Connector) connectorsIterator.next()).draw(g); } } /** */ public void connectorVisibility(boolean isVisible) { fConnectorsVisible = isVisible; invalidate(); } /** */ public Connector connectorAt(int x, int y) { return findConnector(x, y); } /** */ private List getConnectors() { if (fConnectors == null) { createConnectors(); } return fConnectors; } private void createConnectors() { fConnectors = CollectionsFactory.current().createList(4); fConnectors.add(new LocatorConnector(this, RelativeLocator.north())); fConnectors.add(new LocatorConnector(this, RelativeLocator.south())); fConnectors.add(new LocatorConnector(this, RelativeLocator.west())); fConnectors.add(new LocatorConnector(this, RelativeLocator.east())); } private Connector findConnector(int x, int y) { // return closest connector long min = Long.MAX_VALUE; Connector closest = null; Iterator connectorsIterator = getConnectors().iterator(); while (connectorsIterator.hasNext()) { Connector c = (Connector) connectorsIterator.next(); Point p2 = Geom.center(c.displayBox()); long d = Geom.length2(x, y, p2.x, p2.y); if (d < min) { min = d; closest = c; } } return closest; } private void initialize() { setText("node"); Font fb = new Font("Helvetica", Font.BOLD, 12); setFont(fb); createConnectors(); } }