From: Richard K. <ric...@us...> - 2005-05-16 22:18:02
|
Update of /cvsroot/actionstep/actionstep/src/org/actionstep In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31127 Added Files: NSTimer.as Log Message: Added NSTimer and test class --- NEW FILE: NSTimer.as --- /* * Copyright (c) 2005, InfoEther, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1) Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * 2) Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * 3) The name InfoEther, Inc. may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ import org.actionstep.NSObject; class org.actionstep.NSTimer extends NSObject { public static function scheduledTimerWithTimeIntervalTargetSelectorUserInfoRepeats( seconds:Number, target:Object, selector:String, userInfo:Object, repeats:Boolean):NSTimer { return (new NSTimer()).initWithFireDateIntervalTargetSelectorUserInfoRepeats(new Date(), seconds, target, selector, userInfo, repeats); } // Intervals (setInterval/clearInterval) private var m_initialFireInterval; private var m_interval; private var m_seconds:Number; private var m_userInfo:Object; private var m_target; private var m_selector:String; private var m_repeats:Boolean; private var m_fireDate:Date; private var m_lastFireDate:Date; public function initWithFireDateIntervalTargetSelectorUserInfoRepeats( date:Date, seconds:Number, target:Object, selector:String, userInfo:Object, repeats:Boolean):NSTimer { m_seconds = seconds; m_fireDate = date; m_target = target; m_selector = selector; m_userInfo = userInfo; m_repeats = repeats; scheduleToFire(); return this; } public function invalidate() { if (m_initialFireInterval != null) { clearInterval(m_initialFireInterval); m_initialFireInterval = null; } if (m_interval != null) { clearInterval(m_interval); m_interval = null; } } public function isValid():Boolean { return (m_interval != null); } public function fire() { if (isValid()) { m_target[m_selector].call(m_target, this); if (!m_repeats) { invalidate(); } } } public function fireDate():Date { var date = m_lastFireDate; if (date==null) { date = m_fireDate; } var result:Date = new Date(); result.setTime(date.getTime()+m_seconds*1000); return result; } public function setFireDate(date:Date) { invalidate(); m_fireDate = date; scheduleToFire(); } public function timeInterval():Number { return m_seconds; } public function userInfo():Object { return m_userInfo; } // PRIVATE private function scheduleToFire() { var startTime = m_fireDate.getTime(); var currentTime = (new Date()).getTime(); if (startTime < currentTime) { start(); return; } m_initialFireInterval = setInterval(this["startCallback"], startTime - currentTime, this); } private function startCallback(self) { self.start(); } private function start() { if (m_initialFireInterval != null) { clearInterval(m_initialFireInterval); m_initialFireInterval = null; } m_interval = setInterval(this["fireCallback"], m_seconds*1000, this); } private function fireCallback(self) { self.fire(); } } |