]> git.saurik.com Git - wxWidgets.git/blob - src/mac/carbon/toolbar.cpp
Use empty check consistent with other parts.
[wxWidgets.git] / src / mac / carbon / toolbar.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: toolbar.cpp
3 // Purpose: wxToolBar
4 // Author: Stefan Csomor
5 // Modified by:
6 // Created: 04/01/98
7 // RCS-ID: $Id$
8 // Copyright: (c) Stefan Csomor
9 // Licence: The wxWindows licence
10 /////////////////////////////////////////////////////////////////////////////
11
12 #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
13 #pragma implementation "toolbar.h"
14 #endif
15
16 #include "wx/wxprec.h"
17
18 #if wxUSE_TOOLBAR
19
20 #include "wx/wx.h"
21 #include "wx/toolbar.h"
22 #include "wx/notebook.h"
23 #include "wx/tabctrl.h"
24 #include "wx/bitmap.h"
25
26 #if !USE_SHARED_LIBRARY
27 IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
28
29 BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
30 EVT_PAINT( wxToolBar::OnPaint )
31 END_EVENT_TABLE()
32 #endif
33
34 #include "wx/mac/uma.h"
35 #include "wx/geometry.h"
36
37 #ifdef __WXMAC_OSX__
38 const short kwxMacToolBarToolDefaultWidth = 24 ;
39 const short kwxMacToolBarToolDefaultHeight = 24 ;
40 const short kwxMacToolBarTopMargin = 4 ;
41 const short kwxMacToolBarLeftMargin = 4 ;
42 const short kwxMacToolBorder = 0 ;
43 const short kwxMacToolSpacing = 6 ;
44 #else
45 const short kwxMacToolBarToolDefaultWidth = 24 ;
46 const short kwxMacToolBarToolDefaultHeight = 22 ;
47 const short kwxMacToolBarTopMargin = 2 ;
48 const short kwxMacToolBarLeftMargin = 2 ;
49 const short kwxMacToolBorder = 4 ;
50 const short kwxMacToolSpacing = 0 ;
51 #endif
52
53 // ----------------------------------------------------------------------------
54 // private classes
55 // ----------------------------------------------------------------------------
56
57 class wxToolBarTool : public wxToolBarToolBase
58 {
59 public:
60 wxToolBarTool(wxToolBar *tbar,
61 int id,
62 const wxString& label,
63 const wxBitmap& bmpNormal,
64 const wxBitmap& bmpDisabled,
65 wxItemKind kind,
66 wxObject *clientData,
67 const wxString& shortHelp,
68 const wxString& longHelp) ;
69
70 wxToolBarTool(wxToolBar *tbar, wxControl *control)
71 : wxToolBarToolBase(tbar, control)
72 {
73 Init() ;
74 }
75
76 ~wxToolBarTool()
77 {
78 if ( m_controlHandle )
79 DisposeControl( m_controlHandle ) ;
80 }
81
82 WXWidget GetControlHandle() { return (WXWidget) m_controlHandle ; }
83 void SetControlHandle( ControlRef handle ) { m_controlHandle = handle ; }
84
85 void SetSize(const wxSize& size) ;
86 void SetPosition( const wxPoint& position ) ;
87
88 wxSize GetSize() const
89 {
90 if ( IsControl() )
91 {
92 return GetControl()->GetSize() ;
93 }
94 else if ( IsButton() )
95 {
96 return GetToolBar()->GetToolSize() ;
97 }
98 else
99 {
100 // separator size
101 wxSize sz = GetToolBar()->GetToolSize() ;
102 if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL )
103 sz.y /= 4 ;
104 else
105 sz.x /= 4 ;
106 return sz ;
107 }
108 }
109 wxPoint GetPosition() const
110 {
111 return wxPoint(m_x, m_y);
112 }
113 bool DoEnable( bool enable ) ;
114
115 void UpdateToggleImage( bool toggle ) ;
116 private :
117 void Init()
118 {
119 m_controlHandle = NULL ;
120 }
121 ControlRef m_controlHandle ;
122
123 wxCoord m_x;
124 wxCoord m_y;
125 };
126
127 static const EventTypeSpec eventList[] =
128 {
129 { kEventClassControl , kEventControlHit } ,
130 #ifdef __WXMAC_OSX__
131 { kEventClassControl , kEventControlHitTest } ,
132 #endif
133 } ;
134
135 static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
136 {
137 OSStatus result = eventNotHandledErr ;
138
139 wxMacCarbonEvent cEvent( event ) ;
140
141 ControlRef controlRef ;
142
143 cEvent.GetParameter( kEventParamDirectObject , &controlRef ) ;
144
145 switch( GetEventKind( event ) )
146 {
147 case kEventControlHit :
148 {
149 wxToolBarTool* tbartool = (wxToolBarTool*)data ;
150 if ( tbartool->CanBeToggled() )
151 {
152 #ifdef __WXMAC_OSX__
153 ((wxToolBar*)tbartool->GetToolBar())->ToggleTool(tbartool->GetId(), !tbartool->IsToggled() );
154 #else
155 ((wxToolBar*)tbartool->GetToolBar())->ToggleTool(tbartool->GetId(), GetControl32BitValue((ControlRef)tbartool->GetControlHandle()));
156 #endif
157 }
158 ((wxToolBar*)tbartool->GetToolBar())->OnLeftClick( tbartool->GetId() , tbartool -> IsToggled() ) ;
159 result = noErr;
160 }
161 break ;
162 #ifdef __WXMAC_OSX__
163 case kEventControlHitTest :
164 {
165 HIPoint pt = cEvent.GetParameter<HIPoint>(kEventParamMouseLocation) ;
166 HIRect rect ;
167 HIViewGetBounds( controlRef , &rect ) ;
168
169 ControlPartCode pc = kControlNoPart ;
170 if ( CGRectContainsPoint( rect , pt ) )
171 pc = kControlButtonPart ;
172 cEvent.SetParameter( kEventParamControlPart , typeControlPartCode, pc ) ;
173 result = noErr ;
174 }
175 break ;
176 #endif
177 default :
178 break ;
179 }
180 return result ;
181 }
182
183 pascal OSStatus wxMacToolBarToolEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
184 {
185 OSStatus result = eventNotHandledErr ;
186
187 switch ( GetEventClass( event ) )
188 {
189 case kEventClassControl :
190 result = wxMacToolBarToolControlEventHandler( handler, event, data ) ;
191 break ;
192 default :
193 break ;
194 }
195 return result ;
196 }
197
198 DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacToolBarToolEventHandler )
199
200 // ============================================================================
201 // implementation
202 // ============================================================================
203
204 // ----------------------------------------------------------------------------
205 // wxToolBarTool
206 // ----------------------------------------------------------------------------
207
208 bool wxToolBarTool::DoEnable(bool enable)
209 {
210 if ( IsControl() )
211 {
212 GetControl()->Enable( enable ) ;
213 }
214 else if ( IsButton() )
215 {
216 #if TARGET_API_MAC_OSX
217 if ( enable )
218 EnableControl( m_controlHandle ) ;
219 else
220 DisableControl( m_controlHandle ) ;
221 #else
222 if ( enable )
223 ActivateControl( m_controlHandle ) ;
224 else
225 DeactivateControl( m_controlHandle ) ;
226 #endif
227 }
228 return true ;
229 }
230 void wxToolBarTool::SetSize(const wxSize& size)
231 {
232 if ( IsControl() )
233 {
234 GetControl()->SetSize( size ) ;
235 }
236 }
237
238 void wxToolBarTool::SetPosition(const wxPoint& position)
239 {
240 m_x = position.x;
241 m_y = position.y;
242
243 int x , y ;
244 x = y = 0 ;
245 int mac_x = position.x ;
246 int mac_y = position.y ;
247
248 if ( ! GetToolBar()->MacGetTopLevelWindow()->MacUsesCompositing() )
249 {
250 GetToolBar()->MacWindowToRootWindow( &x , &y ) ;
251 mac_x += x;
252 mac_y += y;
253 }
254
255 if ( IsButton() )
256 {
257 Rect contrlRect ;
258 GetControlBounds( m_controlHandle , &contrlRect ) ;
259 int former_mac_x = contrlRect.left ;
260 int former_mac_y = contrlRect.top ;
261 GetToolBar()->GetToolSize() ;
262
263 if ( mac_x != former_mac_x || mac_y != former_mac_y )
264 {
265 UMAMoveControl( m_controlHandle , mac_x , mac_y ) ;
266 }
267 }
268 else if ( IsControl() )
269 {
270 GetControl()->Move( position ) ;
271 }
272 else
273 {
274 // separator
275 #ifdef __WXMAC_OSX__
276 Rect contrlRect ;
277 GetControlBounds( m_controlHandle , &contrlRect ) ;
278 int former_mac_x = contrlRect.left ;
279 int former_mac_y = contrlRect.top ;
280
281 if ( mac_x != former_mac_x || mac_y != former_mac_y )
282 {
283 UMAMoveControl( m_controlHandle , mac_x , mac_y ) ;
284 }
285 #endif
286 }
287 }
288
289 void wxToolBarTool::UpdateToggleImage( bool toggle )
290 {
291 #ifdef __WXMAC_OSX__
292 if ( toggle )
293 {
294 int w = m_bmpNormal.GetWidth() ;
295 int h = m_bmpNormal.GetHeight() ;
296 wxBitmap bmp( w , h ) ;
297 wxMemoryDC dc ;
298 dc.SelectObject( bmp ) ;
299 dc.SetPen( wxNullPen ) ;
300 dc.SetBackground( *wxWHITE ) ;
301 dc.DrawRectangle( 0 , 0 , w , h ) ;
302 dc.DrawBitmap( m_bmpNormal , 0 , 0 , true) ;
303 dc.SelectObject( wxNullBitmap ) ;
304 ControlButtonContentInfo info ;
305 wxMacCreateBitmapButton( &info , bmp ) ;
306 SetControlData( m_controlHandle , 0, kControlIconContentTag, sizeof( info ),
307 (Ptr)&info );
308 wxMacReleaseBitmapButton( &info ) ;
309 }
310 else
311 {
312 ControlButtonContentInfo info ;
313 wxMacCreateBitmapButton( &info , m_bmpNormal ) ;
314 SetControlData( m_controlHandle , 0, kControlIconContentTag, sizeof( info ),
315 (Ptr)&info );
316 wxMacReleaseBitmapButton( &info ) ;
317 }
318
319 IconTransformType transform = toggle ? kTransformSelected : kTransformNone ;
320 SetControlData( m_controlHandle, 0, kControlIconTransformTag, sizeof( transform ),
321 (Ptr)&transform );
322 HIViewSetNeedsDisplay( m_controlHandle , true ) ;
323
324 #else
325 ::SetControl32BitValue( m_controlHandle , toggle ) ;
326 #endif
327 }
328
329 wxToolBarTool::wxToolBarTool(wxToolBar *tbar,
330 int id,
331 const wxString& label,
332 const wxBitmap& bmpNormal,
333 const wxBitmap& bmpDisabled,
334 wxItemKind kind,
335 wxObject *clientData,
336 const wxString& shortHelp,
337 const wxString& longHelp)
338 : wxToolBarToolBase(tbar, id, label, bmpNormal, bmpDisabled, kind,
339 clientData, shortHelp, longHelp)
340 {
341 Init();
342
343 WindowRef window = (WindowRef) tbar->MacGetTopLevelWindowRef() ;
344 wxSize toolSize = tbar->GetToolSize() ;
345 Rect toolrect = { 0, 0 , toolSize.y , toolSize.x } ;
346
347 if ( id == wxID_SEPARATOR )
348 {
349 toolSize.x /= 4 ;
350 toolSize.y /= 4 ;
351 if ( GetToolBar()->GetWindowStyleFlag() & wxTB_VERTICAL )
352 {
353 toolrect.bottom = toolSize.y ;
354 }
355 else
356 {
357 toolrect.right = toolSize.x ;
358 }
359 #ifdef __WXMAC_OSX__
360 // in flat style we need a visual separator
361 CreateSeparatorControl( window , &toolrect , &m_controlHandle ) ;
362 #endif
363 }
364 else
365 {
366 ControlButtonContentInfo info ;
367 wxMacCreateBitmapButton( &info , GetNormalBitmap() , kControlContentIconRef ) ;
368
369 #ifdef __WXMAC_OSX__
370 CreateIconControl( window , &toolrect , &info , false , &m_controlHandle ) ;
371 #else
372 SInt16 behaviour = kControlBehaviorOffsetContents ;
373 if ( CanBeToggled() )
374 behaviour += kControlBehaviorToggles ;
375 CreateBevelButtonControl( window , &toolrect , CFSTR("") , kControlBevelButtonNormalBevel , behaviour , &info ,
376 0 , 0 , 0 , &m_controlHandle ) ;
377 #endif
378
379 wxMacReleaseBitmapButton( &info ) ;
380 /*
381 SetBevelButtonTextPlacement( m_controlHandle , kControlBevelButtonPlaceBelowGraphic ) ;
382 UMASetControlTitle( m_controlHandle , label , wxFont::GetDefaultEncoding() ) ;
383 */
384
385 InstallControlEventHandler( (ControlRef) m_controlHandle, GetwxMacToolBarToolEventHandlerUPP(),
386 GetEventTypeCount(eventList), eventList, this,NULL);
387
388 }
389 ControlRef container = (ControlRef) tbar->GetHandle() ;
390 wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
391 if ( m_controlHandle )
392 {
393 UMAShowControl( m_controlHandle ) ;
394 ::EmbedControl( m_controlHandle , container ) ;
395 }
396 if ( CanBeToggled() && IsToggled() )
397 {
398 UpdateToggleImage( true ) ;
399 }
400 }
401
402
403 wxToolBarToolBase *wxToolBar::CreateTool(int id,
404 const wxString& label,
405 const wxBitmap& bmpNormal,
406 const wxBitmap& bmpDisabled,
407 wxItemKind kind,
408 wxObject *clientData,
409 const wxString& shortHelp,
410 const wxString& longHelp)
411 {
412 return new wxToolBarTool(this, id, label, bmpNormal, bmpDisabled, kind,
413 clientData, shortHelp, longHelp);
414 }
415
416 wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
417 {
418 return new wxToolBarTool(this, control);
419 }
420
421 void wxToolBar::Init()
422 {
423 m_maxWidth = -1;
424 m_maxHeight = -1;
425 m_defaultWidth = kwxMacToolBarToolDefaultWidth;
426 m_defaultHeight = kwxMacToolBarToolDefaultHeight;
427 }
428
429 bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
430 long style, const wxString& name)
431 {
432
433 if ( !wxToolBarBase::Create( parent , id , pos , size , style ) )
434 return FALSE ;
435
436 return TRUE;
437 }
438
439 wxToolBar::~wxToolBar()
440 {
441 // we must refresh the frame size when the toolbar is deleted but the frame
442 // is not - otherwise toolbar leaves a hole in the place it used to occupy
443 }
444
445 bool wxToolBar::Realize()
446 {
447 if (m_tools.GetCount() == 0)
448 return FALSE;
449
450 int x = m_xMargin + kwxMacToolBarLeftMargin ;
451 int y = m_yMargin + kwxMacToolBarTopMargin ;
452
453 int tw, th;
454 GetSize(& tw, & th);
455
456 int maxWidth = 0 ;
457 int maxHeight = 0 ;
458
459 int maxToolWidth = 0;
460 int maxToolHeight = 0;
461
462 // Find the maximum tool width and height
463 wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
464 while ( node )
465 {
466 wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
467 wxSize sz = tool->GetSize() ;
468
469 if ( sz.x > maxToolWidth )
470 maxToolWidth = sz.x ;
471 if (sz.y> maxToolHeight)
472 maxToolHeight = sz.y;
473
474 node = node->GetNext();
475 }
476
477 bool lastWasRadio = FALSE;
478 node = m_tools.GetFirst();
479 while (node)
480 {
481 wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
482 wxSize cursize = tool->GetSize() ;
483
484 bool isRadio = FALSE;
485
486 if ( tool->IsButton() && tool->GetKind() == wxITEM_RADIO )
487 {
488 if ( !lastWasRadio )
489 {
490 if (tool->Toggle(true))
491 {
492 DoToggleTool(tool, true);
493 }
494 }
495 isRadio = TRUE;
496 }
497 else
498 {
499 isRadio = FALSE;
500 }
501 lastWasRadio = isRadio;
502
503 // for the moment we just do a single row/column alignement
504 if ( x + cursize.x > maxWidth )
505 maxWidth = x + cursize.x ;
506 if ( y + cursize.y > maxHeight )
507 maxHeight = y + cursize.y ;
508
509 if ( GetWindowStyleFlag() & wxTB_VERTICAL )
510 {
511 int x1 = x + (maxToolWidth - cursize.x)/2 ;
512 tool->SetPosition( wxPoint( x1 , y ) ) ;
513 }
514 else
515 {
516 int y1 = y + (maxToolHeight - cursize.y)/2 ;
517 tool->SetPosition( wxPoint( x , y1 ) ) ;
518 }
519 if ( GetWindowStyleFlag() & wxTB_VERTICAL )
520 {
521 y += cursize.y ;
522 y += kwxMacToolSpacing ;
523 }
524 else
525 {
526 x += cursize.x ;
527 x += kwxMacToolSpacing ;
528 }
529
530 node = node->GetNext();
531 }
532
533 if ( GetWindowStyleFlag() & wxTB_HORIZONTAL )
534 {
535 if ( m_maxRows == 0 )
536 {
537 // if not set yet, only one row
538 SetRows(1);
539 }
540 m_minWidth = maxWidth;
541 maxWidth = tw ;
542 maxHeight += m_yMargin + kwxMacToolBarTopMargin;
543 m_minHeight = m_maxHeight = maxHeight ;
544 }
545 else
546 {
547 if ( GetToolsCount() > 0 && m_maxRows == 0 )
548 {
549 // if not set yet, have one column
550 SetRows(GetToolsCount());
551 }
552 m_minHeight = maxHeight;
553 maxHeight = th ;
554 maxWidth += m_xMargin + kwxMacToolBarLeftMargin;
555 m_minWidth = m_maxWidth = maxWidth ;
556 }
557
558 SetSize( maxWidth, maxHeight );
559 InvalidateBestSize();
560
561 return TRUE;
562 }
563
564 void wxToolBar::SetToolBitmapSize(const wxSize& size)
565 {
566 m_defaultWidth = size.x+kwxMacToolBorder; m_defaultHeight = size.y+kwxMacToolBorder;
567 }
568
569 // The button size is bigger than the bitmap size
570 wxSize wxToolBar::GetToolSize() const
571 {
572 return wxSize(m_defaultWidth + kwxMacToolBorder, m_defaultHeight + kwxMacToolBorder);
573 }
574
575 void wxToolBar::SetRows(int nRows)
576 {
577 if ( nRows == m_maxRows )
578 {
579 // avoid resizing the frame uselessly
580 return;
581 }
582
583 m_maxRows = nRows;
584 }
585
586 void wxToolBar::MacSuperChangedPosition()
587 {
588 wxWindow::MacSuperChangedPosition() ;
589 Realize() ;
590 }
591
592 wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
593 {
594 wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
595 while (node)
596 {
597 wxToolBarTool *tool = (wxToolBarTool *)node->GetData() ;
598 wxRect2DInt r( tool->GetPosition() , tool->GetSize() ) ;
599 if ( r.Contains( wxPoint( x , y ) ) )
600 {
601 return tool;
602 }
603
604 node = node->GetNext();
605 }
606
607 return (wxToolBarToolBase *)NULL;
608 }
609
610 wxString wxToolBar::MacGetToolTipString( wxPoint &pt )
611 {
612 wxToolBarToolBase* tool = FindToolForPosition( pt.x , pt.y ) ;
613 if ( tool )
614 {
615 return tool->GetShortHelp() ;
616 }
617 return wxEmptyString ;
618 }
619
620 void wxToolBar::DoEnableTool(wxToolBarToolBase *t, bool enable)
621 {
622 ((wxToolBarTool*)t)->DoEnable( enable ) ;
623 }
624
625 void wxToolBar::DoToggleTool(wxToolBarToolBase *t, bool toggle)
626 {
627 wxToolBarTool *tool = (wxToolBarTool *)t;
628 if ( tool->IsButton() )
629 {
630 tool->UpdateToggleImage( toggle ) ;
631 }
632 }
633
634 bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos),
635 wxToolBarToolBase *tool)
636 {
637 // nothing special to do here - we relayout in Realize() later
638 tool->Attach(this);
639 InvalidateBestSize();
640
641 return TRUE;
642 }
643
644 void wxToolBar::DoSetToggle(wxToolBarToolBase *WXUNUSED(tool), bool WXUNUSED(toggle))
645 {
646 wxFAIL_MSG( _T("not implemented") );
647 }
648
649 bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
650 {
651 wxToolBarToolsList::compatibility_iterator node;
652 for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
653 {
654 wxToolBarToolBase *tool2 = node->GetData();
655 if ( tool2 == tool )
656 {
657 // let node point to the next node in the list
658 node = node->GetNext();
659
660 break;
661 }
662 }
663
664 wxSize sz = ((wxToolBarTool*)tool)->GetSize() ;
665
666 tool->Detach();
667
668 // and finally reposition all the controls after this one
669
670 for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
671 {
672 wxToolBarTool *tool2 = (wxToolBarTool*) node->GetData();
673 wxPoint pt = tool2->GetPosition() ;
674
675 if ( GetWindowStyleFlag() & wxTB_VERTICAL )
676 {
677 pt.y -= sz.y ;
678 }
679 else
680 {
681 pt.x -= sz.x ;
682 }
683 tool2->SetPosition( pt ) ;
684 }
685
686 InvalidateBestSize();
687 return TRUE ;
688 }
689
690 void wxToolBar::OnPaint(wxPaintEvent& event)
691 {
692 wxPaintDC dc(this) ;
693
694 int w, h ;
695 GetSize( &w , &h ) ;
696 #if wxMAC_USE_CORE_GRAPHICS && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_3
697 if ( !MacGetTopLevelWindow()->MacGetMetalAppearance() )
698 {
699 if ( UMAGetSystemVersion() >= 0x1030 )
700 {
701 HIThemePlacardDrawInfo info ;
702 memset( &info, 0 , sizeof( info ) ) ;
703 info.version = 0 ;
704 info.state = IsEnabled() ? kThemeStateActive : kThemeStateInactive ;
705
706 CGContextRef cgContext = (CGContextRef) MacGetCGContextRef() ;
707 HIRect rect = CGRectMake( 0 , 0 , w , h ) ;
708 HIThemeDrawPlacard( &rect , & info , cgContext, kHIThemeOrientationNormal) ;
709 }
710 }
711 else
712 {
713 // leave the background as it is (striped or metal)
714 }
715 #else
716 wxMacPortSetter helper(&dc) ;
717
718 Rect toolbarrect = { dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) ,
719 dc.YLOG2DEVMAC(h) , dc.XLOG2DEVMAC(w) } ;
720 /*
721 if( toolbarrect.left < 0 )
722 toolbarrect.left = 0 ;
723 if ( toolbarrect.top < 0 )
724 toolbarrect.top = 0 ;
725 */
726 if ( !MacGetTopLevelWindow()->MacGetMetalAppearance() )
727 {
728 UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
729 }
730 else
731 {
732 #if TARGET_API_MAC_OSX
733 #if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
734 if ( UMAGetSystemVersion() >= 0x1030 )
735 {
736 HIRect hiToolbarrect = CGRectMake( dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) ,
737 dc.YLOG2DEVREL(h) , dc.XLOG2DEVREL(w) );
738 CGContextRef cgContext ;
739 Rect bounds ;
740 GetPortBounds( (CGrafPtr) dc.m_macPort , &bounds ) ;
741 QDBeginCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ;
742 CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ;
743 CGContextScaleCTM( cgContext , 1 , -1 ) ;
744
745 {
746 HIThemeBackgroundDrawInfo drawInfo ;
747 drawInfo.version = 0 ;
748 drawInfo.state = kThemeStateActive ;
749 drawInfo.kind = kThemeBackgroundMetal ;
750 HIThemeApplyBackground( &hiToolbarrect, &drawInfo , cgContext,kHIThemeOrientationNormal) ;
751 }
752 QDEndCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ;
753 }
754 else
755 #endif
756 {
757 UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
758 }
759 #endif
760 }
761 #endif
762
763 event.Skip() ;
764 }
765
766 #endif // wxUSE_TOOLBAR
767