\wxheading{Remarks}
Note that even empty text controls have one line (where the insertion point
-is), so GetNumberOfLines() never returns 0.
+is), so GetNumberOfLines() never returns $0$.
-For gtk\_text (multi-line) controls, the number of lines is
-calculated by actually counting newline characters in the buffer. You
-may wish to avoid using functions that work with line numbers if you are
-working with controls that contain large amounts of text.
+For wxGTK using GTK+ 1.2.x and earlier, the number of lines in a multi-line
+text control is calculated by actually counting newline characters in the
+buffer, i.e. this function returns the number of logical lines and doesn't
+depend on whether any of them are wrapped. For all the other platforms, the
+number of physical lines in the control is returned.
+
+Also note that you may wish to avoid using functions that work with line
+numbers if you are working with controls that contain large amounts of text as
+this function has $O(N)$ complexity for $N$ being the number of lines.
\membersection{wxTextCtrl::GetRange}\label{wxtextctrlgetrange}
int wxTextCtrl::GetNumberOfLines() const
{
- if (m_windowStyle & wxTE_MULTILINE)
- return gtk_text_buffer_get_line_count( m_buffer );
- else
+ if ( m_windowStyle & wxTE_MULTILINE )
+ {
+ GtkTextIter iter;
+ gtk_text_buffer_get_iter_at_offset( m_buffer, &iter, 0 );
+
+ // move forward by one display line until the end is reached
+ int lineCount = 1;
+ while ( gtk_text_view_forward_display_line(GTK_TEXT_VIEW(m_text), &iter) )
+ {
+ lineCount++;
+ }
+
+ // If the last character in the text buffer is a newline,
+ // gtk_text_view_forward_display_line() will return false without that
+ // line being counted. Must add one manually in that case.
+ GtkTextIter lastCharIter;
+ gtk_text_buffer_get_iter_at_offset
+ (
+ m_buffer,
+ &lastCharIter,
+ gtk_text_buffer_get_char_count(m_buffer) - 1
+ );
+ gchar lastChar = gtk_text_iter_get_char( &lastCharIter );
+ if ( lastChar == wxT('\n') )
+ lineCount++;
+
+ return lineCount;
+ }
+ else // single line
+ {
return 1;
+ }
}
void wxTextCtrl::SetInsertionPoint( long pos )