001 /*
002 * cs101 DefaultGameFrame
003 * $Id: DefaultGameFrame.java,v 1.2 2002/11/25 15:21:08 gus Exp $
004 *
005 * Developed for "Rethinking CS101", a project of Lynn Andrea Stein's AP Group.
006 * For more information, see <a href="http://www.ai.mit.edu/projects/cs101/">the
007 * CS101 homepage</a> or email <las@ai.mit.edu>.
008 *
009 * Copyright (C) 1999 Massachusetts Institute of Technology.
010 * Please do not redistribute without obtaining permission.
011 */
012
013 package cs101.awt;
014
015 import java.awt.*;
016 import java.awt.event.*;
017 import cs101.util.gamecontrol.GameControllable;
018
019
020 /**
021 * Simple top level Frame that deals with one component and sizing.
022 *
023 * <P>Copyright (c) 1999 Massachusetts Institute of Technology
024 *
025 * @author Paul K. Njoroge, pnjoroge@mit.edu
026 * @author Lynn Andrea Stein, las@ai.mit.edu
027 * @version $Id: DefaultGameFrame.java
028 */
029 public class DefaultGameFrame extends Frame {
030
031 /** The Component (view) to display. */
032 protected Component c;
033
034 /** The controls for this component. */
035 protected GameControllable gc ;
036
037 /** Default Frame dimensions. Initialized in constructor **/
038 private Dimension defaultDimension = new Dimension(500,400);
039
040 /**
041 * Creates a new frame relying on the supplied GameControllable to
042 * provide its behavior. If GameControllable is also a
043 * java.awt.Component, displays that component in this Frame.
044 *
045 * Note: This method does not show the frame. To show the frame,
046 * you must also call init().
047 *
048 * @see #init
049 * @see #DefaultGameFrame( GameControllable, Component, Dimension )
050 *
051 * @param gc GameControllable to use; may also be Component to show.
052 */
053 public DefaultGameFrame( GameControllable gc )
054 {
055 this( gc, (( gc instanceof Component ) ? ((Component) gc) : null) );
056 }
057
058 /**
059 * Creates a new frame surrounding the supplied component and
060 * relying on the GameControllable to provide its behavior.
061 * Does not show the frame. To show the frame, use init().
062 *
063 * If no size is supplied, this is where the default dimensions of
064 * this Frame are provided.
065 *
066 * @see #init
067 * @see #DefaultGameFrame( GameControllable, Component, Dimension )
068 *
069 * @param gc GameControllable that supplies its behavior.
070 * @param c Component to display.
071 */
072 public DefaultGameFrame(GameControllable gc,Component c)
073 {
074 this( gc, c, new Dimension(500,400) );
075 }
076
077 /**
078 * Creates a new frame of the specified size surrounding the
079 * supplied component and relying on the GameControllable to provide
080 * its behavior. Does not show the frame. To show the frame, use
081 * init().
082 *
083 * @see #init
084 * @see #DefaultGameFrame( GameControllable, Component, Dimension )
085 *
086 * @param gc GameControllable that supplies its behavior.
087 * @param c Component to display.
088 * @param x preferred horizontal dimension of the Frame (in pixels)
089 * @param y preferred vertical dimension of the Frame (in pixels)
090 */
091 public DefaultGameFrame(GameControllable gc, Component c, int x , int y)
092 {
093 this( gc, c, new Dimension(x,y) );
094 }
095
096 /**
097 * Creates a new frame of the specified size surrounding the
098 * supplied component and relying on the GameControllable to provide
099 * its behavior. Does not show the frame. To show the frame, use
100 * init().
101 *
102 * @see #init
103 *
104 * @param gc GameControllable that supplies its behavior.
105 * @param c Component to display.
106 * @param d preferred Dimension of the Frame (in pixels)
107 */
108 public DefaultGameFrame( GameControllable gc, Component c, Dimension d )
109 {
110 super( "GameFrame" );
111
112 this.c=c;
113 this.gc = gc;
114 this.defaultDimension=d;
115
116 this.addWindowListener(new WindowAdapter()
117 {
118 public void windowClosing(WindowEvent e)
119 {
120 DefaultGameFrame.this.shutdown();
121 }
122 });
123
124 MenuBar mbar = new MenuBar();
125 Menu gameMenu = new Menu( "gameControl", true);
126
127 gameMenu.add( createMenuItem ( "Start...",
128 new ActionListener(){
129 public void actionPerformed( ActionEvent event )
130 {
131 DefaultGameFrame.this.gc.start();
132 }}) );
133
134 gameMenu.add( createMenuItem ( "Stop....",
135 new ActionListener(){
136 public void actionPerformed( ActionEvent event )
137 {
138 DefaultGameFrame.this.gc.stop();
139 }}) );
140
141 gameMenu.add( createMenuItem ( "Reset...",
142 new ActionListener(){
143 public void actionPerformed( ActionEvent event )
144 {
145 DefaultGameFrame.this.gc.reset();
146 }}) );
147
148 /* gameMenu.add( createMenuItem ( "Pause...",
149 new ActionListener(){
150 public void actionPerformed( ActionEvent event )
151 {
152 DefaultGameFrame.this.gc.pause();
153 }}) );
154 */
155
156 gameMenu.add( createCheckboxMenuItem ( "Pause...",
157 new ItemListener(){
158 public void itemStateChanged(ItemEvent event )
159 {
160 CheckboxMenuItem item = (CheckboxMenuItem)event.getSource();
161 if (item.getState())
162 {
163 DefaultGameFrame.this.gc.pause();
164 }
165 else
166 {
167 DefaultGameFrame.this.gc.unpause();
168 }
169 }}) );
170
171
172 gameMenu.addSeparator();
173
174 gameMenu.add( createMenuItem ( "Quit....",
175 new ActionListener(){
176 public void actionPerformed( ActionEvent event )
177 {
178 DefaultGameFrame.this.shutdown();
179 }}) );
180
181 mbar.add( gameMenu );
182 this.setMenuBar( mbar );
183
184 this.pack();
185 }
186
187
188 /**
189 * private (macro-like) helper function to create and initialize the
190 * menu items.
191 *
192 * @see #DefaultGameFrame(
193 * @param itemLabel What this menu item is called
194 * @param itemListener Who this menu item should notify when selected
195 */
196 private final MenuItem createMenuItem( String itemLabel,
197 ActionListener itemListener )
198 {
199 MenuItem theItem = new MenuItem( itemLabel );
200 theItem.addActionListener( itemListener );
201 return theItem ;
202 }
203
204 private final CheckboxMenuItem createCheckboxMenuItem( String itemLabel,
205 ItemListener itemListener )
206 {
207 CheckboxMenuItem theItem = new CheckboxMenuItem( itemLabel );
208 theItem.addItemListener( itemListener );
209 return theItem ;
210 }
211
212
213
214 /**
215 * Helper method for what to do when this window goes away....
216 */
217 protected void shutdown()
218 {
219 this.dispose();
220 System.exit(0);
221 }
222
223 /**
224 * Make the frame appear
225 */
226 public void init() {
227 this.add("Center",c);
228 this.show();
229 }
230
231
232 /**
233 * This method overrides Frame's default getPreferredSize() in case
234 * component doesn't specify its own preferences. Without this
235 * method, the DefaultFrame has a disconcerting tendency to paint
236 * itself into a tiny little corner....
237 *
238 * @see java.awt.Frame#getPreferredSize()
239 *
240 * @return the default dimension supplied to (or by) the constructor
241 */
242 public Dimension getPreferredSize()
243 {
244 return this.defaultDimension;
245 }
246
247 }
248
249 /*
250 * $Log: DefaultGameFrame.java,v $
251 * Revision 1.2 2002/11/25 15:21:08 gus
252 * fix javadoc error.
253 *
254 * Revision 1.1.1.1 2002/06/05 21:56:32 root
255 * CS101 comes to Olin finally.
256 *
257 * Revision 1.5 2000/04/30 02:33:50 mharder
258 * Changed import statements to confirm to new cs101 packages.
259 *
260 * Revision 1.4 1999/08/16 16:56:48 jsmthng
261 * Updated to make JavaDoc happy.
262 *
263 * Revision 1.3 1999/08/04 21:35:15 pnjoroge
264 * I added a pause checkbox function onto the gamecontrol menu items list.
265 * To pause one clicks on the checkbox and to unPause one clicks it again.
266 *
267 * Revision 1.2 1999/07/27 18:55:54 las
268 * Patched up DefaultFrame (mostly docs) and DefaultGameFrame (aesthetics
269 * and docs).
270 *
271 * Capitalized the name of the GameControllable interface.
272 *
273 * Moved the other four interfaces (Pausable, Resetable, Startable,
274 * Stoppable) to cs101.util as they really have nothing to do w/awt or
275 * windowing in particular.
276 *
277 * Also, added unpause() to Pausable as it doesn't make much sense to be
278 * able to pause but not unpause something.
279 *
280 * Revision 1.1 1999/07/13 20:42:49 pnjoroge
281 * This is a new implementation of DefaultGameFrame. The frame has
282 * four functionalities that have to be implemented by the user . This
283 * include start, stop, reset and pause.
284 *
285 */
286