001         package com.croftsoft.apps.ajgp.grap;
002         
003         import java.awt.*;
004         import java.awt.image.BufferStrategy;
005         import java.awt.event.*;
006         import java.io.*;
007         import java.security.*;
008         import javax.swing.*;
009    
010         import com.croftsoft.core.CroftSoftConstants;
011         import com.croftsoft.core.animation.AnimatedComponent;
012         import com.croftsoft.core.animation.ComponentAnimator;
013         import com.croftsoft.core.animation.ComponentPainter;
014         import com.croftsoft.core.animation.animator.FrameRateAnimator;
015         import com.croftsoft.core.animation.animator.NullComponentAnimator;
016         import com.croftsoft.core.animation.animator.TileAnimator;
017         import com.croftsoft.core.animation.component
018           .BufferStrategyAnimatedComponent;
019         import com.croftsoft.core.animation.painter.ColorPainter;
020         import com.croftsoft.core.animation.painter.NullComponentPainter;
021         import com.croftsoft.core.awt.image.ImageLib;
022         import com.croftsoft.core.gui.BufferCapabilitiesLib;
023         import com.croftsoft.core.gui.DisplayModeLib;
024         import com.croftsoft.core.gui.FullScreenToggler;
025         import com.croftsoft.core.gui.GraphicsDeviceLib;
026         import com.croftsoft.core.gui.WindowLib;
027         import com.croftsoft.core.lang.lifecycle.Lifecycle;
028    
029         /*********************************************************************
030         * Demonstration of full screen exclusive mode.
031         *
032         * @version
033         *   2003-08-01
034         * @since
035         *   2003-02-24
036         * @author
037         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
038         *********************************************************************/
039    
040         public final class  FullScreenDemo
041           extends JApplet
042           implements ComponentAnimator, Lifecycle
043         //////////////////////////////////////////////////////////////////////
044         //////////////////////////////////////////////////////////////////////
045         {
046           
047         //////////////////////////////////////////////////////////////////////
048         // Applet constants
049         //////////////////////////////////////////////////////////////////////
050    
051         private static final String  VERSION
052           = "2003-08-01";
053    
054         private static final String  TITLE
055           = "CroftSoft Full Screen Demo";
056    
057         private static final String  INFO
058           = "\n" + TITLE
059           + "\n" + CroftSoftConstants.COPYRIGHT
060           + "\n" + CroftSoftConstants.HOME_PAGE
061           + "\n" + "Version " + VERSION
062           + "\n";
063    
064         //////////////////////////////////////////////////////////////////////
065         // animation constants
066         //////////////////////////////////////////////////////////////////////
067    
068         private static final DisplayMode [ ]  DESIRED_DISPLAY_MODES
069           = new DisplayMode [ ] {
070             new DisplayMode ( 640, 480, 8, 85 ),
071             new DisplayMode ( 640, 480, 8, 75 ),
072             new DisplayMode ( 640, 480, 8, 70 ),
073             new DisplayMode ( 640, 480, 8,  0 ),
074             new DisplayMode ( 640, 480, 0,  0 ),
075             new DisplayMode ( 800, 600, 8, 85 ),
076             new DisplayMode ( 800, 600, 8, 75 ),
077             new DisplayMode ( 800, 600, 8, 70 ),
078             new DisplayMode ( 800, 600, 8,  0 ),
079             new DisplayMode ( 800, 600, 0,  0 ) };
080    
081         private static final int     BUFFER_COUNT = 2;
082    
083         private static final String  MEDIA_DIR    = "media/fullscreen/";
084    
085         private static final String  TILE_IMAGE_FILENAME
086           = "clear_brick_32x32.png";
087    
088         //////////////////////////////////////////////////////////////////////
089         // instance variables
090         //////////////////////////////////////////////////////////////////////
091    
092         private final BufferStrategy  bufferStrategy;
093    
094         //
095    
096         private AnimatedComponent  animatedComponent;
097    
098         private ComponentPainter   brickColorPainter;
099    
100         private ComponentAnimator  brickTileAnimator;
101    
102         private ComponentAnimator  frameRateAnimator;
103    
104         //////////////////////////////////////////////////////////////////////
105         //////////////////////////////////////////////////////////////////////
106    
107         public static void  main ( String [ ]  args )
108         //////////////////////////////////////////////////////////////////////
109         {
110           System.out.println ( INFO );
111    
112           JFrame  jFrame = new JFrame ( );
113    
114           jFrame.setUndecorated ( true );
115    
116           GraphicsConfiguration  graphicsConfiguration
117             = jFrame.getGraphicsConfiguration ( );
118    
119           GraphicsDevice  graphicsDevice
120             = graphicsConfiguration.getDevice ( );
121    
122           System.out.println ( "Initial display mode:" );
123    
124           DisplayModeLib.print ( graphicsDevice.getDisplayMode ( ) );
125    
126           BufferStrategy  bufferStrategy = null;
127    
128           try
129           {
130             graphicsDevice.setFullScreenWindow ( jFrame );
131    
132             jFrame.validate ( );
133    
134             jFrame.repaint  ( );
135    
136             System.out.println ( "\nisDisplayChangeSupported:  "
137               + graphicsDevice.isDisplayChangeSupported ( ) );
138    
139             DisplayMode [ ]  desiredDisplayModes = DESIRED_DISPLAY_MODES;
140    
141             if ( args.length == 4 )
142             {
143               desiredDisplayModes = new DisplayMode [ ] {
144                 new DisplayMode (
145                   Integer.parseInt ( args [ 0 ] ),
146                   Integer.parseInt ( args [ 1 ] ),
147                   Integer.parseInt ( args [ 2 ] ),
148                   Integer.parseInt ( args [ 3 ] ) ) };
149             }
150    
151             boolean  displayModeChanged
152               = GraphicsDeviceLib.changeDisplayMode (
153               graphicsDevice, desiredDisplayModes );
154    
155             if ( displayModeChanged )
156             {
157               System.out.println ( "\nNew display mode:" );
158    
159               DisplayModeLib.print ( graphicsDevice.getDisplayMode ( ) );
160             }
161    
162             if ( graphicsDevice.isFullScreenSupported ( ) )
163             {
164               System.out.println ( "\nFull-screen exclusive mode supported" );
165    
166               jFrame.setIgnoreRepaint ( true );
167    
168               jFrame.createBufferStrategy ( BUFFER_COUNT );
169    
170               bufferStrategy = jFrame.getBufferStrategy ( );
171    
172               BufferCapabilitiesLib.print (
173                 bufferStrategy.getCapabilities ( ) );
174             }
175             else
176             {
177               System.out.println (
178                 "\nFull-screen exclusive mode unsupported" );
179             }
180           }
181           catch ( AccessControlException  ex )
182           {
183             System.out.println ( "\nFull-screen exclusive mode not allowed" );
184           }
185    
186           FullScreenDemo  fullScreenDemo
187             = new FullScreenDemo ( bufferStrategy );
188    
189           jFrame.setContentPane ( fullScreenDemo );
190    
191           jFrame.show ( );
192    
193           fullScreenDemo.init  ( );
194    
195           fullScreenDemo.start ( );
196         }
197    
198         //////////////////////////////////////////////////////////////////////
199         //////////////////////////////////////////////////////////////////////
200    
201         public  FullScreenDemo ( BufferStrategy  bufferStrategy )
202         //////////////////////////////////////////////////////////////////////
203         {
204           this.bufferStrategy = bufferStrategy;
205    
206           brickColorPainter = NullComponentPainter .INSTANCE;
207    
208           brickTileAnimator = NullComponentAnimator.INSTANCE;
209    
210           frameRateAnimator = NullComponentAnimator.INSTANCE;
211         }
212    
213         //////////////////////////////////////////////////////////////////////
214         //////////////////////////////////////////////////////////////////////
215    
216         public String  getAppletInfo ( )
217         //////////////////////////////////////////////////////////////////////
218         {
219           return INFO;
220         }
221    
222         //////////////////////////////////////////////////////////////////////
223         // interface Lifecycle methods
224         //////////////////////////////////////////////////////////////////////
225    
226         public void  init ( )
227         //////////////////////////////////////////////////////////////////////
228         {
229           if ( bufferStrategy == null )
230           {
231             animatedComponent = new AnimatedComponent ( this );
232           }
233           else
234           {
235             animatedComponent
236               = new BufferStrategyAnimatedComponent ( this, bufferStrategy );
237           }
238    
239           animatedComponent.addMouseListener (
240             new MouseAdapter ( )
241             {
242               public void  mousePressed ( MouseEvent  mouseEvent )
243               {
244                 FullScreenToggler.toggle (
245                   WindowLib.getParentWindow ( animatedComponent ), false );
246    
247                 System.exit ( 0 );
248               }
249             } );
250    
251           Container  contentPane = getContentPane ( );
252    
253           contentPane.setLayout ( new BorderLayout ( ) );
254    
255           contentPane.add ( animatedComponent, BorderLayout.CENTER );
256    
257           validate ( );
258    
259           animatedComponent.init ( );
260    
261           brickColorPainter = new ColorPainter ( Color.RED );
262    
263           try
264           {
265             Image  brickTileImage = ImageLib.loadAutomaticImage (
266               MEDIA_DIR + TILE_IMAGE_FILENAME,
267               Transparency.BITMASK,
268               animatedComponent,
269               getClass ( ).getClassLoader ( ),
270               null ); // dimension
271    
272             Icon  brickTileIcon = new ImageIcon ( brickTileImage );
273    
274             brickTileAnimator = new TileAnimator (
275               0, 0, brickTileIcon, ( Shape ) null,  1, 1 );
276           }
277           catch ( IOException  ex )
278           {
279             ex.printStackTrace ( );
280           }
281    
282           frameRateAnimator = new FrameRateAnimator ( this, Color.ORANGE );
283         }
284    
285         public void  start   ( ) { animatedComponent.start   ( ); }
286    
287         public void  stop    ( ) { animatedComponent.stop    ( ); }
288    
289         public void  destroy ( ) { animatedComponent.destroy ( ); }
290    
291         //////////////////////////////////////////////////////////////////////
292         // interface ComponentAnimator methods
293         //////////////////////////////////////////////////////////////////////
294    
295         public void  update ( JComponent  component )
296         //////////////////////////////////////////////////////////////////////
297         {
298           brickTileAnimator.update ( component );
299    
300           frameRateAnimator.update ( component );
301         }
302    
303         public void  paint (
304           JComponent  component,
305           Graphics2D  graphics2D )
306         //////////////////////////////////////////////////////////////////////
307         {
308           brickColorPainter.paint ( component, graphics2D );
309    
310           brickTileAnimator.paint ( component, graphics2D );
311    
312           frameRateAnimator.paint ( component, graphics2D );
313         }
314    
315         //////////////////////////////////////////////////////////////////////
316         //////////////////////////////////////////////////////////////////////
317         }