From 0efe5ba76e45711cad627222905a55c7e04adf9a Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 15 Jul 1999 13:42:27 +0000 Subject: [PATCH] 1. wxTextCtrl compilation fixes for wxGTK and more ugfixes (untested yet) for wxMSW. Small doc update, too. 2. wxFFile compilation fixes for wxGTK 3. new files added to gtk/Makefile.am git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3006 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/text.tex | 4 +- include/wx/gtk/textctrl.h | 8 +-- include/wx/gtk1/textctrl.h | 8 +-- include/wx/msw/textctrl.h | 2 +- include/wx/textctrl.h | 4 +- src/common/ffile.cpp | 2 + src/common/textcmn.cpp | 6 ++ src/gtk/Makefile.am | 2 + src/gtk/textctrl.cpp | 135 +++---------------------------------- src/gtk1/Makefile.am | 2 + src/gtk1/textctrl.cpp | 135 +++---------------------------------- src/msw/textctrl.cpp | 32 +++++++-- 12 files changed, 74 insertions(+), 266 deletions(-) diff --git a/docs/latex/wx/text.tex b/docs/latex/wx/text.tex index d0324945c5..deb52984b4 100644 --- a/docs/latex/wx/text.tex +++ b/docs/latex/wx/text.tex @@ -390,7 +390,7 @@ Pastes text from the clipboard to the text item. \membersection{wxTextCtrl::PositionToXY}\label{wxtextctrlpositiontoxy} -\constfunc{long}{PositionToXY}{\param{long }{pos}, \param{long *}{x}, \param{long *}{y}} +\constfunc{bool}{PositionToXY}{\param{long }{pos}, \param{long *}{x}, \param{long *}{y}} Converts given position to a zero-based column, line number pair. @@ -404,7 +404,7 @@ Converts given position to a zero-based column, line number pair. \wxheading{Return value} -Non-zero on success, zero on failure (most likely due to a too large position +TRUE on success, FALSE on failure (most likely due to a too large position parameter). \wxheading{See also} diff --git a/include/wx/gtk/textctrl.h b/include/wx/gtk/textctrl.h index b480306b08..a12d3ccae2 100644 --- a/include/wx/gtk/textctrl.h +++ b/include/wx/gtk/textctrl.h @@ -62,10 +62,6 @@ public: virtual void Replace(long from, long to, const wxString& value); virtual void Remove(long from, long to); - // load/save the controls contents from/to the file - virtual bool LoadFile(const wxString& file); - virtual bool SaveFile(const wxString& file); - // clears the dirty flag virtual void DiscardEdits(); @@ -78,7 +74,7 @@ public: // considering all its contents as a single strings) and (x, y) coordinates // which represent column and line. virtual long XYToPosition(long x, long y) const; - virtual void PositionToXY(long pos, long *x, long *y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; virtual void ShowPosition(long pos); @@ -132,6 +128,8 @@ public: void ApplyWidgetStyle(); void CalculateScrollbar(); + void SetModified() { m_modified = TRUE; } + private: bool m_modified; GtkWidget *m_text; diff --git a/include/wx/gtk1/textctrl.h b/include/wx/gtk1/textctrl.h index b480306b08..a12d3ccae2 100644 --- a/include/wx/gtk1/textctrl.h +++ b/include/wx/gtk1/textctrl.h @@ -62,10 +62,6 @@ public: virtual void Replace(long from, long to, const wxString& value); virtual void Remove(long from, long to); - // load/save the controls contents from/to the file - virtual bool LoadFile(const wxString& file); - virtual bool SaveFile(const wxString& file); - // clears the dirty flag virtual void DiscardEdits(); @@ -78,7 +74,7 @@ public: // considering all its contents as a single strings) and (x, y) coordinates // which represent column and line. virtual long XYToPosition(long x, long y) const; - virtual void PositionToXY(long pos, long *x, long *y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; virtual void ShowPosition(long pos); @@ -132,6 +128,8 @@ public: void ApplyWidgetStyle(); void CalculateScrollbar(); + void SetModified() { m_modified = TRUE; } + private: bool m_modified; GtkWidget *m_text; diff --git a/include/wx/msw/textctrl.h b/include/wx/msw/textctrl.h index 3e66b4a49e..00675d4c95 100644 --- a/include/wx/msw/textctrl.h +++ b/include/wx/msw/textctrl.h @@ -88,7 +88,7 @@ public: // considering all its contents as a single strings) and (x, y) coordinates // which represent column and line. virtual long XYToPosition(long x, long y) const; - virtual void PositionToXY(long pos, long *x, long *y) const; + virtual bool PositionToXY(long pos, long *x, long *y) const; virtual void ShowPosition(long pos); diff --git a/include/wx/textctrl.h b/include/wx/textctrl.h index 77500f4a5d..ec72f8f377 100644 --- a/include/wx/textctrl.h +++ b/include/wx/textctrl.h @@ -36,6 +36,8 @@ #endif // wxUSE_STD_IOSTREAM/!wxUSE_STD_IOSTREAM #endif +class WXDLLEXPORT wxTextCtrl; + // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- @@ -100,7 +102,7 @@ public: // considering all its contents as a single strings) and (x, y) coordinates // which represent column and line. virtual long XYToPosition(long x, long y) const = 0; - virtual void PositionToXY(long pos, long *x, long *y) const = 0; + virtual bool PositionToXY(long pos, long *x, long *y) const = 0; virtual void ShowPosition(long pos) = 0; diff --git a/src/common/ffile.cpp b/src/common/ffile.cpp index 69d1c04af8..4e1aea21ec 100644 --- a/src/common/ffile.cpp +++ b/src/common/ffile.cpp @@ -31,6 +31,8 @@ #if wxUSE_FILE #ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" #endif #include "wx/ffile.h" diff --git a/src/common/textcmn.cpp b/src/common/textcmn.cpp index 33796a5371..ccaa6e3bfa 100644 --- a/src/common/textcmn.cpp +++ b/src/common/textcmn.cpp @@ -21,6 +21,8 @@ #endif #ifndef WX_PRECOMP + #include "wx/intl.h" + #include "wx/log.h" #include "wx/textctrl.h" #endif // WX_PRECOMP @@ -44,6 +46,10 @@ wxTextCtrlBase::wxTextCtrlBase() { +#ifndef NO_TEXT_WINDOW_STREAM + if (allocate()) + setp(base(),ebuf()); +#endif // NO_TEXT_WINDOW_STREAM } // ---------------------------------------------------------------------------- diff --git a/src/gtk/Makefile.am b/src/gtk/Makefile.am index 596102f8d1..edda346de0 100644 --- a/src/gtk/Makefile.am +++ b/src/gtk/Makefile.am @@ -41,6 +41,7 @@ libwx_gtk_la_SOURCES = \ dynarray.cpp \ dynlib.cpp \ event.cpp \ + ffile.cpp \ file.cpp \ fileconf.cpp \ filefn.cpp \ @@ -88,6 +89,7 @@ libwx_gtk_la_SOURCES = \ string.cpp \ tbarbase.cpp \ tbarsmpl.cpp \ + textcmn.cpp \ textfile.cpp \ txtstrm.cpp \ time.cpp \ diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp index 8e7d38a886..93d3bf216b 100644 --- a/src/gtk/textctrl.cpp +++ b/src/gtk/textctrl.cpp @@ -94,31 +94,11 @@ BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo) END_EVENT_TABLE() -#if wxUSE_STD_IOSTREAM -wxTextCtrl::wxTextCtrl() : streambuf() -{ - if (allocate()) setp(base(),ebuf()); - - m_modified = FALSE; -} -#else wxTextCtrl::wxTextCtrl() { m_modified = FALSE; } -#endif - -#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() -{ - if (allocate()) setp(base(),ebuf()); - m_modified = FALSE; - Create( parent, id, value, pos, size, style, validator, name ); -} -#else wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value, const wxPoint &pos, const wxSize &size, int style, const wxValidator& validator, const wxString &name ) @@ -126,7 +106,6 @@ wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value, m_modified = FALSE; Create( parent, id, value, pos, size, style, validator, name ); } -#endif bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, const wxPoint &pos, const wxSize &size, @@ -438,108 +417,6 @@ void wxTextCtrl::AppendText( const wxString &text ) 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") ); - - if (!wxFileExists(file)) return FALSE; - - Clear(); - - 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)))) - { - fclose (fp); - return FALSE; - } - if (fread (text, sizeof (char), len, fp) != (size_t) len) - { - } - fclose (fp); - - text[len] = 0; - - 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; - } - return FALSE; -} - -bool wxTextCtrl::SaveFile( const wxString &file ) -{ - wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") ); - - if (file == _T("")) return FALSE; - - FILE *fp; - - if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w"))) - { - return FALSE; - } - 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 ); - } - else - { - text = gtk_entry_get_text( GTK_ENTRY(m_text) ); - } - - if (fwrite (text, sizeof (char), len, fp) != (size_t) len) - { - // Did not write whole file - } - - // Make sure newline terminates the file - if (text[len - 1] != '\n') - fputc ('\n', fp); - - fclose (fp); - - if (m_windowStyle & wxTE_MULTILINE) g_free( text ); - - m_modified = FALSE; - return TRUE; - } - - return TRUE; -} - wxString wxTextCtrl::GetLineText( long lineNo ) const { if (m_windowStyle & wxTE_MULTILINE) @@ -580,7 +457,7 @@ void wxTextCtrl::OnDropFiles( wxDropFilesEvent &WXUNUSED(event) ) wxFAIL_MSG( _T("wxTextCtrl::OnDropFiles not implemented") ); } -long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const +bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const { if ( m_windowStyle & wxTE_MULTILINE ) { @@ -727,6 +604,11 @@ void wxTextCtrl::SetEditable( bool editable ) gtk_entry_set_editable( GTK_ENTRY(m_text), editable ); } +void wxTextCtrl::DiscardEdits() +{ + m_modified = FALSE; +} + void wxTextCtrl::SetSelection( long from, long to ) { wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); @@ -913,6 +795,11 @@ bool wxTextCtrl::IsEditable() const return GTK_EDITABLE(m_text)->editable; } +bool wxTextCtrl::IsModified() const +{ + return m_modified; +} + void wxTextCtrl::Clear() { SetValue( _T("") ); diff --git a/src/gtk1/Makefile.am b/src/gtk1/Makefile.am index 596102f8d1..edda346de0 100644 --- a/src/gtk1/Makefile.am +++ b/src/gtk1/Makefile.am @@ -41,6 +41,7 @@ libwx_gtk_la_SOURCES = \ dynarray.cpp \ dynlib.cpp \ event.cpp \ + ffile.cpp \ file.cpp \ fileconf.cpp \ filefn.cpp \ @@ -88,6 +89,7 @@ libwx_gtk_la_SOURCES = \ string.cpp \ tbarbase.cpp \ tbarsmpl.cpp \ + textcmn.cpp \ textfile.cpp \ txtstrm.cpp \ time.cpp \ diff --git a/src/gtk1/textctrl.cpp b/src/gtk1/textctrl.cpp index 8e7d38a886..93d3bf216b 100644 --- a/src/gtk1/textctrl.cpp +++ b/src/gtk1/textctrl.cpp @@ -94,31 +94,11 @@ BEGIN_EVENT_TABLE(wxTextCtrl, wxControl) EVT_UPDATE_UI(wxID_REDO, wxTextCtrl::OnUpdateRedo) END_EVENT_TABLE() -#if wxUSE_STD_IOSTREAM -wxTextCtrl::wxTextCtrl() : streambuf() -{ - if (allocate()) setp(base(),ebuf()); - - m_modified = FALSE; -} -#else wxTextCtrl::wxTextCtrl() { m_modified = FALSE; } -#endif - -#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() -{ - if (allocate()) setp(base(),ebuf()); - m_modified = FALSE; - Create( parent, id, value, pos, size, style, validator, name ); -} -#else wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value, const wxPoint &pos, const wxSize &size, int style, const wxValidator& validator, const wxString &name ) @@ -126,7 +106,6 @@ wxTextCtrl::wxTextCtrl( wxWindow *parent, wxWindowID id, const wxString &value, m_modified = FALSE; Create( parent, id, value, pos, size, style, validator, name ); } -#endif bool wxTextCtrl::Create( wxWindow *parent, wxWindowID id, const wxString &value, const wxPoint &pos, const wxSize &size, @@ -438,108 +417,6 @@ void wxTextCtrl::AppendText( const wxString &text ) 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") ); - - if (!wxFileExists(file)) return FALSE; - - Clear(); - - 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)))) - { - fclose (fp); - return FALSE; - } - if (fread (text, sizeof (char), len, fp) != (size_t) len) - { - } - fclose (fp); - - text[len] = 0; - - 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; - } - return FALSE; -} - -bool wxTextCtrl::SaveFile( const wxString &file ) -{ - wxCHECK_MSG( m_text != NULL, FALSE, _T("invalid text ctrl") ); - - if (file == _T("")) return FALSE; - - FILE *fp; - - if (!(fp = fopen (FNSTRINGCAST file.fn_str(), "w"))) - { - return FALSE; - } - 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 ); - } - else - { - text = gtk_entry_get_text( GTK_ENTRY(m_text) ); - } - - if (fwrite (text, sizeof (char), len, fp) != (size_t) len) - { - // Did not write whole file - } - - // Make sure newline terminates the file - if (text[len - 1] != '\n') - fputc ('\n', fp); - - fclose (fp); - - if (m_windowStyle & wxTE_MULTILINE) g_free( text ); - - m_modified = FALSE; - return TRUE; - } - - return TRUE; -} - wxString wxTextCtrl::GetLineText( long lineNo ) const { if (m_windowStyle & wxTE_MULTILINE) @@ -580,7 +457,7 @@ void wxTextCtrl::OnDropFiles( wxDropFilesEvent &WXUNUSED(event) ) wxFAIL_MSG( _T("wxTextCtrl::OnDropFiles not implemented") ); } -long wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const +bool wxTextCtrl::PositionToXY(long pos, long *x, long *y ) const { if ( m_windowStyle & wxTE_MULTILINE ) { @@ -727,6 +604,11 @@ void wxTextCtrl::SetEditable( bool editable ) gtk_entry_set_editable( GTK_ENTRY(m_text), editable ); } +void wxTextCtrl::DiscardEdits() +{ + m_modified = FALSE; +} + void wxTextCtrl::SetSelection( long from, long to ) { wxCHECK_RET( m_text != NULL, _T("invalid text ctrl") ); @@ -913,6 +795,11 @@ bool wxTextCtrl::IsEditable() const return GTK_EDITABLE(m_text)->editable; } +bool wxTextCtrl::IsModified() const +{ + return m_modified; +} + void wxTextCtrl::Clear() { SetValue( _T("") ); diff --git a/src/msw/textctrl.cpp b/src/msw/textctrl.cpp index 0a3471b403..55e3e77492 100644 --- a/src/msw/textctrl.cpp +++ b/src/msw/textctrl.cpp @@ -603,17 +603,41 @@ long wxTextCtrl::XYToPosition(long x, long y) const return (long)(x + charIndex); } -void wxTextCtrl::PositionToXY(long pos, long *x, long *y) const +bool wxTextCtrl::PositionToXY(long pos, long *x, long *y) const { HWND hWnd = GetHwnd(); // This gets the line number containing the character - int lineNo = (int)SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)pos, (LPARAM)0); + int lineNo; +#if wxUSE_RICHEDIT + if ( m_isRich ) + { + lineNo = (int)SendMessage(hWnd, EM_EXLINEFROMCHAR, 0, (LPARAM)pos); + } + else +#endif // wxUSE_RICHEDIT + lineNo = (int)SendMessage(hWnd, EM_LINEFROMCHAR, (WPARAM)pos, 0); + + if ( lineNo == -1 ) + { + // no such line + return FALSE; + } + // This gets the char index for the _beginning_ of this line int charIndex = (int)SendMessage(hWnd, EM_LINEINDEX, (WPARAM)lineNo, (LPARAM)0); + if ( charIndex == -1 ) + { + return FALSE; + } + // The X position must therefore be the different between pos and charIndex - *x = (long)(pos - charIndex); - *y = (long)lineNo; + if ( x ) + *x = (long)(pos - charIndex); + if ( y ) + *y = (long)lineNo; + + return TRUE; } void wxTextCtrl::ShowPosition(long pos) -- 2.45.2