001         package com.croftsoft.apps.rainbow;
002         
003         import java.awt.*;
004         import java.awt.event.*;
005         import java.util.*;
006         import javax.swing.*;
007         import javax.swing.event.*;
008    
009         import com.croftsoft.core.CroftSoftConstants;
010         import com.croftsoft.core.animation.AnimatedComponent;
011         import com.croftsoft.core.animation.ComponentAnimator;
012         import com.croftsoft.core.animation.collector.SimpleRepaintCollector;
013         import com.croftsoft.core.animation.factory.DefaultAnimationFactory;
014         import com.croftsoft.core.gui.FrameLib;
015         import com.croftsoft.core.lang.ClassLib;
016         import com.croftsoft.core.lang.lifecycle.Lifecycle;
017    
018         /*********************************************************************
019         * Main Rainbow class.
020         *
021         * @version
022         *   2003-07-23
023         * @since
024         *   2002-03-18
025         * @author
026         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
027         *********************************************************************/
028    
029         public final class  Rainbow
030           extends JApplet
031           implements ComponentAnimator, Lifecycle
032         //////////////////////////////////////////////////////////////////////
033         //////////////////////////////////////////////////////////////////////
034         {
035           
036         //////////////////////////////////////////////////////////////////////
037         // Applet constants
038         //////////////////////////////////////////////////////////////////////
039    
040         private static final String  VERSION
041           = "2003-07-23";
042    
043         private static final String  TITLE
044           = "CroftSoft Rainbow";
045    
046         private static final String  INFO
047           = "\n" + TITLE + "\n"
048           + CroftSoftConstants.COPYRIGHT + "\n"
049           + CroftSoftConstants.HOME_PAGE + "\n"
050           + "Version " + VERSION + "\n";
051    
052         //////////////////////////////////////////////////////////////////////
053         // Frame constants
054         //////////////////////////////////////////////////////////////////////
055    
056         private static final String  FRAME_TITLE
057           = TITLE;
058    
059         private static final String  FRAME_ICON_FILENAME
060           = "/images/croftsoft.png";
061           
062         private static final Dimension  FRAME_SIZE
063           = null;
064    
065         private static final String  SHUTDOWN_CONFIRMATION_PROMPT
066           = "Close " + TITLE + "?";
067    
068         //////////////////////////////////////////////////////////////////////
069         // animation constants
070         //////////////////////////////////////////////////////////////////////
071    
072         private static final double  FRAME_RATE       = 100.0;
073    
074         private static final int     COLOR_WIDTH      = 64;
075    
076         private static final int     COLOR_HEIGHT     = 64;
077    
078         private static final Color   BACKGROUND_COLOR = Color.WHITE;
079    
080         //////////////////////////////////////////////////////////////////////
081         // instance variables
082         //////////////////////////////////////////////////////////////////////
083    
084         private AnimatedComponent  animatedComponent;
085    
086         private Random             random;
087    
088         private Color              color;
089    
090         private int                x;
091    
092         private int                y;
093    
094         private Point              mousePoint;
095    
096         //////////////////////////////////////////////////////////////////////
097         //////////////////////////////////////////////////////////////////////
098    
099         public static void  main ( String [ ]  args )
100         //////////////////////////////////////////////////////////////////////
101         {
102           JFrame  jFrame = new JFrame ( FRAME_TITLE );
103    
104           try
105           {
106             jFrame.setIconImage ( ClassLib.getResourceAsImage (
107               Rainbow.class, FRAME_ICON_FILENAME ) );
108           }
109           catch ( Exception  ex )
110           {
111           }
112    
113           Rainbow  rainbow = new Rainbow ( );
114    
115           jFrame.setContentPane ( rainbow );
116    
117           FrameLib.launchJFrameAsDesktopApp (
118             jFrame,
119             new Lifecycle [ ] { rainbow },
120             FRAME_SIZE,
121             SHUTDOWN_CONFIRMATION_PROMPT );
122         }
123    
124         //////////////////////////////////////////////////////////////////////
125         //////////////////////////////////////////////////////////////////////
126    
127         public String  getAppletInfo ( )
128         //////////////////////////////////////////////////////////////////////
129         {
130           return INFO;
131         }
132    
133         //////////////////////////////////////////////////////////////////////
134         // interface Lifecycle methods
135         //////////////////////////////////////////////////////////////////////
136    
137         public void  init ( )
138         //////////////////////////////////////////////////////////////////////
139         {
140           System.out.println ( INFO );
141    
142           animatedComponent = new AnimatedComponent (
143             this,
144             new SimpleRepaintCollector ( ),
145             DefaultAnimationFactory.INSTANCE.createLoopGovernor (
146               FRAME_RATE ) );
147    
148           Container  contentPane = getContentPane ( );
149    
150           contentPane.setLayout ( new BorderLayout ( ) );
151    
152           contentPane.add ( animatedComponent, BorderLayout.CENTER );
153    
154           animatedComponent.init ( );
155    
156           color = Color.WHITE;
157    
158           animatedComponent.addMouseMotionListener (
159             new MouseMotionAdapter ( )
160             {
161               public void  mouseMoved ( MouseEvent  mouseEvent )
162               {
163                 mousePoint = mouseEvent.getPoint ( );
164               }
165             } );
166    
167           animatedComponent.addMouseListener (
168             new MouseAdapter ( )
169             {
170               public void  mouseExited ( MouseEvent  mouseEvent )
171               {
172                 mousePoint = null;
173               }
174    
175               public void  mousePressed ( MouseEvent  mouseEvent )
176               {
177                 repaint ( );
178               }
179             } );
180    
181           animatedComponent.setCursor (
182             new Cursor ( Cursor.CROSSHAIR_CURSOR ) );
183    
184           random = new Random ( );
185         }
186    
187         public void  start   ( ) { animatedComponent.start   ( ); }
188    
189         public void  stop    ( ) { animatedComponent.stop    ( ); }
190    
191         public void  destroy ( ) { animatedComponent.destroy ( ); }
192    
193         //////////////////////////////////////////////////////////////////////
194         // interface ComponentAnimator methods
195         //////////////////////////////////////////////////////////////////////
196    
197         public void  update ( JComponent  component )
198         //////////////////////////////////////////////////////////////////////
199         {
200           Point  mousePoint = this.mousePoint;
201    
202           if ( mousePoint != null )
203           {
204             color = new Color (
205               random.nextInt ( 256 ),
206               random.nextInt ( 256 ),
207               random.nextInt ( 256 ) );
208    
209             x = mousePoint.x - COLOR_WIDTH  / 2;
210    
211             y = mousePoint.y - COLOR_HEIGHT / 2;
212    
213             component.repaint ( x, y, COLOR_WIDTH, COLOR_HEIGHT );
214           }
215           else
216           {
217             x = Integer.MIN_VALUE;
218           }
219         }
220    
221         public void  paint (
222           JComponent  component,
223           Graphics2D  graphics )
224         //////////////////////////////////////////////////////////////////////
225         {
226           graphics.setColor ( BACKGROUND_COLOR );
227    
228           graphics.fillRect (
229             0, 0, component.getWidth ( ), component.getHeight ( ) );
230    
231           graphics.setColor ( color );
232    
233           graphics.fillRect ( x, y, COLOR_WIDTH, COLOR_HEIGHT );
234         }
235    
236         //////////////////////////////////////////////////////////////////////
237         //////////////////////////////////////////////////////////////////////
238         }