001 package com.croftsoft.apps.mars.view;
002
003 import java.awt.*;
004 import java.awt.geom.Rectangle2D;
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.apps.mars.model.ModelAccessor;
011
012 /*********************************************************************
013 * The view for a Model.
014 *
015 * @version
016 * 2003-04-17
017 * @since
018 * 2003-04-01
019 * @author
020 * <a href="https://www.croftsoft.com/">David Wallace Croft</a>
021 *********************************************************************/
022
023 public class ModelAnimator
024 implements ComponentAnimator
025 //////////////////////////////////////////////////////////////////////
026 //////////////////////////////////////////////////////////////////////
027 {
028
029 protected final ModelAccessor modelAccessor;
030
031 protected final Rectangle oldRepaintRectangle;
032
033 protected final Rectangle newRepaintRectangle;
034
035 //
036
037 protected Color color;
038
039 protected boolean previouslyActive;
040
041 //////////////////////////////////////////////////////////////////////
042 //////////////////////////////////////////////////////////////////////
043
044 public ModelAnimator (
045 ModelAccessor modelAccessor,
046 Color color )
047 //////////////////////////////////////////////////////////////////////
048 {
049 NullArgumentException.check ( this.modelAccessor = modelAccessor );
050
051 this.color = color;
052
053 oldRepaintRectangle = new Rectangle ( );
054
055 newRepaintRectangle = new Rectangle ( );
056 }
057
058 public ModelAnimator ( ModelAccessor modelAccessor )
059 //////////////////////////////////////////////////////////////////////
060 {
061 this ( modelAccessor, null );
062 }
063
064 //////////////////////////////////////////////////////////////////////
065 //////////////////////////////////////////////////////////////////////
066
067 public void update ( JComponent component )
068 //////////////////////////////////////////////////////////////////////
069 {
070 boolean currentlyActive = modelAccessor.isActive ( );
071
072 if ( !previouslyActive )
073 {
074 if ( currentlyActive )
075 {
076 // went from off to on
077
078 getRepaintRectangle ( oldRepaintRectangle );
079
080 component.repaint ( oldRepaintRectangle );
081
082 previouslyActive = currentlyActive;
083 }
084
085 // otherwise stayed off
086 }
087 else if ( !currentlyActive )
088 {
089 // went from on to off
090
091 component.repaint ( oldRepaintRectangle );
092
093 previouslyActive = currentlyActive;
094 }
095 else
096 {
097 // stayed on
098
099 getRepaintRectangle ( newRepaintRectangle );
100
101 if ( !oldRepaintRectangle.equals ( newRepaintRectangle ) )
102 {
103 Rectangle2D.union (
104 oldRepaintRectangle,
105 newRepaintRectangle,
106 oldRepaintRectangle );
107
108 component.repaint ( oldRepaintRectangle );
109
110 oldRepaintRectangle.setBounds ( newRepaintRectangle );
111 }
112 else if ( isUpdated ( ) )
113 {
114 component.repaint ( newRepaintRectangle );
115 }
116 }
117 }
118
119 protected void getRepaintRectangle ( Rectangle repaintRectangle )
120 //////////////////////////////////////////////////////////////////////
121 {
122 repaintRectangle.setBounds (
123 modelAccessor.getShape ( ).getBounds ( ) );
124 }
125
126 protected boolean isUpdated ( )
127 //////////////////////////////////////////////////////////////////////
128 {
129 return modelAccessor.isUpdated ( );
130 }
131
132 public void paint (
133 JComponent component,
134 Graphics2D graphics )
135 //////////////////////////////////////////////////////////////////////
136 {
137 if ( modelAccessor.isActive ( ) )
138 {
139 if ( color == null )
140 {
141 graphics.setColor ( component.getForeground ( ) );
142 }
143 else
144 {
145 graphics.setColor ( color );
146 }
147
148 graphics.fill ( modelAccessor.getShape ( ) );
149 }
150 }
151
152 //////////////////////////////////////////////////////////////////////
153 //////////////////////////////////////////////////////////////////////
154 }