]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toolbar.cpp
Patch [ 1314868 ] [wxMSW] Show MDI child menubars when ShowFullScreen(false)
[wxWidgets.git] / src / mac / carbon / toolbar.cpp
index da27d58ef1a6f8b5e7fab0889b4d5ee80107c555..b7c55f0812070b3b0a34061a96777d5abb5182f8 100644 (file)
@@ -9,10 +9,6 @@
 // Licence:     The wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-#pragma implementation "toolbar.h"
-#endif
-
 #include "wx/wxprec.h"
 
 #if wxUSE_TOOLBAR
@@ -79,7 +75,7 @@ public:
 
     ~wxToolBarTool()
     {
-       ClearControl() ;
+        ClearControl() ;
         if ( m_controlHandle )
             DisposeControl( m_controlHandle ) ;
 #if wxMAC_USE_NATIVE_TOOLBAR
@@ -95,14 +91,14 @@ public:
 
     void SetControlHandle( ControlRef handle )
     {
-       m_controlHandle = handle ;
+        m_controlHandle = handle ;
     }
 
     void SetPosition( const wxPoint& position ) ;
 
     void ClearControl()
     {
-       m_control = NULL ;
+        m_control = NULL ;
 #if wxMAC_USE_NATIVE_TOOLBAR
         m_toolbarItemRef = NULL ;
 #endif
@@ -156,13 +152,13 @@ public:
     {
         return m_toolbarItemRef ;
     }
-    
-    void SetIndex( CFIndex idx ) 
+
+    void SetIndex( CFIndex idx )
     {
         m_index = idx ;
     }
 
-    CFIndex GetIndex() const 
+    CFIndex GetIndex() const
     {
         return m_index ;
     }
@@ -189,9 +185,9 @@ private :
 
 static const EventTypeSpec eventList[] =
 {
-       { kEventClassControl , kEventControlHit } ,
+    { kEventClassControl , kEventControlHit } ,
 #ifdef __WXMAC_OSX__
-       { kEventClassControl , kEventControlHitTest } ,
+    { kEventClassControl , kEventControlHitTest } ,
 #endif
 } ;
 
@@ -275,7 +271,7 @@ DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacToolBarToolEventHandler )
 
 static const EventTypeSpec toolBarEventList[] =
 {
-       { kEventClassToolbarItem , kEventToolbarItemPerformAction } ,
+    { kEventClassToolbarItem , kEventToolbarItemPerformAction } ,
 } ;
 
 static pascal OSStatus wxMacToolBarCommandEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
@@ -462,22 +458,22 @@ void wxToolBarTool::UpdateToggleImage( bool toggle )
         dc.SelectObject( wxNullBitmap ) ;
         ControlButtonContentInfo info ;
         wxMacCreateBitmapButton( &info , bmp ) ;
-       SetControlData( m_controlHandle , 0, kControlIconContentTag, sizeof( info ),
-                       (Ptr)&info );
+        SetControlData( m_controlHandle , 0, kControlIconContentTag,
+                        sizeof( info ), (Ptr)&info );
         wxMacReleaseBitmapButton( &info ) ;
     }
     else
     {
         ControlButtonContentInfo info ;
         wxMacCreateBitmapButton( &info , m_bmpNormal ) ;
-       SetControlData( m_controlHandle , 0, kControlIconContentTag, sizeof( info ),
-                       (Ptr)&info );
+        SetControlData( m_controlHandle , 0, kControlIconContentTag,
+                        sizeof( info ), (Ptr)&info );
         wxMacReleaseBitmapButton( &info ) ;
     }
 
     IconTransformType transform = toggle ? kTransformSelected : kTransformNone ;
-       SetControlData( m_controlHandle, 0, kControlIconTransformTag, sizeof( transform ),
-                       (Ptr)&transform );
+    SetControlData( m_controlHandle, 0, kControlIconTransformTag,
+                    sizeof( transform ), (Ptr)&transform );
     HIViewSetNeedsDisplay( m_controlHandle , true ) ;
 
 #else
@@ -597,8 +593,9 @@ bool wxToolBar::Show( bool show )
         MacTopLevelHasNativeToolbar( &ownToolbarInstalled );
         if (ownToolbarInstalled)
         {
-            bResult = (HIViewIsVisible( (HIViewRef)m_macHIToolbarRef ) != show);
-            ShowHideWindowToolbar( tlw, show, false );
+            bResult = ( IsWindowToolbarVisible(tlw) != show);
+            if ( bResult )
+                ShowHideWindowToolbar( tlw, show, false );
         }
         else
 #endif
@@ -616,7 +613,10 @@ bool wxToolBar::IsShown() const
     bool ownToolbarInstalled ;
     MacTopLevelHasNativeToolbar( &ownToolbarInstalled );
     if (ownToolbarInstalled)
-        bResult = HIViewIsVisible( (HIViewRef)m_macHIToolbarRef );
+    {
+        WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());
+        bResult = IsWindowToolbarVisible(tlw) ;
+    }
     else
 #endif
         bResult = wxToolBarBase::IsShown();
@@ -645,6 +645,13 @@ void wxToolBar::DoGetSize( int *width, int *height ) const
         wxToolBarBase::DoGetSize( width, height );
 }
 
+wxSize wxToolBar::DoGetBestSize() const
+{
+    int width , height ;
+    DoGetSize( &width , &height ) ;
+    return wxSize( width , height ) ;
+}
+
 void wxToolBar::SetWindowStyleFlag( long style )
 {
     wxToolBarBase::SetWindowStyleFlag( style );
@@ -693,7 +700,7 @@ bool wxToolBar::MacTopLevelHasNativeToolbar(bool *ownToolbarInstalled) const
 
 bool wxToolBar::MacInstallNativeToolbar(bool usesNative)
 {
-    bool       bResult = false;
+    bool bResult = false;
 
     WindowRef tlw = MAC_WXHWND(MacGetTopLevelWindowRef());
     if (tlw == NULL)
@@ -776,18 +783,6 @@ bool wxToolBar::Realize()
     if (m_tools.GetCount() == 0)
         return false;
 
-    OSStatus err = noErr ;
-#if wxMAC_USE_NATIVE_TOOLBAR
-    // remove all tools, no way to determine how many there are in a toolbar, so just a high number :-(
-    if ( m_macHIToolbarRef != NULL )
-    {
-        for ( CFIndex i = 0 ; i < 100 ; ++i )
-        {
-            err = HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef , i ) ;
-        }
-    }
-#endif
-    
     int x = m_xMargin + kwxMacToolBarLeftMargin;
     int y = m_yMargin + kwxMacToolBarTopMargin;
 
@@ -824,9 +819,12 @@ bool wxToolBar::Realize()
     bool    setChoiceInGroup = false;
 
     node = m_tools.GetFirst();
-    
+
+#if wxMAC_USE_NATIVE_TOOLBAR
     CFIndex currentPosition = 0 ;
-    
+    bool insertAll = false ;
+#endif // wxMAC_USE_NATIVE_TOOLBAR
+
     while ( node != NULL )
     {
         wxToolBarTool   *tool = (wxToolBarTool *) node->GetData();
@@ -869,17 +867,30 @@ bool wxToolBar::Realize()
             HIToolbarItemRef    hiItemRef = tool->GetToolbarItemRef();
             if ( hiItemRef != NULL )
             {
-                OSStatus result = HIToolbarInsertItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, hiItemRef , currentPosition ) ;                
-                if ( result == 0 )
+                if ( tool->GetIndex() != currentPosition || insertAll == true )
                 {
+                    OSStatus err = noErr ;
+                    if ( !insertAll )
+                    {
+                        // if this is the first tool that gets newly inserted or repositioned
+                        // first remove all 'old' tools from here to the right, because of this
+                        // all following tools will have to be reinserted (insertAll). i = 100 because there's
+                        // no way to determine how many there are in a toolbar, so just a high number :-(
+                        for ( CFIndex i = 100 ; i >= currentPosition ; --i )
+                        {
+                            err = HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef , i ) ;
+                        }
+                        wxASSERT_MSG( err == noErr, _T("HIToolbarRemoveItemAtIndex failed") );
+                        insertAll = true ;
+                    }
+                    err = HIToolbarInsertItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, hiItemRef , currentPosition ) ;
+                    wxASSERT_MSG( err == noErr, _T("HIToolbarInsertItemAtIndex failed") );
                     tool->SetIndex( currentPosition ) ;
-                    currentPosition++ ;
-                    InstallEventHandler( HIObjectGetEventTarget(hiItemRef), GetwxMacToolBarEventHandlerUPP(),
-                                         GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL );
                 }
+                currentPosition++ ;
             }
         }
-#endif
+#endif // wxMAC_USE_NATIVE_TOOLBAR
 
         // update radio button (and group) state
         lastIsRadio = curIsRadio;
@@ -1090,15 +1101,15 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
 
         #ifdef __WXMAC_OSX__
                 // in flat style we need a visual separator
-               #if wxMAC_USE_NATIVE_TOOLBAR
+            #if wxMAC_USE_NATIVE_TOOLBAR
                 HIToolbarItemRef item;
                 err = HIToolbarItemCreate( kHIToolbarSeparatorIdentifier, kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates, &item );
                 if (err == noErr)
                     tool->SetToolbarItemRef( item );
-               #endif
+            #endif // wxMAC_USE_NATIVE_TOOLBAR
                 CreateSeparatorControl( window, &toolrect, &controlHandle );
                 tool->SetControlHandle( controlHandle );
-        #endif
+        #endif // __WXMAC_OSX__
             }
             break;
 
@@ -1108,16 +1119,18 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
                 ControlButtonContentInfo info ;
                 wxMacCreateBitmapButton( &info , tool->GetNormalBitmap()  , kControlContentIconRef ) ;
 
-                       if ( UMAGetSystemVersion() >= 0x1000)
-                       CreateIconControl( window , &toolrect , &info , false , &controlHandle ) ;
-                       else
-                       {
-                               SInt16 behaviour = kControlBehaviorOffsetContents ;
-                               if ( tool->CanBeToggled() )
-                                   behaviour += kControlBehaviorToggles ;
-                               CreateBevelButtonControl( window , &toolrect , CFSTR("") , kControlBevelButtonNormalBevel , behaviour , &info ,
-                                   0 , 0 , 0 , &controlHandle ) ;
-                       }
+                if ( UMAGetSystemVersion() >= 0x1000)
+                    CreateIconControl( window , &toolrect , &info , false , &controlHandle ) ;
+                else
+                {
+                    SInt16 behaviour = kControlBehaviorOffsetContents ;
+                    if ( tool->CanBeToggled() )
+                        behaviour += kControlBehaviorToggles ;
+                    CreateBevelButtonControl( window , &toolrect , CFSTR("") ,
+                                              kControlBevelButtonNormalBevel ,
+                                              behaviour , &info ,
+                                              0 , 0 , 0 , &controlHandle ) ;
+                }
 
 #if wxMAC_USE_NATIVE_TOOLBAR
                 HIToolbarItemRef item ;
@@ -1127,12 +1140,14 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
                     kHIToolbarItemCantBeRemoved | kHIToolbarItemAnchoredLeft | kHIToolbarItemAllowDuplicates, &item );
                 if (err  == noErr)
                 {
+                    InstallEventHandler( HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(),
+                                         GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL );
                     HIToolbarItemSetLabel( item, wxMacCFStringHolder(tool->GetLabel(), m_font.GetEncoding()) );
                     HIToolbarItemSetIconRef( item, info.u.iconRef );
                     HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction );
                     tool->SetToolbarItemRef( item );
                 }
-#endif
+#endif // wxMAC_USE_NATIVE_TOOLBAR
 
                 wxMacReleaseBitmapButton( &info ) ;
                 /*
@@ -1236,8 +1251,10 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
     wxSize sz = ((wxToolBarTool*)tool)->GetSize() ;
 
     tool->Detach();
-    
-    CFIndex removeIndex = tool->GetIndex() ;
+
+#if wxMAC_USE_NATIVE_TOOLBAR
+    CFIndex removeIndex = tool->GetIndex();
+#endif // wxMAC_USE_NATIVE_TOOLBAR
 
     switch ( tool->GetStyle() )
     {
@@ -1254,12 +1271,12 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
             {
                 DisposeControl( (ControlRef) tool->GetControlHandle() ) ;
 #if wxMAC_USE_NATIVE_TOOLBAR
-                               if ( removeIndex != -1 && m_macHIToolbarRef )
+                if ( removeIndex != -1 && m_macHIToolbarRef )
                 {
-                       HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef , removeIndex ) ;
+                    HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef , removeIndex ) ;
                     tool->SetIndex( -1 ) ;
                 }
-#endif
+#endif // wxMAC_USE_NATIVE_TOOLBAR
                 tool->ClearControl() ;
             }
             break;
@@ -1281,12 +1298,12 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
             pt.x -= sz.x ;
 
         tool2->SetPosition( pt ) ;
-    
+
 #if wxMAC_USE_NATIVE_TOOLBAR
         if ( removeIndex != -1 && tool2->GetIndex() > removeIndex )
             tool2->SetIndex( tool2->GetIndex() - 1 ) ;
 #endif
-        
+
     }
 
     InvalidateBestSize();