X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/781acf8347ceb598bf83572274a303243746482e..6643c354c5850da70a99af38f56ab08c296b7d64:/src/gtk/textctrl.cpp diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 9211dde77c..4417e2c99c 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -17,10 +17,10 @@ #include "wx/log.h" #include "wx/utils.h" #include "wx/panel.h" + #include "wx/settings.h" #endif #include "wx/math.h" -#include "wx/settings.h" #include "wx/strconv.h" #include "wx/fontutil.h" // for wxNativeFontInfo (GetNativeFontInfo()) @@ -454,7 +454,8 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win ) if (g_isIdle) wxapp_install_idle_handler(); - win->MarkDirty(); + if ( win->MarkDirtyOnChange() ) + win->MarkDirty(); wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() ); event.SetEventObject( win ); @@ -469,7 +470,7 @@ gtk_text_changed_callback( GtkWidget *widget, wxTextCtrl *win ) // common part of the event handlers below static void handle_text_clipboard_callback( GtkWidget *widget, wxTextCtrl *win, - wxEventType eventType, const gchar * signal_name) + wxEventType eventType, const gchar * signal_name) { wxClipboardTextEvent event( eventType, win->GetId() ); event.SetEventObject( win ); @@ -477,7 +478,7 @@ handle_text_clipboard_callback( GtkWidget *widget, wxTextCtrl *win, { // don't let the default processing to take place if we did something // ourselves in the event handler - g_signal_stop_emission_by_name (widget, signal_name); + g_signal_stop_emission_by_name (widget, signal_name); } } @@ -485,22 +486,22 @@ extern "C" { static void gtk_copy_clipboard_callback( GtkWidget *widget, wxTextCtrl *win ) { - handle_text_clipboard_callback( - widget, win, wxEVT_COMMAND_TEXT_COPY, "copy-clipboard" ); + handle_text_clipboard_callback( + widget, win, wxEVT_COMMAND_TEXT_COPY, "copy-clipboard" ); } static void gtk_cut_clipboard_callback( GtkWidget *widget, wxTextCtrl *win ) { - handle_text_clipboard_callback( - widget, win, wxEVT_COMMAND_TEXT_CUT, "cut-clipboard" ); + handle_text_clipboard_callback( + widget, win, wxEVT_COMMAND_TEXT_CUT, "cut-clipboard" ); } static void gtk_paste_clipboard_callback( GtkWidget *widget, wxTextCtrl *win ) { - handle_text_clipboard_callback( - widget, win, wxEVT_COMMAND_TEXT_PASTE, "paste-clipboard" ); + handle_text_clipboard_callback( + widget, win, wxEVT_COMMAND_TEXT_PASTE, "paste-clipboard" ); } } @@ -551,9 +552,12 @@ END_EVENT_TABLE() void wxTextCtrl::Init() { + m_dontMarkDirty = m_ignoreNextUpdate = m_modified = false; + SetUpdateFont(false); + m_text = NULL; m_frozenness = 0; m_gdkHandCursor = NULL; @@ -614,6 +618,8 @@ bool wxTextCtrl::Create( wxWindow *parent, m_widget = gtk_scrolled_window_new( NULL, NULL ); gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( m_widget ), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC ); + // for ScrollLines/Pages + m_scrollBar[1] = (GtkRange*)((GtkScrolledWindow*)m_widget)->vscrollbar; // Insert view into scrolled window gtk_container_add( GTK_CONTAINER(m_widget), m_text ); @@ -666,7 +672,6 @@ bool wxTextCtrl::Create( wxWindow *parent, if (multi_line) { gtk_widget_show(m_text); - SetVScrollAdjustment(gtk_scrolled_window_get_vadjustment((GtkScrolledWindow*)m_widget)); } if (!value.empty()) @@ -812,6 +817,13 @@ void wxTextCtrl::SetValue( const wxString &value ) { wxCHECK_RET( m_text != NULL, wxT("invalid text ctrl") ); + // the control won't be modified any more as we programmatically replace + // all the existing text, so reset the flag and don't set it again (and do + // it now, before the text event handler is ran so that IsModified() called + // from there returns the expected value) + m_modified = false; + DontMarkDirtyOnNextChange(); + if (m_windowStyle & wxTE_MULTILINE) { const wxCharBuffer buffer(wxGTK_CONV(value)); @@ -840,8 +852,6 @@ void wxTextCtrl::SetValue( const wxString &value ) // the lists. wxWidgets 2.2 will have a set of flags to // customize this behaviour. SetInsertionPoint(0); - - m_modified = false; } void wxTextCtrl::WriteText( const wxString &text ) @@ -858,10 +868,8 @@ void wxTextCtrl::WriteText( const wxString &text ) return; } - // gtk_text_changed_callback() will set m_modified to true but m_modified - // shouldn't be changed by the program writing to the text control itself, - // so save the old value and restore when we're done - bool oldModified = m_modified; + // we're changing the text programmatically + DontMarkDirtyOnNextChange(); if ( m_windowStyle & wxTE_MULTILINE ) { @@ -896,8 +904,6 @@ void wxTextCtrl::WriteText( const wxString &text ) // Bring entry's cursor uptodate. gtk_editable_set_position( GTK_EDITABLE(m_text), len ); } - - m_modified = oldModified; } void wxTextCtrl::AppendText( const wxString &text ) @@ -1139,11 +1145,6 @@ void wxTextCtrl::DiscardEdits() // max text length support // ---------------------------------------------------------------------------- -void wxTextCtrl::IgnoreNextTextUpdate() -{ - m_ignoreNextUpdate = true; -} - bool wxTextCtrl::IgnoreTextUpdate() { if ( m_ignoreNextUpdate ) @@ -1156,6 +1157,18 @@ bool wxTextCtrl::IgnoreTextUpdate() return false; } +bool wxTextCtrl::MarkDirtyOnChange() +{ + if ( m_dontMarkDirty ) + { + m_dontMarkDirty = false; + + return false; + } + + return true; +} + void wxTextCtrl::SetMaxLength(unsigned long len) { if ( !HasFlag(wxTE_MULTILINE) )