    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: }