// Name: src/cocoa/timer.mm
// Purpose: wxTimer for wxCocoa
// Author: Ryan Norton
-// Modified by:
+// Modified by: David Elliott
// Created: 2005-02-04
// RCS-ID: $Id$
// Copyright: (c) Ryan Norton
#if wxUSE_TIMER
-#ifndef WX_PRECOMP
- #include "wx/timer.h"
-#endif
+#include "wx/cocoa/private/timer.h"
+#include "wx/cocoa/autorelease.h"
-#import <Foundation/NSTimer.h>
-
-// ============================================================================
-// implementation
-// ============================================================================
-
-IMPLEMENT_CLASS(wxTimer, wxTimerBase)
-
-// ========================================================================
-// wxNSTimerDelegate
-// ========================================================================
-@interface wxNSTimerDelegate : NSObject
-{
-}
+#include "wx/cocoa/objc/objc_uniquifying.h"
-- (void)onNotify:(NSTimer *)theTimer;
-@end // interface wxNSTimerDelegate : NSObject
+#import <Foundation/NSTimer.h>
// ========================================================================
// wxNSTimerData
// ========================================================================
@interface wxNSTimerData : NSObject
{
- wxTimer* m_timer;
+ wxCocoaTimerImpl* m_timer;
}
-- (id)setTimer:(wxTimer*)theTimer;
-- (wxTimer*)timer;
+- (id)init;
+- (id)initWithWxTimer:(wxCocoaTimerImpl*)theTimer;
+- (wxCocoaTimerImpl*)timer;
+- (void)onNotify:(NSTimer *)theTimer;
@end // interface wxNSTimerData : NSObject
+WX_DECLARE_GET_OBJC_CLASS(wxNSTimerData,NSObject)
@implementation wxNSTimerData : NSObject
-- (id)setTimer:(wxTimer*)theTimer;
+- (id)init
+{
+ if(!(self = [super init]))
+ return nil;
+ m_timer = NULL;
+ return self;
+}
+
+- (id)initWithWxTimer:(wxCocoaTimerImpl*)theTimer;
{
+ if(!(self = [super init]))
+ return nil;
m_timer = theTimer;
return self;
}
-- (wxTimer*)timer
+
+- (wxCocoaTimerImpl*)timer
{
return m_timer;
}
-@end
-@implementation wxNSTimerDelegate : NSObject
- (void)onNotify:(NSTimer *)theTimer
{
- wxNSTimerData* theData = [theTimer userInfo];
- [theData timer]->Notify(); //wxTimerBase method
+ m_timer->Notify();
}
-@end
+@end
+WX_IMPLEMENT_GET_OBJC_CLASS(wxNSTimerData,NSObject)
// ----------------------------------------------------------------------------
-// wxTimer
+// wxCocoaTimerImpl
// ----------------------------------------------------------------------------
-const wxObjcAutoRefFromAlloc<struct objc_object*> wxTimer::sm_cocoaDelegate = [[wxNSTimerDelegate alloc] init];
-
-wxTimer::~wxTimer()
+wxCocoaTimerImpl::~wxCocoaTimerImpl()
{
Stop();
}
-void wxTimer::Init()
+void wxCocoaTimerImpl::Init()
{
m_cocoaNSTimer = NULL;
}
-bool wxTimer::Start(int millisecs, bool oneShot)
+bool wxCocoaTimerImpl::Start(int millisecs, bool oneShot)
{
- m_cocoaNSTimer = [[NSTimer
+ Stop();
+
+ wxAutoNSAutoreleasePool thePool;
+
+ wxNSTimerData *timerData = [[WX_GET_OBJC_CLASS(wxNSTimerData) alloc] initWithWxTimer:this];
+ m_cocoaNSTimer = [[NSTimer
scheduledTimerWithTimeInterval: millisecs / 1000.0 //seconds
- target: wxTimer::sm_cocoaDelegate
- selector: @selector(onNotify:)
- userInfo: [[wxNSTimerData alloc] setTimer:this]
- repeats: oneShot == false] retain];
-
+ target: timerData
+ selector: @selector(onNotify:)
+ userInfo: nil
+ repeats: oneShot == false] retain];
+ [timerData release];
+
return IsRunning();
}
-void wxTimer::Stop()
+void wxCocoaTimerImpl::Stop()
{
if (m_cocoaNSTimer)
{
+ // FIXME: Is this safe to do if !isValid ?
[m_cocoaNSTimer invalidate];
- [[m_cocoaNSTimer userInfo] release];
[m_cocoaNSTimer release];
+ m_cocoaNSTimer = NULL;
}
}
-bool wxTimer::IsRunning() const
+bool wxCocoaTimerImpl::IsRunning() const
{
return m_cocoaNSTimer != NULL && [m_cocoaNSTimer isValid];
}