]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/carbon/anybutton.cpp
Refactor wxButton and wxToggleButton to derive from wxAnyButton.
[wxWidgets.git] / src / osx / carbon / anybutton.cpp
diff --git a/src/osx/carbon/anybutton.cpp b/src/osx/carbon/anybutton.cpp
new file mode 100644 (file)
index 0000000..36a642a
--- /dev/null
@@ -0,0 +1,113 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        src/osx/carbon/anybutton.cpp
+// Purpose:     wxAnyButton
+// Author:      Stefan Csomor
+// Created:     1998-01-01 (extracted from button.cpp)
+// RCS-ID:      $Id: anybutton.cpp 67230 2011-03-18 14:20:12Z SC $
+// Copyright:   (c) Stefan Csomor
+// Licence:     wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/wxprec.h"
+
+#include "wx/anybutton.h"
+
+#ifndef WX_PRECOMP
+    #include "wx/panel.h"
+    #include "wx/toplevel.h"
+    #include "wx/dcclient.h"
+#endif
+
+#include "wx/stockitem.h"
+
+#include "wx/osx/private.h"
+
+wxSize wxAnyButton::DoGetBestSize() const
+{
+    if ( GetId() == wxID_HELP )
+        return wxSize( 20 , 20 ) ;
+
+    wxSize sz = GetDefaultSize() ;
+
+    switch (GetWindowVariant())
+    {
+        case wxWINDOW_VARIANT_NORMAL:
+        case wxWINDOW_VARIANT_LARGE:
+            sz.y = 20 ;
+            break;
+
+        case wxWINDOW_VARIANT_SMALL:
+            sz.y = 17 ;
+            break;
+
+        case wxWINDOW_VARIANT_MINI:
+            sz.y = 15 ;
+            break;
+
+        default:
+            break;
+    }
+
+#if wxOSX_USE_CARBON
+    Rect    bestsize = { 0 , 0 , 0 , 0 } ;
+    GetPeer()->GetBestRect( &bestsize ) ;
+
+    int wBtn;
+    if ( EmptyRect( &bestsize ) || ( GetWindowStyle() & wxBU_EXACTFIT) )
+    {
+        Point bounds;
+
+        ControlFontStyleRec controlFont;
+        OSStatus err = GetPeer()->GetData<ControlFontStyleRec>( kControlEntireControl, kControlFontStyleTag, &controlFont );
+        verify_noerr( err );
+
+        // GetThemeTextDimensions will cache strings and the documentation
+        // says not to use the NoCopy string creation calls.
+        // This also means that we can't use CFSTR without
+        // -fno-constant-cfstrings if the library might be unloaded,
+        // as GetThemeTextDimensions may cache a pointer to our
+        // unloaded segment.
+        wxCFStringRef str( !m_label.empty() ? m_label : wxString(" "),
+                          GetFont().GetEncoding() );
+
+#if wxOSX_USE_ATSU_TEXT
+        SInt16 baseline;
+        if ( m_font.MacGetThemeFontID() != kThemeCurrentPortFont )
+        {
+            err = GetThemeTextDimensions(
+                (CFStringRef)str,
+                m_font.MacGetThemeFontID(), kThemeStateActive, false, &bounds, &baseline );
+            verify_noerr( err );
+        }
+        else
+#endif
+        {
+            wxClientDC dc(const_cast<wxAnyButton*>(this));
+            wxCoord width, height ;
+            dc.GetTextExtent( m_label , &width, &height);
+            bounds.h = width;
+            bounds.v = height;
+        }
+
+        wBtn = bounds.h + sz.y;
+    }
+    else
+    {
+        wBtn = bestsize.right - bestsize.left ;
+        // non 'normal' window variants don't return the correct height
+        // sz.y = bestsize.bottom - bestsize.top ;
+    }
+    if ((wBtn > sz.x) || ( GetWindowStyle() & wxBU_EXACTFIT))
+        sz.x = wBtn;
+#endif
+
+    return sz ;
+}
+
+wxSize wxAnyButton::GetDefaultSize()
+{
+    int wBtn = 70 ;
+    int hBtn = 20 ;
+
+    return wxSize(wBtn, hBtn);
+}