X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/41e2aad5302a826e6f30a97481ee448965e2ebf5..58e8013e8217e36a4bdf38e6dbad3b21edf61af6:/src/gtk/textctrl.cpp diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 40c89ee562..558d9064e5 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -647,7 +647,8 @@ void wxTextCtrl::Init() SetUpdateFont(false); m_text = NULL; - m_frozenness = 0; + m_freezeCount = 0; + m_showPositionOnThaw = NULL; m_gdkHandCursor = NULL; m_gdkXTermCursor = NULL; } @@ -702,6 +703,11 @@ bool wxTextCtrl::Create( wxWindow *parent, m_buffer = gtk_text_view_get_buffer( GTK_TEXT_VIEW(m_text) ); + // create "ShowPosition" marker + GtkTextIter iter; + gtk_text_buffer_get_start_iter(m_buffer, &iter); + gtk_text_buffer_create_mark(m_buffer, "ShowPosition", &iter, true); + // create scrolled window m_widget = gtk_scrolled_window_new( NULL, NULL ); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( m_widget ), @@ -1225,15 +1231,12 @@ void wxTextCtrl::SetInsertionPoint( long pos ) GtkTextIter iter; gtk_text_buffer_get_iter_at_offset( m_buffer, &iter, pos ); gtk_text_buffer_place_cursor( m_buffer, &iter ); - if (!IsFrozen()) - { - // won't work when frozen, text view is not using m_buffer then - gtk_text_view_scroll_mark_onscreen - ( - GTK_TEXT_VIEW(m_text), - gtk_text_buffer_get_insert( m_buffer ) - ); - } + GtkTextMark* mark = gtk_text_buffer_get_insert(m_buffer); + if (IsFrozen()) + // defer until Thaw, text view is not using m_buffer now + m_showPositionOnThaw = mark; + else + gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(m_text), mark); } else { @@ -1244,18 +1247,7 @@ void wxTextCtrl::SetInsertionPoint( long pos ) void wxTextCtrl::SetInsertionPointEnd() { - wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); - - if ( IsMultiLine() ) - { - GtkTextIter end; - gtk_text_buffer_get_end_iter( m_buffer, &end ); - gtk_text_buffer_place_cursor( m_buffer, &end ); - } - else - { - gtk_editable_set_position( GTK_EDITABLE(m_text), -1 ); - } + SetInsertionPoint(-1); } void wxTextCtrl::SetEditable( bool editable ) @@ -1405,14 +1397,17 @@ void wxTextCtrl::SetSelection( long from, long to ) void wxTextCtrl::ShowPosition( long pos ) { - // won't work when frozen, text view is not using m_buffer then - if (IsMultiLine() && !IsFrozen()) + if (IsMultiLine()) { GtkTextIter iter; - gtk_text_buffer_get_start_iter( m_buffer, &iter ); - gtk_text_iter_set_offset( &iter, pos ); - GtkTextMark *mark = gtk_text_buffer_create_mark( m_buffer, NULL, &iter, TRUE ); - gtk_text_view_scroll_to_mark( GTK_TEXT_VIEW(m_text), mark, 0.0, FALSE, 0.0, 0.0 ); + gtk_text_buffer_get_iter_at_offset(m_buffer, &iter, int(pos)); + GtkTextMark* mark = gtk_text_buffer_get_mark(m_buffer, "ShowPosition"); + gtk_text_buffer_move_mark(m_buffer, mark, &iter); + if (IsFrozen()) + // defer until Thaw, text view is not using m_buffer now + m_showPositionOnThaw = mark; + else + gtk_text_view_scroll_mark_onscreen(GTK_TEXT_VIEW(m_text), mark); } } @@ -1879,7 +1874,7 @@ void wxTextCtrl::Freeze() if ( HasFlag(wxTE_MULTILINE) ) { - if (m_frozenness++ == 0) + if (m_freezeCount++ == 0) { // freeze textview updates and remove buffer g_signal_connect (m_text, "expose_event", @@ -1907,9 +1902,9 @@ void wxTextCtrl::Thaw() { if ( HasFlag(wxTE_MULTILINE) ) { - wxCHECK_RET(m_frozenness != 0, _T("Thaw() without matching Freeze()")); + wxCHECK_RET(m_freezeCount != 0, _T("Thaw() without matching Freeze()")); - if (--m_frozenness == 0) + if (--m_freezeCount == 0) { // Reattach buffer and thaw textview updates gtk_text_view_set_buffer(GTK_TEXT_VIEW(m_text), m_buffer); @@ -1919,6 +1914,12 @@ void wxTextCtrl::Thaw() (gpointer) gtk_text_exposed_callback, this); g_signal_handlers_disconnect_by_func (m_text, (gpointer) gtk_text_exposed_callback, this); + if (m_showPositionOnThaw != NULL) + { + gtk_text_view_scroll_mark_onscreen( + GTK_TEXT_VIEW(m_text), m_showPositionOnThaw); + m_showPositionOnThaw = NULL; + } } } }