| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 | 
							- /////////////////////////////////////////////////////////////////////////////
 
- // Name:        samples/docview/doc.cpp
 
- // Purpose:     Implements document functionality
 
- // Author:      Julian Smart
 
- // Modified by: Vadim Zeitlin: merge with the MDI version and general cleanup
 
- // Created:     04/01/98
 
- // Copyright:   (c) 1998 Julian Smart
 
- //              (c) 2008 Vadim Zeitlin
 
- // Licence:     wxWindows licence
 
- /////////////////////////////////////////////////////////////////////////////
 
- // ----------------------------------------------------------------------------
 
- // headers
 
- // ----------------------------------------------------------------------------
 
- // For compilers that support precompilation, includes "wx/wx.h".
 
- #include "wx/wxprec.h"
 
- #ifdef __BORLANDC__
 
-     #pragma hdrstop
 
- #endif
 
- #if !wxUSE_DOC_VIEW_ARCHITECTURE
 
-     #error You must set wxUSE_DOC_VIEW_ARCHITECTURE to 1 in setup.h!
 
- #endif
 
- #ifndef WX_PRECOMP
 
-     #include "wx/wx.h"
 
- #endif
 
- #if wxUSE_STD_IOSTREAM
 
-     #include "wx/ioswrap.h"
 
- #else
 
-     #include "wx/txtstrm.h"
 
- #endif
 
- #include "wx/wfstream.h"
 
- #include "doc.h"
 
- #include "view.h"
 
- // ----------------------------------------------------------------------------
 
- // DrawingDocument implementation
 
- // ----------------------------------------------------------------------------
 
- IMPLEMENT_DYNAMIC_CLASS(DrawingDocument, wxDocument)
 
- DocumentOstream& DrawingDocument::SaveObject(DocumentOstream& ostream)
 
- {
 
- #if wxUSE_STD_IOSTREAM
 
-     DocumentOstream& stream = ostream;
 
- #else
 
-     wxTextOutputStream stream(ostream);
 
- #endif
 
-     wxDocument::SaveObject(ostream);
 
-     const wxInt32 count = m_doodleSegments.size();
 
-     stream << count << '\n';
 
-     for ( int n = 0; n < count; n++ )
 
-     {
 
-         m_doodleSegments[n].SaveObject(ostream);
 
-         stream << '\n';
 
-     }
 
-     return ostream;
 
- }
 
- DocumentIstream& DrawingDocument::LoadObject(DocumentIstream& istream)
 
- {
 
- #if wxUSE_STD_IOSTREAM
 
-     DocumentIstream& stream = istream;
 
- #else
 
-     wxTextInputStream stream(istream);
 
- #endif
 
-     wxDocument::LoadObject(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++ )
 
-     {
 
-         DoodleSegment segment;
 
-         segment.LoadObject(istream);
 
-         m_doodleSegments.push_back(segment);
 
-     }
 
-     return istream;
 
- }
 
- void DrawingDocument::DoUpdate()
 
- {
 
-     Modify(true);
 
-     UpdateAllViews();
 
- }
 
- void DrawingDocument::AddDoodleSegment(const DoodleSegment& segment)
 
- {
 
-     m_doodleSegments.push_back(segment);
 
-     DoUpdate();
 
- }
 
- bool DrawingDocument::PopLastSegment(DoodleSegment *segment)
 
- {
 
-     if ( m_doodleSegments.empty() )
 
-         return false;
 
-     if ( segment )
 
-         *segment = m_doodleSegments.back();
 
-     m_doodleSegments.pop_back();
 
-     DoUpdate();
 
-     return true;
 
- }
 
- // ----------------------------------------------------------------------------
 
- // DoodleSegment implementation
 
- // ----------------------------------------------------------------------------
 
- DocumentOstream& DoodleSegment::SaveObject(DocumentOstream& ostream)
 
- {
 
- #if wxUSE_STD_IOSTREAM
 
-     DocumentOstream& stream = ostream;
 
- #else
 
-     wxTextOutputStream stream(ostream);
 
- #endif
 
-     const wxInt32 count = m_lines.size();
 
-     stream << count << '\n';
 
-     for ( int n = 0; n < count; n++ )
 
-     {
 
-         const DoodleLine& line = m_lines[n];
 
-         stream
 
-             << line.x1 << ' '
 
-             << line.y1 << ' '
 
-             << line.x2 << ' '
 
-             << line.y2 << '\n';
 
-     }
 
-     return ostream;
 
- }
 
- DocumentIstream& DoodleSegment::LoadObject(DocumentIstream& istream)
 
- {
 
- #if wxUSE_STD_IOSTREAM
 
-     DocumentIstream& stream = istream;
 
- #else
 
-     wxTextInputStream stream(istream);
 
- #endif
 
-     wxInt32 count = 0;
 
-     stream >> count;
 
-     for ( int n = 0; n < count; n++ )
 
-     {
 
-         DoodleLine line;
 
-         stream
 
-             >> line.x1
 
-             >> line.y1
 
-             >> line.x2
 
-             >> line.y2;
 
-         m_lines.push_back(line);
 
-     }
 
-     return istream;
 
- }
 
- // ----------------------------------------------------------------------------
 
- // wxTextDocument: wxDocument and wxTextCtrl married
 
- // ----------------------------------------------------------------------------
 
- 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_TEXT,
 
-         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)
 
- {
 
-     return GetTextCtrl()->SaveFile(filename);
 
- }
 
- bool wxTextDocument::DoOpenDocument(const wxString& filename)
 
- {
 
-     if ( !GetTextCtrl()->LoadFile(filename) )
 
-         return false;
 
-     // we're not modified by the user yet
 
-     Modify(false);
 
-     return true;
 
- }
 
- bool wxTextDocument::IsModified() const
 
- {
 
-     wxTextCtrl* wnd = GetTextCtrl();
 
-     return wxDocument::IsModified() || (wnd && wnd->IsModified());
 
- }
 
- void wxTextDocument::Modify(bool modified)
 
- {
 
-     wxDocument::Modify(modified);
 
-     wxTextCtrl* wnd = GetTextCtrl();
 
-     if (wnd && !modified)
 
-     {
 
-         wnd->DiscardEdits();
 
-     }
 
- }
 
- void wxTextDocument::OnTextChange(wxCommandEvent& event)
 
- {
 
-     Modify(true);
 
-     event.Skip();
 
- }
 
- // ----------------------------------------------------------------------------
 
- // TextEditDocument implementation
 
- // ----------------------------------------------------------------------------
 
- IMPLEMENT_DYNAMIC_CLASS(TextEditDocument, wxDocument)
 
- 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();
 
- }
 
 
  |