]> git.saurik.com Git - wxWidgets.git/commitdiff
Fixed uninstalled toolbars in native toolbar mode, with a method for
authorJulian Smart <julian@anthemion.co.uk>
Wed, 20 Jun 2007 14:02:06 +0000 (14:02 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Wed, 20 Jun 2007 14:02:06 +0000 (14:02 +0000)
specifying non-native if required
Added code to toolbar sample for testing uninstalled toolbar

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@46558 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

samples/toolbar/toolbar.cpp
src/mac/carbon/toolbar.cpp

index 4a98612c16888fa102a2b4435386f28172973617..687dab791ba495317239c4cf06ce00bb1f99e7e9 100644 (file)
     #error You need to enable XPM support to use XPM bitmaps with toolbar!
 #endif // USE_XPM_BITMAPS
 
+// If this is 1, the sample will test an extra toolbar identical to the
+// main one, but not managed by the frame. This can test subtle differences
+// in the way toolbars are handled, especially on Mac where there is one
+// native, 'installed' toolbar.
+#define USE_UNMANAGED_TOOLBAR 0
+
 // ----------------------------------------------------------------------------
 // resources
 // ----------------------------------------------------------------------------
@@ -96,6 +102,7 @@ public:
             const wxSize& size = wxDefaultSize,
             long style = wxDEFAULT_FRAME_STYLE|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE);
 
+    void PopulateToolbar(wxToolBarBase* toolBar);
     void RecreateToolbar();
 
     void OnQuit(wxCommandEvent& event);
@@ -155,6 +162,9 @@ private:
 
     wxTextCtrl         *m_textWindow;
 
+    wxPanel            *m_panel;
+    wxToolBar          *m_extraToolBar;
+
     wxToolBar          *m_tbar;
 
     // the path to the custom bitmap for the test toolbar tool
@@ -337,6 +347,11 @@ void MyFrame::RecreateToolbar()
     toolBar = CreateToolBar(style, ID_TOOLBAR);
 #endif
 
+    PopulateToolbar(toolBar);
+}
+
+void MyFrame::PopulateToolbar(wxToolBarBase* toolBar)
+{
     // Set up toolbar
     enum
     {
@@ -591,10 +606,25 @@ MyFrame::MyFrame(wxFrame* parent,
 
     menuBar->Check(IDM_TOOLBAR_TOP_ORIENTATION, true );
     m_toolbarPosition = TOOLBAR_TOP;
+
     // Create the toolbar
     RecreateToolbar();
 
-    m_textWindow = new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
+    m_panel = new wxPanel(this, wxID_ANY);
+#if USE_UNMANAGED_TOOLBAR
+    m_extraToolBar = new wxToolBar(m_panel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTB_TEXT|wxTB_FLAT|wxTB_TOP);
+    PopulateToolbar(m_extraToolBar);
+#else
+    m_extraToolBar = NULL;
+#endif
+    
+    m_textWindow = new wxTextCtrl(m_panel, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
+
+    wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
+    m_panel->SetSizer(sizer);
+    if (m_extraToolBar)
+        sizer->Add(m_extraToolBar, 0, wxEXPAND, 0);
+    sizer->Add(m_textWindow, 1, wxEXPAND, 0);
 }
 
 void MyFrame::LayoutChildren()
@@ -613,7 +643,7 @@ void MyFrame::LayoutChildren()
         offset = 0;
     }
 
-    m_textWindow->SetSize(offset, 0, size.x - offset, size.y);
+    m_panel->SetSize(offset, 0, size.x - offset, size.y);
 }
 
 void MyFrame::OnSize(wxSizeEvent& event)
index 1857727ebbef9c552fd951134feef712c3c988e7..df5f25ccb0f4f9fb792f2eec93c692978f60ff09 100644 (file)
@@ -22,6 +22,7 @@
 #include "wx/app.h"
 #include "wx/mac/uma.h"
 #include "wx/geometry.h"
+#include "wx/sysopt.h"
 
 
 #ifdef __WXMAC_OSX__
@@ -842,28 +843,31 @@ bool wxToolBar::Create(
     OSStatus err = noErr;
 
 #if wxMAC_USE_NATIVE_TOOLBAR
-    wxString labelStr = wxString::Format( wxT("%xd"), (int)this );
-    err = HIToolbarCreate(
-        wxMacCFStringHolder( labelStr, wxFont::GetDefaultEncoding() ), 0,
-        (HIToolbarRef*) &m_macHIToolbarRef );
-
-    if (m_macHIToolbarRef != NULL)
+    if (parent->IsKindOf(CLASSINFO(wxFrame)) && wxSystemOptions::GetOptionInt(wxT("mac.toolbar.no-native")) != 1)
     {
-        InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
-                GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
+        wxString labelStr = wxString::Format( wxT("%xd"), (int)this );
+        err = HIToolbarCreate(
+          wxMacCFStringHolder( labelStr, wxFont::GetDefaultEncoding() ), 0,
+          (HIToolbarRef*) &m_macHIToolbarRef );
 
-        HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;
-        HIToolbarDisplaySize displaySize = kHIToolbarDisplaySizeSmall;
+        if (m_macHIToolbarRef != NULL)
+        {
+            InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
+                    GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
 
-        if ( style & wxTB_NOICONS )
-            mode = kHIToolbarDisplayModeLabelOnly;
-        else if ( style & wxTB_TEXT )
-            mode = kHIToolbarDisplayModeIconAndLabel;
-        else
-            mode = kHIToolbarDisplayModeIconOnly;
+            HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;
+            HIToolbarDisplaySize displaySize = kHIToolbarDisplaySizeSmall;
 
-        HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode );
-        HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, displaySize );
+            if ( style & wxTB_NOICONS )
+                mode = kHIToolbarDisplayModeLabelOnly;
+            else if ( style & wxTB_TEXT )
+                mode = kHIToolbarDisplayModeIconAndLabel;
+            else
+                mode = kHIToolbarDisplayModeIconOnly;
+
+            HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode );
+          HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, displaySize );
+       }
     }
 #endif // wxMAC_USE_NATIVE_TOOLBAR
 
@@ -1470,12 +1474,17 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
 
                 // in flat style we need a visual separator
 #if wxMAC_USE_NATIVE_TOOLBAR
-                err = HIToolbarItemCreate(
-                    kHIToolbarSeparatorIdentifier,
-                    kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates,
-                    &item );
-                if (err == noErr)
-                    tool->SetToolbarItemRef( item );
+                if (m_macHIToolbarRef != NULL)
+                {
+                    err = HIToolbarItemCreate(
+                        kHIToolbarSeparatorIdentifier,
+                        kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates,
+                        &item );
+                    if (err == noErr)
+                        tool->SetToolbarItemRef( item );
+                }
+                else
+                    err = noErr;
 #endif // wxMAC_USE_NATIVE_TOOLBAR
 
                 CreateSeparatorControl( window, &toolrect, &controlHandle );
@@ -1504,20 +1513,25 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
                 }
 
 #if wxMAC_USE_NATIVE_TOOLBAR
-                wxString labelStr = wxString::Format(wxT("%xd"), (int)tool);
-                err = HIToolbarItemCreate(
-                    wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()),
-                    kHIToolbarItemCantBeRemoved | kHIToolbarItemAnchoredLeft | kHIToolbarItemAllowDuplicates, &item );
-                if (err  == noErr)
+                if (m_macHIToolbarRef != NULL)
                 {
-                    InstallEventHandler(
-                        HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(),
-                        GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL );
+                    wxString labelStr = wxString::Format(wxT("%xd"), (int)tool);
+                    err = HIToolbarItemCreate(
+                        wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()),
+                        kHIToolbarItemCantBeRemoved | kHIToolbarItemAnchoredLeft | kHIToolbarItemAllowDuplicates, &item );
+                    if (err  == noErr)
+                    {
+                        InstallEventHandler(
+                            HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(),
+                            GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL );
 
-                    HIToolbarItemSetIconRef( item, info.u.iconRef );
-                    HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction );
-                    tool->SetToolbarItemRef( item );
+                        HIToolbarItemSetIconRef( item, info.u.iconRef );
+                        HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction );
+                        tool->SetToolbarItemRef( item );
+                    }
                 }
+                else
+                    err = noErr;
 #endif // wxMAC_USE_NATIVE_TOOLBAR
 
                 wxMacReleaseBitmapButton( &info );
@@ -1538,6 +1552,7 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
         case wxTOOL_STYLE_CONTROL:
 
 #if wxMAC_USE_NATIVE_TOOLBAR
+            if (m_macHIToolbarRef != NULL)
             {
                 wxCHECK_MSG( tool->GetControl(), false, _T("control must be non-NULL") );
 
@@ -1552,7 +1567,11 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
                 }
                 CFRelease( data ) ;
            }
-
+           else
+           {
+               err = noErr;
+               break;
+           }
 #else
                 // right now there's nothing to do here
 #endif
@@ -1564,7 +1583,7 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
 
 #if wxMAC_USE_NATIVE_TOOLBAR
     wxString label = tool->GetLabel();
-    if ( !label.empty() )
+    if (m_macHIToolbarRef && !label.empty() )
     {
         // strip mnemonics from the label for compatibility
         // with the usual labels in wxStaticText sense
@@ -1630,10 +1649,13 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
 #endif
 
 #if wxMAC_USE_NATIVE_TOOLBAR
-    if ( removeIndex != -1 && m_macHIToolbarRef )
+    if (m_macHIToolbarRef != NULL)
     {
-        HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
-        tool->SetIndex( -1 );
+        if ( removeIndex != -1 && m_macHIToolbarRef )
+        {
+            HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
+            tool->SetIndex( -1 );
+        }
     }
 #endif
     switch ( tool->GetStyle() )
@@ -1668,8 +1690,11 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
         tool2->SetPosition( pt );
 
 #if wxMAC_USE_NATIVE_TOOLBAR
-        if ( removeIndex != -1 && tool2->GetIndex() > removeIndex )
-            tool2->SetIndex( tool2->GetIndex() - 1 );
+        if (m_macHIToolbarRef != NULL)
+        {
+            if ( removeIndex != -1 && tool2->GetIndex() > removeIndex )
+                tool2->SetIndex( tool2->GetIndex() - 1 );
+        }
 #endif
     }