001: import java.awt.*;
002: import java.awt.geom.*;
003: import java.util.*;
004: import javax.swing.*;
005:
006: /**
007: A tool bar that contains node and edge prototype icons.
008: Exactly one icon is selected at any time.
009: */
010: public class ToolBar extends JPanel
011: {
012: /**
013: Constructs a tool bar with no icons.
014: */
015: public ToolBar(Graph graph)
016: {
017: group = new ButtonGroup();
018: tools = new ArrayList();
019:
020: JToggleButton grabberButton = new JToggleButton(new
021: Icon()
022: {
023: public int getIconHeight() { return BUTTON_SIZE; }
024: public int getIconWidth() { return BUTTON_SIZE; }
025: public void paintIcon(Component c, Graphics g,
026: int x, int y)
027: {
028: Graphics2D g2 = (Graphics2D) g;
029: GraphPanel.drawGrabber(g2, x + OFFSET, y + OFFSET);
030: GraphPanel.drawGrabber(g2, x + OFFSET, y + BUTTON_SIZE - OFFSET);
031: GraphPanel.drawGrabber(g2, x + BUTTON_SIZE - OFFSET, y + OFFSET);
032: GraphPanel.drawGrabber(g2, x + BUTTON_SIZE - OFFSET, y + BUTTON_SIZE - OFFSET);
033: }
034: });
035: group.add(grabberButton);
036: add(grabberButton);
037: grabberButton.setSelected(true);
038: tools.add(null);
039:
040: Node[] nodeTypes = graph.getNodePrototypes();
041: for (int i = 0; i < nodeTypes.length; i++)
042: add(nodeTypes[i]);
043: Edge[] edgeTypes = graph.getEdgePrototypes();
044: for (int i = 0; i < edgeTypes.length; i++)
045: add(edgeTypes[i]);
046: }
047:
048: /**
049: Gets the node or edge prototype that is associated with
050: the currently selected button
051: @return a Node or Edge prototype
052: */
053: public Object getSelectedTool()
054: {
055: for (int i = 0; i < tools.size(); i++)
056: {
057: JToggleButton button = (JToggleButton) getComponent(i);
058: if (button.isSelected()) return tools.get(i);
059: }
060: return null;
061: }
062:
063: /**
064: Adds a node to the tool bar.
065: @param n the node to add
066: */
067: public void add(final Node n)
068: {
069: JToggleButton button = new JToggleButton(new
070: Icon()
071: {
072: public int getIconHeight() { return BUTTON_SIZE; }
073: public int getIconWidth() { return BUTTON_SIZE; }
074: public void paintIcon(Component c, Graphics g,
075: int x, int y)
076: {
077: double width = n.getBounds().getWidth();
078: double height = n.getBounds().getHeight();
079: Graphics2D g2 = (Graphics2D) g;
080: double scaleX = (BUTTON_SIZE - OFFSET)/ width;
081: double scaleY = (BUTTON_SIZE - OFFSET)/ height;
082: double scale = Math.min(scaleX, scaleY);
083:
084: AffineTransform oldTransform = g2.getTransform();
085: g2.translate(x, y);
086: g2.scale(scale, scale);
087: g2.translate(Math.max((height - width) / 2, 0), Math.max((width - height) / 2, 0));
088: g2.setColor(Color.black);
089: n.draw(g2);
090: g2.setTransform(oldTransform);
091: }
092: });
093: group.add(button);
094: add(button);
095: tools.add(n);
096: }
097:
098: /**
099: Adds an edge to the tool bar.
100: @param n the edge to add
101: */
102: public void add(final Edge e)
103: {
104: JToggleButton button = new JToggleButton(new
105: Icon()
106: {
107: public int getIconHeight() { return BUTTON_SIZE; }
108: public int getIconWidth() { return BUTTON_SIZE; }
109: public void paintIcon(Component c, Graphics g,
110: int x, int y)
111: {
112: Graphics2D g2 = (Graphics2D) g;
113: PointNode p = new PointNode();
114: p.translate(OFFSET, OFFSET);
115: PointNode q = new PointNode();
116: q.translate(BUTTON_SIZE - OFFSET, BUTTON_SIZE - OFFSET);
117: e.connect(p, q);
118: g2.translate(x, y);
119: g2.setColor(Color.black);
120: e.draw(g2);
121: g2.translate(-x, -y);
122: }
123: });
124: group.add(button);
125: add(button);
126: tools.add(e);
127: }
128:
129: private ButtonGroup group;
130: private ArrayList tools;
131:
132: private static final int BUTTON_SIZE = 25;
133: private static final int OFFSET = 4;
134: }