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<PlayerThreadListener> listeners = new HashSet<PlayerThreadListener>();
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 (PlayerThreadListener listener : listeners) {
133            listener.updateTime(curTime, timeStep, playState);
134        }
135    }
136}