+ if ( IsMultiLine() )
+ {
+ 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
+ {
+ wxString str = GetLineText (lineNo);
+ return (int) str.length();
+ }
+}
+
+wxPoint wxTextCtrl::DoPositionToCoords(long pos) const
+{
+ if ( !IsMultiLine() )
+ {
+ // Single line text entry (GtkTextEntry) doesn't have support for
+ // getting the coordinates for the given offset. Perhaps we could
+ // find them ourselves by using GetTextExtent() but for now just leave
+ // it unimplemented, this function is more useful for multiline
+ // controls anyhow.
+ return wxDefaultPosition;
+ }
+
+ // Window coordinates for the given position is calculated by getting
+ // the buffer coordinates and converting them to window coordinates.
+ GtkTextView *textview = GTK_TEXT_VIEW(m_text);
+
+ GtkTextIter iter;
+ gtk_text_buffer_get_iter_at_offset(m_buffer, &iter, pos);
+
+ GdkRectangle bufferCoords;
+ gtk_text_view_get_iter_location(textview, &iter, &bufferCoords);
+
+ gint winCoordX = 0,
+ winCoordY = 0;
+ gtk_text_view_buffer_to_window_coords(textview, GTK_TEXT_WINDOW_WIDGET,
+ bufferCoords.x, bufferCoords.y,
+ &winCoordX, &winCoordY);
+
+ return wxPoint(winCoordX, winCoordY);