1 //Frame for the Sketcher application
2 import javax.swing.*;3 import javax.swing.border.*;4 import java.awt.event.*;5 import java.awt.*;6
7 import static java.awt.event.InputEvent.*;8 import static java.awt.Color.*;9 import static Constants.SketcherConstants.*;10 import static javax.swing.Action.*;11
12 @SuppressWarnings("serial")13 public class SketcherFrame extendsJFrame {14 //Constructor
15 publicSketcherFrame(String title) {16 setTitle(title); //Set the window title
17 setJMenuBar(menuBar); //Add the menu bar to the window
18 setDefaultCloseOperation(EXIT_ON_CLOSE); //Default is exit the application
19
20 createFileMenu(); //Create the File menu
21 createElementMenu(); //Create the element menu
22 createColorMenu(); //Create the element menu
23 createToolbar();24 toolBar.setRollover(true);25 getContentPane().add(toolBar, BorderLayout.NORTH);26 }27
28 //Create File menu item actions
29 private voidcreateFileMenuActions() {30 newAction = new FileAction("New", 'N', CTRL_DOWN_MASK);31 openAction = new FileAction("Open", 'O', CTRL_DOWN_MASK);32 closeAction = new FileAction("Close");33 saveAction = new FileAction("Save", 'S', CTRL_DOWN_MASK);34 saveAsAction = new FileAction("Save As...");35 printAction = new FileAction("Print", 'P', CTRL_DOWN_MASK);36 exitAction = new FileAction("Exit", 'X', CTRL_DOWN_MASK);37
38 //Initialize the array
39 FileAction[] actions ={openAction, closeAction, saveAction, saveAsAction, printAction, exitAction};40 fileActions =actions;41 //Add toolbar icons
42 newAction.putValue(LARGE_ICON_KEY, NEW24);43 openAction.putValue(LARGE_ICON_KEY, OPEN24);44 saveAction.putValue(LARGE_ICON_KEY, SAVE24);45 saveAsAction.putValue(LARGE_ICON_KEY, SAVEAS24);46 printAction.putValue(LARGE_ICON_KEY, PRINT24);47
48 //Add menu item icons
49 newAction.putValue(SMALL_ICON, NEW16);50 openAction.putValue(SMALL_ICON, OPEN16);51 saveAction.putValue(SMALL_ICON, SAVE16);52 saveAsAction.putValue(SMALL_ICON,SAVEAS16);53 printAction.putValue(SMALL_ICON, PRINT16);54
55 //Add tooltip text
56 newAction.putValue(SHORT_DESCRIPTION, "Create a new sketch");57 openAction.putValue(SHORT_DESCRIPTION, "Read a sketch from a file");58 closeAction.putValue(SHORT_DESCRIPTION, "Close the current sketch");59 saveAction.putValue(SHORT_DESCRIPTION, "Save the current sketch to file");60 saveAsAction.putValue(SHORT_DESCRIPTION, "Save the current sketch to a new file");61 printAction.putValue(SHORT_DESCRIPTION, "Print the current sketch");62 exitAction.putValue(SHORT_DESCRIPTION, "Exit Sketcher");63 }64
65 //Create the File menu
66 private voidcreateFileMenu() {67 JMenu fileMenu = new JMenu("File"); //Create File menu
68 fileMenu.setMnemonic('F'); //Create shortcut
69 createFileMenuActions(); //Create Actions for File menu item70
71 //Construct the file drop-down menu
72 fileMenu.add(newAction); //New Sketch menu item
73 fileMenu.add(openAction); //Open sketch menu item
74 fileMenu.add(closeAction); //Close sketch menu item
75 fileMenu.addSeparator(); //Add separator
76 fileMenu.add(saveAction); //Save sketch to file
77 fileMenu.add(saveAsAction); //Save As menu item
78 fileMenu.addSeparator(); //Add separator
79 fileMenu.add(printAction); //Print sketch menu item
80 fileMenu.addSeparator(); //Add separator
81 fileMenu.add(exitAction); //Print sketch menu item
82 menuBar.add(fileMenu); //Add the file menu
83 }84
85 //Create Element menu actions
86 private voidcreateElementTypeActions() {87 lineAction = new TypeAction("Line", LINE, 'L', CTRL_DOWN_MASK);88 rectangleAction = new TypeAction("Rectangle", RECTANGLE, 'R', CTRL_DOWN_MASK);89 circleAction = new TypeAction("Circle", CIRCLE,'C', CTRL_DOWN_MASK);90 curveAction = new TypeAction("Curve", CURVE,'U', CTRL_DOWN_MASK);91
92 //Initialize the array
93 TypeAction[] actions ={lineAction, rectangleAction, circleAction, curveAction};94 typeActions =actions;95
96 //Add toolbar icons
97 lineAction.putValue(LARGE_ICON_KEY, LINE24);98 rectangleAction.putValue(LARGE_ICON_KEY, RECTANGLE24);99 circleAction.putValue(LARGE_ICON_KEY, CIRCLE24);100 curveAction.putValue(LARGE_ICON_KEY, CURVE24);101
102 //Add menu item icons
103 lineAction.putValue(SMALL_ICON, LINE16);104 rectangleAction.putValue(SMALL_ICON, RECTANGLE16);105 circleAction.putValue(SMALL_ICON, CIRCLE16);106 curveAction.putValue(SMALL_ICON, CURVE16);107
108 //Add tooltip text
109 lineAction.putValue(SHORT_DESCRIPTION, "Draw lines");110 rectangleAction.putValue(SHORT_DESCRIPTION, "Draw rectangles");111 circleAction.putValue(SHORT_DESCRIPTION, "Draw circles");112 curveAction.putValue(SHORT_DESCRIPTION, "Draw curves");113 }114
115 //Create the Elements menu
116 private voidcreateElementMenu() {117 createElementTypeActions();118 elementMenu = new JMenu("Elements"); //Create Elements menu
119 elementMenu.setMnemonic('E'); //Create shortcut
120 createRadioButtonDropDown(elementMenu, typeActions, lineAction);121 menuBar.add(elementMenu); //Add the element menu
122 }123
124 //Create Color menu actions
125 private voidcreateElementColorActions() {126 redAction = new ColorAction("Red", RED, 'R', CTRL_DOWN_MASK|ALT_DOWN_MASK);127 yellowAction = new ColorAction("Yellow", YELLOW, 'Y', CTRL_DOWN_MASK|ALT_DOWN_MASK);128 greenAction = new ColorAction("Green", GREEN, 'G', CTRL_DOWN_MASK|ALT_DOWN_MASK);129 blueAction = new ColorAction("Blue", BLUE, 'B', CTRL_DOWN_MASK|ALT_DOWN_MASK);130
131 //Initialize the array
132 ColorAction[] actions ={redAction, greenAction, blueAction, yellowAction};133 colorActions =actions;134
135 //Add toolbar icons
136 redAction.putValue(LARGE_ICON_KEY, RED24);137 greenAction.putValue(LARGE_ICON_KEY, GREEN24);138 blueAction.putValue(LARGE_ICON_KEY, BLUE24);139 yellowAction.putValue(LARGE_ICON_KEY, YELLOW24);140
141 //Add menu item icons
142 redAction.putValue(SMALL_ICON, RED16);143 greenAction.putValue(SMALL_ICON, GREEN16);144 blueAction.putValue(SMALL_ICON, BLUE16);145 yellowAction.putValue(SMALL_ICON, YELLOW16);146
147 //Add tooltip text
148 redAction.putValue(SHORT_DESCRIPTION, "Draw in red");149 blueAction.putValue(SHORT_DESCRIPTION, "Draw in blue");150 greenAction.putValue(SHORT_DESCRIPTION, "Draw in green");151 yellowAction.putValue(SHORT_DESCRIPTION, "Draw in yellow");152 }153
154 //Create the Color menu
155 private voidcreateColorMenu() {156 createElementColorActions();157 colorMenu = new JMenu("Color"); //Create Elements menu
158 colorMenu.setMnemonic('C'); //Create shortcut
159 createRadioButtonDropDown(colorMenu, colorActions, blueAction);160 menuBar.add(colorMenu); //Add the color menu
161 }162
163 //Menu creation helper
164 private voidcreateRadioButtonDropDown(JMenu menu, Action[] actions, Action selected) {165 ButtonGroup group = newButtonGroup();166 JRadioButtonMenuItem item = null;167 for(Action action : actions) {168 group.add(menu.add(item = newJRadioButtonMenuItem(action)));169 if(action ==selected) {170 item.setSelected(true); //This is default selected
171 }172 }173 }174
175 //Create toolbar buttons on the toolbar
176 private voidcreateToolbar() {177 for(FileAction action: fileActions){178 if(action != exitAction && action !=closeAction)179 addToolbarButton(action); //Add the toolbar button
180 }181 toolBar.addSeparator();182
183 //Create Color menu buttons
184 for(ColorAction action:colorActions){185 addToolbarButton(action); //Add the toolbar button
186 }187
188 toolBar.addSeparator();189
190 //Create Elements menu buttons
191 for(TypeAction action:typeActions){192 addToolbarButton(action); //Add the toolbar button
193 }194 }195
196 //Create and add a toolbar button
197 private voidaddToolbarButton(Action action) {198 JButton button = new JButton(action); //Create from Action
199 button.setBorder(BorderFactory.createCompoundBorder( //Add button border
200 new EmptyBorder(2,5,5,2), //Outside border
201 BorderFactory.createRaisedBevelBorder())); //Inside border
202 button.setHideActionText(true); //No label on the button
203 toolBar.add(button); //Add the toolbar button
204 }205
206 //Set radio button menu checks
207 private voidsetChecks(JMenu menu, Object eventSource) {208 if(eventSource instanceofJButton){209 JButton button =(JButton)eventSource;210 Action action =button.getAction();211 for(int i = 0 ; i < menu.getItemCount() ; ++i) {212 JMenuItem item =menu.getItem(i);213 item.setSelected(item.getAction() ==action);214 }215 }216 }217
218 //Inner class defining Action objects for File menu items
219 class FileAction extendsAbstractAction {220 //Create action with a name
221 FileAction(String name) {222 super(name);223 }224
225 //Create action with a name and accelerator
226 FileAction(String name, char ch, intmodifiers) {227 super(name);228 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));229
230 //Now find the character to underline
231 int index =name.toUpperCase().indexOf(ch);232 if(index != -1) {233 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);234 }235 }236
237 //Event handler
238 public voidactionPerformed(ActionEvent e) {239 //You will add action code here eventually...
240 }241 }242
243 //Inner class defining Action objects for Element type menu items
244 class TypeAction extendsAbstractAction {245 //Create action with just a name property
246 TypeAction(String name, inttypeID) {247 super(name);248 this.typeID =typeID;249 }250
251 //Create action with a name and an accelerator
252 private TypeAction(String name,int typeID, char ch, intmodifiers) {253 this(name, typeID);254 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));255
256 //Now find the character to underline
257 int index =name.toUpperCase().indexOf(ch);258 if(index != -1) {259 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);260 }261 }262
263 public voidactionPerformed(ActionEvent e) {264 elementType =typeID;265 setChecks(elementMenu, e.getSource());266 }267
268 private inttypeID;269 }270
271 //Handles color menu items
272 class ColorAction extendsAbstractAction {273 //Create an action with a name and a color
274 publicColorAction(String name, Color color) {275 super(name);276 this.color =color;277 }278
279 //Create an action with a name, a color, and an accelerator
280 public ColorAction(String name, Color color, char ch, intmodifiers) {281 this(name, color);282 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));283
284 //Now find the character to underline
285 int index =name.toUpperCase().indexOf(ch);286 if(index != -1) {287 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);288 }289 }290
291 public voidactionPerformed(ActionEvent e) {292 elementColor =color;293 setChecks(colorMenu, e.getSource());294 }295
296 privateColor color;297 }298
299 //File actions
300 privateFileAction newAction, openAction, closeAction, saveAction, saveAsAction, printAction, exitAction;301 private FileAction[] fileActions; //File actions as an array302
303 //Element type actions
304 privateTypeAction lineAction, rectangleAction, circleAction, curveAction;305 private TypeAction[] typeActions; //Type actions as an array306
307 //Element color actions
308 privateColorAction redAction, yellowAction,greenAction, blueAction;309 private ColorAction[] colorActions; //Color actions as an array
310
311 private JMenuBar menuBar = new JMenuBar(); //Window menu bar
312 private JMenu elementMenu; //Elements menu
313 private JMenu colorMenu; //Color menu
314
315 private Color elementColor = DEFAULT_ELEMENT_COLOR; //Current element color
316 private int elementType = DEFAULT_ELEMENT_TYPE; //Current element type
317 private JToolBar toolBar = new JToolBar(); //Window toolbar
318 }