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