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 }