1 //Frame for the Sketcher application
2 import javax.swing.*;3 import java.awt.event.*;4 import java.awt.*;5
6 import static java.awt.event.InputEvent.*;7 import static java.awt.AWTEvent.*;8 import static java.awt.Color.*;9 import static Constants.SketcherConstants.*;10
11 @SuppressWarnings("serial")12 public class SketcherFrame extendsJFrame {13 //Constructor
14 publicSketcherFrame(String title) {15 setTitle(title); //Set the window title
16 setJMenuBar(menuBar); //Add the menu bar to the window
17 setDefaultCloseOperation(EXIT_ON_CLOSE); //Default is exit the application
18
19 createFileMenu(); //Create the File menu
20 createElementMenu(); //Create the element menu
21 createColorMenu(); //Create the element menu
22 }23
24 //Create File menu item actions
25 private voidcreateFileMenuActions() {26 newAction = new FileAction("New", 'N', CTRL_DOWN_MASK);27 openAction = new FileAction("Open", 'O', CTRL_DOWN_MASK);28 closeAction = new FileAction("Close");29 saveAction = new FileAction("Save", 'S', CTRL_DOWN_MASK);30 saveAsAction = new FileAction("Save As...");31 printAction = new FileAction("Print", 'P', CTRL_DOWN_MASK);32 exitAction = new FileAction("Exit", 'X', CTRL_DOWN_MASK);33
34 //Initialize the array
35 FileAction[] actions ={openAction, closeAction, saveAction, saveAsAction, printAction, exitAction};36 fileActions =actions;37 }38
39 //Create the File menu
40 private voidcreateFileMenu() {41 JMenu fileMenu = new JMenu("File"); //Create File menu
42 fileMenu.setMnemonic('F'); //Create shortcut
43 createFileMenuActions(); //Create Actions for File menu item44
45 //Construct the file drop-down menu
46 fileMenu.add(newAction); //New Sketch menu item
47 fileMenu.add(openAction); //Open sketch menu item
48 fileMenu.add(closeAction); //Close sketch menu item
49 fileMenu.addSeparator(); //Add separator
50 fileMenu.add(saveAction); //Save sketch to file
51 fileMenu.add(saveAsAction); //Save As menu item
52 fileMenu.addSeparator(); //Add separator
53 fileMenu.add(printAction); //Print sketch menu item
54 fileMenu.addSeparator(); //Add separator
55 fileMenu.add(exitAction); //Print sketch menu item
56 menuBar.add(fileMenu); //Add the file menu
57 }58
59 //Create Element menu actions
60 private voidcreateElementTypeActions() {61 lineAction = new TypeAction("Line", LINE, 'L', CTRL_DOWN_MASK);62 rectangleAction = new TypeAction("Rectangle", RECTANGLE, 'R', CTRL_DOWN_MASK);63 circleAction = new TypeAction("Circle", CIRCLE,'C', CTRL_DOWN_MASK);64 curveAction = new TypeAction("Curve", CURVE,'U', CTRL_DOWN_MASK);65
66 //Initialize the array
67 TypeAction[] actions ={lineAction, rectangleAction, circleAction, curveAction};68 typeActions =actions;69 }70
71 //Create the Element menu
72 private voidcreateElementMenu() {73 createElementTypeActions();74 elementMenu = new JMenu("Elements"); //Create Elements menu
75 elementMenu.setMnemonic('E'); //Create shortcut
76 createRadioButtonDropDown(elementMenu, typeActions, lineAction);77 menuBar.add(elementMenu); //Add the element menu
78 }79
80 //Create Element menu actions
81 private voidcreateElementColorActions() {82 redAction = new ColorAction("Red", RED, 'R', CTRL_DOWN_MASK|ALT_DOWN_MASK);83 yellowAction = new ColorAction("Yellow", YELLOW, 'Y', CTRL_DOWN_MASK|ALT_DOWN_MASK);84 greenAction = new ColorAction("Green", GREEN, 'G', CTRL_DOWN_MASK|ALT_DOWN_MASK);85 blueAction = new ColorAction("Blue", BLUE, 'B', CTRL_DOWN_MASK|ALT_DOWN_MASK);86
87 //Initialize the array
88 ColorAction[] actions ={redAction, greenAction, blueAction, yellowAction};89 colorActions =actions;90 }91
92 //Create the Color menu
93 private voidcreateColorMenu() {94 createElementColorActions();95 colorMenu = new JMenu("Color"); //Create Elements menu
96 colorMenu.setMnemonic('C'); //Create shortcut
97 createRadioButtonDropDown(colorMenu, colorActions, blueAction);98 menuBar.add(colorMenu); //Add the color menu
99 }100
101 //Menu creation helper
102 private voidcreateRadioButtonDropDown(JMenu menu, Action[] actions, Action selected) {103 ButtonGroup group = newButtonGroup();104 JRadioButtonMenuItem item = null;105 for(Action action : actions) {106 group.add(menu.add(item = newJRadioButtonMenuItem(action)));107 if(action ==selected) {108 item.setSelected(true); //This is default selected
109 }110 }111 }112
113 //Inner class defining Action objects for File menu items
114 class FileAction extendsAbstractAction {115 //Create action with a name
116 FileAction(String name) {117 super(name);118 }119
120 //Create action with a name and accelerator
121 FileAction(String name, char ch, intmodifiers) {122 super(name);123 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));124
125 //Now find the character to underline
126 int index =name.toUpperCase().indexOf(ch);127 if(index != -1) {128 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);129 }130 }131
132 //Event handler
133 public voidactionPerformed(ActionEvent e) {134 //You will add action code here eventually...
135 }136 }137
138 //Inner class defining Action objects for Element type menu items
139 class TypeAction extendsAbstractAction {140 //Create action with just a name property
141 TypeAction(String name, inttypeID) {142 super(name);143 this.typeID =typeID;144 }145
146 //Create action with a name and an accelerator
147 private TypeAction(String name,int typeID, char ch, intmodifiers) {148 this(name, typeID);149 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));150
151 //Now find the character to underline
152 int index =name.toUpperCase().indexOf(ch);153 if(index != -1) {154 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);155 }156 }157
158 public voidactionPerformed(ActionEvent e) {159 elementType =typeID;160 }161
162 private inttypeID;163 }164
165 //Handles color menu items
166 class ColorAction extendsAbstractAction {167 //Create an action with a name and a color
168 publicColorAction(String name, Color color) {169 super(name);170 this.color =color;171 }172
173 //Create an action with a name, a color, and an accelerator
174 public ColorAction(String name, Color color, char ch, intmodifiers) {175 this(name, color);176 putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(ch, modifiers));177
178 //Now find the character to underline
179 int index =name.toUpperCase().indexOf(ch);180 if(index != -1) {181 putValue(DISPLAYED_MNEMONIC_INDEX_KEY, index);182 }183 }184
185 public voidactionPerformed(ActionEvent e) {186 elementColor =color;187
188 //This is temporary just to show it works...
189 getContentPane().setBackground(color);190 }191
192 privateColor color;193 }194
195 //File actions
196 privateFileAction newAction, openAction, closeAction, saveAction, saveAsAction, printAction, exitAction;197 private FileAction[] fileActions; //File actions as an array198
199 //Element type actions
200 privateTypeAction lineAction, rectangleAction, circleAction, curveAction;201 private TypeAction[] typeActions; //Type actions as an array202
203 //Element color actions
204 privateColorAction redAction, yellowAction,greenAction, blueAction;205 private ColorAction[] colorActions; //Color actions as an array
206
207 private JMenuBar menuBar = new JMenuBar(); //Window menu bar
208 private JMenu elementMenu; //Elements menu
209 private JMenu colorMenu; //Color menu
210 private Color elementColor = DEFAULT_ELEMENT_COLOR; //Current element color
211 private int elementType = DEFAULT_ELEMENT_TYPE; //Current element type
212 }