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 }