Fixed uninstalled toolbars in native toolbar mode, with a method for

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
This commit is contained in:
Julian Smart 2007-06-20 14:02:06 +00:00
parent a201463482
commit 079b2f6ba2
2 changed files with 99 additions and 44 deletions

View File

@ -47,6 +47,12 @@
#error You need to enable XPM support to use XPM bitmaps with toolbar! #error You need to enable XPM support to use XPM bitmaps with toolbar!
#endif // USE_XPM_BITMAPS #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 // resources
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -96,6 +102,7 @@ public:
const wxSize& size = wxDefaultSize, const wxSize& size = wxDefaultSize,
long style = wxDEFAULT_FRAME_STYLE|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE); long style = wxDEFAULT_FRAME_STYLE|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE);
void PopulateToolbar(wxToolBarBase* toolBar);
void RecreateToolbar(); void RecreateToolbar();
void OnQuit(wxCommandEvent& event); void OnQuit(wxCommandEvent& event);
@ -155,6 +162,9 @@ private:
wxTextCtrl *m_textWindow; wxTextCtrl *m_textWindow;
wxPanel *m_panel;
wxToolBar *m_extraToolBar;
wxToolBar *m_tbar; wxToolBar *m_tbar;
// the path to the custom bitmap for the test toolbar tool // the path to the custom bitmap for the test toolbar tool
@ -337,6 +347,11 @@ void MyFrame::RecreateToolbar()
toolBar = CreateToolBar(style, ID_TOOLBAR); toolBar = CreateToolBar(style, ID_TOOLBAR);
#endif #endif
PopulateToolbar(toolBar);
}
void MyFrame::PopulateToolbar(wxToolBarBase* toolBar)
{
// Set up toolbar // Set up toolbar
enum enum
{ {
@ -591,10 +606,25 @@ MyFrame::MyFrame(wxFrame* parent,
menuBar->Check(IDM_TOOLBAR_TOP_ORIENTATION, true ); menuBar->Check(IDM_TOOLBAR_TOP_ORIENTATION, true );
m_toolbarPosition = TOOLBAR_TOP; m_toolbarPosition = TOOLBAR_TOP;
// Create the toolbar // Create the toolbar
RecreateToolbar(); 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() void MyFrame::LayoutChildren()
@ -613,7 +643,7 @@ void MyFrame::LayoutChildren()
offset = 0; 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) void MyFrame::OnSize(wxSizeEvent& event)

View File

@ -22,6 +22,7 @@
#include "wx/app.h" #include "wx/app.h"
#include "wx/mac/uma.h" #include "wx/mac/uma.h"
#include "wx/geometry.h" #include "wx/geometry.h"
#include "wx/sysopt.h"
#ifdef __WXMAC_OSX__ #ifdef __WXMAC_OSX__
@ -842,28 +843,31 @@ bool wxToolBar::Create(
OSStatus err = noErr; OSStatus err = noErr;
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
wxString labelStr = wxString::Format( wxT("%xd"), (int)this ); if (parent->IsKindOf(CLASSINFO(wxFrame)) && wxSystemOptions::GetOptionInt(wxT("mac.toolbar.no-native")) != 1)
err = HIToolbarCreate(
wxMacCFStringHolder( labelStr, wxFont::GetDefaultEncoding() ), 0,
(HIToolbarRef*) &m_macHIToolbarRef );
if (m_macHIToolbarRef != NULL)
{ {
InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler, wxString labelStr = wxString::Format( wxT("%xd"), (int)this );
GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL ); err = HIToolbarCreate(
wxMacCFStringHolder( labelStr, wxFont::GetDefaultEncoding() ), 0,
(HIToolbarRef*) &m_macHIToolbarRef );
HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault; if (m_macHIToolbarRef != NULL)
HIToolbarDisplaySize displaySize = kHIToolbarDisplaySizeSmall; {
InstallEventHandler( HIObjectGetEventTarget((HIToolbarRef)m_macHIToolbarRef ), ToolbarDelegateHandler,
GetEventTypeCount( kToolbarEvents ), kToolbarEvents, this, NULL );
if ( style & wxTB_NOICONS ) HIToolbarDisplayMode mode = kHIToolbarDisplayModeDefault;
mode = kHIToolbarDisplayModeLabelOnly; HIToolbarDisplaySize displaySize = kHIToolbarDisplaySizeSmall;
else if ( style & wxTB_TEXT )
mode = kHIToolbarDisplayModeIconAndLabel;
else
mode = kHIToolbarDisplayModeIconOnly;
HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode ); if ( style & wxTB_NOICONS )
HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, displaySize ); 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 #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 // in flat style we need a visual separator
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
err = HIToolbarItemCreate( if (m_macHIToolbarRef != NULL)
kHIToolbarSeparatorIdentifier, {
kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates, err = HIToolbarItemCreate(
&item ); kHIToolbarSeparatorIdentifier,
if (err == noErr) kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates,
tool->SetToolbarItemRef( item ); &item );
if (err == noErr)
tool->SetToolbarItemRef( item );
}
else
err = noErr;
#endif // wxMAC_USE_NATIVE_TOOLBAR #endif // wxMAC_USE_NATIVE_TOOLBAR
CreateSeparatorControl( window, &toolrect, &controlHandle ); CreateSeparatorControl( window, &toolrect, &controlHandle );
@ -1504,20 +1513,25 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
} }
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
wxString labelStr = wxString::Format(wxT("%xd"), (int)tool); if (m_macHIToolbarRef != NULL)
err = HIToolbarItemCreate(
wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()),
kHIToolbarItemCantBeRemoved | kHIToolbarItemAnchoredLeft | kHIToolbarItemAllowDuplicates, &item );
if (err == noErr)
{ {
InstallEventHandler( wxString labelStr = wxString::Format(wxT("%xd"), (int)tool);
HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(), err = HIToolbarItemCreate(
GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL ); 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 ); HIToolbarItemSetIconRef( item, info.u.iconRef );
HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction ); HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction );
tool->SetToolbarItemRef( item ); tool->SetToolbarItemRef( item );
}
} }
else
err = noErr;
#endif // wxMAC_USE_NATIVE_TOOLBAR #endif // wxMAC_USE_NATIVE_TOOLBAR
wxMacReleaseBitmapButton( &info ); wxMacReleaseBitmapButton( &info );
@ -1538,6 +1552,7 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
case wxTOOL_STYLE_CONTROL: case wxTOOL_STYLE_CONTROL:
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
if (m_macHIToolbarRef != NULL)
{ {
wxCHECK_MSG( tool->GetControl(), false, _T("control must be non-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 ) ; CFRelease( data ) ;
} }
else
{
err = noErr;
break;
}
#else #else
// right now there's nothing to do here // right now there's nothing to do here
#endif #endif
@ -1564,7 +1583,7 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
wxString label = tool->GetLabel(); wxString label = tool->GetLabel();
if ( !label.empty() ) if (m_macHIToolbarRef && !label.empty() )
{ {
// strip mnemonics from the label for compatibility // strip mnemonics from the label for compatibility
// with the usual labels in wxStaticText sense // with the usual labels in wxStaticText sense
@ -1630,10 +1649,13 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
#endif #endif
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
if ( removeIndex != -1 && m_macHIToolbarRef ) if (m_macHIToolbarRef != NULL)
{ {
HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex ); if ( removeIndex != -1 && m_macHIToolbarRef )
tool->SetIndex( -1 ); {
HIToolbarRemoveItemAtIndex( (HIToolbarRef) m_macHIToolbarRef, removeIndex );
tool->SetIndex( -1 );
}
} }
#endif #endif
switch ( tool->GetStyle() ) switch ( tool->GetStyle() )
@ -1668,8 +1690,11 @@ bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
tool2->SetPosition( pt ); tool2->SetPosition( pt );
#if wxMAC_USE_NATIVE_TOOLBAR #if wxMAC_USE_NATIVE_TOOLBAR
if ( removeIndex != -1 && tool2->GetIndex() > removeIndex ) if (m_macHIToolbarRef != NULL)
tool2->SetIndex( tool2->GetIndex() - 1 ); {
if ( removeIndex != -1 && tool2->GetIndex() > removeIndex )
tool2->SetIndex( tool2->GetIndex() - 1 );
}
#endif #endif
} }