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
00031 @implementation CPTimer : CPObject
00032 {
00033 CPTimeInterval _timeInterval;
00034 CPInvocation _invocation;
00035 Function _callback;
00036
00037 BOOL _repeats;
00038 BOOL _isValid;
00039 CPDate _fireDate;
00040 id _userInfo;
00041 }
00042
00046 + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
00047 {
00048 var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds invocation:anInvocation repeats:shouldRepeat];
00049
00050
00051 [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
00052
00053 return timer;
00054 }
00055
00059 + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
00060 {
00061 var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds target:aTarget selector:aSelector userInfo:userInfo repeats:shouldRepeat]
00062
00063
00064 [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
00065
00066 return timer;
00067 }
00068
00072 + (CPTimer)scheduledTimerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
00073 {
00074 var timer = [[self alloc] initWithFireDate:[CPDate dateWithTimeIntervalSinceNow:seconds] interval:seconds callback:aFunction repeats:shouldRepeat];
00075
00076
00077 [[CPRunLoop currentRunLoop] addTimer:timer forMode:CPDefaultRunLoopMode];
00078
00079 return timer;
00080 }
00081
00085 + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
00086 {
00087 return [[self alloc] initWithFireDate:nil interval:seconds invocation:anInvocation repeats:shouldRepeat];
00088 }
00089
00093 + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
00094 {
00095 return [[self alloc] initWithFireDate:nil interval:seconds target:aTarget selector:aSelector userInfo:userInfo repeats:shouldRepeat];
00096 }
00097
00101 + (CPTimer)timerWithTimeInterval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
00102 {
00103 return [[self alloc] initWithFireDate:nil interval:seconds callback:aFunction repeats:shouldRepeat];
00104 }
00105
00109 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds invocation:(CPInvocation)anInvocation repeats:(BOOL)shouldRepeat
00110 {
00111 self = [super init];
00112
00113 if (self)
00114 {
00115 _timeInterval = seconds;
00116 _invocation = anInvocation;
00117 _repeats = shouldRepeat;
00118 _isValid = YES;
00119 _fireDate = aDate;
00120 }
00121
00122 return self;
00123 }
00124
00128 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)shouldRepeat
00129 {
00130 var invocation = [CPInvocation invocationWithMethodSignature:1];
00131
00132 [invocation setTarget:aTarget];
00133 [invocation setSelector:aSelector];
00134 [invocation setArgument:self atIndex:2];
00135
00136 self = [self initWithFireDate:aDate interval:seconds invocation:invocation repeats:shouldRepeat];
00137
00138 if (self)
00139 _userInfo = userInfo;
00140
00141 return self;
00142 }
00143
00147 - (id)initWithFireDate:(CPDate)aDate interval:(CPTimeInterval)seconds callback:(Function)aFunction repeats:(BOOL)shouldRepeat
00148 {
00149 self = [super init];
00150
00151 if (self)
00152 {
00153 _timeInterval = seconds;
00154 _callback = aFunction;
00155 _repeats = shouldRepeat;
00156 _isValid = YES;
00157 _fireDate = aDate;
00158 }
00159
00160 return self;
00161 }
00162
00166 - (CPTimeInterval)timeInterval
00167 {
00168 return _timeInterval;
00169 }
00170
00174 - (CPDate)fireDate
00175 {
00176 return _fireDate;
00177 }
00178
00182 - (void)setFireDate:(CPDate)aDate
00183 {
00184 _fireDate = aDate;
00185 }
00186
00190 - (void)fire
00191 {
00192 if (!_isValid)
00193 return;
00194
00195 if (_callback)
00196 _callback();
00197 else
00198 [_invocation invoke];
00199
00200 if (!_isValid)
00201 return;
00202
00203 if (_repeats)
00204 _fireDate = [CPDate dateWithTimeIntervalSinceNow:_timeInterval];
00205
00206 else
00207 [self invalidate];
00208 }
00209
00213 - (BOOL)isValid
00214 {
00215 return _isValid;
00216 }
00217
00221 - (void)invalidate
00222 {
00223 _isValid = NO;
00224 _userInfo = nil;
00225 _invocation = nil;
00226 _callback = nil;
00227 }
00228
00232 - (id)userInfo
00233 {
00234 return _userInfo;
00235 }
00236
00237 @end
00238
00239 var CPTimersTimeoutID = 1000,
00240 CPTimersForTimeoutIDs = {};
00241
00242 var _CPTimerBridgeTimer = function(codeOrFunction, aDelay, shouldRepeat, functionArgs)
00243 {
00244 var timeoutID = CPTimersTimeoutID++,
00245 theFunction = nil;
00246
00247 if (typeof codeOrFunction === "string")
00248 theFunction = function() { new Function(codeOrFunction)(); if (!shouldRepeat) CPTimersForTimeoutIDs[timeoutID] = nil; }
00249 else
00250 {
00251 if (!functionArgs)
00252 functionArgs = [];
00253
00254 theFunction = function() { codeOrFunction.apply(window, functionArgs); if (!shouldRepeat) CPTimersForTimeoutIDs[timeoutID] = nil; }
00255 }
00256
00257 CPTimersForTimeoutIDs[timeoutID] = [CPTimer scheduledTimerWithTimeInterval:aDelay / 1000 callback:theFunction repeats:shouldRepeat];
00258
00259 return timeoutID;
00260 }
00261
00262 window.setTimeout = function(codeOrFunction, aDelay)
00263 {
00264 return _CPTimerBridgeTimer(codeOrFunction, aDelay, NO, Array.prototype.slice.apply(arguments, [2]));
00265 }
00266
00267 window.clearTimeout = function(aTimeoutID)
00268 {
00269 var timer = CPTimersForTimeoutIDs[aTimeoutID];
00270
00271 if (timer)
00272 [timer invalidate];
00273
00274 CPTimersForTimeoutIDs[aTimeoutID] = nil;
00275 }
00276
00277 window.setInterval = function(codeOrFunction, aDelay, functionArgs)
00278 {
00279 return _CPTimerBridgeTimer(codeOrFunction, aDelay, YES, Array.prototype.slice.apply(arguments, [2]));
00280 }
00281
00282 window.clearInterval = function(aTimeoutID)
00283 {
00284 window.clearTimeout(aTimeoutID);
00285 }