]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/timer.mm
[ 1509599 ] 'Split pickers page in widgets sample' with more icons and rebaking.
[wxWidgets.git] / src / cocoa / timer.mm
index 9cef73ce20a71d025a767ae2ea04a8aed6a270a5..4815472d7bc3ccb0eb80aec91884facc8f35818b 100644 (file)
@@ -2,7 +2,7 @@
 // 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
@@ -22,8 +22,9 @@
 
 #if wxUSE_TIMER
 
+#include "wx/timer.h"
+
 #ifndef WX_PRECOMP
-    #include "wx/timer.h"
 #endif
 
 #include "wx/cocoa/autorelease.h"
 
 IMPLEMENT_CLASS(wxTimer, wxTimerBase)
 
-// ========================================================================
-// wxNSTimerDelegate
-// ========================================================================
-@interface wxNSTimerDelegate : NSObject
-{
-}
-
-- (void)onNotify:(NSTimer *)theTimer;
-@end // interface wxNSTimerDelegate : NSObject
-
 // ========================================================================
 // wxNSTimerData
 // ========================================================================
@@ -54,36 +45,44 @@ IMPLEMENT_CLASS(wxTimer, wxTimerBase)
     wxTimer* m_timer;
 }
 
-- (id)setTimer:(wxTimer*)theTimer;
+- (id)init;
+- (id)initWithWxTimer:(wxTimer*)theTimer;
 - (wxTimer*)timer;
+- (void)onNotify:(NSTimer *)theTimer;
 @end // interface wxNSTimerData : NSObject
 
 @implementation wxNSTimerData : NSObject
-- (id)setTimer:(wxTimer*)theTimer;
+- (id)init
 {
+    if(!(self = [super init]))
+        return nil;
+    m_timer = NULL;
+    return self;
+}
+
+- (id)initWithWxTimer:(wxTimer*)theTimer;
+{
+    if(!(self = [super init]))
+        return nil;
     m_timer = theTimer;
     return self;
 }
+
 - (wxTimer*)timer
 {
     return m_timer;
 }
-@end 
 
-@implementation wxNSTimerDelegate : NSObject
 - (void)onNotify:(NSTimer *)theTimer
 {
-    wxNSTimerData* theData = [theTimer userInfo];
-    [theData timer]->Notify(); //wxTimerBase method
+    m_timer->Notify(); //wxTimerBase method
 }
-@end 
+@end
 
 // ----------------------------------------------------------------------------
 // wxTimer
 // ----------------------------------------------------------------------------
 
-const wxObjcAutoRefFromAlloc<struct objc_object*> wxTimer::sm_cocoaDelegate = [[wxNSTimerDelegate alloc] init];
-
 wxTimer::~wxTimer()
 {
     Stop();
@@ -97,16 +96,18 @@ void wxTimer::Init()
 bool wxTimer::Start(int millisecs, bool oneShot)
 {
     Stop();
-    
+
     wxAutoNSAutoreleasePool thePool;
 
-    m_cocoaNSTimer =     [[NSTimer 
+    wxNSTimerData *timerData = [[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();
 }
 
@@ -114,9 +115,8 @@ void wxTimer::Stop()
 {
     if (m_cocoaNSTimer)
     {
-        NSObject* theUserInfo = [m_cocoaNSTimer userInfo];
+        // FIXME: Is this safe to do if !isValid ?
         [m_cocoaNSTimer invalidate];
-        [theUserInfo release];
         [m_cocoaNSTimer release];
         m_cocoaNSTimer = NULL;
     }