00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 @import "CPObject.j"
00024 @import "CPInvocation.j"
00025 @import "CPDate.j"
00026 @import "CPRunLoop.j"
00027
00028
00029 @implementation CPTimer : CPObject
00030 {
00031 CPTimeInterval _timeInterval;
00032 CPInvocation _invocation;
00033 Function _callback;
00034
00035 BOOL _repeats;
00036 BOOL _isValid;
00037 CPDate _fireDate;
00038 id _userInfo;
00039 }
00040
00044 + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
00045 {
00046 var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds invocation:anInvocation repeats:shouldRepeat];
00047
00048
00049 [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
00050
00051 return timer;
00052 }
00053
00057 + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
00058 {
00059 var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds target:aTarget selector:aSelector userInfo:userInfo repeats:shouldRepeat]
00060
00061
00062 [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
00063
00064 return timer;
00065 }
00066
00070 + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
00071 {
00072 var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds callback:aFunction repeats:shouldRepeat];
00073
00074
00075 [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
00076
00077 return timer;
00078 }
00079
00083 + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
00084 {
00085 return [[self alloc] initWithFireDate:nil interval:seconds invocation:anInvocation repeats:shouldRepeat];
00086 }
00087
00091 + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
00092 {
00093 return [[self alloc] initWithFireDate:nil interval:seconds target:aTarget selector:aSelector userInfo:userInfo repeats:shouldRepeat];
00094 }
00095
00099 + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
00100 {
00101 return [[self alloc] initWithFireDate:nil interval:seconds callback:aFunction repeats:shouldRepeat];
00102 }
00103
00107 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
00108 {
00109 self = [super init];
00110
00111 if (self)
00112 {
00113 _timeInterval = seconds;
00114 _invocation = anInvocation;
00115 _repeats = shouldRepeat;
00116 _isValid = YES;
00117 _fireDate = aDate;
00118 }
00119
00120 return self;
00121 }
00122
00126 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
00127 {
00128 var invocation = [CPInvocation invocationWithMethodSignature:1];
00129
00130 [invocation setTarget:aTarget];
00131 [invocation setSelector:aSelector];
00132 [invocation setArgument:self atIndex:2];
00133
00134 self = [self initWithFireDate:aDate interval:seconds invocation:invocation repeats:shouldRepeat];
00135
00136 if (self)
00137 _userInfo = userInfo;
00138
00139 return self;
00140 }
00141
00145 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
00146 {
00147 self = [super init];
00148
00149 if (self)
00150 {
00151 _timeInterval = seconds;
00152 _callback = aFunction;
00153 _repeats = shouldRepeat;
00154 _isValid = YES;
00155 _fireDate = aDate;
00156 }
00157
00158 return self;
00159 }
00160
00164 - (CPTimeInterval)timeInterval
00165 {
00166 return _timeInterval;
00167 }
00168
00172 - (CPDate)fireDate
00173 {
00174 return _fireDate;
00175 }
00176
00180 - (void)setFireDate:(CPDate)aDate
00181 {
00182 _fireDate = aDate;
00183 }
00184
00188 - (void)fire
00189 {
00190 if (!_isValid)
00191 return;
00192
00193 if (_callback)
00194 _callback();
00195 else
00196 [_invocation invoke];
00197
00198 if (!_isValid)
00199 return;
00200
00201 if (_repeats)
00202 _fireDate = [CPDate dateWithTimeIntervalSinceNow:_timeInterval];
00203
00204 else
00205 [self invalidate];
00206 }
00207
00211 - (BOOL)isValid
00212 {
00213 return _isValid;
00214 }
00215
00219 - (void)invalidate
00220 {
00221 _isValid = NO;
00222 _userInfo = nil;
00223 _invocation = nil;
00224 _callback = nil;
00225 }
00226
00230 - (id)userInfo
00231 {
00232 return _userInfo;
00233 }
00234
00235 @end
00236
00237 var CPTimersTimeoutID = 1000,
00238 CPTimersForTimeoutIDs = {};
00239
00240 var _CPTimerBridgeTimer = function(codeOrFunction, aDelay, shouldRepeat, functionArgs)
00241 {
00242 var timeoutID = CPTimersTimeoutID++,
00243 theFunction = nil;
00244
00245 if (typeof codeOrFunction === "string")
00246 theFunction = function() { new Function(codeOrFunction)(); if (!shouldRepeat) CPTimersForTimeoutIDs[timeoutID] = nil; }
00247 else
00248 {
00249 if (!functionArgs)
00250 functionArgs = [];
00251
00252 theFunction = function() { codeOrFunction.apply(window, functionArgs); if (!shouldRepeat) CPTimersForTimeoutIDs[timeoutID] = nil; }
00253 }
00254
00255 CPTimersForTimeoutIDs[timeoutID] = [CPTimer scheduledTimerWithTimeInterval:aDelay / 1000 callback:theFunction repeats:shouldRepeat];
00256
00257 return timeoutID;
00258 }
00259
00260 window.setTimeout = function(codeOrFunction, aDelay)
00261 {
00262 return _CPTimerBridgeTimer(codeOrFunction, aDelay, NO, Array.prototype.slice.apply(arguments, [2]));
00263 }
00264
00265 window.clearTimeout = function(aTimeoutID)
00266 {
00267 var timer = CPTimersForTimeoutIDs[aTimeoutID];
00268
00269 if (timer)
00270 [timer invalidate];
00271
00272 CPTimersForTimeoutIDs[aTimeoutID] = nil;
00273 }
00274
00275 window.setInterval = function(codeOrFunction, aDelay, functionArgs)
00276 {
00277 return _CPTimerBridgeTimer(codeOrFunction, aDelay, YES, Array.prototype.slice.apply(arguments, [2]));
00278 }
00279
00280 window.clearInterval = function(aTimeoutID)
00281 {
00282 window.clearTimeout(aTimeoutID);
00283 }