From 3396739da180ef3f8d006f11f8a13a9e0df7d88d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 26 Sep 2009 13:26:16 +0000 Subject: [PATCH] Refactor wxStyledTextCtrl to share common file save/load code. Keep the code for saving and loading text contents from files in a single place instead of doing it differently in wxTextCtrl and wxStyledTextCtrl. This required adding Set/GetValue() methods to wxTextAreaBase just so that its DoLoad/SaveFile() could use them, even if they are the same as wxTextEntryBase methods and are overridden in wxTextCtrlBase to be implemented in terms of the latter. Notice that wxRichTextCtrl might need to be refactored to use this code too in the future. Also notice that this reverts the change of r62081 which replaced SetValue() with ChangeValue() in DoLoadFile() as wxTextAreaBase only has SetValue() and it's not worth adding ChangeValue() to it too just to preserve this recent change in behaviour. Closes #10715. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62139 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/stc/stc.h | 9 +++-- include/wx/textctrl.h | 26 +++++++++++- src/common/textcmn.cpp | 40 ++++++++++++------- src/stc/stc.cpp | 89 +++++++++++++++++------------------------- src/stc/stc.cpp.in | 89 +++++++++++++++++------------------------- src/stc/stc.h.in | 9 +++-- 6 files changed, 131 insertions(+), 131 deletions(-) diff --git a/include/wx/stc/stc.h b/include/wx/stc/stc.h index 2d1386c142..af29838e63 100644 --- a/include/wx/stc/stc.h +++ b/include/wx/stc/stc.h @@ -1985,11 +1985,12 @@ class WXDLLIMPEXP_FWD_STC wxStyledTextEvent; //---------------------------------------------------------------------- -class WXDLLIMPEXP_STC wxStyledTextCtrl : public wxControl - , public wxTextEntryBase +class WXDLLIMPEXP_STC wxStyledTextCtrl : public wxControl, #if wxUSE_TEXTCTRL - , public wxTextAreaBase -#endif // wxUSE_TEXTCTRL + public wxTextCtrlIface +#else // !wxUSE_TEXTCTRL + public wxTextEntryBase +#endif // wxUSE_TEXTCTRL/!wxUSE_TEXTCTRL { public: diff --git a/include/wx/textctrl.h b/include/wx/textctrl.h index 318af3e53f..a2e06b2cbd 100644 --- a/include/wx/textctrl.h +++ b/include/wx/textctrl.h @@ -582,11 +582,13 @@ public: virtual wxTextCtrlHitTestResult HitTest(const wxPoint& pt, wxTextCoord *col, wxTextCoord *row) const; + virtual wxString GetValue() const = 0; + virtual void SetValue(const wxString& value) = 0; protected: // implementation of loading/saving - virtual bool DoLoadFile(const wxString& file, int fileType) = 0; - virtual bool DoSaveFile(const wxString& file, int fileType) = 0; + virtual bool DoLoadFile(const wxString& file, int fileType); + virtual bool DoSaveFile(const wxString& file, int fileType); // the name of the last file loaded with LoadFile() which will be used by @@ -611,6 +613,16 @@ class WXDLLIMPEXP_CORE wxTextCtrlIface : public wxTextAreaBase, public: wxTextCtrlIface() { } + // wxTextAreaBase overrides + virtual wxString GetValue() const + { + return wxTextEntryBase::GetValue(); + } + virtual void SetValue(const wxString& value) + { + wxTextEntryBase::SetValue(value); + } + private: wxDECLARE_NO_COPY_CLASS(wxTextCtrlIface); }; @@ -683,6 +695,16 @@ public: virtual bool GetStyle(long position, wxTextAttr& style); virtual bool SetDefaultStyle(const wxTextAttr& style); + // wxTextAreaBase overrides + virtual wxString GetValue() const + { + return wxTextEntry::GetValue(); + } + virtual void SetValue(const wxString& value) + { + wxTextEntry::SetValue(value); + } + protected: // override streambuf method #if wxHAS_TEXT_WINDOW_STREAM diff --git a/src/common/textcmn.cpp b/src/common/textcmn.cpp index 402037e1e1..6248877613 100644 --- a/src/common/textcmn.cpp +++ b/src/common/textcmn.cpp @@ -736,7 +736,7 @@ bool wxTextCtrlBase::SetDefaultStyle(const wxTextAttr& style) // file IO functions // ---------------------------------------------------------------------------- -bool wxTextCtrlBase::DoLoadFile(const wxString& filename, int WXUNUSED(fileType)) +bool wxTextAreaBase::DoLoadFile(const wxString& filename, int WXUNUSED(fileType)) { #if wxUSE_FFILE wxFFile file(filename); @@ -745,20 +745,36 @@ bool wxTextCtrlBase::DoLoadFile(const wxString& filename, int WXUNUSED(fileType) wxString text; if ( file.ReadAll(&text) ) { - ChangeValue(text); - - DiscardEdits(); - - m_filename = filename; + SetValue(text); return true; } } +#endif // wxUSE_FFILE + + return false; +} +bool wxTextCtrlBase::DoLoadFile(const wxString& filename, int fileType) +{ + if ( wxTextAreaBase::DoLoadFile(filename, fileType) ) + { + DiscardEdits(); + m_filename = filename; + return true; + } wxLogError(_("File couldn't be loaded.")); -#endif // wxUSE_FFILE + return false; +} +bool wxTextAreaBase::DoSaveFile(const wxString& filename, int WXUNUSED(fileType)) +{ +#if wxUSE_FFILE + wxFFile file(filename, wxT("w")); + return file.IsOpened() && file.Write(GetValue(), *wxConvCurrent); +#else return false; +#endif // wxUSE_FFILE } bool wxTextAreaBase::SaveFile(const wxString& filename, int fileType) @@ -775,11 +791,9 @@ bool wxTextAreaBase::SaveFile(const wxString& filename, int fileType) return DoSaveFile(filenameToUse, fileType); } -bool wxTextCtrlBase::DoSaveFile(const wxString& filename, int WXUNUSED(fileType)) +bool wxTextCtrlBase::DoSaveFile(const wxString& filename, int fileType) { -#if wxUSE_FFILE - wxFFile file(filename, wxT("w")); - if ( file.IsOpened() && file.Write(GetValue()) ) + if ( wxTextAreaBase::DoSaveFile(filename, fileType) ) { // if it worked, save for future calls m_filename = filename; @@ -789,10 +803,6 @@ bool wxTextCtrlBase::DoSaveFile(const wxString& filename, int WXUNUSED(fileType) return true; } -#endif // wxUSE_FFILE - - wxLogError(_("The text couldn't be saved.")); - return false; } diff --git a/src/stc/stc.cpp b/src/stc/stc.cpp index 452a30f9fd..aedb28e311 100644 --- a/src/stc/stc.cpp +++ b/src/stc/stc.cpp @@ -47,7 +47,7 @@ #include "wx/tokenzr.h" #include "wx/mstream.h" #include "wx/image.h" -#include "wx/file.h" +#include "wx/ffile.h" #include "ScintillaWX.h" @@ -3500,74 +3500,57 @@ void wxStyledTextCtrl::ScrollToColumn(int column) { #if wxUSE_TEXTCTRL -bool wxStyledTextCtrl::DoSaveFile(const wxString& filename, int WXUNUSED(fileType)) +bool wxStyledTextCtrl::DoSaveFile(const wxString& filename, int fileType) +{ + bool ok = wxTextAreaBase::DoSaveFile(filename, fileType); #else bool wxStyledTextCtrl::SaveFile(const wxString& filename) -#endif { - wxFile file(filename, wxFile::write); - - if (!file.IsOpened()) - return false; - - bool success = file.Write(GetText(), *wxConvCurrent); - - if (success) +#if wxUSE_FFILE + wxFFile file(filename, wxT("w")); + bool ok = file.IsOpened() && file.Write(GetValue(), *wxConvCurrent); +#else + bool ok = false; +#endif // wxUSE_FFILE +#endif + if (ok) + { SetSavePoint(); - - return success; + } + return ok; } #if wxUSE_TEXTCTRL -bool wxStyledTextCtrl::DoLoadFile(const wxString& filename, int WXUNUSED(fileType)) +bool wxStyledTextCtrl::DoLoadFile(const wxString& filename, int fileType) +{ + bool ok = wxTextAreaBase::DoLoadFile(filename, fileType); #else bool wxStyledTextCtrl::LoadFile(const wxString& filename) -#endif { - bool success = false; - wxFile file(filename, wxFile::read); - - if (file.IsOpened()) +#if wxUSE_FFILE + wxFFile file(filename); + bool ok = file.IsOpened(); + if (ok) { - wxString contents; - // get the file size (assume it is not huge file...) - ssize_t len = (ssize_t)file.Length(); - - if (len > 0) - { -#if wxUSE_UNICODE - wxMemoryBuffer buffer(len+1); - success = (file.Read(buffer.GetData(), len) == len); - if (success) { - ((char*)buffer.GetData())[len] = 0; - contents = wxString(buffer, *wxConvCurrent, len); - } -#else - wxString buffer; - success = (file.Read(wxStringBuffer(buffer, len), len) == len); - contents = buffer; -#endif - } - else + wxString text; + ok = file.ReadAll(&text, *wxConvCurrent); + if (ok) { - if (len == 0) - success = true; // empty file is ok - else - success = false; // len == wxInvalidOffset - } - - if (success) - { - SetText(contents); - EmptyUndoBuffer(); - SetSavePoint(); + SetValue(text); } } - - return success; +#else + bool ok = false; +#endif // wxUSE_FFILE +#endif + if (ok) + { + EmptyUndoBuffer(); + SetSavePoint(); + } + return ok; } - #if wxUSE_DRAG_AND_DROP wxDragResult wxStyledTextCtrl::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { return m_swx->DoDragOver(x, y, def); diff --git a/src/stc/stc.cpp.in b/src/stc/stc.cpp.in index 2d23345d91..fa51a690f7 100644 --- a/src/stc/stc.cpp.in +++ b/src/stc/stc.cpp.in @@ -47,7 +47,7 @@ #include "wx/tokenzr.h" #include "wx/mstream.h" #include "wx/image.h" -#include "wx/file.h" +#include "wx/ffile.h" #include "ScintillaWX.h" @@ -509,74 +509,57 @@ void wxStyledTextCtrl::ScrollToColumn(int column) { #if wxUSE_TEXTCTRL -bool wxStyledTextCtrl::DoSaveFile(const wxString& filename, int WXUNUSED(fileType)) +bool wxStyledTextCtrl::DoSaveFile(const wxString& filename, int fileType) +{ + bool ok = wxTextAreaBase::DoSaveFile(filename, fileType); #else bool wxStyledTextCtrl::SaveFile(const wxString& filename) -#endif { - wxFile file(filename, wxFile::write); - - if (!file.IsOpened()) - return false; - - bool success = file.Write(GetText(), *wxConvCurrent); - - if (success) +#if wxUSE_FFILE + wxFFile file(filename, wxT("w")); + bool ok = file.IsOpened() && file.Write(GetValue(), *wxConvCurrent); +#else + bool ok = false; +#endif // wxUSE_FFILE +#endif + if (ok) + { SetSavePoint(); - - return success; + } + return ok; } #if wxUSE_TEXTCTRL -bool wxStyledTextCtrl::DoLoadFile(const wxString& filename, int WXUNUSED(fileType)) +bool wxStyledTextCtrl::DoLoadFile(const wxString& filename, int fileType) +{ + bool ok = wxTextAreaBase::DoLoadFile(filename, fileType); #else bool wxStyledTextCtrl::LoadFile(const wxString& filename) -#endif { - bool success = false; - wxFile file(filename, wxFile::read); - - if (file.IsOpened()) +#if wxUSE_FFILE + wxFFile file(filename); + bool ok = file.IsOpened(); + if (ok) { - wxString contents; - // get the file size (assume it is not huge file...) - ssize_t len = (ssize_t)file.Length(); - - if (len > 0) - { -#if wxUSE_UNICODE - wxMemoryBuffer buffer(len+1); - success = (file.Read(buffer.GetData(), len) == len); - if (success) { - ((char*)buffer.GetData())[len] = 0; - contents = wxString(buffer, *wxConvCurrent, len); - } -#else - wxString buffer; - success = (file.Read(wxStringBuffer(buffer, len), len) == len); - contents = buffer; -#endif - } - else + wxString text; + ok = file.ReadAll(&text, *wxConvCurrent); + if (ok) { - if (len == 0) - success = true; // empty file is ok - else - success = false; // len == wxInvalidOffset - } - - if (success) - { - SetText(contents); - EmptyUndoBuffer(); - SetSavePoint(); + SetValue(text); } } - - return success; +#else + bool ok = false; +#endif // wxUSE_FFILE +#endif + if (ok) + { + EmptyUndoBuffer(); + SetSavePoint(); + } + return ok; } - #if wxUSE_DRAG_AND_DROP wxDragResult wxStyledTextCtrl::DoDragOver(wxCoord x, wxCoord y, wxDragResult def) { return m_swx->DoDragOver(x, y, def); diff --git a/src/stc/stc.h.in b/src/stc/stc.h.in index 6398adbc8f..2153ed2e14 100644 --- a/src/stc/stc.h.in +++ b/src/stc/stc.h.in @@ -84,11 +84,12 @@ class WXDLLIMPEXP_FWD_STC wxStyledTextEvent; //---------------------------------------------------------------------- -class WXDLLIMPEXP_STC wxStyledTextCtrl : public wxControl - , public wxTextEntryBase +class WXDLLIMPEXP_STC wxStyledTextCtrl : public wxControl, #if wxUSE_TEXTCTRL - , public wxTextAreaBase -#endif // wxUSE_TEXTCTRL + public wxTextCtrlIface +#else // !wxUSE_TEXTCTRL + public wxTextEntryBase +#endif // wxUSE_TEXTCTRL/!wxUSE_TEXTCTRL { public: -- 2.47.2