Solve textctrl handle char type event twice error, correct the insertion point calculation

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@77769 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2014-09-23 17:39:19 +00:00
parent d8618b6814
commit 1c88c28c41

View File

@@ -971,8 +971,14 @@ void wxTextCtrl::Replace(wxTextPos from, wxTextPos to, const wxString& text)
int selStartOld = m_selStart,
selEndOld = m_selEnd;
m_selStart =
m_selEnd = -1;
// set selection range for GetSelection and GetInsertionPoint call
// if give a range but the text length that give doesn't equal the range
// it mean clear the text in the range and set the text after `from`
if ( (to - from) != (int)text.Len() )
{
m_selStart = from;
m_selEnd = from + text.Len();
}
if ( IsSingleLine() )
{
@@ -1347,7 +1353,14 @@ void wxTextCtrl::SetInsertionPointEnd()
wxTextPos wxTextCtrl::GetInsertionPoint() const
{
return m_curPos;
//if has selection, the insert point should be the lower number of selection,
//else should be current cursor position
long from;
if ( HasSelection() )
GetSelection(&from, NULL);
else
from = m_curPos;
return from;
}
wxTextPos wxTextCtrl::GetLastPosition() const
@@ -4419,9 +4432,6 @@ bool wxTextCtrl::PerformAction(const wxControlAction& actionOrig,
long numArg,
const wxString& strArg)
{
// has the text changed as result of this action?
bool textChanged = false;
// the remembered cursor abscissa for multiline text controls is usually
// reset after each user action but for ones which do use it (UP and DOWN
// for example) we shouldn't do it - as indicated by this flag
@@ -4520,8 +4530,6 @@ bool wxTextCtrl::PerformAction(const wxControlAction& actionOrig,
{
// inserting text can be undone
command = new wxTextCtrlInsertCommand(strArg);
textChanged = true;
}
}
else if ( (action == wxACTION_TEXT_PAGE_UP) ||
@@ -4694,23 +4702,15 @@ bool wxTextCtrl::PerformAction(const wxControlAction& actionOrig,
}
}
// Submit call will insert text eventually, so if has command,
// then no need to process wxEVT_TEXT event again.
if ( command )
{
// execute and remember it to be able to undo it later
m_cmdProcessor->Submit(command);
// undoable commands always change text
textChanged = true;
}
else // no undoable command
else if ( IsEditable() )
{
// m_cmdProcessor->StopCompressing()
}
if ( textChanged )
{
wxASSERT_MSG( IsEditable(), wxT("non editable control changed?") );
wxCommandEvent event(wxEVT_TEXT, GetId());
InitCommandEvent(event);
GetEventHandler()->ProcessEvent(event);
@@ -4719,6 +4719,8 @@ bool wxTextCtrl::PerformAction(const wxControlAction& actionOrig,
m_isModified = true;
}
return true;
}