]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toolbar.cpp
changing ES_LEFT/CENTER/RIGHT styles only works for plain (not rich) controls and...
[wxWidgets.git] / src / mac / carbon / toolbar.cpp
index f338f0fc7798cfa0378ca1d96cb78acfffcab281..61fdc4325ab3b00124bddcbb82e21a8259bc744d 100644 (file)
@@ -19,6 +19,7 @@
     #include "wx/wx.h"
 #endif
 
+#include "wx/app.h"
 #include "wx/mac/uma.h"
 #include "wx/geometry.h"
 
@@ -82,11 +83,6 @@ public:
     virtual ~wxToolBarTool()
     {
         ClearControl();
-
-#if wxMAC_USE_NATIVE_TOOLBAR
-        if ( m_toolbarItemRef )
-            CFRelease( m_toolbarItemRef );
-#endif
     }
 
     WXWidget GetControlHandle()
@@ -116,7 +112,14 @@ public:
         }
 
 #if wxMAC_USE_NATIVE_TOOLBAR
-        m_toolbarItemRef = NULL;
+        if ( m_toolbarItemRef )
+        {
+            CFIndex count = CFGetRetainCount( m_toolbarItemRef ) ;
+            wxASSERT_MSG( count == 1 , wxT("Reference Count of native tool was not 1 in wxToolBarTool destructor") );
+            wxTheApp->MacAddToAutorelease(m_toolbarItemRef);
+            CFRelease(m_toolbarItemRef);
+            m_toolbarItemRef = NULL;
+        }
 #endif
     }
 
@@ -392,8 +395,6 @@ void wxToolBarTool::SetPosition( const wxPoint& position )
     m_x = position.x;
     m_y = position.y;
 
-    int x, y;
-    x = y = 0;
     int mac_x = position.x;
     int mac_y = position.y;
 
@@ -437,33 +438,6 @@ void wxToolBarTool::SetPosition( const wxPoint& position )
 
 void wxToolBarTool::UpdateToggleImage( bool toggle )
 {
-#if wxMAC_USE_NATIVE_TOOLBAR
-
-#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_4
-#define kHIToolbarItemSelected (1 << 7)
-#endif
-
-    // FIXME: this should be a OSX v10.4 runtime check
-    if (m_toolbarItemRef != NULL)
-    {
-        OptionBits addAttrs, removeAttrs;
-        OSStatus result;
-
-        if (toggle)
-        {
-            addAttrs = kHIToolbarItemSelected;
-            removeAttrs = kHIToolbarItemNoAttributes;
-        }
-        else
-        {
-            addAttrs = kHIToolbarItemNoAttributes;
-            removeAttrs = kHIToolbarItemSelected;
-        }
-
-        result = HIToolbarItemChangeAttributes( m_toolbarItemRef, addAttrs, removeAttrs );
-    }
-#endif
-
 #ifdef __WXMAC_OSX__
     if ( toggle )
     {
@@ -473,14 +447,20 @@ void wxToolBarTool::UpdateToggleImage( bool toggle )
         wxMemoryDC dc;
 
         dc.SelectObject( bmp );
-        dc.SetPen( wxNullPen );
-        dc.SetBackground( *wxWHITE );
+        dc.SetPen( wxPen(*wxBLACK) );
+        dc.SetBrush( wxBrush( *wxLIGHT_GREY ));
         dc.DrawRectangle( 0, 0, w, h );
         dc.DrawBitmap( m_bmpNormal, 0, 0, true );
         dc.SelectObject( wxNullBitmap );
         ControlButtonContentInfo info;
         wxMacCreateBitmapButton( &info, bmp );
         SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info );
+#if wxMAC_USE_NATIVE_TOOLBAR
+        if (m_toolbarItemRef != NULL)
+        {
+            HIToolbarItemSetIconRef( m_toolbarItemRef, info.u.iconRef );
+        }
+#endif
         wxMacReleaseBitmapButton( &info );
     }
     else
@@ -488,6 +468,12 @@ void wxToolBarTool::UpdateToggleImage( bool toggle )
         ControlButtonContentInfo info;
         wxMacCreateBitmapButton( &info, m_bmpNormal );
         SetControlData( m_controlHandle, 0, kControlIconContentTag, sizeof(info), (Ptr)&info );
+#if wxMAC_USE_NATIVE_TOOLBAR
+        if (m_toolbarItemRef != NULL)
+        {
+            HIToolbarItemSetIconRef( m_toolbarItemRef, info.u.iconRef );
+        }
+#endif
         wxMacReleaseBitmapButton( &info );
     }
 
@@ -627,8 +613,19 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
                     break;
 
                 case kEventHIObjectDestruct:
-                    free( object ) ;
-                    result = noErr;
+                    {
+                        // we've increased the ref count when creating this, so we decrease manually again in case
+                        // it was never really installed and deinstalled
+                        HIViewRef viewRef = object->viewRef ;
+                        if( viewRef && IsValidControlHandle( viewRef)  )
+                        {
+                            CFIndex count =  CFGetRetainCount( viewRef ) ; 
+                            if ( count >= 1 )
+                                CFRelease( viewRef ) ;
+                        }
+                           free( object ) ;
+                       result = noErr;
+                    }
                     break;
             }
             break;
@@ -729,6 +726,7 @@ CantCreateEvent :
     return result ;
 }
 
+#if wxMAC_USE_NATIVE_TOOLBAR
 static const EventTypeSpec kToolbarEvents[] =
 {
     { kEventClassToolbar, kEventToolbarGetDefaultIdentifiers },
@@ -792,6 +790,7 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef
     }
     return result ;
 }
+#endif // wxMAC_USE_NATIVE_TOOLBAR
 
 // also for the toolbar we have the dual implementation:
 // only when MacInstallNativeToolbar is called is the native toolbar set as the window toolbar
@@ -807,6 +806,8 @@ bool wxToolBar::Create(
     if ( !wxToolBarBase::Create( parent, id, pos, size, style, wxDefaultValidator, name ) )
         return false;
 
+    FixupStyle();
+
     OSStatus err = noErr;
 
 #if wxMAC_USE_NATIVE_TOOLBAR
@@ -847,6 +848,9 @@ wxToolBar::~wxToolBar()
         if (m_macUsesNativeToolbar)
             MacInstallNativeToolbar( false );
 
+        CFIndex count = CFGetRetainCount( m_macHIToolbarRef ) ;
+        wxASSERT_MSG( count == 1 , wxT("Reference Count of native control was not 1 in wxToolBar destructor") );
+
         CFRelease( (HIToolbarRef)m_macHIToolbarRef );
         m_macHIToolbarRef = NULL;
     }
@@ -1085,7 +1089,6 @@ bool wxToolBar::Realize()
 
     bool lastIsRadio = false;
     bool curIsRadio = false;
-    bool setChoiceInGroup = false;
 
 #if wxMAC_USE_NATIVE_TOOLBAR
     CFIndex currentPosition = 0;
@@ -1180,8 +1183,6 @@ bool wxToolBar::Realize()
         {
             if ( tool->IsToggled() )
                 DoToggleTool( tool, true );
-
-            setChoiceInGroup = false;
         }
         else
         {
@@ -1190,7 +1191,6 @@ bool wxToolBar::Realize()
                 if ( tool->Toggle( true ) )
                 {
                     DoToggleTool( tool, true );
-                    setChoiceInGroup = true;
                 }
             }
             else if ( tool->IsToggled() )
@@ -1259,7 +1259,7 @@ bool wxToolBar::Realize()
     InvalidateBestSize();
 #endif
 
-    SetBestFittingSize();
+    SetInitialSize();
 
     return true;
 }
@@ -1535,34 +1535,29 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
     CFIndex removeIndex = tool->GetIndex();
 #endif
 
+#if wxMAC_USE_NATIVE_TOOLBAR
+    if ( removeIndex != -1 && m_macHIToolbarRef )
+    {
+        HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
+        tool->SetIndex( -1 );
+    }
+#endif
     switch ( tool->GetStyle() )
     {
         case wxTOOL_STYLE_CONTROL:
-            {
+            if ( tool->GetControl() )
                 tool->GetControl()->Destroy();
-                tool->ClearControl();
-            }
             break;
 
         case wxTOOL_STYLE_BUTTON:
         case wxTOOL_STYLE_SEPARATOR:
-            if ( tool->GetControlHandle() )
-            {
-#if wxMAC_USE_NATIVE_TOOLBAR
-                if ( removeIndex != -1 && m_macHIToolbarRef )
-                {
-                    HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
-                    tool->SetIndex( -1 );
-                }
-#endif
-
-                tool->ClearControl();
-            }
+            // nothing special
             break;
 
         default:
             break;
     }
+    tool->ClearControl();
 
     // and finally reposition all the controls after this one
 
@@ -1667,7 +1662,9 @@ void wxToolBar::OnPaint(wxPaintEvent& event)
             drawInfo.kind = kThemeBackgroundMetal;
             HIThemeApplyBackground( &hiToolbarrect, &drawInfo, cgContext, kHIThemeOrientationNormal );
 
+#ifndef __LP64__
             QDEndCGContext( (CGrafPtr) dc.m_macPort, &cgContext );
+#endif
 #endif
         }
     }