Merge branch 'textctrl-fixes'

Closes https://github.com/wxWidgets/wxWidgets/pull/546
This commit is contained in:
Vadim Zeitlin 2017-08-28 21:50:35 +02:00
commit 2a06ef9bf3
2 changed files with 20 additions and 15 deletions

View File

@ -1334,7 +1334,12 @@ wxTextPos wxTextCtrl::GetLastPosition() const
{
if ( IsMultiLine() )
{
return ::GetWindowTextLength(GetHwnd());
int numLines = GetNumberOfLines();
long posStartLastLine = XYToPosition(0, numLines - 1);
long lenLastLine = GetLengthOfLineContainingPos(posStartLastLine);
return posStartLastLine + lenLastLine;
}
return wxTextEntry::GetLastPosition();
@ -1486,13 +1491,12 @@ long wxTextCtrl::XYToPosition(long x, long y) const
// Line is identified by a character position!
long lineLength = ::SendMessage(GetHwnd(), EM_LINELENGTH, charIndex, 0);
// For all lines but last one we need to adjust the length
// to include new line character (only one because both CR and LF
// are virtually "displayed" at the same position).
if ( y < GetNumberOfLines() - 1 )
lineLength += 1;
if ( x >= lineLength )
// Notice that x == lineLength is still valid because it corresponds either
// to the position of the LF at the end of any line except the last one or
// to the last position, which is the position after the last character,
// for the last line.
if ( x > lineLength )
return -1;
return charIndex + x;

View File

@ -71,6 +71,7 @@ private:
// don't pass neither but this could be a bug.
CPPUNIT_TEST( SetValue );
CPPUNIT_TEST( Selection );
CPPUNIT_TEST( InsertionPoint );
CPPUNIT_TEST( Replace );
WXUISIM_TEST( Editable );
CPPUNIT_TEST( CopyPaste );
@ -831,7 +832,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
const long numLines_0 = 1;
CPPUNIT_ASSERT_EQUAL( m_text->GetNumberOfLines(), numLines_0 );
long pos_0[numLines_0+1][maxLineLength_0+1] =
{ { -1 } };
{ { 0 } };
for ( long y = 0; y < numLines_0; y++ )
for( long x = 0; x < maxLineLength_0+1; x++ )
{
@ -846,7 +847,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
const long numLines_1 = 1;
CPPUNIT_ASSERT_EQUAL( m_text->GetNumberOfLines(), numLines_1 );
long pos_1[numLines_1+1][maxLineLength_1+1] =
{ { 0, 1, 2, 3, -1 },
{ { 0, 1, 2, 3, 4 },
{ -1, -1, -1, -1, -1 } };
for ( long y = 0; y < numLines_1; y++ )
for( long x = 0; x < maxLineLength_1+1; x++ )
@ -866,7 +867,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
long pos_2[numLines_2 + 1][maxLineLength_2 + 1] =
{ { 0, 1, 2, 3, -1 }, // New line occupies positions 3, 4
{ 5, 6, 7, -1, -1 }, // New line occupies positions 7, 8
{ 9, -1, -1, -1, -1 } };
{ 9, 10, -1, -1, -1 } };
#else
long pos_2[numLines_2+1][maxLineLength_2+1] =
{ { 0, 1, 2, 3, -1 },
@ -893,7 +894,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
{ { 0, -1 }, // New line occupies positions 0, 1
{ 2, -1 }, // New line occupies positions 2, 3
{ 4, -1 }, // New line occupies positions 4, 5
{ -1, -1 },
{ 6, -1 },
{ -1, -1 } };
#else
long pos_3[numLines_3+1][maxLineLength_3+1] =
@ -925,7 +926,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
{ 8, -1, -1, -1, -1 }, // New line occupies positions 8, 9
{ 10, 11, -1, -1, -1 }, // New line occupies positions 11, 12
{ 13, -1, -1, -1, -1 }, // New line occupies positions 13, 14
{ -1, -1, -1, -1, -1 },
{ 15, -1, -1, -1, -1 },
{ -1, -1, -1, -1, -1 } };
#else
long pos_4[numLines_4+1][maxLineLength_4+1] =
@ -1013,7 +1014,7 @@ void TextCtrlTestCase::XYToPositionSingleLine()
for( long x = 0; x < m_text->GetLastPosition()+2; x++ )
{
long p0 = m_text->XYToPosition(x, 0);
if ( x < m_text->GetLastPosition() )
if ( x <= m_text->GetLastPosition() )
CPPUNIT_ASSERT_EQUAL( p0, x );
else
CPPUNIT_ASSERT_EQUAL( p0, -1 );
@ -1029,7 +1030,7 @@ void TextCtrlTestCase::XYToPositionSingleLine()
for( long x = 0; x < m_text->GetLastPosition()+2; x++ )
{
long p1 = m_text->XYToPosition(x, 0);
if ( x < m_text->GetLastPosition() )
if ( x <= m_text->GetLastPosition() )
CPPUNIT_ASSERT_EQUAL( p1, x );
else
CPPUNIT_ASSERT_EQUAL( p1, -1 );
@ -1045,7 +1046,7 @@ void TextCtrlTestCase::XYToPositionSingleLine()
for( long x = 0; x < m_text->GetLastPosition()+2; x++ )
{
long p2 = m_text->XYToPosition(x, 0);
if ( x < m_text->GetLastPosition() )
if ( x <= m_text->GetLastPosition() )
CPPUNIT_ASSERT_EQUAL( p2, x );
else
CPPUNIT_ASSERT_EQUAL( p2, -1 );