added labels support for toolbar controls for wxMac and wxMSW (modified patch 1613603)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@44903 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -69,6 +69,7 @@ All:
|
||||
All (GUI):
|
||||
|
||||
- Added wxDC::StretchBlit() for wxMac and wxMSW (Vince Harron)
|
||||
- Added support for labels for toolbar controls (Vince Harron)
|
||||
- Added wxEventBlocker class (Francesco Montorsi).
|
||||
- Added wxFile/DirPickerCtrl::Get/SetFile/DirName() (Francesco Montorsi).
|
||||
- Added wxSizerFlags::Top() and Bottom().
|
||||
|
@@ -165,12 +165,20 @@ Toolbar destructor.
|
||||
|
||||
\membersection{wxToolBar::AddControl}\label{wxtoolbaraddcontrol}
|
||||
|
||||
\func{bool}{AddControl}{\param{wxControl*}{ control}}
|
||||
\func{bool}{AddControl}{\param{wxControl*}{ control}, \param{const wxString&}{ label = ""}}
|
||||
|
||||
Adds any control to the toolbar, typically e.g. a combobox.
|
||||
|
||||
\docparam{control}{The control to be added.}
|
||||
|
||||
\docparam{label}{Text to be displayed near the control.}
|
||||
|
||||
\wxheading{Remarks}
|
||||
|
||||
wxMSW: the label is only displayed if there is enough space available below the embedded control.
|
||||
|
||||
wxMac: labels are only displayed if wxWidgets is built with wxMAC_USE_NATIVE_TOOLBAR set to 1
|
||||
|
||||
|
||||
\membersection{wxToolBar::AddSeparator}\label{wxtoolbaraddseparator}
|
||||
|
||||
|
@@ -6,7 +6,7 @@
|
||||
// Created: 2006-04-13
|
||||
// Id: $Id$
|
||||
// Copyright: (c) Julian Smart, Robert Roebling, Vadim Zeitlin,
|
||||
// SciTech Software, Inc.
|
||||
// SciTech Software, Inc.
|
||||
// Licence: wxWindows licence
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@@ -23,7 +23,7 @@ class WXDLLEXPORT wxButtonToolBarTool;
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class WXDLLEXPORT wxButtonToolBar : public wxToolBarBase
|
||||
{
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
wxButtonToolBar() { Init(); }
|
||||
@@ -45,7 +45,7 @@ public:
|
||||
const wxSize& size = wxDefaultSize,
|
||||
long style = 0,
|
||||
const wxString& name = wxToolBarNameStr );
|
||||
|
||||
|
||||
virtual ~wxButtonToolBar();
|
||||
|
||||
virtual bool Realize();
|
||||
@@ -73,7 +73,8 @@ protected:
|
||||
wxObject *clientData,
|
||||
const wxString& shortHelp,
|
||||
const wxString& longHelp);
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control);
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control,
|
||||
const wxString& label);
|
||||
|
||||
virtual wxSize DoGetBestClientSize() const;
|
||||
|
||||
|
@@ -93,7 +93,8 @@ protected:
|
||||
wxObject *clientData,
|
||||
const wxString& shortHelp,
|
||||
const wxString& longHelp);
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control);
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control,
|
||||
const wxString& label);
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
#if wxMAC_USE_NATIVE_TOOLBAR
|
||||
|
@@ -56,7 +56,7 @@ public:
|
||||
|
||||
virtual void SetToolNormalBitmap(int id, const wxBitmap& bitmap);
|
||||
virtual void SetToolDisabledBitmap(int id, const wxBitmap& bitmap);
|
||||
|
||||
|
||||
// implementation only from now on
|
||||
// -------------------------------
|
||||
|
||||
@@ -104,7 +104,9 @@ protected:
|
||||
wxObject *clientData,
|
||||
const wxString& shortHelp,
|
||||
const wxString& longHelp);
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control);
|
||||
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control,
|
||||
const wxString& label);
|
||||
|
||||
// return the appropriate size and flags for the toolbar control
|
||||
virtual wxSize DoGetBestSize() const;
|
||||
|
@@ -91,7 +91,10 @@ public:
|
||||
: wxTOOL_STYLE_BUTTON;
|
||||
}
|
||||
|
||||
wxToolBarToolBase(wxToolBarBase *tbar, wxControl *control)
|
||||
wxToolBarToolBase(wxToolBarBase *tbar,
|
||||
wxControl *control,
|
||||
const wxString& label)
|
||||
: m_label(label)
|
||||
{
|
||||
m_tbar = tbar;
|
||||
m_control = control;
|
||||
@@ -316,13 +319,17 @@ public:
|
||||
virtual wxToolBarToolBase *AddTool (wxToolBarToolBase *tool);
|
||||
virtual wxToolBarToolBase *InsertTool (size_t pos, wxToolBarToolBase *tool);
|
||||
|
||||
// add an arbitrary control to the toolbar (notice that
|
||||
// the control will be deleted by the toolbar and that it will also adjust
|
||||
// its position/size)
|
||||
// add an arbitrary control to the toolbar (notice that the control will be
|
||||
// deleted by the toolbar and that it will also adjust its position/size)
|
||||
//
|
||||
// the label is optional and, if specified, will be shown near the control
|
||||
// NB: the control should have toolbar as its parent
|
||||
virtual wxToolBarToolBase *AddControl(wxControl *control);
|
||||
virtual wxToolBarToolBase *InsertControl(size_t pos, wxControl *control);
|
||||
virtual wxToolBarToolBase *
|
||||
AddControl(wxControl *control, const wxString& label = wxEmptyString);
|
||||
|
||||
virtual wxToolBarToolBase *
|
||||
InsertControl(size_t pos, wxControl *control,
|
||||
const wxString& label = wxEmptyString);
|
||||
|
||||
// get the control with the given id or return NULL
|
||||
virtual wxControl *FindControl( int toolid );
|
||||
@@ -565,7 +572,8 @@ protected:
|
||||
const wxString& shortHelp,
|
||||
const wxString& longHelp) = 0;
|
||||
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control) = 0;
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control,
|
||||
const wxString& label) = 0;
|
||||
|
||||
// helper functions
|
||||
// ----------------
|
||||
|
@@ -98,7 +98,8 @@ protected:
|
||||
wxObject *clientData,
|
||||
const wxString& shortHelp,
|
||||
const wxString& longHelp);
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control);
|
||||
virtual wxToolBarToolBase *CreateTool(wxControl *control,
|
||||
const wxString& label);
|
||||
|
||||
virtual wxSize DoGetBestClientSize() const;
|
||||
virtual void DoSetSize(int x, int y,
|
||||
|
@@ -402,14 +402,14 @@ void MyFrame::RecreateToolbar()
|
||||
combo->Append(_T("combobox"));
|
||||
combo->Append(_T("in a"));
|
||||
combo->Append(_T("toolbar"));
|
||||
toolBar->AddControl(combo);
|
||||
toolBar->AddControl(combo, _T("Combo Label"));
|
||||
|
||||
wxSpinCtrl *spin = new wxSpinCtrl( toolBar, ID_SPIN, wxT("0"), wxDefaultPosition, wxSize(80,wxDefaultCoord), 0, 0, 100 );
|
||||
toolBar->AddControl( spin );
|
||||
|
||||
|
||||
wxTextCtrl *text = new wxTextCtrl( toolBar, -1, wxT("text"), wxDefaultPosition, wxSize(80,wxDefaultCoord) );
|
||||
toolBar->AddControl( text );
|
||||
|
||||
|
||||
wxSearchCtrl *srch = new wxSearchCtrl( toolBar, -1, wxT("xx"), wxDefaultPosition, wxSize(80,wxDefaultCoord), wxSUNKEN_BORDER );
|
||||
toolBar->AddControl( srch );
|
||||
}
|
||||
|
@@ -197,12 +197,16 @@ wxToolBarBase::InsertTool(size_t pos, wxToolBarToolBase *tool)
|
||||
return tool;
|
||||
}
|
||||
|
||||
wxToolBarToolBase *wxToolBarBase::AddControl(wxControl *control)
|
||||
wxToolBarToolBase *
|
||||
wxToolBarBase::AddControl(wxControl *control, const wxString& label)
|
||||
{
|
||||
return InsertControl(GetToolsCount(), control);
|
||||
return InsertControl(GetToolsCount(), control, label);
|
||||
}
|
||||
|
||||
wxToolBarToolBase *wxToolBarBase::InsertControl(size_t pos, wxControl *control)
|
||||
wxToolBarToolBase *
|
||||
wxToolBarBase::InsertControl(size_t pos,
|
||||
wxControl *control,
|
||||
const wxString& label)
|
||||
{
|
||||
wxCHECK_MSG( control, (wxToolBarToolBase *)NULL,
|
||||
_T("toolbar: can't insert NULL control") );
|
||||
@@ -213,7 +217,7 @@ wxToolBarToolBase *wxToolBarBase::InsertControl(size_t pos, wxControl *control)
|
||||
wxCHECK_MSG( pos <= GetToolsCount(), (wxToolBarToolBase *)NULL,
|
||||
_T("invalid position in wxToolBar::InsertControl()") );
|
||||
|
||||
wxToolBarToolBase *tool = CreateTool(control);
|
||||
wxToolBarToolBase *tool = CreateTool(control, label);
|
||||
|
||||
if ( !InsertTool(pos, tool) )
|
||||
{
|
||||
|
@@ -66,8 +66,10 @@ public:
|
||||
m_button = NULL;
|
||||
}
|
||||
|
||||
wxButtonToolBarTool(wxButtonToolBar *tbar, wxControl *control)
|
||||
: wxToolBarToolBase(tbar, control)
|
||||
wxButtonToolBarTool(wxButtonToolBar *tbar,
|
||||
wxControl *control,
|
||||
const wxString& label)
|
||||
: wxToolBarToolBase(tbar, control, label)
|
||||
{
|
||||
m_x = m_y = wxDefaultCoord;
|
||||
m_width =
|
||||
@@ -271,9 +273,10 @@ wxToolBarToolBase *wxButtonToolBar::CreateTool(int id,
|
||||
clientData, shortHelp, longHelp);
|
||||
}
|
||||
|
||||
wxToolBarToolBase *wxButtonToolBar::CreateTool(wxControl *control)
|
||||
wxToolBarToolBase *wxButtonToolBar::CreateTool(wxControl *control,
|
||||
const wxString& label)
|
||||
{
|
||||
return new wxButtonToolBarTool(this, control);
|
||||
return new wxButtonToolBarTool(this, control, label);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@@ -72,8 +72,8 @@ public:
|
||||
const wxString& shortHelp,
|
||||
const wxString& longHelp );
|
||||
|
||||
wxToolBarTool(wxToolBar *tbar, wxControl *control)
|
||||
: wxToolBarToolBase(tbar, control)
|
||||
wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label)
|
||||
: wxToolBarToolBase(tbar, control, label)
|
||||
{
|
||||
Init();
|
||||
if (control != NULL)
|
||||
@@ -176,7 +176,7 @@ public:
|
||||
enc = f.GetEncoding();
|
||||
else
|
||||
enc = wxFont::GetDefaultEncoding();
|
||||
|
||||
|
||||
HIToolbarItemSetHelpText(
|
||||
m_toolbarItemRef,
|
||||
wxMacCFStringHolder( GetShortHelp(), enc ),
|
||||
@@ -533,9 +533,10 @@ wxToolBarToolBase *wxToolBar::CreateTool(
|
||||
clientData, shortHelp, longHelp );
|
||||
}
|
||||
|
||||
wxToolBarToolBase * wxToolBar::CreateTool( wxControl *control )
|
||||
wxToolBarToolBase *
|
||||
wxToolBar::CreateTool(wxControl *control, const wxString& label)
|
||||
{
|
||||
return new wxToolBarTool( this, control );
|
||||
return new wxToolBarTool(this, control, label);
|
||||
}
|
||||
|
||||
void wxToolBar::Init()
|
||||
@@ -553,26 +554,26 @@ void wxToolBar::Init()
|
||||
|
||||
#define kControlToolbarItemClassID CFSTR( "org.wxwidgets.controltoolbaritem" )
|
||||
|
||||
const EventTypeSpec kEvents[] =
|
||||
const EventTypeSpec kEvents[] =
|
||||
{
|
||||
{ kEventClassHIObject, kEventHIObjectConstruct },
|
||||
{ kEventClassHIObject, kEventHIObjectInitialize },
|
||||
{ kEventClassHIObject, kEventHIObjectDestruct },
|
||||
|
||||
|
||||
{ kEventClassToolbarItem, kEventToolbarItemCreateCustomView }
|
||||
};
|
||||
|
||||
const EventTypeSpec kViewEvents[] =
|
||||
{
|
||||
{ kEventClassControl, kEventControlGetSizeConstraints }
|
||||
const EventTypeSpec kViewEvents[] =
|
||||
{
|
||||
{ kEventClassControl, kEventControlGetSizeConstraints }
|
||||
};
|
||||
|
||||
struct ControlToolbarItem
|
||||
{
|
||||
HIToolbarItemRef toolbarItem;
|
||||
struct ControlToolbarItem
|
||||
{
|
||||
HIToolbarItemRef toolbarItem;
|
||||
HIViewRef viewRef;
|
||||
wxSize lastValidSize ;
|
||||
};
|
||||
};
|
||||
|
||||
static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef, EventRef inEvent, void* inUserData )
|
||||
{
|
||||
@@ -588,20 +589,20 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
|
||||
{
|
||||
HIObjectRef toolbarItem;
|
||||
ControlToolbarItem* item;
|
||||
|
||||
|
||||
GetEventParameter( inEvent, kEventParamHIObjectInstance, typeHIObjectRef, NULL,
|
||||
sizeof( HIObjectRef ), NULL, &toolbarItem );
|
||||
|
||||
|
||||
item = (ControlToolbarItem*) malloc(sizeof(ControlToolbarItem)) ;
|
||||
item->toolbarItem = toolbarItem ;
|
||||
item->viewRef = NULL ;
|
||||
|
||||
|
||||
SetEventParameter( inEvent, kEventParamHIObjectInstance, typeVoidPtr, sizeof( void * ), &item );
|
||||
|
||||
|
||||
result = noErr ;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case kEventHIObjectInitialize:
|
||||
result = CallNextEventHandler( inCallRef, inEvent );
|
||||
if ( result == noErr )
|
||||
@@ -609,12 +610,12 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
|
||||
CFDataRef data;
|
||||
GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL,
|
||||
sizeof( CFTypeRef ), NULL, &data );
|
||||
|
||||
|
||||
HIViewRef viewRef ;
|
||||
|
||||
|
||||
wxASSERT_MSG( CFDataGetLength( data ) == sizeof( viewRef ) , wxT("Illegal Data passed") ) ;
|
||||
memcpy( &viewRef , CFDataGetBytePtr( data ) , sizeof( viewRef ) ) ;
|
||||
|
||||
|
||||
object->viewRef = (HIViewRef) viewRef ;
|
||||
|
||||
result = noErr ;
|
||||
@@ -628,7 +629,7 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
|
||||
HIViewRef viewRef = object->viewRef ;
|
||||
if( viewRef && IsValidControlHandle( viewRef) )
|
||||
{
|
||||
CFIndex count = CFGetRetainCount( viewRef ) ;
|
||||
CFIndex count = CFGetRetainCount( viewRef ) ;
|
||||
if ( count >= 1 )
|
||||
CFRelease( viewRef ) ;
|
||||
}
|
||||
@@ -638,10 +639,10 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case kEventClassToolbarItem:
|
||||
switch ( GetEventKind( inEvent ) )
|
||||
{
|
||||
{
|
||||
case kEventToolbarItemCreateCustomView:
|
||||
{
|
||||
HIViewRef viewRef = object->viewRef ;
|
||||
@@ -650,13 +651,13 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
|
||||
HIViewSetVisible(viewRef, true) ;
|
||||
InstallEventHandler( GetControlEventTarget( viewRef ), ControlToolbarItemHandler,
|
||||
GetEventTypeCount( kViewEvents ), kViewEvents, object, NULL );
|
||||
|
||||
|
||||
result = SetEventParameter( inEvent, kEventParamControlRef, typeControlRef, sizeof( HIViewRef ), &viewRef );
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case kEventClassControl:
|
||||
switch ( GetEventKind( inEvent ) )
|
||||
{
|
||||
@@ -675,14 +676,14 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
|
||||
object->lastValidSize = sz ;
|
||||
else
|
||||
sz = object->lastValidSize ;
|
||||
|
||||
|
||||
HISize min, max;
|
||||
min.width = max.width = sz.x ;
|
||||
min.height = max.height = sz.y ;
|
||||
|
||||
|
||||
result = SetEventParameter( inEvent, kEventParamMinimumSize, typeHISize,
|
||||
sizeof( HISize ), &min );
|
||||
|
||||
|
||||
result = SetEventParameter( inEvent, kEventParamMaximumSize, typeHISize,
|
||||
sizeof( HISize ), &max );
|
||||
result = noErr ;
|
||||
@@ -692,19 +693,19 @@ static pascal OSStatus ControlToolbarItemHandler( EventHandlerCallRef inCallRef,
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void RegisterControlToolbarItemClass()
|
||||
{
|
||||
static bool sRegistered;
|
||||
|
||||
|
||||
if ( !sRegistered )
|
||||
{
|
||||
HIObjectRegisterSubclass( kControlToolbarItemClassID, kHIToolbarItemClassID, 0,
|
||||
ControlToolbarItemHandler, GetEventTypeCount( kEvents ), kEvents, 0, NULL );
|
||||
|
||||
|
||||
sRegistered = true;
|
||||
}
|
||||
}
|
||||
@@ -712,26 +713,26 @@ void RegisterControlToolbarItemClass()
|
||||
HIToolbarItemRef CreateControlToolbarItem(CFStringRef inIdentifier, CFTypeRef inConfigData)
|
||||
{
|
||||
RegisterControlToolbarItemClass();
|
||||
|
||||
|
||||
OSStatus err;
|
||||
EventRef event;
|
||||
UInt32 options = kHIToolbarItemAllowDuplicates;
|
||||
HIToolbarItemRef result = NULL;
|
||||
|
||||
|
||||
err = CreateEvent( NULL, kEventClassHIObject, kEventHIObjectInitialize, GetCurrentEventTime(), 0, &event );
|
||||
require_noerr( err, CantCreateEvent );
|
||||
|
||||
|
||||
SetEventParameter( event, kEventParamAttributes, typeUInt32, sizeof( UInt32 ), &options );
|
||||
SetEventParameter( event, kEventParamToolbarItemIdentifier, typeCFStringRef, sizeof( CFStringRef ), &inIdentifier );
|
||||
|
||||
|
||||
if ( inConfigData )
|
||||
SetEventParameter( event, kEventParamToolbarItemConfigData, typeCFTypeRef, sizeof( CFTypeRef ), &inConfigData );
|
||||
|
||||
|
||||
err = HIObjectCreate( kControlToolbarItemClassID, event, (HIObjectRef*)&result );
|
||||
check_noerr( err );
|
||||
|
||||
|
||||
ReleaseEvent( event );
|
||||
CantCreateEvent :
|
||||
CantCreateEvent :
|
||||
return result ;
|
||||
}
|
||||
|
||||
@@ -761,7 +762,7 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef
|
||||
result = noErr;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case kEventToolbarGetAllowedIdentifiers:
|
||||
{
|
||||
GetEventParameter( inEvent, kEventParamMutableArray, typeCFMutableArrayRef, NULL,
|
||||
@@ -776,13 +777,13 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef
|
||||
HIToolbarItemRef item = NULL;
|
||||
CFTypeRef data = NULL;
|
||||
CFStringRef identifier = NULL ;
|
||||
|
||||
|
||||
GetEventParameter( inEvent, kEventParamToolbarItemIdentifier, typeCFStringRef, NULL,
|
||||
sizeof( CFStringRef ), NULL, &identifier );
|
||||
|
||||
|
||||
GetEventParameter( inEvent, kEventParamToolbarItemConfigData, typeCFTypeRef, NULL,
|
||||
sizeof( CFTypeRef ), NULL, &data );
|
||||
|
||||
|
||||
if ( CFStringCompare( kControlToolbarItemClassID, identifier, kCFCompareBackwards ) == kCFCompareEqualTo )
|
||||
{
|
||||
item = CreateControlToolbarItem( kControlToolbarItemClassID, data );
|
||||
@@ -793,7 +794,7 @@ static OSStatus ToolbarDelegateHandler( EventHandlerCallRef inCallRef, EventRef
|
||||
result = noErr;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -843,7 +844,7 @@ bool wxToolBar::Create(
|
||||
HIToolbarSetDisplayMode( (HIToolbarRef) m_macHIToolbarRef, mode );
|
||||
HIToolbarSetDisplaySize( (HIToolbarRef) m_macHIToolbarRef, displaySize );
|
||||
}
|
||||
#endif
|
||||
#endif // wxMAC_USE_NATIVE_TOOLBAR
|
||||
|
||||
return (err == noErr);
|
||||
}
|
||||
@@ -1332,7 +1333,7 @@ void wxToolBar::SetToolNormalBitmap( int id, const wxBitmap& bitmap )
|
||||
|
||||
// a side-effect of the UpdateToggleImage function is that it always changes the bitmap used on the button.
|
||||
tool->UpdateToggleImage( tool->CanBeToggled() && tool->IsToggled() );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap )
|
||||
@@ -1343,9 +1344,9 @@ void wxToolBar::SetToolDisabledBitmap( int id, const wxBitmap& bitmap )
|
||||
wxCHECK_RET( tool->IsButton(), wxT("Can only set bitmap on button tools."));
|
||||
|
||||
tool->SetDisabledBitmap(bitmap);
|
||||
|
||||
|
||||
// TODO: what to do for this one?
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wxToolBarToolBase *wxToolBar::FindToolForPosition(wxCoord x, wxCoord y) const
|
||||
@@ -1403,6 +1404,10 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
|
||||
OSStatus err = 0;
|
||||
tool->Attach( this );
|
||||
|
||||
#if wxMAC_USE_NATIVE_TOOLBAR
|
||||
HIToolbarItemRef item;
|
||||
#endif
|
||||
|
||||
switch (tool->GetStyle())
|
||||
{
|
||||
case wxTOOL_STYLE_SEPARATOR:
|
||||
@@ -1415,21 +1420,18 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
|
||||
else
|
||||
toolrect.right = toolSize.x;
|
||||
|
||||
#ifdef __WXMAC_OSX__
|
||||
// in flat style we need a visual separator
|
||||
#if wxMAC_USE_NATIVE_TOOLBAR
|
||||
HIToolbarItemRef item;
|
||||
err = HIToolbarItemCreate(
|
||||
kHIToolbarSeparatorIdentifier,
|
||||
kHIToolbarItemCantBeRemoved | kHIToolbarItemIsSeparator | kHIToolbarItemAllowDuplicates,
|
||||
&item );
|
||||
if (err == noErr)
|
||||
tool->SetToolbarItemRef( item );
|
||||
#endif
|
||||
#endif // wxMAC_USE_NATIVE_TOOLBAR
|
||||
|
||||
CreateSeparatorControl( window, &toolrect, &controlHandle );
|
||||
tool->SetControlHandle( controlHandle );
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1454,7 +1456,6 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
|
||||
}
|
||||
|
||||
#if wxMAC_USE_NATIVE_TOOLBAR
|
||||
HIToolbarItemRef item;
|
||||
wxString labelStr = wxString::Format(wxT("%xd"), (int)tool);
|
||||
err = HIToolbarItemCreate(
|
||||
wxMacCFStringHolder(labelStr, wxFont::GetDefaultEncoding()),
|
||||
@@ -1464,12 +1465,12 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
|
||||
InstallEventHandler(
|
||||
HIObjectGetEventTarget(item), GetwxMacToolBarEventHandlerUPP(),
|
||||
GetEventTypeCount(toolBarEventList), toolBarEventList, tool, NULL );
|
||||
HIToolbarItemSetLabel( item, wxMacCFStringHolder(tool->GetLabel(), m_font.GetEncoding()) );
|
||||
|
||||
HIToolbarItemSetIconRef( item, info.u.iconRef );
|
||||
HIToolbarItemSetCommandID( item, kHIToolbarCommandPressAction );
|
||||
tool->SetToolbarItemRef( item );
|
||||
}
|
||||
#endif
|
||||
#endif // wxMAC_USE_NATIVE_TOOLBAR
|
||||
|
||||
wxMacReleaseBitmapButton( &info );
|
||||
|
||||
@@ -1497,8 +1498,8 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
|
||||
// reference count to make sure we are not dealing with zombie controls after the native toolbar has released its views
|
||||
CFRetain( viewRef ) ;
|
||||
CFDataRef data = CFDataCreate( kCFAllocatorDefault , (UInt8*) &viewRef , sizeof(viewRef) ) ;
|
||||
err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID,
|
||||
data , &item ) ;
|
||||
err = HIToolbarCreateItemWithIdentifier((HIToolbarRef) m_macHIToolbarRef,kControlToolbarItemClassID,
|
||||
data , &item ) ;
|
||||
|
||||
if (err == noErr)
|
||||
{
|
||||
@@ -1516,6 +1517,19 @@ bool wxToolBar::DoInsertTool(size_t WXUNUSED(pos), wxToolBarToolBase *toolBase)
|
||||
break;
|
||||
}
|
||||
|
||||
#if wxMAC_USE_NATIVE_TOOLBAR
|
||||
wxString label = tool->GetLabel();
|
||||
if ( !label.empty() )
|
||||
{
|
||||
// strip mnemonics from the label for compatibility
|
||||
// with the usual labels in wxStaticText sense
|
||||
label = wxStaticText(label);
|
||||
|
||||
HIToolbarItemSetLabel(item,
|
||||
wxMacCFStringHolder(label, m_font.GetEncoding()));
|
||||
}
|
||||
#endif // wxMAC_USE_NATIVE_TOOLBAR
|
||||
|
||||
if ( err == noErr )
|
||||
{
|
||||
if ( controlHandle )
|
||||
|
@@ -148,14 +148,38 @@ public:
|
||||
clientData, shortHelp, longHelp)
|
||||
{
|
||||
m_nSepCount = 0;
|
||||
m_staticText = 0;
|
||||
}
|
||||
|
||||
wxToolBarTool(wxToolBar *tbar, wxControl *control)
|
||||
: wxToolBarToolBase(tbar, control)
|
||||
wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label)
|
||||
: wxToolBarToolBase(tbar, control, label)
|
||||
{
|
||||
if ( IsControl() && !m_label.empty() )
|
||||
{
|
||||
// create a control to render the control's label
|
||||
m_staticText = new wxStaticText
|
||||
(
|
||||
m_tbar,
|
||||
wxID_ANY,
|
||||
m_label,
|
||||
wxDefaultPosition,
|
||||
wxDefaultSize,
|
||||
wxALIGN_CENTRE | wxST_NO_AUTORESIZE
|
||||
);
|
||||
}
|
||||
else // no label
|
||||
{
|
||||
m_staticText = NULL;
|
||||
}
|
||||
|
||||
m_nSepCount = 1;
|
||||
}
|
||||
|
||||
virtual ~wxToolBarTool()
|
||||
{
|
||||
delete m_staticText;
|
||||
}
|
||||
|
||||
virtual void SetLabel(const wxString& label)
|
||||
{
|
||||
if ( label == m_label )
|
||||
@@ -163,12 +187,23 @@ public:
|
||||
|
||||
wxToolBarToolBase::SetLabel(label);
|
||||
|
||||
if ( m_staticText )
|
||||
m_staticText->SetLabel(label);
|
||||
|
||||
// we need to update the label shown in the toolbar because it has a
|
||||
// pointer to the internal buffer of the old label
|
||||
//
|
||||
// TODO: use TB_SETBUTTONINFO
|
||||
}
|
||||
|
||||
wxStaticText* GetStaticText()
|
||||
{
|
||||
wxASSERT_MSG( IsControl(),
|
||||
_T("only makes sense for embedded control tools") );
|
||||
|
||||
return m_staticText;
|
||||
}
|
||||
|
||||
// set/get the number of separators which we use to cover the space used by
|
||||
// a control in the toolbar
|
||||
void SetSeparatorsCount(size_t count) { m_nSepCount = count; }
|
||||
@@ -176,6 +211,7 @@ public:
|
||||
|
||||
private:
|
||||
size_t m_nSepCount;
|
||||
wxStaticText *m_staticText;
|
||||
|
||||
DECLARE_NO_COPY_CLASS(wxToolBarTool)
|
||||
};
|
||||
@@ -201,9 +237,10 @@ wxToolBarToolBase *wxToolBar::CreateTool(int id,
|
||||
clientData, shortHelp, longHelp);
|
||||
}
|
||||
|
||||
wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
|
||||
wxToolBarToolBase *
|
||||
wxToolBar::CreateTool(wxControl *control, const wxString& label)
|
||||
{
|
||||
return new wxToolBarTool(this, control);
|
||||
return new wxToolBarTool(this, control, label);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -489,13 +526,16 @@ bool wxToolBar::DoDeleteTool(size_t pos, wxToolBarToolBase *tool)
|
||||
// takes care of all normal items)
|
||||
for ( /* node -> first after deleted */ ; node; node = node->GetNext() )
|
||||
{
|
||||
wxToolBarToolBase *tool2 = node->GetData();
|
||||
wxToolBarTool *tool2 = (wxToolBarTool*)node->GetData();
|
||||
if ( tool2->IsControl() )
|
||||
{
|
||||
int x;
|
||||
wxControl *control = tool2->GetControl();
|
||||
control->GetPosition(&x, NULL);
|
||||
control->Move(x - width, wxDefaultCoord);
|
||||
|
||||
wxStaticText* staticText = tool2->GetStaticText();
|
||||
staticText->Move(x - width, wxDefaultCoord);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -944,7 +984,7 @@ bool wxToolBar::Realize()
|
||||
size_t index = 0;
|
||||
for ( node = m_tools.GetFirst(); node; node = node->GetNext(), index++ )
|
||||
{
|
||||
wxToolBarToolBase *tool = node->GetData();
|
||||
wxToolBarTool *tool = (wxToolBarTool*)node->GetData();
|
||||
|
||||
// we calculate the running y coord for vertical toolbars so we need to
|
||||
// get the items size for all items but for the horizontal ones we
|
||||
@@ -971,7 +1011,15 @@ bool wxToolBar::Realize()
|
||||
}
|
||||
|
||||
wxControl *control = tool->GetControl();
|
||||
wxStaticText * const staticText = tool->GetStaticText();
|
||||
|
||||
wxSize size = control->GetSize();
|
||||
wxSize staticTextSize;
|
||||
if ( staticText )
|
||||
{
|
||||
staticTextSize = staticText->GetSize();
|
||||
staticTextSize.y += 3; // margin between control and its label
|
||||
}
|
||||
|
||||
// the position of the leftmost controls corner
|
||||
int left = wxDefaultCoord;
|
||||
@@ -1026,18 +1074,36 @@ bool wxToolBar::Realize()
|
||||
((wxToolBarTool *)tool)->SetSeparatorsCount(nSeparators);
|
||||
|
||||
// adjust the controls width to exactly cover the separators
|
||||
control->SetSize((nSeparators + 1)*widthSep, wxDefaultCoord);
|
||||
size.x = (nSeparators + 1)*widthSep;
|
||||
control->SetSize(size.x, wxDefaultCoord);
|
||||
}
|
||||
|
||||
// position the control itself correctly vertically
|
||||
int height = r.bottom - r.top;
|
||||
int diff = height - size.y;
|
||||
if ( diff < 0 )
|
||||
{
|
||||
// the control is too high, resize to fit
|
||||
control->SetSize(wxDefaultCoord, height - 2);
|
||||
// position the control itself correctly vertically centering it on the
|
||||
// icon area of the toolbar
|
||||
int height = r.bottom - r.top - staticTextSize.y;
|
||||
|
||||
diff = 2;
|
||||
int diff = height - size.y;
|
||||
if ( diff < 0 || !HasFlag(wxTB_TEXT) )
|
||||
{
|
||||
// not enough room for the static text
|
||||
if ( staticText )
|
||||
staticText->Hide();
|
||||
|
||||
// recalculate height & diff without the staticText control
|
||||
height = r.bottom - r.top;
|
||||
diff = height - size.y;
|
||||
if ( diff < 0 )
|
||||
{
|
||||
// the control is too high, resize to fit
|
||||
control->SetSize(wxDefaultCoord, height - 2);
|
||||
|
||||
diff = 2;
|
||||
}
|
||||
}
|
||||
else // enough space for both the control and the label
|
||||
{
|
||||
if ( staticText )
|
||||
staticText->Show();
|
||||
}
|
||||
|
||||
int top;
|
||||
@@ -1057,6 +1123,11 @@ bool wxToolBar::Realize()
|
||||
}
|
||||
|
||||
control->Move(left, top + (diff + 1) / 2);
|
||||
if ( staticText )
|
||||
{
|
||||
staticText->Move(left + (size.x - staticTextSize.x)/2,
|
||||
r.bottom - staticTextSize.y);
|
||||
}
|
||||
}
|
||||
|
||||
// the max index is the "real" number of buttons - i.e. counting even the
|
||||
@@ -1539,12 +1610,18 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam)
|
||||
// otherwise
|
||||
for ( node = m_tools.GetFirst(); node; node = node->GetNext() )
|
||||
{
|
||||
wxToolBarToolBase *tool = node->GetData();
|
||||
wxToolBarTool *tool = (wxToolBarTool*)node->GetData();
|
||||
if ( tool->IsControl() )
|
||||
{
|
||||
// get the control rect in our client coords
|
||||
wxControl *control = tool->GetControl();
|
||||
wxStaticText *staticText = tool->GetStaticText();
|
||||
wxRect rectCtrl = control->GetRect();
|
||||
wxRect rectStaticText(0,0,0,0);
|
||||
if ( staticText )
|
||||
{
|
||||
rectStaticText = staticText->GetRect();
|
||||
}
|
||||
|
||||
// iterate over all buttons
|
||||
TBBUTTON tbb;
|
||||
@@ -1585,6 +1662,15 @@ bool wxToolBar::HandlePaint(WXWPARAM wParam, WXLPARAM lParam)
|
||||
// style in the parent: the controls can disappear
|
||||
control->Refresh(false);
|
||||
}
|
||||
if ( staticText && rectStaticText.Intersects(rectItem) )
|
||||
{
|
||||
// yes, do erase it!
|
||||
dc.DrawRectangle(rectItem);
|
||||
|
||||
// Necessary in case we use a no-paint-on-size
|
||||
// style in the parent: the controls can disappear
|
||||
staticText->Refresh(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -104,8 +104,8 @@ public:
|
||||
m_underMouse = false;
|
||||
}
|
||||
|
||||
wxToolBarTool(wxToolBar *tbar, wxControl *control)
|
||||
: wxToolBarToolBase(tbar, control)
|
||||
wxToolBarTool(wxToolBar *tbar, wxControl *control, const wxString& label)
|
||||
: wxToolBarToolBase(tbar, control, label)
|
||||
{
|
||||
// no position yet
|
||||
m_x =
|
||||
@@ -328,9 +328,10 @@ wxToolBarToolBase *wxToolBar::CreateTool(int id,
|
||||
clientData, shortHelp, longHelp);
|
||||
}
|
||||
|
||||
wxToolBarToolBase *wxToolBar::CreateTool(wxControl *control)
|
||||
wxToolBarToolBase *
|
||||
wxToolBar::CreateTool(wxControl *control, const wxString& label)
|
||||
{
|
||||
return new wxToolBarTool(this, control);
|
||||
return new wxToolBarTool(this, control, label);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user