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
This commit is contained 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"
|
||||
|
||||
@@ -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)
|
||||
wxString text;
|
||||
ok = file.ReadAll(&text, *wxConvCurrent);
|
||||
if (ok)
|
||||
{
|
||||
#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
|
||||
{
|
||||
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);
|
||||
|
Reference in New Issue
Block a user