[wxGTK2] multiline wxTextCtrl: Implement XYToPosition, PositionToXY and GetLineLength natively, making them not take

an eternity per call. Also closes bug #1250464. Not sure if this should go into changes.txt.


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@35060 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Mart Raudsepp
2005-08-03 13:14:36 +00:00
parent cdc0140021
commit f29a481a66
2 changed files with 68 additions and 4 deletions

View File

@@ -1117,6 +1117,15 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
{
if ( m_windowStyle & wxTE_MULTILINE )
{
#ifdef __WXGTK20__
GtkTextIter iter;
gtk_text_buffer_get_iter_at_offset(m_buffer, &iter, pos);
if (gtk_text_iter_is_end(&iter))
return false;
*y = gtk_text_iter_get_line(&iter);
*x = gtk_text_iter_get_line_offset(&iter);
#else
wxString text = GetValue();
// cast to prevent warning. But pos really should've been unsigned.
@@ -1137,6 +1146,7 @@ bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const
else
(*x)++;
}
#endif
}
else // single line control
{
@@ -1159,17 +1169,39 @@ long wxTextCtrl::XYToPosition(long x, long y ) const
{
if (!(m_windowStyle & wxTE_MULTILINE)) return 0;
#ifdef __WXGTK20__
GtkTextIter iter;
gtk_text_buffer_get_iter_at_line_offset(m_buffer, &iter, y, x);
return gtk_text_iter_get_offset(&iter);
#else
long pos=0;
for( int i=0; i<y; i++ ) pos += GetLineLength(i) + 1; // one for '\n'
pos += x;
return pos;
#endif
}
int wxTextCtrl::GetLineLength(long lineNo) const
{
wxString str = GetLineText (lineNo);
return (int) str.Length();
#ifdef __WXGTK20__
if (m_windowStyle & wxTE_MULTILINE)
{
int last_line = gtk_text_buffer_get_line_count( m_buffer ) - 1;
if (lineNo > last_line)
return -1;
GtkTextIter iter;
gtk_text_buffer_get_iter_at_line(m_buffer, &iter, lineNo);
// get_chars_in_line return includes paragraph delimiters, so need to subtract 1 IF it is not the last line
return gtk_text_iter_get_chars_in_line(&iter) - ((lineNo == last_line) ? 0 : 1);
}
else
#endif
{
wxString str = GetLineText (lineNo);
return (int) str.Length();
}
}
int wxTextCtrl::GetNumberOfLines() const