1 package prefuse.activity; 2 3 import prefuse.util.collections.CopyOnWriteArrayList; 4 5 6 14 public abstract class Activity { 15 16 public static final long INFINITY = -1L; public static final long DEFAULT_STEP_TIME = 15L; 18 19 private boolean m_enabled = true; 20 private Pacer m_pacer; 21 22 private long m_startTime = -1L; 23 private long m_duration = -1L; 24 private long m_stepTime = -1L; 25 private long m_nextTime = -1L; 26 private boolean m_isRunning = false; 27 private boolean m_isScheduled = false; 28 29 private CopyOnWriteArrayList m_listeners; 30 31 37 public Activity(long duration) { 38 this(duration, DEFAULT_STEP_TIME); 39 } 40 41 48 public Activity(long duration, long stepTime) { 49 this(duration, stepTime, System.currentTimeMillis()); 50 } 51 52 59 public Activity(long duration, long stepTime, long startTime) { 60 m_startTime = startTime; 61 m_nextTime = startTime; 62 m_duration = duration; 63 m_stepTime = stepTime; 64 } 65 66 69 public void run() { 70 ActivityManager.scheduleNow(this); 71 } 72 73 78 public void runAt(long startTime) { 79 ActivityManager.scheduleAt(this,startTime); 80 } 81 82 98 public void runAfter(Activity before) { 99 ActivityManager.scheduleAfter(before, this); 100 } 101 102 119 public void alwaysRunAfter(Activity before) { 120 ActivityManager.alwaysScheduleAfter(before, this); 121 } 122 123 128 protected abstract void run(long elapsedTime); 129 130 139 long runActivity(long currentTime) { 140 if (currentTime < m_startTime) { 141 return m_startTime - currentTime; 142 } 143 144 long elapsedTime = currentTime - m_startTime; 145 146 if ( m_duration == 0 || currentTime >= getStopTime() ) 147 { 148 if ( !setRunning(true) ) { 149 fireActivityStarted(); 150 } 151 if ( m_enabled ) { 152 run(elapsedTime); 153 fireActivityStepped(); 154 } 155 setRunning(false); 156 157 fireActivityFinished(); 158 return -1; 159 } 160 else if ( currentTime >= m_nextTime ) 161 { 162 if ( !setRunning(true) ) 163 fireActivityStarted(); 164 if ( m_enabled ) { 165 run(elapsedTime); 166 fireActivityStepped(); 167 } 168 m_nextTime = currentTime + m_stepTime; 169 } 170 171 return (m_nextTime-currentTime); 172 } 173 174 179 public void cancel() { 180 boolean fire = false; 181 synchronized ( this ) { 182 if ( isScheduled() ) { 183 ActivityManager.removeActivity(this); 186 fire = true; 187 } 188 setRunning(false); 189 } 190 if ( fire ) 191 fireActivityCancelled(); 192 } 193 194 199 public synchronized boolean isScheduled() { 200 return m_isScheduled; 201 } 202 203 208 void setScheduled(boolean s) { 209 boolean fire; 210 synchronized ( this ) { 211 fire = (s && !m_isScheduled); 212 m_isScheduled = s; 213 } 214 if ( fire ) 215 fireActivityScheduled(); 216 } 217 218 222 synchronized boolean setRunning(boolean s) { 223 boolean b = m_isRunning; 224 m_isRunning = s; 225 return b; 226 } 227 228 232 public synchronized boolean isRunning() { 233 return m_isRunning; 234 } 235 236 239 243 public void addActivityListener(ActivityListener l) { 244 if ( m_listeners == null ) 245 m_listeners = new CopyOnWriteArrayList(); 246 if ( !m_listeners.contains(l) ) 247 m_listeners.add(l); 248 } 249 250 254 public void removeActivityListener(ActivityListener l) { 255 if ( m_listeners == null ) 256 return; 257 m_listeners.remove(l); 258 if ( m_listeners.size() == 0 ) 259 m_listeners = null; 260 } 261 262 protected void fireActivityScheduled() { 263 if ( m_listeners == null ) return; 264 Object [] a = m_listeners.getArray(); 265 for ( int i=0; i<a.length; ++i ) { 266 ((ActivityListener)a[i]).activityScheduled(this); 267 } 268 } 269 270 protected void fireActivityStarted() { 271 if ( m_listeners == null ) return; 272 Object [] a = m_listeners.getArray(); 273 for ( int i=0; i<a.length; ++i ) { 274 ((ActivityListener)a[i]).activityStarted(this); 275 } 276 } 277 278 protected void fireActivityStepped() { 279 if ( m_listeners == null ) return; 280 Object [] a = m_listeners.getArray(); 281 for ( int i=0; i<a.length; ++i ) { 282 ((ActivityListener)a[i]).activityStepped(this); 283 } 284 } 285 286 protected void fireActivityFinished() { 287 if ( m_listeners == null ) return; 288 Object [] a = m_listeners.getArray(); 289 for ( int i=0; i<a.length; ++i ) { 290 ((ActivityListener)a[i]).activityFinished(this); 291 } 292 } 293 294 protected void fireActivityCancelled() { 295 if ( m_listeners == null ) return; 296 Object [] a = m_listeners.getArray(); 297 for ( int i=0; i<a.length; ++i ) { 298 ((ActivityListener)a[i]).activityCancelled(this); 299 } 300 } 301 302 305 316 public double getPace(long elapsedTime) { 317 long duration = getDuration(); 318 double frac = (duration == 0L ? 0.0 : ((double)elapsedTime)/duration); 319 frac = Math.min(1, Math.max(0, frac)); 320 return m_pacer!=null ? m_pacer.pace(frac) : frac; 321 } 322 323 329 public synchronized Pacer getPacingFunction() { 330 return m_pacer; 331 } 332 333 340 public synchronized void setPacingFunction(Pacer pfunc) { 341 m_pacer = pfunc; 342 } 343 344 349 public long getStopTime() { 350 if (m_duration == -1) { 351 return Long.MAX_VALUE; 352 } 353 return m_startTime + m_duration; 354 } 355 356 360 public long getNextTime() { 361 return m_nextTime; 362 } 363 364 368 public long getDuration() { 369 return m_duration; 370 } 371 372 378 public void setDuration(long duration) { 379 this.m_duration = duration; 380 } 381 382 386 public long getStartTime() { 387 return m_startTime; 388 } 389 390 394 public void setStartTime(long time) { 395 m_startTime = time; 396 } 397 398 402 public long getStepTime() { 403 return m_stepTime; 404 } 405 406 410 public void setStepTime(long time) { 411 m_stepTime = time; 412 } 413 414 418 public boolean isEnabled() { 419 return m_enabled; 420 } 421 422 426 public void setEnabled(boolean s) { 427 m_enabled = s; 428 } 429 430 } | Popular Tags |