001/* 002 * SVG Salamander 003 * Copyright (c) 2004, Mark McKay 004 * All rights reserved. 005 * 006 * Redistribution and use in source and binary forms, with or 007 * without modification, are permitted provided that the following 008 * conditions are met: 009 * 010 * - Redistributions of source code must retain the above 011 * copyright notice, this list of conditions and the following 012 * disclaimer. 013 * - Redistributions in binary form must reproduce the above 014 * copyright notice, this list of conditions and the following 015 * disclaimer in the documentation and/or other materials 016 * provided with the distribution. 017 * 018 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 019 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 020 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 021 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 022 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 023 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 024 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 025 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 026 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 027 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 028 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 029 * OF THE POSSIBILITY OF SUCH DAMAGE. 030 * 031 * Mark McKay can be contacted at mark@kitfox.com. Salamander and other 032 * projects can be found at http://www.kitfox.com 033 * 034 * Created on September 28, 2004, 10:07 PM 035 */ 036 037 038package com.kitfox.svg.app; 039 040import java.util.*; 041 042/** 043 * 044 * @author kitfox 045 */ 046public class PlayerThread implements Runnable 047{ 048 HashSet listeners = new HashSet(); 049 050 double curTime = 0; 051 double timeStep = .2; 052 053 public static final int PS_STOP = 0; 054 public static final int PS_PLAY_FWD = 1; 055 public static final int PS_PLAY_BACK = 2; 056 057 int playState = PS_STOP; 058 059 Thread thread; 060 061 /** Creates a new instance of PlayerThread */ 062 public PlayerThread() 063 { 064 thread = new Thread(this); 065 thread.start(); 066 } 067 068 public void run() 069 { 070 while (thread != null) 071 { 072 synchronized (this) 073 { 074 switch (playState) 075 { 076 case PS_PLAY_FWD: 077 curTime += timeStep; 078 break; 079 case PS_PLAY_BACK: 080 curTime -= timeStep; 081 if (curTime < 0) curTime = 0; 082 break; 083 default: 084 case PS_STOP: 085 break; 086 } 087 088 fireTimeUpdateEvent(); 089 } 090 091 try 092 { 093 Thread.sleep((long)(timeStep * 1000)); 094 } 095 catch (Exception e) 096 { 097 throw new RuntimeException(e); 098 } 099 } 100 } 101 102 public void exit() { thread = null; } 103 public synchronized void addListener(PlayerThreadListener listener) 104 { 105 listeners.add(listener); 106 } 107 108 public synchronized double getCurTime() { return curTime; } 109 110 public synchronized void setCurTime(double time) 111 { 112 curTime = time; 113 } 114 115 public synchronized double getTimeStep() { return timeStep; } 116 117 public synchronized void setTimeStep(double time) 118 { 119 timeStep = time; 120 if (timeStep < .01) timeStep = .01; 121 } 122 123 public synchronized int getPlayState() { return playState; } 124 125 public synchronized void setPlayState(int playState) 126 { 127 this.playState = playState; 128 } 129 130 private void fireTimeUpdateEvent() 131 { 132 for (Iterator it = listeners.iterator(); it.hasNext();) 133 { 134 PlayerThreadListener listener = (PlayerThreadListener)it.next(); 135 listener.updateTime(curTime, timeStep, playState); 136 } 137 } 138}