]> git.saurik.com Git - wxWidgets.git/commitdiff
Implement a reasonable DoGetBestSize (NSProgressIndicator is not an NSControl)
authorDavid Elliott <dfe@tgwbd.org>
Sat, 10 Apr 2004 03:23:41 +0000 (03:23 +0000)
committerDavid Elliott <dfe@tgwbd.org>
Sat, 10 Apr 2004 03:23:41 +0000 (03:23 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@26689 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/cocoa/gauge.h
src/cocoa/gauge.mm

index 8dd3529d9335c7d1700617fe9645c97f827b8930..dd5228059ba160084297b8c7d8a30ae373052c3a 100644 (file)
@@ -14,6 +14,8 @@
 
 // #include "wx/cocoa/NSProgressIndicator.h"
 
+DECLARE_WXCOCOA_OBJC_CLASS(NSProgressIndicator);
+
 // ========================================================================
 // wxGauge
 // ========================================================================
@@ -48,6 +50,8 @@ public:
 // ------------------------------------------------------------------------
 // Cocoa callbacks
 // ------------------------------------------------------------------------
+public:
+    inline WX_NSProgressIndicator GetNSProgressIndicator() const { return (WX_NSProgressIndicator)m_cocoaNSView; }
 protected:
     // NSProgressIndicator cannot be enabled/disabled
     virtual void CocoaSetEnabled(bool enable) { }
@@ -62,6 +66,8 @@ public:
     // retrieve/change the range
     virtual void SetRange(int maxValue);
     int GetRange(void) const;
+protected:
+    virtual wxSize DoGetBestSize() const;
 };
 
 #endif // __WX_COCOA_GAUGE_H__
index 028064b74a954506aa03fc1b3064d5b866dbf01e..92978f94bd142775e37f43f2d273d2c181de16e4 100644 (file)
 #ifndef WX_PRECOMP
     #include "wx/app.h"
     #include "wx/gauge.h"
+    #include "wx/log.h"
 #endif //WX_PRECOMP
 
+#include "wx/cocoa/autorelease.h"
+
 #import <AppKit/NSProgressIndicator.h>
+#import <Foundation/NSException.h>
+
+#include <math.h>
 
 IMPLEMENT_DYNAMIC_CLASS(wxGauge, wxControl)
 BEGIN_EVENT_TABLE(wxGauge, wxGaugeBase)
@@ -68,4 +74,31 @@ void wxGauge::SetRange(int maxValue)
     [(NSProgressIndicator*)m_cocoaNSView setMaxValue:maxValue];
 }
 
+// NSProgressIndicator is not an NSControl but does respond to
+// sizeToFit on OS X >= 10.2
+wxSize wxGauge::DoGetBestSize() const
+{
+    wxAutoNSAutoreleasePool pool;
+    wxASSERT(GetNSProgressIndicator());
+    NSRect storedRect = [m_cocoaNSView frame];
+    bool didFit = false;
+NS_DURING
+    [GetNSProgressIndicator() sizeToFit];
+    didFit = true;
+NS_HANDLER
+    // TODO: if anything other than method not implemented, re-raise
+NS_ENDHANDLER
+    if(didFit)
+    {
+        NSRect cocoaRect = [m_cocoaNSView frame];
+        wxSize size((int)ceilf(cocoaRect.size.width),(int)ceilf(cocoaRect.size.height));
+        [m_cocoaNSView setFrame: storedRect];
+        wxLogTrace(wxTRACE_COCOA_Window_Size,wxT("wxControl=%p::DoGetBestSize()==(%d,%d) from sizeToFit"),this,size.x,size.y);
+        return /*wxConstCast(this, wxControl)->m_bestSize =*/ size;
+    }
+    // Cocoa can't tell us the size
+    float height = NSProgressIndicatorPreferredAquaThickness;
+    return wxSize((int)(height*2),(int)height);
+}
+
 #endif // wxUSE_GAUGE