connecting the currently focused text control to the mac os services (Services Menu)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@27178 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -120,7 +120,12 @@ static const EventTypeSpec eventList[] =
|
|||||||
{ kEventClassControl , kEventControlEnabledStateChanged } ,
|
{ kEventClassControl , kEventControlEnabledStateChanged } ,
|
||||||
{ kEventClassControl , kEventControlHiliteChanged } ,
|
{ kEventClassControl , kEventControlHiliteChanged } ,
|
||||||
{ kEventClassControl , kEventControlSetFocusPart } ,
|
{ kEventClassControl , kEventControlSetFocusPart } ,
|
||||||
// { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only
|
|
||||||
|
{ kEventClassService , kEventServiceGetTypes },
|
||||||
|
{ kEventClassService , kEventServiceCopy },
|
||||||
|
{ kEventClassService , kEventServicePaste },
|
||||||
|
|
||||||
|
// { kEventClassControl , kEventControlInvalidateForSizeChange } , // 10.3 only
|
||||||
// { kEventClassControl , kEventControlBoundsChanged } ,
|
// { kEventClassControl , kEventControlBoundsChanged } ,
|
||||||
#endif
|
#endif
|
||||||
} ;
|
} ;
|
||||||
@@ -236,6 +241,80 @@ static pascal OSStatus wxMacWindowControlEventHandler( EventHandlerCallRef handl
|
|||||||
return result ;
|
return result ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static pascal OSStatus wxMacWindowServiceEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
|
||||||
|
{
|
||||||
|
OSStatus result = eventNotHandledErr ;
|
||||||
|
|
||||||
|
wxMacCarbonEvent cEvent( event ) ;
|
||||||
|
|
||||||
|
ControlRef controlRef ;
|
||||||
|
wxWindowMac* thisWindow = (wxWindowMac*) data ;
|
||||||
|
wxTextCtrl* textCtrl = wxDynamicCast( thisWindow , wxTextCtrl ) ;
|
||||||
|
cEvent.GetParameter( kEventParamDirectObject , &controlRef ) ;
|
||||||
|
|
||||||
|
switch( GetEventKind( event ) )
|
||||||
|
{
|
||||||
|
case kEventServiceGetTypes :
|
||||||
|
if( textCtrl )
|
||||||
|
{
|
||||||
|
long from, to ;
|
||||||
|
textCtrl->GetSelection( &from , &to ) ;
|
||||||
|
|
||||||
|
CFMutableArrayRef copyTypes = 0 , pasteTypes = 0;
|
||||||
|
if( from != to )
|
||||||
|
copyTypes = cEvent.GetParameter< CFMutableArrayRef >( kEventParamServiceCopyTypes , typeCFMutableArrayRef ) ;
|
||||||
|
if ( textCtrl->IsEditable() )
|
||||||
|
pasteTypes = cEvent.GetParameter< CFMutableArrayRef >( kEventParamServicePasteTypes , typeCFMutableArrayRef ) ;
|
||||||
|
|
||||||
|
static const OSType textDataTypes[] = { kTXNTextData /* , 'utxt' , 'PICT', 'MooV', 'AIFF' */ };
|
||||||
|
for ( size_t i = 0 ; i < WXSIZEOF(textDataTypes) ; ++i )
|
||||||
|
{
|
||||||
|
CFStringRef typestring = CreateTypeStringWithOSType(textDataTypes[i]);
|
||||||
|
if ( typestring )
|
||||||
|
{
|
||||||
|
if ( copyTypes )
|
||||||
|
CFArrayAppendValue (copyTypes, typestring) ;
|
||||||
|
if ( pasteTypes )
|
||||||
|
CFArrayAppendValue (pasteTypes, typestring) ;
|
||||||
|
CFRelease( typestring ) ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result = noErr ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
case kEventServiceCopy :
|
||||||
|
if ( textCtrl )
|
||||||
|
{
|
||||||
|
long from, to ;
|
||||||
|
textCtrl->GetSelection( &from , &to ) ;
|
||||||
|
wxString val = textCtrl->GetValue() ;
|
||||||
|
val = val.Mid( from , to - from ) ;
|
||||||
|
ScrapRef scrapRef = cEvent.GetParameter< ScrapRef > ( kEventParamScrapRef , typeScrapRef ) ;
|
||||||
|
verify_noerr( ClearScrap( &scrapRef ) ) ;
|
||||||
|
verify_noerr( PutScrapFlavor( scrapRef , kTXNTextData , 0 , val.Length() , val.c_str() ) ) ;
|
||||||
|
result = noErr ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
case kEventServicePaste :
|
||||||
|
if ( textCtrl )
|
||||||
|
{
|
||||||
|
ScrapRef scrapRef = cEvent.GetParameter< ScrapRef > ( kEventParamScrapRef , typeScrapRef ) ;
|
||||||
|
Size textSize, pastedSize ;
|
||||||
|
verify_noerr( GetScrapFlavorSize (scrapRef, kTXNTextData, &textSize) ) ;
|
||||||
|
textSize++ ;
|
||||||
|
char *content = new char[textSize] ;
|
||||||
|
GetScrapFlavorData (scrapRef, kTXNTextData, &pastedSize, content );
|
||||||
|
content[textSize-1] = 0 ;
|
||||||
|
textCtrl->WriteText( wxString( content ) ) ;
|
||||||
|
delete[] content ;
|
||||||
|
result = noErr ;
|
||||||
|
}
|
||||||
|
break ;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result ;
|
||||||
|
}
|
||||||
|
|
||||||
pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
|
pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
|
||||||
{
|
{
|
||||||
OSStatus result = eventNotHandledErr ;
|
OSStatus result = eventNotHandledErr ;
|
||||||
@@ -245,6 +324,8 @@ pascal OSStatus wxMacWindowEventHandler( EventHandlerCallRef handler , EventRef
|
|||||||
case kEventClassControl :
|
case kEventClassControl :
|
||||||
result = wxMacWindowControlEventHandler( handler, event, data ) ;
|
result = wxMacWindowControlEventHandler( handler, event, data ) ;
|
||||||
break ;
|
break ;
|
||||||
|
case kEventClassService :
|
||||||
|
result = wxMacWindowServiceEventHandler( handler, event , data ) ;
|
||||||
default :
|
default :
|
||||||
break ;
|
break ;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user