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:
Vadim Zeitlin
2007-03-18 23:13:18 +00:00
parent 88c23b64c7
commit cdb11cb99e
13 changed files with 235 additions and 105 deletions

View File

@@ -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 )