corrected an off-by-1 bug in GetNumberOfLines() and PositionToXY() for

single-line text controls


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1506 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-01-28 14:01:37 +00:00
parent dcfde59229
commit 2829d9e3e8
2 changed files with 32 additions and 14 deletions

View File

@@ -435,12 +435,18 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
{ {
wxString text = GetValue(); wxString text = GetValue();
if( pos >= (long)text.Len() ) // cast to prevent warning. But pos really should've been unsigned.
if( (unsigned long)pos > text.Len() )
return FALSE; return FALSE;
*x=1; // Col 1 *x=1; // Col 1
*y=1; // Line 1 *y=1; // Line 1
for ( const char *p = text.c_str(); *p; p++ )
if (pos == 0)
return TRUE;
const char* stop = text.c_str() + pos + 1;
for ( const char *p = text.c_str(); p <= stop; p++ )
{ {
if (*p == '\n') if (*p == '\n')
{ {
@@ -453,7 +459,7 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
} }
else // single line control else // single line control
{ {
if ( pos < GTK_ENTRY(m_text)->text_length ) if ( pos <= GTK_ENTRY(m_text)->text_length )
{ {
*y = 1; *y = 1;
*x = pos; *x = pos;
@@ -473,8 +479,9 @@ long wxTextCtrl::XYToPosition(long x, long y ) const
if (!(m_windowStyle & wxTE_MULTILINE)) return 0; if (!(m_windowStyle & wxTE_MULTILINE)) return 0;
long pos=0; long pos=0;
/* This is a kludge; our XY values are 1-based, but GetLineLength()
for( int i=1; i<y; i++ ) pos += GetLineLength(i); * and --Text() start counting at 0. (and so say the docs) */
for( int i=1; i<y; i++ ) pos += GetLineLength(i-1) + 1; // one for '\n'
pos += x-1; // Pos start with 0 pos += x-1; // Pos start with 0
return pos; return pos;
@@ -502,7 +509,9 @@ int wxTextCtrl::GetNumberOfLines() const
currentLine++; currentLine++;
} }
g_free( text ); g_free( text );
return currentLine;
// currentLine is 0 based, add 1 to get number of lines
return currentLine + 1;
} }
else else
{ {

View File

@@ -435,12 +435,18 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
{ {
wxString text = GetValue(); wxString text = GetValue();
if( pos >= (long)text.Len() ) // cast to prevent warning. But pos really should've been unsigned.
if( (unsigned long)pos > text.Len() )
return FALSE; return FALSE;
*x=1; // Col 1 *x=1; // Col 1
*y=1; // Line 1 *y=1; // Line 1
for ( const char *p = text.c_str(); *p; p++ )
if (pos == 0)
return TRUE;
const char* stop = text.c_str() + pos + 1;
for ( const char *p = text.c_str(); p <= stop; p++ )
{ {
if (*p == '\n') if (*p == '\n')
{ {
@@ -453,7 +459,7 @@ long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
} }
else // single line control else // single line control
{ {
if ( pos < GTK_ENTRY(m_text)->text_length ) if ( pos <= GTK_ENTRY(m_text)->text_length )
{ {
*y = 1; *y = 1;
*x = pos; *x = pos;
@@ -473,8 +479,9 @@ long wxTextCtrl::XYToPosition(long x, long y ) const
if (!(m_windowStyle & wxTE_MULTILINE)) return 0; if (!(m_windowStyle & wxTE_MULTILINE)) return 0;
long pos=0; long pos=0;
/* This is a kludge; our XY values are 1-based, but GetLineLength()
for( int i=1; i<y; i++ ) pos += GetLineLength(i); * and --Text() start counting at 0. (and so say the docs) */
for( int i=1; i<y; i++ ) pos += GetLineLength(i-1) + 1; // one for '\n'
pos += x-1; // Pos start with 0 pos += x-1; // Pos start with 0
return pos; return pos;
@@ -502,7 +509,9 @@ int wxTextCtrl::GetNumberOfLines() const
currentLine++; currentLine++;
} }
g_free( text ); g_free( text );
return currentLine;
// currentLine is 0 based, add 1 to get number of lines
return currentLine + 1;
} }
else else
{ {