X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/828c8f98d5346c58b8fa75b043fba7a2a007b337..2a45803fc3877afd0ae3ce356dfe216505165882:/samples/docview/doc.cpp?ds=sidebyside diff --git a/samples/docview/doc.cpp b/samples/docview/doc.cpp index f43bbb1c13..e093d82ae3 100644 --- a/samples/docview/doc.cpp +++ b/samples/docview/doc.cpp @@ -7,7 +7,7 @@ // RCS-ID: $Id$ // Copyright: (c) 1998 Julian Smart // (c) 2008 Vadim Zeitlin -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------- @@ -34,6 +34,7 @@ #else #include "wx/txtstrm.h" #endif +#include "wx/wfstream.h" #include "doc.h" #include "view.h" @@ -78,6 +79,16 @@ DocumentIstream& DrawingDocument::LoadObject(DocumentIstream& istream) wxInt32 count = 0; stream >> count; + if ( count < 0 ) + { + wxLogWarning("Drawing document corrupted: invalid segments count."); +#if wxUSE_STD_IOSTREAM + istream.clear(std::ios::badbit); +#else + istream.Reset(wxSTREAM_READ_ERROR); +#endif + return istream; + } for ( int n = 0; n < count; n++ ) { @@ -176,6 +187,24 @@ DocumentIstream& DoodleSegment::LoadObject(DocumentIstream& istream) IMPLEMENT_CLASS(wxTextDocument, wxDocument) +bool wxTextDocument::OnCreate(const wxString& path, long flags) +{ + if ( !wxDocument::OnCreate(path, flags) ) + return false; + + // subscribe to changes in the text control to update the document state + // when it's modified + GetTextCtrl()->Connect + ( + wxEVT_COMMAND_TEXT_UPDATED, + wxCommandEventHandler(wxTextDocument::OnTextChange), + NULL, + this + ); + + return true; +} + // Since text windows have their own method for saving to/loading from files, // we override DoSave/OpenDocument instead of Save/LoadObject bool wxTextDocument::DoSaveDocument(const wxString& filename) @@ -185,7 +214,13 @@ bool wxTextDocument::DoSaveDocument(const wxString& filename) bool wxTextDocument::DoOpenDocument(const wxString& filename) { - return GetTextCtrl()->LoadFile(filename); + if ( !GetTextCtrl()->LoadFile(filename) ) + return false; + + // we're not modified by the user yet + Modify(false); + + return true; } bool wxTextDocument::IsModified() const @@ -205,6 +240,13 @@ void wxTextDocument::Modify(bool modified) } } +void wxTextDocument::OnTextChange(wxCommandEvent& event) +{ + Modify(true); + + event.Skip(); +} + // ---------------------------------------------------------------------------- // TextEditDocument implementation // ---------------------------------------------------------------------------- @@ -216,3 +258,41 @@ wxTextCtrl* TextEditDocument::GetTextCtrl() const wxView* view = GetFirstView(); return view ? wxStaticCast(view, TextEditView)->GetText() : NULL; } + +// ---------------------------------------------------------------------------- +// ImageDocument and ImageDetailsDocument implementation +// ---------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(ImageDocument, wxDocument) + +bool ImageDocument::DoOpenDocument(const wxString& file) +{ + return m_image.LoadFile(file); +} + +bool ImageDocument::OnOpenDocument(const wxString& filename) +{ + if ( !wxDocument::OnOpenDocument(filename) ) + return false; + + // we don't have a wxDocTemplate for the image details document as it's + // never created by wxWidgets automatically, instead just do it manually + ImageDetailsDocument * const docDetails = new ImageDetailsDocument(this); + docDetails->SetFilename(filename); + + new ImageDetailsView(docDetails); + + return true; +} + +ImageDetailsDocument::ImageDetailsDocument(ImageDocument *parent) + : wxDocument(parent) +{ + const wxImage image = parent->GetImage(); + + m_size.x = image.GetWidth(); + m_size.y = image.GetHeight(); + m_numColours = image.CountColours(); + m_type = image.GetType(); + m_hasAlpha = image.HasAlpha(); +}