#include "wx/tabctrl.h"
#include "wx/bitmap.h"
-#if !USE_SHARED_LIBRARY
IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
EVT_PAINT( wxToolBar::OnPaint )
END_EVENT_TABLE()
-#endif
#include "wx/mac/uma.h"
#include "wx/geometry.h"
#ifdef __WXMAC_OSX__
-const short kwxMacToolBarToolDefaultWidth = 24 ;
-const short kwxMacToolBarToolDefaultHeight = 24 ;
+const short kwxMacToolBarToolDefaultWidth = 16 ;
+const short kwxMacToolBarToolDefaultHeight = 16 ;
const short kwxMacToolBarTopMargin = 4 ;
const short kwxMacToolBarLeftMargin = 4 ;
const short kwxMacToolBorder = 0 ;
void SetSize(const wxSize& size) ;
void SetPosition( const wxPoint& position ) ;
+ void ClearControl() { m_control = NULL ; }
+
wxSize GetSize() const
{
if ( IsControl() )
ControlPartCode pc = kControlNoPart ;
if ( CGRectContainsPoint( rect , pt ) )
- pc = kControlButtonPart ;
+ pc = kControlIconPart ;
cEvent.SetParameter( kEventParamControlPart , typeControlPartCode, pc ) ;
result = noErr ;
}
return result ;
}
-pascal OSStatus wxMacToolBarToolEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+static pascal OSStatus wxMacToolBarToolEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
clientData, shortHelp, longHelp)
{
Init();
-
- WindowRef window = (WindowRef) tbar->MacGetTopLevelWindowRef() ;
- wxSize toolSize = tbar->GetToolSize() ;
- Rect toolrect = { 0, 0 , toolSize.y , toolSize.x } ;
-
- if ( id == wxID_SEPARATOR )
- {
- toolSize.x /= 4 ;
- toolSize.y /= 4 ;
- if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL )
- {
- toolrect.bottom = toolSize.y ;
- }
- else
- {
- toolrect.right = toolSize.x ;
- }
-#ifdef __WXMAC_OSX__
- // in flat style we need a visual separator
- CreateSeparatorControl( window , &toolrect , &m_controlHandle ) ;
-#endif
- }
- else
- {
- ControlButtonContentInfo info ;
- wxMacCreateBitmapButton( &info , GetNormalBitmap() , kControlContentIconRef ) ;
-
-#ifdef __WXMAC_OSX__
- CreateIconControl( window , &toolrect , &info , false , &m_controlHandle ) ;
-#else
- SInt16 behaviour = kControlBehaviorOffsetContents ;
- if ( CanBeToggled() )
- behaviour += kControlBehaviorToggles ;
- CreateBevelButtonControl( window , &toolrect , CFSTR("") , kControlBevelButtonNormalBevel , behaviour , &info ,
- 0 , 0 , 0 , &m_controlHandle ) ;
-#endif
-
- wxMacReleaseBitmapButton( &info ) ;
- /*
- SetBevelButtonTextPlacement( m_controlHandle , kControlBevelButtonPlaceBelowGraphic ) ;
- UMASetControlTitle( m_controlHandle , label , wxFont::GetDefaultEncoding() ) ;
- */
-
- InstallControlEventHandler( (ControlRef) m_controlHandle, GetwxMacToolBarToolEventHandlerUPP(),
- GetEventTypeCount(eventList), eventList, this,NULL);
-
- }
- ControlRef container = (ControlRef) tbar->GetHandle() ;
- wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
- if ( m_controlHandle )
- {
- UMAShowControl( m_controlHandle ) ;
- ::EmbedControl( m_controlHandle , container ) ;
- }
- if ( CanBeToggled() && IsToggled() )
- {
- UpdateToggleImage( true ) ;
- }
}
DoToggleTool(tool, true);
}
}
+ else if (tool->IsToggled())
+ {
+ wxToolBarToolsList::compatibility_iterator nodePrev = node->GetPrevious();
+ while ( nodePrev )
+ {
+ wxToolBarToolBase *tool = nodePrev->GetData();
+ if ( !tool->IsButton() || (tool->GetKind() != wxITEM_RADIO) )
+ break;
+ if ( tool->Toggle(false) )
+ {
+ DoToggleTool(tool, false);
+ }
+ nodePrev = nodePrev->GetPrevious();
+ }
+ }
isRadio = TRUE;
}
else
}
bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
- wxToolBarToolBase *tool)
+ wxToolBarToolBase *toolBase)
{
+ wxToolBarTool* tool = wx_static_cast( wxToolBarTool* , toolBase ) ;
+
+ WindowRef window = (WindowRef) MacGetTopLevelWindowRef() ;
+ wxSize toolSize = GetToolSize() ;
+ Rect toolrect = { 0, 0 , toolSize.y , toolSize.x } ;
+ ControlRef controlHandle = NULL ;
+
+ switch( tool->GetStyle() )
+ {
+ case wxTOOL_STYLE_SEPARATOR :
+ {
+ wxASSERT( tool->GetControlHandle() == NULL ) ;
+ toolSize.x /= 4 ;
+ toolSize.y /= 4 ;
+ if ( GetWindowStyleFlag() & wxTB_VERTICAL )
+ {
+ toolrect.bottom = toolSize.y ;
+ }
+ else
+ {
+ toolrect.right = toolSize.x ;
+ }
+ #ifdef __WXMAC_OSX__
+ // in flat style we need a visual separator
+ CreateSeparatorControl( window , &toolrect , &controlHandle ) ;
+ tool->SetControlHandle( controlHandle ) ;
+ #endif
+ }
+ break ;
+ case wxTOOL_STYLE_BUTTON :
+ {
+ wxASSERT( tool->GetControlHandle() == NULL ) ;
+ ControlButtonContentInfo info ;
+ wxMacCreateBitmapButton( &info , tool->GetNormalBitmap() , kControlContentIconRef ) ;
+
+ #ifdef __WXMAC_OSX__
+ 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 ) ;
+ #endif
+
+ wxMacReleaseBitmapButton( &info ) ;
+ /*
+ SetBevelButtonTextPlacement( m_controlHandle , kControlBevelButtonPlaceBelowGraphic ) ;
+ UMASetControlTitle( m_controlHandle , label , wxFont::GetDefaultEncoding() ) ;
+ */
+
+ InstallControlEventHandler( (ControlRef) controlHandle, GetwxMacToolBarToolEventHandlerUPP(),
+ GetEventTypeCount(eventList), eventList, tool,NULL);
+
+ tool->SetControlHandle( controlHandle ) ;
+ }
+ break ;
+ case wxTOOL_STYLE_CONTROL :
+ wxASSERT( tool->GetControl() != NULL ) ;
+ // right now there's nothing to do here
+ break ;
+ }
+
+ if ( controlHandle )
+ {
+ ControlRef container = (ControlRef) GetHandle() ;
+ wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
+
+ UMAShowControl( controlHandle ) ;
+ ::EmbedControl( controlHandle , container ) ;
+ }
+
+ if ( tool->CanBeToggled() && tool->IsToggled() )
+ {
+ tool->UpdateToggleImage( true ) ;
+ }
+
// nothing special to do here - we relayout in Realize() later
tool->Attach(this);
InvalidateBestSize();
wxFAIL_MSG( _T("not implemented") );
}
-bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
+bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolbase)
{
+ wxToolBarTool* tool = wx_static_cast( wxToolBarTool* , toolbase ) ;
wxToolBarToolsList::compatibility_iterator node;
for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
{
tool->Detach();
+ switch ( tool->GetStyle() )
+ {
+ case wxTOOL_STYLE_CONTROL:
+ {
+ tool->GetControl()->Destroy();
+ tool->ClearControl() ;
+ }
+ break;
+
+ case wxTOOL_STYLE_BUTTON:
+ case wxTOOL_STYLE_SEPARATOR:
+ if ( tool->GetControlHandle() )
+ {
+ DisposeControl( (ControlRef) tool->GetControlHandle() ) ;
+ tool->SetControlHandle( (ControlRef) NULL ) ;
+ }
+ break;
+ }
+
// and finally reposition all the controls after this one
for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
void wxToolBar::OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this) ;
-#if wxMAC_USE_CORE_GRAPHICS
- // leave the background as it is (striped or metal)
-#else
- wxMacPortSetter helper(&dc) ;
+
int w, h ;
GetSize( &w , &h ) ;
+#if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
+ if ( !MacGetTopLevelWindow()->MacGetMetalAppearance() )
+ {
+ if ( UMAGetSystemVersion() >= 0x1030 )
+ {
+ HIThemePlacardDrawInfo info ;
+ memset( &info, 0 , sizeof( info ) ) ;
+ info.version = 0 ;
+ info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
+
+ CGContextRef cgContext = (CGContextRef) MacGetCGContextRef() ;
+ HIRect rect = CGRectMake( 0 , 0 , w , h ) ;
+ HIThemeDrawPlacard( &rect , & info , cgContext, kHIThemeOrientationNormal) ;
+ }
+ }
+ else
+ {
+ // leave the background as it is (striped or metal)
+ }
+#else
+ wxMacPortSetter helper(&dc) ;
Rect toolbarrect = { dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) ,
dc.YLOG2DEVMAC(h) , dc.XLOG2DEVMAC(w) } ;