merged docvwmdi sample into docview one to avoid having 2 almost identical samples; and modernized and cleaned up the code in the process
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@56053 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,107 +1,179 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: doc.h
|
||||
// Name: samples/docview/doc.h
|
||||
// Purpose: Document classes
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Modified by: Vadim Zeitlin: merge with the MDI version and general cleanup
|
||||
// Created: 04/01/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Copyright: (c) 1998 Julian Smart
|
||||
// (c) 2008 Vadim Zeitlin
|
||||
// Licence: wxWindows license
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef __DOC_H__
|
||||
#define __DOC_H__
|
||||
#ifndef _WX_SAMPLES_DOCVIEW_DOC_H_
|
||||
#define _WX_SAMPLES_DOCVIEW_DOC_H_
|
||||
|
||||
#include "wx/docview.h"
|
||||
#include "wx/cmdproc.h"
|
||||
#include "wx/vector.h"
|
||||
|
||||
// Plots a line from one point to the other
|
||||
class DoodleLine : public wxObject
|
||||
// This sample is written to build both with wxUSE_STD_IOSTREAM==0 and 1, which
|
||||
// somewhat complicates its code but is necessary in order to support building
|
||||
// it under all platforms and in all build configurations
|
||||
//
|
||||
// In your own code you would normally use std::stream classes only and so
|
||||
// wouldn't need these typedefs
|
||||
#if wxUSE_STD_IOSTREAM
|
||||
typedef wxSTD istream DocumentIstream;
|
||||
typedef wxSTD ostream DocumentOstream;
|
||||
#else // !wxUSE_STD_IOSTREAM
|
||||
typedef wxInputStream DocumentIstream;
|
||||
typedef wxOutputStream DocumentOstream;
|
||||
#endif // wxUSE_STD_IOSTREAM/!wxUSE_STD_IOSTREAM
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// The document class and its helpers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Represents a line from one point to the other
|
||||
struct DoodleLine
|
||||
{
|
||||
public:
|
||||
DoodleLine() { /* leave fields uninitialized */ }
|
||||
|
||||
DoodleLine(const wxPoint& pt1, const wxPoint& pt2)
|
||||
: x1(pt1.x), y1(pt1.y), x2(pt2.x), y2(pt2.y)
|
||||
{
|
||||
}
|
||||
|
||||
wxInt32 x1;
|
||||
wxInt32 y1;
|
||||
wxInt32 x2;
|
||||
wxInt32 y2;
|
||||
};
|
||||
|
||||
typedef wxVector<DoodleLine> DoodleLines;
|
||||
|
||||
// Contains a list of lines: represents a mouse-down doodle
|
||||
class DoodleSegment : public wxObject
|
||||
class DoodleSegment
|
||||
{
|
||||
public:
|
||||
wxList m_lines;
|
||||
DocumentOstream& SaveObject(DocumentOstream& stream);
|
||||
DocumentIstream& LoadObject(DocumentIstream& stream);
|
||||
|
||||
DoodleSegment() : wxObject() {}
|
||||
DoodleSegment(const DoodleSegment& seg);
|
||||
virtual ~DoodleSegment();
|
||||
|
||||
void Draw(wxDC *dc);
|
||||
#if wxUSE_STD_IOSTREAM
|
||||
wxSTD ostream& SaveObject(wxSTD ostream& text_stream);
|
||||
wxSTD istream& LoadObject(wxSTD istream& text_stream);
|
||||
#else
|
||||
wxOutputStream& SaveObject(wxOutputStream& stream);
|
||||
wxInputStream& LoadObject(wxInputStream& stream);
|
||||
#endif
|
||||
bool IsEmpty() const { return m_lines.empty(); }
|
||||
void AddLine(const wxPoint& pt1, const wxPoint& pt2)
|
||||
{
|
||||
m_lines.push_back(DoodleLine(pt1, pt2));
|
||||
}
|
||||
const DoodleLines& GetLines() const { return m_lines; }
|
||||
|
||||
private:
|
||||
DoodleLines m_lines;
|
||||
};
|
||||
|
||||
typedef wxVector<DoodleSegment> DoodleSegments;
|
||||
|
||||
|
||||
// The drawing document (model) class itself
|
||||
class DrawingDocument : public wxDocument
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(DrawingDocument)
|
||||
private:
|
||||
public:
|
||||
wxList m_doodleSegments;
|
||||
DrawingDocument() : wxDocument() { }
|
||||
|
||||
DrawingDocument() : wxDocument() {}
|
||||
virtual ~DrawingDocument();
|
||||
DocumentOstream& SaveObject(DocumentOstream& stream);
|
||||
DocumentIstream& LoadObject(DocumentIstream& stream);
|
||||
|
||||
#if wxUSE_STD_IOSTREAM
|
||||
wxSTD ostream& SaveObject(wxSTD ostream& text_stream);
|
||||
wxSTD istream& LoadObject(wxSTD istream& text_stream);
|
||||
#else
|
||||
wxOutputStream& SaveObject(wxOutputStream& stream);
|
||||
wxInputStream& LoadObject(wxInputStream& stream);
|
||||
#endif
|
||||
// add a new segment to the document
|
||||
void AddDoodleSegment(const DoodleSegment& segment);
|
||||
|
||||
inline wxList& GetDoodleSegments() const { return (wxList&) m_doodleSegments; };
|
||||
// remove the last segment, if any, and copy it in the provided pointer if
|
||||
// not NULL and return true or return false and do nothing if there are no
|
||||
// segments
|
||||
bool PopLastSegment(DoodleSegment *segment);
|
||||
|
||||
// get direct access to our segments (for DrawingView)
|
||||
const DoodleSegments& GetSegments() const { return m_doodleSegments; }
|
||||
|
||||
private:
|
||||
void DoUpdate();
|
||||
|
||||
DoodleSegments m_doodleSegments;
|
||||
|
||||
DECLARE_DYNAMIC_CLASS(DrawingDocument)
|
||||
};
|
||||
|
||||
#define DOODLE_CUT 1
|
||||
#define DOODLE_ADD 2
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Some operations (which can be done and undone by the view) on the document:
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// Base class for all operations on DrawingDocument
|
||||
class DrawingCommand : public wxCommand
|
||||
{
|
||||
protected:
|
||||
DoodleSegment* m_segment;
|
||||
DrawingDocument* m_doc;
|
||||
int m_cmd;
|
||||
public:
|
||||
DrawingCommand(const wxString& name, int cmd, DrawingDocument*, DoodleSegment*);
|
||||
virtual ~DrawingCommand();
|
||||
DrawingCommand(DrawingDocument *doc,
|
||||
const wxString& name,
|
||||
const DoodleSegment& segment = DoodleSegment())
|
||||
: wxCommand(true, name),
|
||||
m_doc(doc),
|
||||
m_segment(segment)
|
||||
{
|
||||
}
|
||||
|
||||
bool Do(void);
|
||||
bool Undo(void);
|
||||
protected:
|
||||
bool DoAdd() { m_doc->AddDoodleSegment(m_segment); return true; }
|
||||
bool DoRemove() { return m_doc->PopLastSegment(&m_segment); }
|
||||
|
||||
private:
|
||||
DrawingDocument * const m_doc;
|
||||
DoodleSegment m_segment;
|
||||
};
|
||||
|
||||
// The command for adding a new segment
|
||||
class DrawingAddSegmentCommand : public DrawingCommand
|
||||
{
|
||||
public:
|
||||
DrawingAddSegmentCommand(DrawingDocument *doc, const DoodleSegment& segment)
|
||||
: DrawingCommand(doc, "Add new segment", segment)
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool Do() { return DoAdd(); }
|
||||
virtual bool Undo() { return DoRemove(); }
|
||||
};
|
||||
|
||||
// The command for removing the last segment
|
||||
class DrawingRemoveSegmentCommand : public DrawingCommand
|
||||
{
|
||||
public:
|
||||
DrawingRemoveSegmentCommand(DrawingDocument *doc)
|
||||
: DrawingCommand(doc, "Remove last segment")
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool Do() { return DoRemove(); }
|
||||
virtual bool Undo() { return DoAdd(); }
|
||||
};
|
||||
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// A simple text document class
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
class TextEditView;
|
||||
class TextEditDocument : public wxDocument
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(TextEditDocument)
|
||||
public:
|
||||
TextEditDocument() : wxDocument() {}
|
||||
virtual ~TextEditDocument() {}
|
||||
/*
|
||||
wxSTD ostream& SaveObject(wxSTD ostream&);
|
||||
wxSTD istream& LoadObject(wxSTD istream&);
|
||||
*/
|
||||
TextEditView* GetFirstView() const;
|
||||
TextEditDocument() : wxDocument() { }
|
||||
TextEditView *GetFirstView() const;
|
||||
|
||||
virtual bool DoSaveDocument(const wxString& filename);
|
||||
virtual bool DoOpenDocument(const wxString& filename);
|
||||
virtual bool IsModified(void) const;
|
||||
virtual bool IsModified() const;
|
||||
virtual void Modify(bool mod);
|
||||
|
||||
DECLARE_NO_COPY_CLASS(TextEditDocument)
|
||||
DECLARE_DYNAMIC_CLASS(TextEditDocument)
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
#endif // _WX_SAMPLES_DOCVIEW_DOC_H_
|
||||
|
Reference in New Issue
Block a user