001         package com.croftsoft.apps.slideshow;
002    
003         import java.awt.*;
004         import java.awt.event.*;
005         import java.io.*;
006         import java.util.*;
007         import java.util.logging.*;
008         import javax.imageio.*;
009         import javax.swing.JComponent;
010    
011         import com.croftsoft.core.animation.ComponentAnimator;
012         import com.croftsoft.core.awt.image.ImageLib;
013         import com.croftsoft.core.lang.NullArgumentException;
014    
015         /*********************************************************************
016         * ComponentAnimator.
017         *
018         * @version
019         *   $Date: 2008/04/19 21:31:00 $
020         * @since
021         *   2005-08-12
022         * @author
023         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
024         *********************************************************************/
025    
026         public final class  SlideshowAnimator
027           implements ComponentAnimator
028         //////////////////////////////////////////////////////////////////////
029         //////////////////////////////////////////////////////////////////////
030         {
031           
032         private static final String  CLASS_NAME
033           = SlideshowAnimator.class.getName ( );
034         
035         //
036           
037         private final Logger           logger;
038             
039         private final SlideshowConfig  slideshowConfig;
040           
041         private final Rectangle        componentBounds;
042         
043         private final Random           random;
044         
045         //
046         
047         private boolean  skip;
048         
049         private long     lastTimeNanos;
050         
051         private Image    image;
052         
053         private String   imageFilename;
054         
055         //////////////////////////////////////////////////////////////////////
056         // constructor methods
057         //////////////////////////////////////////////////////////////////////
058    
059         /*********************************************************************
060         * Main constructor.
061         *********************************************************************/
062         public  SlideshowAnimator (
063           final SlideshowConfig  slideshowConfig,
064           final JComponent       jComponent )
065         //////////////////////////////////////////////////////////////////////
066         {
067           NullArgumentException.checkArgs (
068             this.slideshowConfig = slideshowConfig,
069             jComponent );
070           
071           logger = Logger.getLogger ( CLASS_NAME );
072           
073           componentBounds = new Rectangle ( );
074           
075           random = new Random ( );
076           
077           jComponent.setOpaque ( true );
078           
079           jComponent.setFont ( slideshowConfig.getFont ( ) );
080    
081           jComponent.addKeyListener (
082             new KeyAdapter ( )
083             {
084               @Override
085               public void  keyPressed ( final KeyEvent  keyEvent )
086               {
087                 final int  keyCode = keyEvent.getKeyCode ( );
088    
089                 if ( keyCode == KeyEvent.VK_SPACE )
090                 {
091                   logger.info ( "spacebar pressed" );
092    
093                   skip = true;
094                 }
095               }
096             } );
097    
098           jComponent.requestFocus ( );
099    /*       
100           jComponent.addComponentListener (
101             new ComponentAdapter ( )
102             {
103               @Override
104               public void  componentResized ( ComponentEvent  componentEvent )
105               {
106                 update ( jComponent );
107                         
108                 jComponent.repaint ( );
109               }
110             } );
111    */       
112           update ( jComponent );       
113         }
114         
115         //////////////////////////////////////////////////////////////////////
116         // interface ComponentAnimator methods
117         //////////////////////////////////////////////////////////////////////
118         
119         public void  paint (
120           final JComponent  jComponent,
121           final Graphics2D  graphics2D )
122         //////////////////////////////////////////////////////////////////////
123         {
124           try
125           {
126             jComponent.getBounds ( componentBounds );
127           
128             graphics2D.setColor ( slideshowConfig.getBackgroundColor ( ) );
129               
130             graphics2D.fill ( componentBounds );
131           
132             if ( image != null )
133             {
134               final Rectangle  rectangle = ImageLib.shrinkToFitAndCenter (
135                 image.getWidth  ( null ),
136                 image.getHeight ( null ),
137                 componentBounds.width,
138                 componentBounds.height );
139    
140               // logger.info ( rectangle.toString ( ) );
141                 
142               graphics2D.drawImage (
143                 image,
144                 rectangle.x,
145                 rectangle.y,
146                 rectangle.width,
147                 rectangle.height,
148                 null );
149             }
150    
151             if ( ( imageFilename != null )
152               && slideshowConfig.getDisplayImageFilename ( ) )
153             {
154               graphics2D.setColor ( slideshowConfig.getForegroundColor ( ) );
155    
156               graphics2D.drawString ( imageFilename, 20, 20 );
157             }
158           }
159           catch ( final Exception  ex )
160           {
161             ex.printStackTrace ( );
162             
163             logger.throwing ( CLASS_NAME, "paint", ex );
164           }
165         }
166         
167         public void  update ( final JComponent  jComponent )
168         //////////////////////////////////////////////////////////////////////
169         {
170           try
171           {
172             final long  currentTimeNanos = System.nanoTime ( );
173    
174             final long  deltaTimeNanos = currentTimeNanos - lastTimeNanos;
175             
176             final long  displayTimeNanos
177               = slideshowConfig.getDisplayTimeNanos ( ); 
178    
179             if ( skip
180               || ( deltaTimeNanos >= displayTimeNanos ) )
181             {
182               // logger.info ( "update changing image" );
183             
184               skip = false;
185    
186               final String [ ]  imageFilenames
187                 = slideshowConfig.getImageFilenames ( );
188    
189               if ( ( imageFilenames != null    )
190                 && ( imageFilenames.length > 0 ) )
191               {
192                 lastTimeNanos = currentTimeNanos;
193                 
194                 final int  imageIndex
195                   = random.nextInt ( imageFilenames.length );
196    
197                 imageFilename = imageFilenames [ imageIndex ];
198    
199                 logger.info ( imageFilename );
200                 
201                 final File  imageFile = new File ( imageFilename );
202    
203                 image = ImageIO.read ( imageFile );             
204               }
205             }
206             
207             jComponent.paintImmediately ( componentBounds );
208           }
209           catch ( final Exception  ex )
210           {
211             ex.printStackTrace ( );
212             
213             logger.throwing ( CLASS_NAME, "update", ex );
214           }
215         }
216    
217         //////////////////////////////////////////////////////////////////////
218         //////////////////////////////////////////////////////////////////////
219         }