]> git.saurik.com Git - wxWidgets.git/blobdiff - src/mac/carbon/toolbar.cpp
further encapsulation of graphics context, wxdc becoming 'generic'
[wxWidgets.git] / src / mac / carbon / toolbar.cpp
index 6292291bdb54342d6db5ff2e284cd97f620a9f27..f338f0fc7798cfa0378ca1d96cb78acfffcab281 100644 (file)
@@ -106,7 +106,12 @@ public:
         m_control = NULL;
         if ( m_controlHandle )
         {
-            DisposeControl( m_controlHandle );
+            if ( !IsControl() )
+                DisposeControl( m_controlHandle );
+            else
+            {
+                // the embedded control is not under the responsibility of the tool
+            }
             m_controlHandle = NULL ;
         }
 
@@ -407,7 +412,13 @@ void wxToolBarTool::SetPosition( const wxPoint& position )
     }
     else if ( IsControl() )
     {
-        GetControl()->Move( position );
+        // embedded native controls are moved by the OS
+#if wxMAC_USE_NATIVE_TOOLBAR
+        if ( ((wxToolBar*)GetToolBar())->MacWantsNativeToolbar() == false )
+#endif
+        {
+            GetControl()->Move( position );
+        }
     }
     else
     {
@@ -545,15 +556,15 @@ void wxToolBar::Init()
 #endif
 }
 
-#define kControlToolbarItemClassID             CFSTR( "org.wxwidgets.controltoolbaritem" )
+#define kControlToolbarItemClassID      CFSTR( "org.wxwidgets.controltoolbaritem" )
 
 const EventTypeSpec kEvents[] = 
 {
-       { kEventClassHIObject, kEventHIObjectConstruct },
-       { kEventClassHIObject, kEventHIObjectInitialize },
-       { kEventClassHIObject, kEventHIObjectDestruct },
-       
-       { kEventClassToolbarItem, kEventToolbarItemCreateCustomView }
+    { kEventClassHIObject, kEventHIObjectConstruct },
+    { kEventClassHIObject, kEventHIObjectInitialize },
+    { kEventClassHIObject, kEventHIObjectDestruct },
+    
+    { kEventClassToolbarItem, kEventToolbarItemCreateCustomView }
 };
 
 const EventTypeSpec kViewEvents[] = 
@@ -570,40 +581,40 @@ struct ControlToolbarItem
 
 static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
 {
-       OSStatus                        result = eventNotHandledErr;
-       ControlToolbarItem*     object = (ControlToolbarItem*)inUserData;
-
-       switch ( GetEventClass( inEvent ) )
-       {
-               case kEventClassHIObject:
-                       switch ( GetEventKind( inEvent ) )
-                       {
-                               case kEventHIObjectConstruct:
-                                       {
-                                               HIObjectRef                     toolbarItem;
-                                               ControlToolbarItem*     item;
-                                               
-                                               GetEventParameter( inEvent, kEventParamHIObjectInstance, typeHIObjectRef, NULL,
+    OSStatus            result = eventNotHandledErr;
+    ControlToolbarItem* object = (ControlToolbarItem*)inUserData;
+
+    switch ( GetEventClass( inEvent ) )
+    {
+        case kEventClassHIObject:
+            switch ( GetEventKind( inEvent ) )
+            {
+                case kEventHIObjectConstruct:
+                    {
+                        HIObjectRef         toolbarItem;
+                        ControlToolbarItem* item;
+                        
+                        GetEventParameter( inEvent, kEventParamHIObjectInstance, typeHIObjectRef, NULL,
                             sizeof( HIObjectRef ), NULL, &toolbarItem );
-                                               
+                        
                         item = (ControlToolbarItem*) malloc(sizeof(ControlToolbarItem)) ;
                         item->toolbarItem = toolbarItem ;
                         item->viewRef = NULL ;
                         
-                                               SetEventParameter( inEvent, kEventParamHIObjectInstance, typeVoidPtr, sizeof( void * ), &item );
+                        SetEventParameter( inEvent, kEventParamHIObjectInstance, typeVoidPtr, sizeof( void * ), &item );
                         
                         result = noErr ;
-                                       }
-                                       break;
+                    }
+                    break;
  
                 case kEventHIObjectInitialize:
                     result = CallNextEventHandler( inCallRef, inEvent );
-                                       if ( result == noErr )
+                    if ( result == noErr )
                     {
                         CFDataRef           data;
                         GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL,
                             sizeof( CFTypeRef ), NULL, &data );
-                                       
+                    
                         HIViewRef viewRef ;
                         
                         wxASSERT_MSG( CFDataGetLength( data ) == sizeof( viewRef ) , wxT("Illegal Data passed") ) ;
@@ -611,22 +622,22 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
                     
                         object->viewRef = (HIViewRef) viewRef ;
 
-                                               result = noErr ;
-                                       }
+                        result = noErr ;
+                    }
                     break;
 
-                               case kEventHIObjectDestruct:
+                case kEventHIObjectDestruct:
                     free( object ) ;
-                                       result = noErr;
-                                       break;
-                       }
-                       break;
-               
-               case kEventClassToolbarItem:
-                       switch ( GetEventKind( inEvent ) )
-                       {                               
-                               case kEventToolbarItemCreateCustomView:
-                               {
+                    result = noErr;
+                    break;
+            }
+            break;
+        
+        case kEventClassToolbarItem:
+            switch ( GetEventKind( inEvent ) )
+            {               
+                case kEventToolbarItemCreateCustomView:
+                {
                     HIViewRef viewRef = object->viewRef ;
 
                     HIViewRemoveFromSuperview( viewRef ) ;
@@ -635,16 +646,16 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
                                             GetEventTypeCount( kViewEvents ), kViewEvents, object, NULL );
                     
                     result = SetEventParameter( inEvent, kEventParamControlRef, typeControlRef, sizeof( HIViewRef ), &viewRef );
-                               }
-                               break;
-                       }
-                       break;
-               
-               case kEventClassControl:
-                       switch ( GetEventKind( inEvent ) )
-                       {
-                               case kEventControlGetSizeConstraints:
-                               {
+                }
+                break;
+            }
+            break;
+        
+        case kEventClassControl:
+            switch ( GetEventKind( inEvent ) )
+            {
+                case kEventControlGetSizeConstraints:
+                {
                     wxWindow* wxwindow = wxFindControlFromMacControl(object->viewRef ) ;
                     if ( wxwindow )
                     {
@@ -670,100 +681,101 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
                                                         sizeof( HISize ), &max );
                         result = noErr ;
                     }
-                               }
-                               break;
-                       }
-                       break;
-       }
-       
-       return result;
+                }
+                break;
+            }
+            break;
+    }
+    
+    return result;
 }
 
 void RegisterControlToolbarItemClass()
 {
-       static bool sRegistered;
-       
-       if ( !sRegistered )
-       {
-               HIObjectRegisterSubclass( kControlToolbarItemClassID, kHIToolbarItemClassID, 0,
-                               ControlToolbarItemHandler, GetEventTypeCount( kEvents ), kEvents, 0, NULL );
-               
-               sRegistered = true;
-       }
+    static bool sRegistered;
+    
+    if ( !sRegistered )
+    {
+        HIObjectRegisterSubclass( kControlToolbarItemClassID, kHIToolbarItemClassID, 0,
+                ControlToolbarItemHandler, GetEventTypeCount( kEvents ), kEvents, 0, NULL );
+        
+        sRegistered = true;
+    }
 }
 
 HIToolbarItemRef CreateControlToolbarItem(CFStringRef inIdentifier, CFTypeRef inConfigData)
 {
-       RegisterControlToolbarItemClass();
+    RegisterControlToolbarItemClass();
+    
+    OSStatus            err;
+    EventRef            event;
+    UInt32              options = kHIToolbarItemAllowDuplicates;
+    HIToolbarItemRef    result = NULL;
+    
+    err = CreateEvent( NULL, kEventClassHIObject, kEventHIObjectInitialize, GetCurrentEventTime(), 0, &event );
+    require_noerr( err, CantCreateEvent );
+    
+    SetEventParameter( event, kEventParamAttributes, typeUInt32, sizeof( UInt32 ), &options );
+    SetEventParameter( event, kEventParamToolbarItemIdentifier, typeCFStringRef, sizeof( CFStringRef ), &inIdentifier );
     
-       OSStatus                        err;
-       EventRef                        event;
-       UInt32                          options = kHIToolbarItemAllowDuplicates;
-       HIToolbarItemRef        result = NULL;
-       
-       err = CreateEvent( NULL, kEventClassHIObject, kEventHIObjectInitialize, GetCurrentEventTime(), 0, &event );
-       require_noerr( err, CantCreateEvent );
-       
-       SetEventParameter( event, kEventParamAttributes, typeUInt32, sizeof( UInt32 ), &options );
-       SetEventParameter( event, kEventParamToolbarItemIdentifier, typeCFStringRef, sizeof( CFStringRef ), &inIdentifier );
-       
-       if ( inConfigData )
-               SetEventParameter( event, kEventParamToolbarItemConfigData, typeCFTypeRef, sizeof( CFTypeRef ), &inConfigData );
-       
-       err = HIObjectCreate( kControlToolbarItemClassID, event, (HIObjectRef*)&result );
-       check_noerr( err );
-       
-       ReleaseEvent( event );
-CantCreateEvent :      
-       return result ;
+    if ( inConfigData )
+        SetEventParameter( event, kEventParamToolbarItemConfigData, typeCFTypeRef, sizeof( CFTypeRef ), &inConfigData );
+    
+    err = HIObjectCreate( kControlToolbarItemClassID, event, (HIObjectRef*)&result );
+    check_noerr( err );
+    
+    ReleaseEvent( event );
+CantCreateEvent :   
+    return result ;
 }
 
 static const EventTypeSpec kToolbarEvents[] =
 {
-       { kEventClassToolbar, kEventToolbarGetDefaultIdentifiers },
-       { kEventClassToolbar, kEventToolbarGetAllowedIdentifiers },
-       { kEventClassToolbar, kEventToolbarCreateItemWithIdentifier },
+    { kEventClassToolbar, kEventToolbarGetDefaultIdentifiers },
+    { kEventClassToolbar, kEventToolbarGetAllowedIdentifiers },
+    { kEventClassToolbar, kEventToolbarCreateItemWithIdentifier },
 };
 
 static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
 {
-       OSStatus result = eventNotHandledErr;
-    wxToolBar* toolbar = (wxToolBar*) inUserData ;
-       CFMutableArrayRef       array;
+    OSStatus result = eventNotHandledErr;
+    // Not yet needed
+    // wxToolBar* toolbar = (wxToolBar*) inUserData ;
+    CFMutableArrayRef   array;
 
-       switch ( GetEventKind( inEvent ) )
-       {
-               case kEventToolbarGetDefaultIdentifiers:
+    switch ( GetEventKind( inEvent ) )
+    {
+        case kEventToolbarGetDefaultIdentifiers:
             {
                 GetEventParameter( inEvent, kEventParamMutableArray, typeCFMutableArrayRef, NULL,
-                                       sizeof( CFMutableArrayRef ), NULL, &array );
+                    sizeof( CFMutableArrayRef ), NULL, &array );
                 // not implemented yet
                 // GetToolbarDefaultItems( array );
                 result = noErr;
             }
-                       break;
-                       
-               case kEventToolbarGetAllowedIdentifiers:
+            break;
+            
+        case kEventToolbarGetAllowedIdentifiers:
             {
                 GetEventParameter( inEvent, kEventParamMutableArray, typeCFMutableArrayRef, NULL,
-                                       sizeof( CFMutableArrayRef ), NULL, &array );
+                    sizeof( CFMutableArrayRef ), NULL, &array );
                 // not implemented yet
                 // GetToolbarAllowedItems( array );
                 result = noErr;
             }
-                       break;
-               case kEventToolbarCreateItemWithIdentifier:
-                       {
-                               HIToolbarItemRef                item = NULL;
-                               CFTypeRef                               data = NULL;
+            break;
+        case kEventToolbarCreateItemWithIdentifier:
+            {
+                HIToolbarItemRef        item = NULL;
+                CFTypeRef               data = NULL;
                 CFStringRef             identifier = NULL ;
-                               
-                               GetEventParameter( inEvent, kEventParamToolbarItemIdentifier, typeCFStringRef, NULL,
-                                               sizeof( CFStringRef ), NULL, &identifier );
-                               
-                               GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL,
-                                               sizeof( CFTypeRef ), NULL, &data );
-                                       
+                
+                GetEventParameter( inEvent, kEventParamToolbarItemIdentifier, typeCFStringRef, NULL,
+                        sizeof( CFStringRef ), NULL, &identifier );
+                
+                GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL,
+                        sizeof( CFTypeRef ), NULL, &data );
+                    
                 if ( CFStringCompare( kControlToolbarItemClassID, identifier, kCFCompareBackwards ) == kCFCompareEqualTo )
                 {
                     item = CreateControlToolbarItem( kControlToolbarItemClassID, data );
@@ -773,10 +785,10 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef
                             sizeof( HIToolbarItemRef ), &item );
                         result = noErr;
                     }
-                               }
+                }
                 
-                       }
-                       break;
+            }
+            break;
     }
     return result ;
 }
@@ -805,8 +817,8 @@ bool wxToolBar::Create(
 
     if (m_macHIToolbarRef != NULL)
     {
-               InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
-                               GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
+        InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
+                GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
 
         HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;
         HIToolbarDisplaySize displaySize = kHIToolbarDisplaySizeSmall;
@@ -1441,9 +1453,12 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
 
 #if wxMAC_USE_NATIVE_TOOLBAR
             {
-                   wxASSERT( tool->GetControl() != NULL );
+                wxASSERT( tool->GetControl() != NULL );
                 HIToolbarItemRef    item;
                 HIViewRef viewRef = (HIViewRef) tool->GetControl()->GetHandle() ;
+                // as this control now is part of both the wxToolBar children and the native toolbar, we have to increase the
+                // reference count to make sure we are not dealing with zombie controls after the native toolbar has released its views
+                CFRetain( viewRef ) ;
                 CFDataRef data = CFDataCreate( kCFAllocatorDefault , (UInt8*) &viewRef , sizeof(viewRef) ) ;
                  err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID,
                    data , &item ) ;