// Licence: The wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "toolbar.h"
#endif
-#include "wx/wx.h"
+#include "wx/wxprec.h"
#if wxUSE_TOOLBAR
+#include "wx/wx.h"
#include "wx/toolbar.h"
#include "wx/notebook.h"
#include "wx/tabctrl.h"
IMPLEMENT_DYNAMIC_CLASS(wxToolBar, wxControl)
BEGIN_EVENT_TABLE(wxToolBar, wxToolBarBase)
- EVT_MOUSE_EVENTS( wxToolBar::OnMouse )
EVT_PAINT( wxToolBar::OnPaint )
END_EVENT_TABLE()
#endif
DisposeControl( m_controlHandle ) ;
}
- ControlHandle GetControlHandle() { return m_controlHandle ; }
- void SetControlHandle( ControlHandle handle ) { m_controlHandle = handle ; }
+ WXWidget GetControlHandle() { return (WXWidget) m_controlHandle ; }
+ void SetControlHandle( ControlRef handle ) { m_controlHandle = handle ; }
void SetSize(const wxSize& size) ;
void SetPosition( const wxPoint& position ) ;
+
wxSize GetSize() const
{
if ( IsControl() )
{
return wxPoint(m_x, m_y);
}
+ bool DoEnable( bool enable ) ;
private :
void Init()
{
m_controlHandle = NULL ;
}
- ControlHandle m_controlHandle ;
+ ControlRef m_controlHandle ;
wxCoord m_x;
wxCoord m_y;
};
+static const EventTypeSpec eventList[] =
+{
+ { kEventClassControl , kEventControlHit } ,
+} ;
+
+static pascal OSStatus wxMacToolBarToolControlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+{
+ OSStatus result = eventNotHandledErr ;
+
+ wxMacCarbonEvent cEvent( event ) ;
+
+ ControlRef controlRef ;
+
+ cEvent.GetParameter( kEventParamDirectObject , &controlRef ) ;
+
+ switch( GetEventKind( event ) )
+ {
+ case kEventControlHit :
+ {
+ wxToolBarTool* tbartool = (wxToolBarTool*)data ;
+ if ( tbartool->CanBeToggled() )
+ {
+ ((wxToolBar*)tbartool->GetToolBar())->ToggleTool(tbartool->GetId(), GetControl32BitValue((ControlRef)tbartool->GetControlHandle()));
+ }
+ ((wxToolBar*)tbartool->GetToolBar())->OnLeftClick( tbartool->GetId() , tbartool -> IsToggled() ) ;
+ result = noErr;
+ }
+ break ;
+ default :
+ break ;
+ }
+ return result ;
+}
+
+pascal OSStatus wxMacToolBarToolEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
+{
+ OSStatus result = eventNotHandledErr ;
+
+ switch ( GetEventClass( event ) )
+ {
+ case kEventClassControl :
+ result = wxMacToolBarToolControlEventHandler( handler, event, data ) ;
+ break ;
+ default :
+ break ;
+ }
+ return result ;
+}
+
+DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacToolBarToolEventHandler )
+
// ============================================================================
// implementation
// ============================================================================
// wxToolBarTool
// ----------------------------------------------------------------------------
+bool wxToolBarTool::DoEnable(bool enable)
+{
+ if ( IsControl() )
+ {
+ GetControl()->Enable( enable ) ;
+ }
+ else if ( IsButton() )
+ {
+#if TARGET_API_MAC_OSX
+ if ( enable )
+ EnableControl( m_controlHandle ) ;
+ else
+ DisableControl( m_controlHandle ) ;
+#else
+ if ( enable )
+ ActivateControl( m_controlHandle ) ;
+ else
+ DeactivateControl( m_controlHandle ) ;
+#endif
+ }
+ return true ;
+}
void wxToolBarTool::SetSize(const wxSize& size)
{
if ( IsControl() )
{
int x , y ;
x = y = 0 ;
- WindowRef rootwindow = (WindowRef) GetToolBar()->MacGetRootWindow() ;
+ int mac_x = position.x ;
+ int mac_y = position.y ;
+#if !TARGET_API_MAC_OSX
+ WindowRef rootwindow = (WindowRef) GetToolBar()->MacGetTopLevelWindowRef() ;
GetToolBar()->MacWindowToRootWindow( &x , &y ) ;
- int mac_x = x + position.x ;
- int mac_y = y + position.y ;
-
-
+ mac_x += x;
+ mac_y += y;
+#endif
Rect contrlRect ;
GetControlBounds( m_controlHandle , &contrlRect ) ;
int former_mac_x = contrlRect.left ;
int former_mac_y = contrlRect.top ;
- wxSize sz = GetToolBar()->GetToolSize() ;
+ GetToolBar()->GetToolSize() ;
if ( mac_x != former_mac_x || mac_y != former_mac_y )
{
- {
- Rect inval = { former_mac_y , former_mac_x , former_mac_y + sz.y , former_mac_x + sz.x } ;
- InvalWindowRect( rootwindow , &inval ) ;
- }
UMAMoveControl( m_controlHandle , mac_x , mac_y ) ;
- {
- Rect inval = { mac_y , mac_x , mac_y + sz.y , mac_x + sz.x } ;
- InvalWindowRect( rootwindow , &inval ) ;
- }
}
}
else if ( IsControl() )
if (id == wxID_SEPARATOR) return;
- WindowRef window = (WindowRef) tbar->MacGetRootWindow() ;
+ WindowRef window = (WindowRef) tbar->MacGetTopLevelWindowRef() ;
wxSize toolSize = tbar->GetToolSize() ;
Rect toolrect = { 0, 0 , toolSize.y , toolSize.x } ;
SInt16 behaviour = kControlBehaviorOffsetContents ;
if ( CanBeToggled() )
behaviour += kControlBehaviorToggles ;
-
- if ( info.contentType != kControlNoContent )
- {
- m_controlHandle = ::NewControl( window , &toolrect , "\p" , false , 0 ,
- behaviour + info.contentType , 0 , kControlBevelButtonNormalBevelProc , (long) this ) ;
- ::SetControlData( m_controlHandle , kControlButtonPart , kControlBevelButtonContentTag , sizeof(info) , (char*) &info ) ;
- }
- else
- {
- m_controlHandle = ::NewControl( window , &toolrect , "\p" , false , 0 ,
- behaviour , 0 , kControlBevelButtonNormalBevelProc , (long) this ) ;
- }
+ CreateBevelButtonControl( window , &toolrect , CFSTR("") , kControlBevelButtonNormalBevel , behaviour , &info ,
+ 0 , 0 , 0 , &m_controlHandle ) ;
+
+ wxMacReleaseBitmapButton( &info ) ;
+
+ InstallControlEventHandler( (ControlRef) m_controlHandle, GetwxMacToolBarToolEventHandlerUPP(),
+ GetEventTypeCount(eventList), eventList, this,NULL);
+
UMAShowControl( m_controlHandle ) ;
- if ( !IsEnabled() )
- {
- UMADeactivateControl( m_controlHandle ) ;
- }
+
if ( CanBeToggled() && IsToggled() )
- {
::SetControl32BitValue( m_controlHandle , 1 ) ;
- }
else
- {
::SetControl32BitValue( m_controlHandle , 0 ) ;
- }
- ControlHandle container = (ControlHandle) tbar->MacGetContainerForEmbedding() ;
+ ControlRef container = (ControlRef) tbar->GetHandle() ;
wxASSERT_MSG( container != NULL , wxT("No valid mac container control") ) ;
::EmbedControl( m_controlHandle , container ) ;
}
bool wxToolBar::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size,
long style, const wxString& name)
{
- int x = pos.x;
- int y = pos.y;
- int width = size.x;
- int height = size.y;
-
- if (width <= 0)
- width = 100;
- if (height <= 0)
- height = 30;
- if (x < 0)
- x = 0;
- if (y < 0)
- y = 0;
-
- SetName(name);
-
- m_windowStyle = style;
- parent->AddChild(this);
-
- m_backgroundColour = parent->GetBackgroundColour() ;
- m_foregroundColour = parent->GetForegroundColour() ;
-
- if (id == -1)
- m_windowId = NewControlId();
- else
- m_windowId = id;
-
- {
- m_width = size.x ;
- m_height = size.y ;
- int x = pos.x ;
- int y = pos.y ;
- AdjustForParentClientOrigin(x, y, wxSIZE_USE_EXISTING);
- m_x = x ;
- m_y = y ;
- }
+ if ( !wxToolBarBase::Create( parent , id , pos , size , style ) )
+ return FALSE ;
return TRUE;
}
int maxToolHeight = 0;
// Find the maximum tool width and height
- wxToolBarToolsList::Node *node = m_tools.GetFirst();
+ wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
while ( node )
{
wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
node = node->GetNext();
}
+ bool lastWasRadio = FALSE;
node = m_tools.GetFirst();
while (node)
{
wxToolBarTool *tool = (wxToolBarTool *)node->GetData();
wxSize cursize = tool->GetSize() ;
+ bool isRadio = FALSE;
+
+ if ( tool->IsButton() && tool->GetKind() == wxITEM_RADIO )
+ {
+ if ( !lastWasRadio )
+ {
+ if (tool->Toggle(true))
+ {
+ DoToggleTool(tool, true);
+ }
+ }
+ isRadio = TRUE;
+ }
+ else
+ {
+ isRadio = FALSE;
+ }
+ lastWasRadio = isRadio;
+
// for the moment we just do a single row/column alignement
if ( x + cursize.x > maxWidth )
maxWidth = x + cursize.x ;
// if not set yet, only one row
SetRows(1);
}
+ m_minWidth = maxWidth;
maxWidth = tw ;
maxHeight += m_yMargin + kwxMacToolBarTopMargin;
- m_maxHeight = maxHeight ;
+ m_minHeight = m_maxHeight = maxHeight ;
}
else
{
// if not set yet, have one column
SetRows(GetToolsCount());
}
+ m_minHeight = maxHeight;
maxHeight = th ;
maxWidth += m_xMargin + kwxMacToolBarLeftMargin;
- m_maxWidth = maxWidth ;
+ m_minWidth = m_maxWidth = maxWidth ;
}
- SetSize(maxWidth, maxHeight);
+ SetSize( maxWidth, maxHeight );
+ InvalidateBestSize();
return TRUE;
}
return wxSize(m_defaultWidth + 4, m_defaultHeight + 4);
}
-void wxToolBar::MacHandleControlClick( WXWidget control , wxInt16 controlpart , bool WXUNUSED( mouseStillDown ) )
-{
- wxToolBarToolsList::Node *node;
- for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
- {
- wxToolBarTool* tool = (wxToolBarTool*) node->GetData() ;
- if ( tool->IsButton() )
- {
- if( tool->GetControlHandle() == control )
- {
- if ( tool->CanBeToggled() )
- {
- tool->Toggle( GetControl32BitValue( (ControlHandle) control ) ) ;
- }
- OnLeftClick( tool->GetId() , tool -> IsToggled() ) ;
- break ;
- }
- }
- }
-}
-
void wxToolBar::SetRows(int nRows)
{
if ( nRows == m_maxRows )
wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
{
- wxToolBarToolsList::Node *node = m_tools.GetFirst();
+ wxToolBarToolsList::compatibility_iterator node = m_tools.GetFirst();
while (node)
{
wxToolBarTool *tool = (wxToolBarTool *)node->GetData() ;
void wxToolBar::DoEnableTool(wxToolBarToolBase *t, bool enable)
{
- if (!IsShown())
- return ;
-
- wxToolBarTool *tool = (wxToolBarTool *)t;
- if ( tool->IsControl() )
- {
- tool->GetControl()->Enable( enable ) ;
- }
- else if ( tool->IsButton() )
- {
- if ( enable )
- UMAActivateControl( tool->GetControlHandle() ) ;
- else
- UMADeactivateControl( tool->GetControlHandle() ) ;
- }
+ ((wxToolBarTool*)t)->DoEnable( enable ) ;
}
void wxToolBar::DoToggleTool(wxToolBarToolBase *t, bool toggle)
{
- if (!IsShown())
- return ;
-
wxToolBarTool *tool = (wxToolBarTool *)t;
if ( tool->IsButton() )
{
- ::SetControl32BitValue( tool->GetControlHandle() , toggle ) ;
+ ::SetControl32BitValue( (ControlRef) tool->GetControlHandle() , toggle ) ;
}
}
{
// nothing special to do here - we relayout in Realize() later
tool->Attach(this);
+ InvalidateBestSize();
return TRUE;
}
bool wxToolBar::DoDeleteTool(size_t WXUNUSED(pos), wxToolBarToolBase *tool)
{
- wxToolBarToolsList::Node *node;
+ wxToolBarToolsList::compatibility_iterator node;
for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
{
wxToolBarToolBase *tool2 = node->GetData();
tool2->SetPosition( pt ) ;
}
+ InvalidateBestSize();
return TRUE ;
}
void wxToolBar::OnPaint(wxPaintEvent& event)
{
wxPaintDC dc(this) ;
+#if wxMAC_USE_CORE_GRAPHICS
+#else
wxMacPortSetter helper(&dc) ;
+ int w, h ;
+ GetSize( &w , &h ) ;
Rect toolbarrect = { dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) ,
- dc.YLOG2DEVMAC(m_height) , dc.XLOG2DEVMAC(m_width) } ;
- UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
+ dc.YLOG2DEVMAC(h) , dc.XLOG2DEVMAC(w) } ;
+/*
+ if( toolbarrect.left < 0 )
+ toolbarrect.left = 0 ;
+ if ( toolbarrect.top < 0 )
+ toolbarrect.top = 0 ;
+*/
+ if ( !MacGetTopLevelWindow()->MacGetMetalAppearance() )
{
- wxToolBarToolsList::Node *node;
- for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
- {
- wxToolBarTool* tool = (wxToolBarTool*) node->GetData() ;
- if ( tool->IsButton() )
- {
- UMADrawControl( tool->GetControlHandle() ) ;
- }
- }
+ UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
}
-}
-
-void wxToolBar::OnMouse( wxMouseEvent &event )
-{
- if (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK )
+ else
{
-
- int x = event.m_x ;
- int y = event.m_y ;
-
- MacClientToRootWindow( &x , &y ) ;
-
- ControlHandle control ;
- Point localwhere ;
- SInt16 controlpart ;
- WindowRef window = (WindowRef) MacGetRootWindow() ;
-
- localwhere.h = x ;
- localwhere.v = y ;
-
- short modifiers = 0;
-
- if ( !event.m_leftDown && !event.m_rightDown )
- modifiers |= btnState ;
-
- if ( event.m_shiftDown )
- modifiers |= shiftKey ;
-
- if ( event.m_controlDown )
- modifiers |= controlKey ;
-
- if ( event.m_altDown )
- modifiers |= optionKey ;
-
- if ( event.m_metaDown )
- modifiers |= cmdKey ;
-
- controlpart = ::FindControl( localwhere , window , &control ) ;
+#if TARGET_API_MAC_OSX
+#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
+ if ( UMAGetSystemVersion() >= 0x1030 )
{
- if ( control && ::IsControlActive( control ) )
+ HIRect hiToolbarrect = CGRectMake( dc.YLOG2DEVMAC(0) , dc.XLOG2DEVMAC(0) ,
+ dc.YLOG2DEVREL(h) , dc.XLOG2DEVREL(w) );
+ CGContextRef cgContext ;
+ Rect bounds ;
+ GetPortBounds( (CGrafPtr) dc.m_macPort , &bounds ) ;
+ QDBeginCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ;
+ CGContextTranslateCTM( cgContext , 0 , bounds.bottom - bounds.top ) ;
+ CGContextScaleCTM( cgContext , 1 , -1 ) ;
+
{
- {
- controlpart = ::HandleControlClick( control , localwhere , modifiers , (ControlActionUPP) -1 ) ;
- wxTheApp->s_lastMouseDown = 0 ;
- if ( control && controlpart != kControlNoPart ) // otherwise we will get the event twice
- {
- MacHandleControlClick( control , controlpart , false /* not down anymore */ ) ;
- }
- }
+ HIThemeBackgroundDrawInfo drawInfo ;
+ drawInfo.version = 0 ;
+ drawInfo.state = kThemeStateActive ;
+ drawInfo.kind = kThemeBackgroundMetal ;
+ HIThemeApplyBackground( &hiToolbarrect, &drawInfo , cgContext,kHIThemeOrientationNormal) ;
}
+ QDEndCGContext( (CGrafPtr) dc.m_macPort , &cgContext ) ;
+ }
+ else
+#endif
+ {
+ UMADrawThemePlacard( &toolbarrect , IsEnabled() ? kThemeStateActive : kThemeStateInactive) ;
}
+#endif
}
+#endif
+
+ event.Skip() ;
}
#endif // wxUSE_TOOLBAR