GetNumberOfLines() now returns the number of physical, not logical, lines in the control in wxGTK2 as under the other platforms (patch 1438117)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@38015 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-03-12 12:46:58 +00:00
parent c01359d9d5
commit e894be201b
2 changed files with 41 additions and 8 deletions

View File

@@ -731,12 +731,17 @@ Returns the number of lines in the text control buffer.
\wxheading{Remarks} \wxheading{Remarks}
Note that even empty text controls have one line (where the insertion point 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 For wxGTK using GTK+ 1.2.x and earlier, the number of lines in a multi-line
calculated by actually counting newline characters in the buffer. You text control is calculated by actually counting newline characters in the
may wish to avoid using functions that work with line numbers if you are buffer, i.e. this function returns the number of logical lines and doesn't
working with controls that contain large amounts of text. 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} \membersection{wxTextCtrl::GetRange}\label{wxtextctrlgetrange}

View File

@@ -947,10 +947,38 @@ int wxTextCtrl::GetLineLength(long lineNo) const
int wxTextCtrl::GetNumberOfLines() const int wxTextCtrl::GetNumberOfLines() const
{ {
if (m_windowStyle & wxTE_MULTILINE) if ( m_windowStyle & wxTE_MULTILINE )
return gtk_text_buffer_get_line_count( m_buffer ); {
else 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; return 1;
}
} }
void wxTextCtrl::SetInsertionPoint( long pos ) void wxTextCtrl::SetInsertionPoint( long pos )