movement by word works for multiline too
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/wxUNIVERSAL@8564 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -108,6 +108,7 @@ void wxTextCtrl::Init()
|
|||||||
m_colLastVisible = -1;
|
m_colLastVisible = -1;
|
||||||
m_posLastVisible = -1;
|
m_posLastVisible = -1;
|
||||||
|
|
||||||
|
m_posLast =
|
||||||
m_curPos =
|
m_curPos =
|
||||||
m_curCol =
|
m_curCol =
|
||||||
m_curRow = 0;
|
m_curRow = 0;
|
||||||
@@ -556,6 +557,9 @@ void wxTextCtrl::Replace(long from, long to, const wxString& text)
|
|||||||
}
|
}
|
||||||
#endif // 0/1
|
#endif // 0/1
|
||||||
|
|
||||||
|
// update the (cached) last position
|
||||||
|
m_posLast += text.length() - to + from;
|
||||||
|
|
||||||
// update the current position: note that we always put the cursor at the
|
// update the current position: note that we always put the cursor at the
|
||||||
// end of the replacement text
|
// end of the replacement text
|
||||||
SetInsertionPoint(from + text.length());
|
SetInsertionPoint(from + text.length());
|
||||||
@@ -643,6 +647,7 @@ long wxTextCtrl::GetLastPosition() const
|
|||||||
}
|
}
|
||||||
else // multiline
|
else // multiline
|
||||||
{
|
{
|
||||||
|
#ifdef WXDEBUG_TEXT
|
||||||
pos = 0;
|
pos = 0;
|
||||||
size_t nLineCount = m_lines.GetCount();
|
size_t nLineCount = m_lines.GetCount();
|
||||||
for ( size_t nLine = 0; nLine < nLineCount; nLine++ )
|
for ( size_t nLine = 0; nLine < nLineCount; nLine++ )
|
||||||
@@ -658,6 +663,12 @@ long wxTextCtrl::GetLastPosition() const
|
|||||||
// beginning of the next line after it
|
// beginning of the next line after it
|
||||||
pos--;
|
pos--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// more probable reason of this would be to forget to update m_posLast
|
||||||
|
wxASSERT_MSG( pos == m_posLast, _T("bug in GetLastPosition()") );
|
||||||
|
#endif // WXDEBUG_TEXT
|
||||||
|
|
||||||
|
pos = m_posLast;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pos;
|
return pos;
|
||||||
@@ -1070,20 +1081,23 @@ static inline bool IsWordChar(wxChar ch)
|
|||||||
|
|
||||||
long wxTextCtrl::GetWordStart() const
|
long wxTextCtrl::GetWordStart() const
|
||||||
{
|
{
|
||||||
// TODO
|
|
||||||
wxCHECK_MSG( IsSingleLine(), -1, _T("not implemented for multline") );
|
|
||||||
|
|
||||||
if ( m_curPos == -1 || m_curPos == 0 )
|
if ( m_curPos == -1 || m_curPos == 0 )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if ( m_curCol == 0 )
|
||||||
|
{
|
||||||
|
// go to the end of the previous line
|
||||||
|
return m_curPos - 1;
|
||||||
|
}
|
||||||
|
|
||||||
// it shouldn't be possible to learn where the word starts in the password
|
// it shouldn't be possible to learn where the word starts in the password
|
||||||
// text entry zone
|
// text entry zone
|
||||||
if ( IsPassword() )
|
if ( IsPassword() )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// start at the previous position
|
// start at the previous position
|
||||||
const wxChar *p0 = m_value.c_str();
|
const wxChar *p0 = GetLineText(m_curRow).c_str();
|
||||||
const wxChar *p = p0 + m_curPos - 1;
|
const wxChar *p = p0 + m_curCol - 1;
|
||||||
|
|
||||||
// find the end of the previous word
|
// find the end of the previous word
|
||||||
while ( (p > p0) && !IsWordChar(*p) )
|
while ( (p > p0) && !IsWordChar(*p) )
|
||||||
@@ -1097,25 +1111,34 @@ long wxTextCtrl::GetWordStart() const
|
|||||||
if ( !IsWordChar(*p) )
|
if ( !IsWordChar(*p) )
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
return p - p0;
|
return (m_curPos - m_curCol) + p - p0;
|
||||||
}
|
}
|
||||||
|
|
||||||
long wxTextCtrl::GetWordEnd() const
|
long wxTextCtrl::GetWordEnd() const
|
||||||
{
|
{
|
||||||
// TODO
|
|
||||||
wxCHECK_MSG( IsSingleLine(), -1, _T("not implemented for multline") );
|
|
||||||
|
|
||||||
if ( m_curPos == -1 )
|
if ( m_curPos == -1 )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
wxString line = GetLineText(m_curRow);
|
||||||
|
if ( (size_t)m_curCol == line.length() )
|
||||||
|
{
|
||||||
|
// if we're on the last position in the line, go to the next one - if
|
||||||
|
// it exists
|
||||||
|
long pos = m_curPos;
|
||||||
|
if ( pos < GetLastPosition() )
|
||||||
|
pos++;
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
// it shouldn't be possible to learn where the word ends in the password
|
// it shouldn't be possible to learn where the word ends in the password
|
||||||
// text entry zone
|
// text entry zone
|
||||||
if ( IsPassword() )
|
if ( IsPassword() )
|
||||||
return GetLastPosition();
|
return GetLastPosition();
|
||||||
|
|
||||||
// start at the current position
|
// start at the current position
|
||||||
const wxChar *p0 = m_value.c_str();
|
const wxChar *p0 = line.c_str();
|
||||||
const wxChar *p = p0 + m_curPos;
|
const wxChar *p = p0 + m_curCol;
|
||||||
|
|
||||||
// find the start of the next word
|
// find the start of the next word
|
||||||
while ( *p && !IsWordChar(*p) )
|
while ( *p && !IsWordChar(*p) )
|
||||||
@@ -1129,7 +1152,7 @@ long wxTextCtrl::GetWordEnd() const
|
|||||||
while ( *p && !IsWordChar(*p) )
|
while ( *p && !IsWordChar(*p) )
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
return p - p0;
|
return (m_curPos - m_curCol) + p - p0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user