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 }