Merge branch 'textctrl-fixes'
Closes https://github.com/wxWidgets/wxWidgets/pull/546
This commit is contained in:
@@ -1334,7 +1334,12 @@ wxTextPos wxTextCtrl::GetLastPosition() const
|
|||||||
{
|
{
|
||||||
if ( IsMultiLine() )
|
if ( IsMultiLine() )
|
||||||
{
|
{
|
||||||
return ::GetWindowTextLength(GetHwnd());
|
int numLines = GetNumberOfLines();
|
||||||
|
long posStartLastLine = XYToPosition(0, numLines - 1);
|
||||||
|
|
||||||
|
long lenLastLine = GetLengthOfLineContainingPos(posStartLastLine);
|
||||||
|
|
||||||
|
return posStartLastLine + lenLastLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
return wxTextEntry::GetLastPosition();
|
return wxTextEntry::GetLastPosition();
|
||||||
@@ -1486,13 +1491,12 @@ long wxTextCtrl::XYToPosition(long x, long y) const
|
|||||||
|
|
||||||
// Line is identified by a character position!
|
// Line is identified by a character position!
|
||||||
long lineLength = ::SendMessage(GetHwnd(), EM_LINELENGTH, charIndex, 0);
|
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 -1;
|
||||||
|
|
||||||
return charIndex + x;
|
return charIndex + x;
|
||||||
|
@@ -71,6 +71,7 @@ private:
|
|||||||
// don't pass neither but this could be a bug.
|
// don't pass neither but this could be a bug.
|
||||||
CPPUNIT_TEST( SetValue );
|
CPPUNIT_TEST( SetValue );
|
||||||
CPPUNIT_TEST( Selection );
|
CPPUNIT_TEST( Selection );
|
||||||
|
CPPUNIT_TEST( InsertionPoint );
|
||||||
CPPUNIT_TEST( Replace );
|
CPPUNIT_TEST( Replace );
|
||||||
WXUISIM_TEST( Editable );
|
WXUISIM_TEST( Editable );
|
||||||
CPPUNIT_TEST( CopyPaste );
|
CPPUNIT_TEST( CopyPaste );
|
||||||
@@ -831,7 +832,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
|
|||||||
const long numLines_0 = 1;
|
const long numLines_0 = 1;
|
||||||
CPPUNIT_ASSERT_EQUAL( m_text->GetNumberOfLines(), numLines_0 );
|
CPPUNIT_ASSERT_EQUAL( m_text->GetNumberOfLines(), numLines_0 );
|
||||||
long pos_0[numLines_0+1][maxLineLength_0+1] =
|
long pos_0[numLines_0+1][maxLineLength_0+1] =
|
||||||
{ { -1 } };
|
{ { 0 } };
|
||||||
for ( long y = 0; y < numLines_0; y++ )
|
for ( long y = 0; y < numLines_0; y++ )
|
||||||
for( long x = 0; x < maxLineLength_0+1; x++ )
|
for( long x = 0; x < maxLineLength_0+1; x++ )
|
||||||
{
|
{
|
||||||
@@ -846,7 +847,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
|
|||||||
const long numLines_1 = 1;
|
const long numLines_1 = 1;
|
||||||
CPPUNIT_ASSERT_EQUAL( m_text->GetNumberOfLines(), numLines_1 );
|
CPPUNIT_ASSERT_EQUAL( m_text->GetNumberOfLines(), numLines_1 );
|
||||||
long pos_1[numLines_1+1][maxLineLength_1+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 } };
|
{ -1, -1, -1, -1, -1 } };
|
||||||
for ( long y = 0; y < numLines_1; y++ )
|
for ( long y = 0; y < numLines_1; y++ )
|
||||||
for( long x = 0; x < maxLineLength_1+1; x++ )
|
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] =
|
long pos_2[numLines_2 + 1][maxLineLength_2 + 1] =
|
||||||
{ { 0, 1, 2, 3, -1 }, // New line occupies positions 3, 4
|
{ { 0, 1, 2, 3, -1 }, // New line occupies positions 3, 4
|
||||||
{ 5, 6, 7, -1, -1 }, // New line occupies positions 7, 8
|
{ 5, 6, 7, -1, -1 }, // New line occupies positions 7, 8
|
||||||
{ 9, -1, -1, -1, -1 } };
|
{ 9, 10, -1, -1, -1 } };
|
||||||
#else
|
#else
|
||||||
long pos_2[numLines_2+1][maxLineLength_2+1] =
|
long pos_2[numLines_2+1][maxLineLength_2+1] =
|
||||||
{ { 0, 1, 2, 3, -1 },
|
{ { 0, 1, 2, 3, -1 },
|
||||||
@@ -893,7 +894,7 @@ void TextCtrlTestCase::XYToPositionMultiLine()
|
|||||||
{ { 0, -1 }, // New line occupies positions 0, 1
|
{ { 0, -1 }, // New line occupies positions 0, 1
|
||||||
{ 2, -1 }, // New line occupies positions 2, 3
|
{ 2, -1 }, // New line occupies positions 2, 3
|
||||||
{ 4, -1 }, // New line occupies positions 4, 5
|
{ 4, -1 }, // New line occupies positions 4, 5
|
||||||
{ -1, -1 },
|
{ 6, -1 },
|
||||||
{ -1, -1 } };
|
{ -1, -1 } };
|
||||||
#else
|
#else
|
||||||
long pos_3[numLines_3+1][maxLineLength_3+1] =
|
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
|
{ 8, -1, -1, -1, -1 }, // New line occupies positions 8, 9
|
||||||
{ 10, 11, -1, -1, -1 }, // New line occupies positions 11, 12
|
{ 10, 11, -1, -1, -1 }, // New line occupies positions 11, 12
|
||||||
{ 13, -1, -1, -1, -1 }, // New line occupies positions 13, 14
|
{ 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 } };
|
{ -1, -1, -1, -1, -1 } };
|
||||||
#else
|
#else
|
||||||
long pos_4[numLines_4+1][maxLineLength_4+1] =
|
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++ )
|
for( long x = 0; x < m_text->GetLastPosition()+2; x++ )
|
||||||
{
|
{
|
||||||
long p0 = m_text->XYToPosition(x, 0);
|
long p0 = m_text->XYToPosition(x, 0);
|
||||||
if ( x < m_text->GetLastPosition() )
|
if ( x <= m_text->GetLastPosition() )
|
||||||
CPPUNIT_ASSERT_EQUAL( p0, x );
|
CPPUNIT_ASSERT_EQUAL( p0, x );
|
||||||
else
|
else
|
||||||
CPPUNIT_ASSERT_EQUAL( p0, -1 );
|
CPPUNIT_ASSERT_EQUAL( p0, -1 );
|
||||||
@@ -1029,7 +1030,7 @@ void TextCtrlTestCase::XYToPositionSingleLine()
|
|||||||
for( long x = 0; x < m_text->GetLastPosition()+2; x++ )
|
for( long x = 0; x < m_text->GetLastPosition()+2; x++ )
|
||||||
{
|
{
|
||||||
long p1 = m_text->XYToPosition(x, 0);
|
long p1 = m_text->XYToPosition(x, 0);
|
||||||
if ( x < m_text->GetLastPosition() )
|
if ( x <= m_text->GetLastPosition() )
|
||||||
CPPUNIT_ASSERT_EQUAL( p1, x );
|
CPPUNIT_ASSERT_EQUAL( p1, x );
|
||||||
else
|
else
|
||||||
CPPUNIT_ASSERT_EQUAL( p1, -1 );
|
CPPUNIT_ASSERT_EQUAL( p1, -1 );
|
||||||
@@ -1045,7 +1046,7 @@ void TextCtrlTestCase::XYToPositionSingleLine()
|
|||||||
for( long x = 0; x < m_text->GetLastPosition()+2; x++ )
|
for( long x = 0; x < m_text->GetLastPosition()+2; x++ )
|
||||||
{
|
{
|
||||||
long p2 = m_text->XYToPosition(x, 0);
|
long p2 = m_text->XYToPosition(x, 0);
|
||||||
if ( x < m_text->GetLastPosition() )
|
if ( x <= m_text->GetLastPosition() )
|
||||||
CPPUNIT_ASSERT_EQUAL( p2, x );
|
CPPUNIT_ASSERT_EQUAL( p2, x );
|
||||||
else
|
else
|
||||||
CPPUNIT_ASSERT_EQUAL( p2, -1 );
|
CPPUNIT_ASSERT_EQUAL( p2, -1 );
|
||||||
|
Reference in New Issue
Block a user