001         package com.croftsoft.core.animation.animator;
002    
003         import java.awt.*;
004         import java.util.*;
005         import javax.swing.JComponent;
006    
007         import com.croftsoft.core.animation.ComponentAnimator;
008         import com.croftsoft.core.lang.NullArgumentException;
009    
010         import com.croftsoft.core.animation.model.ModelAccessor;
011         import com.croftsoft.core.animation.model.WorldAccessor;
012    
013         /*********************************************************************
014         * ComponentAnimator that maps Models to views.
015         *
016         * @version
017         *   2003-06-18
018         * @since
019         *   2003-04-14
020         * @author
021         *   <a href="https://www.croftsoft.com/">David Wallace Croft</a>
022         *********************************************************************/
023    
024         public abstract class  WorldAnimator
025           implements ComponentAnimator
026         //////////////////////////////////////////////////////////////////////
027         //////////////////////////////////////////////////////////////////////
028         {
029    
030         private final WorldAccessor  worldAccessor;
031    
032         private final Map            modelAccessorToComponentAnimatorMap;
033    
034         private final Set            oldModelAccessorSet;
035    
036         //
037    
038         private ModelAccessor [ ]  modelAccessors;
039    
040         //////////////////////////////////////////////////////////////////////
041         //////////////////////////////////////////////////////////////////////
042    
043         public  WorldAnimator ( WorldAccessor  worldAccessor )
044         //////////////////////////////////////////////////////////////////////
045         {
046           NullArgumentException.check ( this.worldAccessor = worldAccessor );
047    
048           modelAccessorToComponentAnimatorMap = new HashMap ( );
049    
050           oldModelAccessorSet = new HashSet ( );
051    
052           modelAccessors = new ModelAccessor [ 0 ];
053         }
054    
055         //////////////////////////////////////////////////////////////////////
056         // interface ComponentAnimator methods
057         //////////////////////////////////////////////////////////////////////
058    
059         public void  update ( JComponent  component )
060         //////////////////////////////////////////////////////////////////////
061         {
062           if ( worldAccessor.isCleared ( ) )
063           {
064             component.repaint ( );
065    
066             oldModelAccessorSet.clear ( );
067    
068             modelAccessorToComponentAnimatorMap.clear ( );
069           }
070    
071           modelAccessors = worldAccessor.getModelAccessors ( modelAccessors );       
072    
073           for ( int  i = 0; i < modelAccessors.length; i++ )
074           {
075             ModelAccessor  modelAccessor = modelAccessors [ i ];
076    
077             if ( modelAccessor == null )
078             {
079               break;
080             }
081    
082             oldModelAccessorSet.remove ( modelAccessor );
083    
084             ComponentAnimator  componentAnimator
085               = getComponentAnimator ( modelAccessor );
086    
087             componentAnimator.update ( component );
088           }
089    
090           Iterator  iterator = oldModelAccessorSet.iterator ( );
091    
092           while ( iterator.hasNext ( ) )
093           {
094             ModelAccessor  modelAccessor
095               = ( ModelAccessor ) iterator.next ( );
096    
097             modelAccessorToComponentAnimatorMap.remove ( modelAccessor );
098           }
099    
100           oldModelAccessorSet.clear ( );
101    
102           for ( int  i = 0; i < modelAccessors.length; i++ )
103           {
104             ModelAccessor  modelAccessor = modelAccessors [ i ];
105    
106             if ( modelAccessor == null )
107             {
108               break;
109             }
110    
111             oldModelAccessorSet.add ( modelAccessor );
112           }       
113         }
114    
115         public void  paint (
116           JComponent  component,
117           Graphics2D  graphics )
118         //////////////////////////////////////////////////////////////////////
119         {
120           for ( int  i = 0; i < modelAccessors.length; i++ )
121           {
122             ModelAccessor  modelAccessor = modelAccessors [ i ];
123    
124             if ( modelAccessor == null )
125             {
126               break;
127             }
128    
129             ComponentAnimator  componentAnimator
130               = getComponentAnimator ( modelAccessor );
131    
132             componentAnimator.paint ( component, graphics );
133           }
134         }
135    
136         //////////////////////////////////////////////////////////////////////
137         // protected methods
138         //////////////////////////////////////////////////////////////////////
139    
140         protected ComponentAnimator  getComponentAnimator (
141           ModelAccessor  modelAccessor )
142         //////////////////////////////////////////////////////////////////////
143         {
144           ComponentAnimator  componentAnimator = ( ComponentAnimator )
145             modelAccessorToComponentAnimatorMap.get ( modelAccessor );
146    
147           if ( componentAnimator == null )
148           {
149             componentAnimator = createComponentAnimator ( modelAccessor );
150    
151             modelAccessorToComponentAnimatorMap.put (
152               modelAccessor, componentAnimator );
153           }
154    
155           return componentAnimator;
156         }
157    
158         protected ComponentAnimator  createComponentAnimator (
159           ModelAccessor  modelAccessor )
160         //////////////////////////////////////////////////////////////////////
161         {
162           return new ModelAnimator ( modelAccessor );
163         }
164    
165         //////////////////////////////////////////////////////////////////////
166         //////////////////////////////////////////////////////////////////////
167         }