added new implementation for editable and brought selection behaviour in synch

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16438 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Stefan Csomor 2002-08-10 09:45:20 +00:00
parent 17a2c5a10f
commit e600c175c0
2 changed files with 138 additions and 22 deletions

View File

@ -54,6 +54,7 @@
#define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
extern wxApp *wxTheApp ;
extern wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ;
// CS:TODO we still have a problem getting properly at the text events of a control because under Carbon
// the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the
@ -196,8 +197,10 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart
/* save the drawing state */
SetPort((**tpvars).fDrawingEnvironment);
/* verify our boundary */
/* verify our boundary */
GetControlBounds(theControl, &bounds);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
if ( ! EqualRect(&bounds, &varsp->fRFocusOutline) ) {
// scrollbar is on the border, we add one
Rect oldbounds = varsp->fRFocusOutline ;
@ -224,6 +227,7 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart
if ((**tpvars).fIsActive && varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, true);
/* release our globals */
HSetState((Handle) tpvars, state);
}
}
@ -284,6 +288,7 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point
/* handle clicks in the text part */
case kmUPTextPart:
{ SetPort((**tpvars).fDrawingEnvironment);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent());
}
break;
@ -314,6 +319,7 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) {
varsp = *tpvars;
/* get the current mouse coordinates (in our window) */
SetPortWindowPort(GetControlOwner(theControl));
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
GetMouse(&mousep);
/* there's a 'focus thing' and an 'unfocused thing' */
if (varsp->fInFocus) {
@ -351,6 +357,7 @@ static pascal ControlPartCode TPPaneKeyDownProc(ControlHandle theControl,
if ((**tpvars).fInFocus) {
/* turn autoscrolling on and send the key event to text edit */
SetPort((**tpvars).fDrawingEnvironment);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
EventRecord ev ;
memset( &ev , 0 , sizeof( ev ) ) ;
ev.what = keyDown ;
@ -378,6 +385,7 @@ static pascal void TPPaneActivateProc(ControlHandle theControl, Boolean activati
varsp = *tpvars;
/* de/activate the text edit record */
SetPort((**tpvars).fDrawingEnvironment);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
GetControlBounds(theControl, &bounds);
varsp->fIsActive = activating;
TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
@ -423,6 +431,7 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF
define your own value for handling click-to-focus type events. */
/* save the drawing state */
SetPort((**tpvars).fDrawingEnvironment);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
/* calculate the next highlight state */
switch (action) {
default:
@ -736,6 +745,8 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
m_macTXN = (**tpvars).fTXNRec ;
m_macTXNvars = tpvars ;
m_macUsesTXN = true ;
TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
}
return TRUE;
@ -813,8 +824,13 @@ void wxTextCtrl::SetValue(const wxString& st)
}
else
{
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
kTXNStartOffset, kTXNEndOffset);
bool formerEditable = IsEditable() ;
SetEditable(true) ;
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
kTXNStartOffset, kTXNEndOffset);
TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
SetEditable(formerEditable) ;
}
MacRedrawControl() ;
}
@ -828,6 +844,8 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
{
if ( m_macUsesTXN )
{
bool formerEditable = IsEditable() ;
SetEditable(true) ;
TXNTypeAttributes typeAttr[4] ;
Str255 fontName = "\pMonaco" ;
SInt16 fontSize = 12 ;
@ -872,6 +890,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
OSStatus status = TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr,
start,end);
}
SetEditable(formerEditable) ;
}
return TRUE ;
}
@ -942,6 +961,7 @@ void wxTextCtrl::Paste()
{
TXNConvertFromPublicScrap();
TXNPaste((TXNObject)m_macTXN);
SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
}
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
event.SetString( GetValue() ) ;
@ -1010,10 +1030,19 @@ void wxTextCtrl::SetEditable(bool editable)
if ( editable != m_editable )
{
m_editable = editable ;
if ( editable )
UMAActivateControl( (ControlHandle) m_macControl ) ;
if ( !m_macUsesTXN )
{
if ( editable )
UMAActivateControl( (ControlHandle) m_macControl ) ;
else
UMADeactivateControl((ControlHandle) m_macControl ) ;
}
else
UMADeactivateControl((ControlHandle) m_macControl ) ;
{
TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
TXNControlData data[] = { editable ? kTXNReadWrite : kTXNReadOnly } ;
TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
}
}
}
@ -1075,10 +1104,13 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
}
else
{
TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
TXNClear( ((TXNObject) m_macTXN) ) ;
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
kTXNUseCurrentSelection, kTXNUseCurrentSelection);
bool formerEditable = IsEditable() ;
SetEditable(true) ;
TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
TXNClear( ((TXNObject) m_macTXN) ) ;
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
kTXNUseCurrentSelection, kTXNUseCurrentSelection);
SetEditable( formerEditable ) ;
}
Refresh() ;
}
@ -1096,8 +1128,11 @@ void wxTextCtrl::Remove(long from, long to)
}
else
{
bool formerEditable = IsEditable() ;
SetEditable(true) ;
TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
TXNClear( ((TXNObject) m_macTXN) ) ;
SetEditable( formerEditable ) ;
}
Refresh() ;
}
@ -1124,6 +1159,7 @@ void wxTextCtrl::SetSelection(long from, long to)
SetPort((**tpvars).fDrawingEnvironment);
/* change the selection */
TXNSetSelection( (**tpvars).fTXNRec, from, to);
TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
}
}
@ -1150,12 +1186,15 @@ void wxTextCtrl::WriteText(const wxString& text)
}
else
{
bool formerEditable = IsEditable() ;
SetEditable(true) ;
long start , end , dummy ;
GetSelection( &start , &dummy ) ;
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(),
kTXNUseCurrentSelection, kTXNUseCurrentSelection);
GetSelection( &dummy , &end ) ;
SetStyle( start , end , GetDefaultStyle() ) ;
SetEditable( formerEditable ) ;
}
MacRedrawControl() ;
}
@ -1376,6 +1415,13 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
int key = event.GetKeyCode() ;
bool eat_key = false ;
if ( key == 'c' && event.MetaDown() )
{
if ( CanCopy() )
Copy() ;
return ;
}
if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB &&
!( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) )
/* && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */
@ -1384,6 +1430,18 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
// eat it
return ;
}
if ( key == 'v' && event.MetaDown() )
{
if ( CanPaste() )
Paste() ;
return ;
}
if ( key == 'x' && event.MetaDown() )
{
if ( CanCut() )
Cut() ;
return ;
}
switch ( key )
{
case WXK_RETURN:
@ -1447,7 +1505,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
// default handling
event.Skip() ;
}
if ( key >= 0x20 ||
if ( ( key >= 0x20 && key < WXK_START ) ||
key == WXK_RETURN ||
key == WXK_DELETE ||
key == WXK_BACK)

View File

@ -54,6 +54,7 @@
#define TE_UNLIMITED_LENGTH 0xFFFFFFFFUL
extern wxApp *wxTheApp ;
extern wxControl *wxFindControlFromMacControl(ControlHandle inControl ) ;
// CS:TODO we still have a problem getting properly at the text events of a control because under Carbon
// the MLTE engine registers itself for the key events thus the normal flow never occurs, the only measure for the
@ -196,8 +197,10 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart
/* save the drawing state */
SetPort((**tpvars).fDrawingEnvironment);
/* verify our boundary */
/* verify our boundary */
GetControlBounds(theControl, &bounds);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
if ( ! EqualRect(&bounds, &varsp->fRFocusOutline) ) {
// scrollbar is on the border, we add one
Rect oldbounds = varsp->fRFocusOutline ;
@ -224,6 +227,7 @@ static pascal void TPPaneDrawProc(ControlRef theControl, ControlPartCode thePart
if ((**tpvars).fIsActive && varsp->fInFocus) DrawThemeFocusRect(&varsp->fRFocusOutline, true);
/* release our globals */
HSetState((Handle) tpvars, state);
}
}
@ -284,6 +288,7 @@ static pascal ControlPartCode TPPaneTrackingProc(ControlHandle theControl, Point
/* handle clicks in the text part */
case kmUPTextPart:
{ SetPort((**tpvars).fDrawingEnvironment);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
TXNClick( varsp->fTXNRec, (const EventRecord*) wxTheApp->MacGetCurrentEvent());
}
break;
@ -314,6 +319,7 @@ static pascal void TPPaneIdleProc(ControlHandle theControl) {
varsp = *tpvars;
/* get the current mouse coordinates (in our window) */
SetPortWindowPort(GetControlOwner(theControl));
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
GetMouse(&mousep);
/* there's a 'focus thing' and an 'unfocused thing' */
if (varsp->fInFocus) {
@ -351,6 +357,7 @@ static pascal ControlPartCode TPPaneKeyDownProc(ControlHandle theControl,
if ((**tpvars).fInFocus) {
/* turn autoscrolling on and send the key event to text edit */
SetPort((**tpvars).fDrawingEnvironment);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
EventRecord ev ;
memset( &ev , 0 , sizeof( ev ) ) ;
ev.what = keyDown ;
@ -378,6 +385,7 @@ static pascal void TPPaneActivateProc(ControlHandle theControl, Boolean activati
varsp = *tpvars;
/* de/activate the text edit record */
SetPort((**tpvars).fDrawingEnvironment);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
GetControlBounds(theControl, &bounds);
varsp->fIsActive = activating;
TPActivatePaneText(tpvars, varsp->fIsActive && varsp->fInFocus);
@ -423,6 +431,7 @@ static pascal ControlPartCode TPPaneFocusProc(ControlHandle theControl, ControlF
define your own value for handling click-to-focus type events. */
/* save the drawing state */
SetPort((**tpvars).fDrawingEnvironment);
wxMacWindowClipper clipper( wxFindControlFromMacControl(theControl ) ) ;
/* calculate the next highlight state */
switch (action) {
default:
@ -736,6 +745,8 @@ bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id,
m_macTXN = (**tpvars).fTXNRec ;
m_macTXNvars = tpvars ;
m_macUsesTXN = true ;
TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
}
return TRUE;
@ -813,8 +824,13 @@ void wxTextCtrl::SetValue(const wxString& st)
}
else
{
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
kTXNStartOffset, kTXNEndOffset);
bool formerEditable = IsEditable() ;
SetEditable(true) ;
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
kTXNStartOffset, kTXNEndOffset);
TXNSetSelection( (TXNObject) m_macTXN, 0, 0);
TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
SetEditable(formerEditable) ;
}
MacRedrawControl() ;
}
@ -828,6 +844,8 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
{
if ( m_macUsesTXN )
{
bool formerEditable = IsEditable() ;
SetEditable(true) ;
TXNTypeAttributes typeAttr[4] ;
Str255 fontName = "\pMonaco" ;
SInt16 fontSize = 12 ;
@ -872,6 +890,7 @@ bool wxTextCtrl::SetStyle(long start, long end, const wxTextAttr& style)
OSStatus status = TXNSetTypeAttributes ((TXNObject)m_macTXN, attrCounter , typeAttr,
start,end);
}
SetEditable(formerEditable) ;
}
return TRUE ;
}
@ -942,6 +961,7 @@ void wxTextCtrl::Paste()
{
TXNConvertFromPublicScrap();
TXNPaste((TXNObject)m_macTXN);
SetStyle( kTXNUseCurrentSelection , kTXNUseCurrentSelection , GetDefaultStyle() ) ;
}
wxCommandEvent event(wxEVT_COMMAND_TEXT_UPDATED, m_windowId);
event.SetString( GetValue() ) ;
@ -1010,10 +1030,19 @@ void wxTextCtrl::SetEditable(bool editable)
if ( editable != m_editable )
{
m_editable = editable ;
if ( editable )
UMAActivateControl( (ControlHandle) m_macControl ) ;
if ( !m_macUsesTXN )
{
if ( editable )
UMAActivateControl( (ControlHandle) m_macControl ) ;
else
UMADeactivateControl((ControlHandle) m_macControl ) ;
}
else
UMADeactivateControl((ControlHandle) m_macControl ) ;
{
TXNControlTag tag[] = { kTXNIOPrivilegesTag } ;
TXNControlData data[] = { editable ? kTXNReadWrite : kTXNReadOnly } ;
TXNSetTXNObjectControls( (TXNObject) m_macTXN , false , sizeof(tag) / sizeof (TXNControlTag) , tag , data ) ;
}
}
}
@ -1075,10 +1104,13 @@ void wxTextCtrl::Replace(long from, long to, const wxString& value)
}
else
{
TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
TXNClear( ((TXNObject) m_macTXN) ) ;
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
kTXNUseCurrentSelection, kTXNUseCurrentSelection);
bool formerEditable = IsEditable() ;
SetEditable(true) ;
TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
TXNClear( ((TXNObject) m_macTXN) ) ;
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*)value.c_str(), value.Length(),
kTXNUseCurrentSelection, kTXNUseCurrentSelection);
SetEditable( formerEditable ) ;
}
Refresh() ;
}
@ -1096,8 +1128,11 @@ void wxTextCtrl::Remove(long from, long to)
}
else
{
bool formerEditable = IsEditable() ;
SetEditable(true) ;
TXNSetSelection( ((TXNObject) m_macTXN) , from , to ) ;
TXNClear( ((TXNObject) m_macTXN) ) ;
SetEditable( formerEditable ) ;
}
Refresh() ;
}
@ -1124,6 +1159,7 @@ void wxTextCtrl::SetSelection(long from, long to)
SetPort((**tpvars).fDrawingEnvironment);
/* change the selection */
TXNSetSelection( (**tpvars).fTXNRec, from, to);
TXNShowSelection( (TXNObject) m_macTXN, kTXNShowStart);
}
}
@ -1150,12 +1186,15 @@ void wxTextCtrl::WriteText(const wxString& text)
}
else
{
bool formerEditable = IsEditable() ;
SetEditable(true) ;
long start , end , dummy ;
GetSelection( &start , &dummy ) ;
TXNSetData( ((TXNObject) m_macTXN), kTXNTextData, (void*) (const char*)value, value.Length(),
kTXNUseCurrentSelection, kTXNUseCurrentSelection);
GetSelection( &dummy , &end ) ;
SetStyle( start , end , GetDefaultStyle() ) ;
SetEditable( formerEditable ) ;
}
MacRedrawControl() ;
}
@ -1376,6 +1415,13 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
int key = event.GetKeyCode() ;
bool eat_key = false ;
if ( key == 'c' && event.MetaDown() )
{
if ( CanCopy() )
Copy() ;
return ;
}
if ( !IsEditable() && key != WXK_LEFT && key != WXK_RIGHT && key != WXK_DOWN && key != WXK_UP && key != WXK_TAB &&
!( key == WXK_RETURN && ( (m_windowStyle & wxPROCESS_ENTER) || (m_windowStyle & wxTE_MULTILINE) ) )
/* && key != WXK_PRIOR && key != WXK_NEXT && key != WXK_HOME && key != WXK_END */
@ -1384,6 +1430,18 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
// eat it
return ;
}
if ( key == 'v' && event.MetaDown() )
{
if ( CanPaste() )
Paste() ;
return ;
}
if ( key == 'x' && event.MetaDown() )
{
if ( CanCut() )
Cut() ;
return ;
}
switch ( key )
{
case WXK_RETURN:
@ -1447,7 +1505,7 @@ void wxTextCtrl::OnChar(wxKeyEvent& event)
// default handling
event.Skip() ;
}
if ( key >= 0x20 ||
if ( ( key >= 0x20 && key < WXK_START ) ||
key == WXK_RETURN ||
key == WXK_DELETE ||
key == WXK_BACK)