hack around a UnicodeEditTextControl which does not deliver a correct selection unless the control has the focus.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@39258 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor
2006-05-21 09:38:21 +00:00
parent a269ba6e3d
commit ad604d0f8d

View File

@@ -344,6 +344,12 @@ public :
protected :
// contains the tag for the content (is different for password and non-password controls)
OSType m_valueTag ;
// as the selection tag only works correctly when the control has the focus we have to mirror the
// intended value
EventHandlerRef m_focusHandlerRef ;
public :
ControlEditTextSelectionRec m_selection ;
};
#endif
@@ -1361,6 +1367,65 @@ int wxMacTextControl::GetLineLength(long lineNo) const
#if TARGET_API_MAC_OSX
// the current unicode textcontrol implementation has a bug : only if the control
// is currently having the focus, the selection can be retrieved by the corresponding
// data tag. So we have a mirroring using a member variable
// TODO : build event table using virtual member functions for wxMacControl
static const EventTypeSpec unicodeTextControlEventList[] =
{
{ kEventClassControl , kEventControlSetFocusPart } ,
} ;
static pascal OSStatus wxMacUnicodeTextControlControlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
wxMacUnicodeTextControl* focus = (wxMacUnicodeTextControl*) data ;
wxMacCarbonEvent cEvent( event ) ;
switch ( GetEventKind( event ) )
{
case kEventControlSetFocusPart :
{
ControlPartCode controlPart = cEvent.GetParameter<ControlPartCode>(kEventParamControlPart , typeControlPartCode );
if ( controlPart == kControlFocusNoPart )
{
// about to loose focus -> store selection to field
focus->GetData<ControlEditTextSelectionRec>( 0, kControlEditTextSelectionTag, &focus->m_selection );
}
result = CallNextEventHandler(handler,event) ;
if ( controlPart != kControlFocusNoPart )
{
// about to gain focus -> set selection from field
focus->SetData<ControlEditTextSelectionRec>( 0, kControlEditTextSelectionTag, &focus->m_selection );
}
break;
}
default:
break ;
}
return result ;
}
static pascal OSStatus wxMacUnicodeTextControlEventHandler( EventHandlerCallRef handler , EventRef event , void *data )
{
OSStatus result = eventNotHandledErr ;
switch ( GetEventClass( event ) )
{
case kEventClassControl :
result = wxMacUnicodeTextControlControlEventHandler( handler , event , data ) ;
break ;
default :
break ;
}
return result ;
}
DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacUnicodeTextControlEventHandler )
wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxTextCtrl *wxPeer,
const wxString& str,
const wxPoint& pos,
@@ -1384,10 +1449,15 @@ wxMacUnicodeTextControl::wxMacUnicodeTextControl( wxTextCtrl *wxPeer,
if ( !(m_windowStyle & wxTE_MULTILINE) )
SetData<Boolean>( kControlEditTextPart , kControlEditTextSingleLineTag , true ) ;
InstallControlEventHandler( m_controlRef , GetwxMacUnicodeTextControlEventHandlerUPP(),
GetEventTypeCount(unicodeTextControlEventList), unicodeTextControlEventList, this,
&m_focusHandlerRef);
}
wxMacUnicodeTextControl::~wxMacUnicodeTextControl()
{
::RemoveEventHandler( m_focusHandlerRef );
}
void wxMacUnicodeTextControl::VisibilityChanged(bool shown)
@@ -1465,7 +1535,11 @@ void wxMacUnicodeTextControl::SetEditable(bool editable)
void wxMacUnicodeTextControl::GetSelection( long* from, long* to ) const
{
ControlEditTextSelectionRec sel ;
if (HasFocus())
verify_noerr( GetData<ControlEditTextSelectionRec>( 0, kControlEditTextSelectionTag, &sel ) ) ;
else
sel = m_selection ;
if ( from )
*from = sel.selStart ;
if ( to )
@@ -1475,15 +1549,32 @@ void wxMacUnicodeTextControl::GetSelection( long* from, long* to ) const
void wxMacUnicodeTextControl::SetSelection( long from , long to )
{
ControlEditTextSelectionRec sel ;
wxString result ;
int textLength = 0 ;
CFStringRef value = GetData<CFStringRef>(0, m_valueTag) ;
if ( value )
{
wxMacCFStringHolder cf(value) ;
textLength = cf.AsString().Length() ;
}
if ((from == -1) && (to == -1))
{
from = 0 ;
to = 32767 ; // sel has 16 bit signed values, max is 32767
to = textLength ;
}
else
{
from = wxMin(textLength,wxMax(from,0)) ;
to = wxMax(0,wxMin(textLength,to)) ;
}
sel.selStart = from ;
sel.selEnd = to ;
if ( HasFocus() )
SetData<ControlEditTextSelectionRec>( 0, kControlEditTextSelectionTag, &sel ) ;
else
m_selection = sel;
}
void wxMacUnicodeTextControl::WriteText( const wxString& str )
@@ -1492,10 +1583,14 @@ void wxMacUnicodeTextControl::WriteText( const wxString& str )
wxMacConvertNewlines10To13( &st ) ;
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
if ( HasFocus() )
{
wxMacCFStringHolder cf(st , m_font.GetEncoding() ) ;
CFStringRef value = cf ;
SetData<CFStringRef>( 0, kControlEditTextInsertCFStringRefTag, &value );
#else
}
#endif
{
wxString val = GetStringValue() ;
long start , end ;
GetSelection( &start , &end ) ;
@@ -1503,7 +1598,7 @@ void wxMacUnicodeTextControl::WriteText( const wxString& str )
val.insert( start , str ) ;
SetStringValue( val ) ;
SetSelection( start + str.length() , start + str.length() ) ;
#endif
}
}
#endif