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:
@@ -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,10 +479,11 @@ 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()
|
||||||
|
* 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'
|
||||||
|
|
||||||
for( int i=1; i<y; i++ ) pos += GetLineLength(i);
|
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
|
||||||
{
|
{
|
||||||
|
@@ -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,10 +479,11 @@ 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()
|
||||||
|
* 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'
|
||||||
|
|
||||||
for( int i=1; i<y; i++ ) pos += GetLineLength(i);
|
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
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user