//WXUISIM_TEST( ProcessEnter );
WXUISIM_TEST( Url );
CPPUNIT_TEST( Style );
+ CPPUNIT_TEST( FontStyle );
CPPUNIT_TEST( Lines );
CPPUNIT_TEST( LogTextCtrl );
+ CPPUNIT_TEST( PositionToCoords );
+ CPPUNIT_TEST( PositionToCoordsRich );
+ CPPUNIT_TEST( PositionToCoordsRich2 );
CPPUNIT_TEST_SUITE_END();
void MultiLineReplace();
//void ProcessEnter();
void Url();
void Style();
+ void FontStyle();
void Lines();
void LogTextCtrl();
+ void PositionToCoords();
+ void PositionToCoordsRich();
+ void PositionToCoordsRich2();
+
+ void DoPositionToCoordsTestWithStyle(long style);
wxTextCtrl *m_text;
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( TextCtrlTestCase );
-// also include in it's own registry so that these tests can be run alone
+// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( TextCtrlTestCase, "TextCtrlTestCase" );
// ----------------------------------------------------------------------------
#endif
}
+void TextCtrlTestCase::FontStyle()
+{
+ // We need wxTE_RICH under MSW and wxTE_MULTILINE under GTK for style
+ // support so recreate the control with these styles.
+ delete m_text;
+ m_text = new wxTextCtrl(wxTheApp->GetTopWindow(), wxID_ANY, "",
+ wxDefaultPosition, wxDefaultSize,
+ wxTE_MULTILINE | wxTE_RICH);
+
+ // Check that we get back the same font from GetStyle() after setting it
+ // with SetDefaultStyle().
+ wxFont fontIn(14,
+ wxFONTFAMILY_DEFAULT,
+ wxFONTSTYLE_NORMAL,
+ wxFONTWEIGHT_NORMAL);
+ wxTextAttr attrIn;
+ attrIn.SetFont(fontIn);
+ if ( !m_text->SetDefaultStyle(attrIn) )
+ {
+ // Skip the test if the styles are not supported.
+ return;
+ }
+
+ m_text->AppendText("Default font size 14");
+
+ wxTextAttr attrOut;
+ m_text->GetStyle(5, attrOut);
+
+ CPPUNIT_ASSERT( attrOut.HasFont() );
+
+ wxFont fontOut = attrOut.GetFont();
+#ifdef __WXMSW__
+ // Under MSW we get back an encoding in the font even though we hadn't
+ // specified it originally. It's not really a problem but we need this hack
+ // to prevent the assert below from failing because of it.
+ fontOut.SetEncoding(fontIn.GetEncoding());
+#endif
+ CPPUNIT_ASSERT_EQUAL( fontIn, fontOut );
+
+
+ // Also check the same for SetStyle().
+ fontIn.SetPointSize(10);
+ fontIn.SetWeight(wxFONTWEIGHT_BOLD);
+ attrIn.SetFont(fontIn);
+ m_text->SetStyle(0, 6, attrIn);
+
+ m_text->GetStyle(4, attrOut);
+ CPPUNIT_ASSERT( attrOut.HasFont() );
+
+ fontOut = attrOut.GetFont();
+#ifdef __WXMSW__
+ fontOut.SetEncoding(fontIn.GetEncoding());
+#endif
+ CPPUNIT_ASSERT_EQUAL( fontIn, fontOut );
+}
+
void TextCtrlTestCase::Lines()
{
-#ifndef __WXOSX__
delete m_text;
m_text = new wxTextCtrl(wxTheApp->GetTopWindow(), wxID_ANY, "",
- wxDefaultPosition, wxSize(400, 200), wxTE_MULTILINE | wxTE_DONTWRAP);
+ wxDefaultPosition, wxSize(400, 200), wxTE_MULTILINE);
m_text->SetValue("line1\nline2\nlong long line 3");
m_text->Refresh();
CPPUNIT_ASSERT_EQUAL(5, m_text->GetNumberOfLines());
CPPUNIT_ASSERT_EQUAL(0, m_text->GetLineLength(3));
CPPUNIT_ASSERT_EQUAL("", m_text->GetLineText(3));
+
+ // Verify that wrapped lines count as 2 lines.
+ //
+ // This currently doesn't work neither in wxGTK nor wxOSX/Cocoa, see
+ // #12366, where GetNumberOfLines() always returns the number of logical,
+ // not physical, lines.
+ m_text->AppendText("\n" + wxString(50, '1') + ' ' + wxString(50, '2'));
+#if defined(__WXGTK__) || defined(__WXOSX_COCOA__)
+ CPPUNIT_ASSERT_EQUAL(6, m_text->GetNumberOfLines());
+#else
+ CPPUNIT_ASSERT_EQUAL(7, m_text->GetNumberOfLines());
#endif
}
CPPUNIT_ASSERT(!m_text->IsEmpty());
}
+void TextCtrlTestCase::PositionToCoords()
+{
+ DoPositionToCoordsTestWithStyle(0);
+}
+
+void TextCtrlTestCase::PositionToCoordsRich()
+{
+ DoPositionToCoordsTestWithStyle(wxTE_RICH);
+}
+
+void TextCtrlTestCase::PositionToCoordsRich2()
+{
+ DoPositionToCoordsTestWithStyle(wxTE_RICH2);
+}
+
+void TextCtrlTestCase::DoPositionToCoordsTestWithStyle(long style)
+{
+ static const int TEXT_HEIGHT = 200;
+
+ delete m_text;
+ m_text = new wxTextCtrl(wxTheApp->GetTopWindow(), wxID_ANY, "",
+ wxDefaultPosition, wxSize(400, TEXT_HEIGHT),
+ wxTE_MULTILINE | style);
+
+ // Asking for invalid index should fail.
+ WX_ASSERT_FAILS_WITH_ASSERT( m_text->PositionToCoords(1) );
+
+ // Getting position shouldn't return wxDefaultPosition except if the method
+ // is not implemented at all in the current port.
+ const wxPoint pos0 = m_text->PositionToCoords(0);
+ if ( pos0 == wxDefaultPosition )
+ {
+#if defined(__WXMSW__) || defined(__WXGTK20__)
+ CPPUNIT_FAIL( "PositionToCoords() unexpectedly failed." );
+#endif
+ return;
+ }
+
+ CPPUNIT_ASSERT(pos0.x >= 0);
+ CPPUNIT_ASSERT(pos0.y >= 0);
+
+
+ m_text->SetValue("Hello");
+ wxYield(); // Let GTK layout the control correctly.
+
+ // Position of non-first character should be positive.
+ const long posHello4 = m_text->PositionToCoords(4).x;
+ CPPUNIT_ASSERT( posHello4 > 0 );
+
+ // Asking for position beyond the last character should succeed and return
+ // reasonable result.
+ CPPUNIT_ASSERT( m_text->PositionToCoords(5).x > posHello4 );
+
+ // But asking for the next position should fail.
+ WX_ASSERT_FAILS_WITH_ASSERT( m_text->PositionToCoords(6) );
+
+ // Test getting the coordinates of the last character when it is in the
+ // beginning of a new line to exercise MSW code which has specific logic
+ // for it.
+ m_text->AppendText("\n");
+ const wxPoint posLast = m_text->PositionToCoords(m_text->GetLastPosition());
+ CPPUNIT_ASSERT_EQUAL( pos0.x, posLast.x );
+ CPPUNIT_ASSERT( posLast.y > 0 );
+
+
+ // Add enough contents to the control to make sure it has a scrollbar.
+ m_text->SetValue("First line" + wxString(50, '\n') + "Last line");
+ m_text->SetInsertionPoint(0);
+ wxYield(); // Let GTK layout the control correctly.
+
+ // This shouldn't change anything for the first position coordinates.
+ CPPUNIT_ASSERT_EQUAL( pos0, m_text->PositionToCoords(0) );
+
+ // And the last one must be beyond the window boundary and so not be
+ // visible -- but getting its coordinate should still work.
+ CPPUNIT_ASSERT
+ (
+ m_text->PositionToCoords(m_text->GetLastPosition()).y > TEXT_HEIGHT
+ );
+
+
+ // Now make it scroll to the end and check that the first position now has
+ // negative offset as its above the visible part of the window while the
+ // last position is in its bounds.
+ m_text->SetInsertionPointEnd();
+
+ CPPUNIT_ASSERT( m_text->PositionToCoords(0).y < 0 );
+ CPPUNIT_ASSERT
+ (
+ m_text->PositionToCoords(m_text->GetInsertionPoint()).y <= TEXT_HEIGHT
+ );
+}
+
+
#endif //wxUSE_TEXTCTRL