X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cfb50f14ecc87d39319a3f23ddbae938e7858c33..a533f5c122c27b44a80b4eef2bd907a44bec8b70:/src/gtk1/textctrl.cpp diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 3640c7dfcc..7e283a82d9 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -44,10 +44,11 @@ extern bool g_blockEventsOnDrag; static void gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) { - if (g_isIdle) wxapp_install_idle_handler(); - if (!win->m_hasVMT) return; + if (g_isIdle) + wxapp_install_idle_handler(); + win->SetModified(); wxCommandEvent event( wxEVT_COMMAND_TEXT_UPDATED, win->GetId() ); @@ -63,11 +64,12 @@ gtk_text_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) static void gtk_scrollbar_changed_callback( GtkWidget *WXUNUSED(widget), wxTextCtrl *win ) { - if (g_isIdle) wxapp_install_idle_handler(); + if (!win->m_hasVMT) return; + + if (g_isIdle) + wxapp_install_idle_handler(); win->CalculateScrollbar(); - - if (!win->m_hasVMT) return; } //----------------------------------------------------------------------------- @@ -92,7 +94,7 @@ BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo) END_EVENT_TABLE() -#ifndef NO_TEXT_WINDOW_STREAM +#if wxUSE_STD_IOSTREAM wxTextCtrl::wxTextCtrl() : streambuf() { if (allocate()) setp(base(),ebuf()); @@ -106,7 +108,7 @@ wxTextCtrl::wxTextCtrl() } #endif -#ifndef NO_TEXT_WINDOW_STREAM +#if wxUSE_STD_IOSTREAM wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value, const wxPoint &pos, const wxSize &size, int style, const wxValidator& validator, const wxString &name ) : streambuf() @@ -135,7 +137,9 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, PreCreation( parent, id, pos, size, style, name ); +#if wxUSE_VALIDATORS SetValidator( validator ); +#endif // wxUSE_VALIDATORS m_vScrollbarVisible = FALSE; @@ -156,16 +160,17 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK), (GtkAttachOptions)(GTK_FILL | GTK_EXPAND | GTK_SHRINK), 0, 0); - + /* always wrap words */ gtk_text_set_word_wrap( GTK_TEXT(m_text), TRUE ); + /* put the horizontal scrollbar in the lower left hand corner */ if (bHasHScrollbar) { GtkWidget *hscrollbar = gtk_hscrollbar_new(GTK_TEXT(m_text)->hadj); GTK_WIDGET_UNSET_FLAGS( hscrollbar, GTK_CAN_FOCUS ); gtk_table_attach(GTK_TABLE(m_widget), hscrollbar, 0, 1, 1, 2, - (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), + (GtkAttachOptions)(GTK_EXPAND | GTK_FILL | GTK_SHRINK), GTK_FILL, 0, 0); gtk_widget_show(hscrollbar); @@ -175,6 +180,7 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, gtk_text_set_line_wrap( GTK_TEXT(m_text), FALSE ); #endif } + /* finally, put the vertical scrollbar in the upper right corner */ m_vScrollbar = gtk_vscrollbar_new( GTK_TEXT(m_text)->vadj ); GTK_WIDGET_UNSET_FLAGS( m_vScrollbar, GTK_CAN_FOCUS ); @@ -254,7 +260,7 @@ bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, gtk_text_set_editable( GTK_TEXT(m_text), 1 ); } - SetBackgroundColour( parent->GetBackgroundColour() ); + SetBackgroundColour( wxSystemSettings::GetSystemColour(wxSYS_COLOUR_WINDOW) ); SetForegroundColour( parent->GetForegroundColour() ); Show( TRUE ); @@ -273,7 +279,6 @@ void wxTextCtrl::CalculateScrollbar() if (m_vScrollbarVisible) { gtk_widget_hide( m_vScrollbar ); - m_vScrollbarVisible = FALSE; } } @@ -282,7 +287,6 @@ void wxTextCtrl::CalculateScrollbar() if (!m_vScrollbarVisible) { gtk_widget_show( m_vScrollbar ); - m_vScrollbarVisible = TRUE; } } @@ -297,12 +301,12 @@ wxString wxTextCtrl::GetValue() const { gint len = gtk_text_get_length( GTK_TEXT(m_text) ); char *text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); - tmp = wxString(text,*wxConv_current); + tmp = wxString(text,*wxConvCurrent); g_free( text ); } else { - tmp = wxString(gtk_entry_get_text( GTK_ENTRY(m_text) ),*wxConv_current); + tmp = wxString(gtk_entry_get_text( GTK_ENTRY(m_text) ),*wxConvCurrent); } return tmp; } @@ -341,8 +345,11 @@ void wxTextCtrl::WriteText( const wxString &text ) { wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); - if (text.IsNull()) return; + if (text.IsEmpty()) return; + gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + if (m_windowStyle & wxTE_MULTILINE) { /* this moves the cursor pos to behind the inserted text */ @@ -375,12 +382,20 @@ void wxTextCtrl::WriteText( const wxString &text ) /* bring entry's cursor uptodate. bug in GTK. */ gtk_entry_set_position( GTK_ENTRY(m_text), GTK_EDITABLE(m_text)->current_pos ); } + + gtk_signal_connect( GTK_OBJECT(m_text), "changed", + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); } void wxTextCtrl::AppendText( const wxString &text ) { wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); + if (text.IsEmpty()) return; + + gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + if (m_windowStyle & wxTE_MULTILINE) { /* we'll insert at the last position */ @@ -399,82 +414,91 @@ void wxTextCtrl::AppendText( const wxString &text ) { gtk_entry_append_text( GTK_ENTRY(m_text), text.mbc_str() ); } + + gtk_signal_connect( GTK_OBJECT(m_text), "changed", + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); } bool wxTextCtrl::LoadFile( const wxString &file ) { - wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") ); + wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") ); - if (!wxFileExists(file)) return FALSE; + if (!wxFileExists(file)) return FALSE; - Clear(); + Clear(); - FILE *fp = (FILE*) NULL; - struct stat statb; + FILE *fp = (FILE*) NULL; + struct stat statb; - if ((stat (FNSTRINGCAST file.fn_str(), &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG || - !(fp = fopen (FNSTRINGCAST file.fn_str(), "r"))) - { - return FALSE; - } - else - { - gint len = statb.st_size; - char *text; - if (!(text = (char*)malloc ((unsigned) (len + 1)))) + if ((stat (FNSTRINGCAST file.fn_str(), &statb) == -1) || (statb.st_mode & S_IFMT) != S_IFREG || + !(fp = fopen (FNSTRINGCAST file.fn_str(), "r"))) { - fclose (fp); - return FALSE; + return FALSE; } - if (fread (text, sizeof (char), len, fp) != (size_t) len) + else { - } - fclose (fp); + gint len = statb.st_size; + char *text; + if (!(text = (char*)malloc ((unsigned) (len + 1)))) + { + fclose (fp); + return FALSE; + } + if (fread (text, sizeof (char), len, fp) != (size_t) len) + { + } + fclose (fp); - text[len] = 0; + text[len] = 0; - if (m_windowStyle & wxTE_MULTILINE) - { - gint pos = 0; - gtk_editable_insert_text( GTK_EDITABLE(m_text), text, len, &pos ); - } - else - { - gtk_entry_set_text( GTK_ENTRY(m_text), text ); + gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + + if (m_windowStyle & wxTE_MULTILINE) + { + gint pos = 0; + gtk_editable_insert_text( GTK_EDITABLE(m_text), text, len, &pos ); + } + else + { + gtk_entry_set_text( GTK_ENTRY(m_text), text ); + } + + gtk_signal_connect( GTK_OBJECT(m_text), "changed", + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + + free (text); + m_modified = FALSE; + return TRUE; } - - free (text); - m_modified = FALSE; - return TRUE; - } - return FALSE; + return FALSE; } bool wxTextCtrl::SaveFile( const wxString &file ) { - wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") ); + wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") ); - if (file == _T("")) return FALSE; + if (file == _T("")) return FALSE; - FILE *fp; + FILE *fp; - if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w"))) + if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w"))) { - return FALSE; + return FALSE; } - else + else { char *text = (char*) NULL; gint len = 0; if (m_windowStyle & wxTE_MULTILINE) { - len = gtk_text_get_length( GTK_TEXT(m_text) ); - text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); + len = gtk_text_get_length( GTK_TEXT(m_text) ); + text = gtk_editable_get_chars( GTK_EDITABLE(m_text), 0, len ); } else { - text = gtk_entry_get_text( GTK_ENTRY(m_text) ); + text = gtk_entry_get_text( GTK_ENTRY(m_text) ); } if (fwrite (text, sizeof (char), len, fp) != (size_t) len) @@ -494,7 +518,7 @@ bool wxTextCtrl::SaveFile( const wxString &file ) return TRUE; } - return TRUE; + return TRUE; } wxString wxTextCtrl::GetLineText( long lineNo ) const @@ -693,7 +717,7 @@ void wxTextCtrl::SetSelection( long from, long to ) void wxTextCtrl::ShowPosition( long WXUNUSED(pos) ) { - wxFAIL_MSG( _T("wxTextCtrl::ShowPosition not implemented") ); +// SetInsertionPoint( pos ); } long wxTextCtrl::GetInsertionPoint() const @@ -720,33 +744,54 @@ void wxTextCtrl::Remove( long from, long to ) { wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); + gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); + + gtk_signal_connect( GTK_OBJECT(m_text), "changed", + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); } void wxTextCtrl::Replace( long from, long to, const wxString &value ) { wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); + gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + gtk_editable_delete_text( GTK_EDITABLE(m_text), (gint)from, (gint)to ); - if (value.IsNull()) return; - gint pos = (gint)from; + + if (!value.IsEmpty()) + { + gint pos = (gint)from; #if wxUSE_UNICODE - wxWX2MBbuf buf = value.mbc_str(); - gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &pos ); + wxWX2MBbuf buf = value.mbc_str(); + gtk_editable_insert_text( GTK_EDITABLE(m_text), buf, strlen(buf), &pos ); #else - gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos ); + gtk_editable_insert_text( GTK_EDITABLE(m_text), value, value.Length(), &pos ); #endif + } + + gtk_signal_connect( GTK_OBJECT(m_text), "changed", + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); } void wxTextCtrl::Cut() { wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); + gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + #if (GTK_MINOR_VERSION > 0) gtk_editable_cut_clipboard( GTK_EDITABLE(m_text) ); #else gtk_editable_cut_clipboard( GTK_EDITABLE(m_text), 0 ); #endif + + gtk_signal_connect( GTK_OBJECT(m_text), "changed", + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); } void wxTextCtrl::Copy() @@ -764,11 +809,17 @@ void wxTextCtrl::Paste() { wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); + gtk_signal_disconnect_by_func( GTK_OBJECT(m_text), + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); + #if (GTK_MINOR_VERSION > 0) gtk_editable_paste_clipboard( GTK_EDITABLE(m_text) ); #else gtk_editable_paste_clipboard( GTK_EDITABLE(m_text), 0 ); #endif + + gtk_signal_connect( GTK_OBJECT(m_text), "changed", + GTK_SIGNAL_FUNC(gtk_text_changed_callback), (gpointer)this); } bool wxTextCtrl::CanCopy() const @@ -823,17 +874,24 @@ bool wxTextCtrl::CanRedo() const // selection. void wxTextCtrl::GetSelection(long* from, long* to) const { - // TODO - *from = 0; - *to = 0; - wxFAIL_MSG( _T("wxTextCtrl::GetSelection not implemented") ); + wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); + + if (!(GTK_EDITABLE(m_text)->has_selection)) + { + if (from) *from = 0; + if (to) *to = 0; + return; + } + + if (from) *from = (long) GTK_EDITABLE(m_text)->selection_start_pos; + if (to) *to = (long) GTK_EDITABLE(m_text)->selection_end_pos; } bool wxTextCtrl::IsEditable() const { - // TODO - wxFAIL_MSG( _T("wxTextCtrl::IsEditable not implemented") ); - return FALSE; + wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") ); + + return GTK_EDITABLE(m_text)->editable; } void wxTextCtrl::Clear() @@ -855,7 +913,7 @@ void wxTextCtrl::OnChar( wxKeyEvent &key_event ) key_event.Skip(); } -#ifndef NO_TEXT_WINDOW_STREAM +#if wxUSE_STD_IOSTREAM int wxTextCtrl::overflow( int WXUNUSED(c) ) { int len = pptr() - pbase(); @@ -884,6 +942,7 @@ int wxTextCtrl::underflow() { return EOF; } +#endif wxTextCtrl& wxTextCtrl::operator<<(const wxString& s) { @@ -932,7 +991,6 @@ wxTextCtrl& wxTextCtrl::operator<<(const char c) AppendText(buf); return *this; } -#endif GtkWidget* wxTextCtrl::GetConnectWidget() {