]> git.saurik.com Git - wxWidgets.git/blame - samples/docview/doc.h
compilation fix for systems without neither MSG_NOSIGNAL nor SO_NOSIGPIPE (such as...
[wxWidgets.git] / samples / docview / doc.h
CommitLineData
457814b5 1/////////////////////////////////////////////////////////////////////////////
2d1df0fc 2// Name: samples/docview/doc.h
457814b5
JS
3// Purpose: Document classes
4// Author: Julian Smart
2d1df0fc 5// Modified by: Vadim Zeitlin: merge with the MDI version and general cleanup
457814b5
JS
6// Created: 04/01/98
7// RCS-ID: $Id$
2d1df0fc
VZ
8// Copyright: (c) 1998 Julian Smart
9// (c) 2008 Vadim Zeitlin
2f6c54eb 10// Licence: wxWindows license
457814b5
JS
11/////////////////////////////////////////////////////////////////////////////
12
2d1df0fc
VZ
13#ifndef _WX_SAMPLES_DOCVIEW_DOC_H_
14#define _WX_SAMPLES_DOCVIEW_DOC_H_
457814b5
JS
15
16#include "wx/docview.h"
606b005f 17#include "wx/cmdproc.h"
2d1df0fc
VZ
18#include "wx/vector.h"
19
20// This sample is written to build both with wxUSE_STD_IOSTREAM==0 and 1, which
21// somewhat complicates its code but is necessary in order to support building
22// it under all platforms and in all build configurations
23//
24// In your own code you would normally use std::stream classes only and so
25// wouldn't need these typedefs
26#if wxUSE_STD_IOSTREAM
27 typedef wxSTD istream DocumentIstream;
28 typedef wxSTD ostream DocumentOstream;
29#else // !wxUSE_STD_IOSTREAM
30 typedef wxInputStream DocumentIstream;
31 typedef wxOutputStream DocumentOstream;
32#endif // wxUSE_STD_IOSTREAM/!wxUSE_STD_IOSTREAM
33
34// ----------------------------------------------------------------------------
35// The document class and its helpers
36// ----------------------------------------------------------------------------
37
38// Represents a line from one point to the other
39struct DoodleLine
457814b5 40{
2d1df0fc
VZ
41 DoodleLine() { /* leave fields uninitialized */ }
42
43 DoodleLine(const wxPoint& pt1, const wxPoint& pt2)
44 : x1(pt1.x), y1(pt1.y), x2(pt2.x), y2(pt2.y)
45 {
46 }
47
f6bcfd97
BP
48 wxInt32 x1;
49 wxInt32 y1;
50 wxInt32 x2;
51 wxInt32 y2;
457814b5
JS
52};
53
2d1df0fc
VZ
54typedef wxVector<DoodleLine> DoodleLines;
55
457814b5 56// Contains a list of lines: represents a mouse-down doodle
2d1df0fc 57class DoodleSegment
457814b5 58{
f6bcfd97 59public:
2d1df0fc
VZ
60 DocumentOstream& SaveObject(DocumentOstream& stream);
61 DocumentIstream& LoadObject(DocumentIstream& stream);
958d3a7e 62
2d1df0fc
VZ
63 bool IsEmpty() const { return m_lines.empty(); }
64 void AddLine(const wxPoint& pt1, const wxPoint& pt2)
65 {
66 m_lines.push_back(DoodleLine(pt1, pt2));
67 }
68 const DoodleLines& GetLines() const { return m_lines; }
958d3a7e 69
2d1df0fc
VZ
70private:
71 DoodleLines m_lines;
457814b5
JS
72};
73
2d1df0fc
VZ
74typedef wxVector<DoodleSegment> DoodleSegments;
75
76
77// The drawing document (model) class itself
6bdf5153 78class DrawingDocument : public wxDocument
457814b5 79{
f6bcfd97 80public:
2d1df0fc 81 DrawingDocument() : wxDocument() { }
958d3a7e 82
2d1df0fc
VZ
83 DocumentOstream& SaveObject(DocumentOstream& stream);
84 DocumentIstream& LoadObject(DocumentIstream& stream);
958d3a7e 85
2d1df0fc
VZ
86 // add a new segment to the document
87 void AddDoodleSegment(const DoodleSegment& segment);
88
89 // remove the last segment, if any, and copy it in the provided pointer if
90 // not NULL and return true or return false and do nothing if there are no
91 // segments
92 bool PopLastSegment(DoodleSegment *segment);
93
94 // get direct access to our segments (for DrawingView)
95 const DoodleSegments& GetSegments() const { return m_doodleSegments; }
96
97private:
98 void DoUpdate();
99
100 DoodleSegments m_doodleSegments;
101
102 DECLARE_DYNAMIC_CLASS(DrawingDocument)
457814b5
JS
103};
104
457814b5 105
2d1df0fc
VZ
106// ----------------------------------------------------------------------------
107// Some operations (which can be done and undone by the view) on the document:
108// ----------------------------------------------------------------------------
109
110// Base class for all operations on DrawingDocument
6bdf5153 111class DrawingCommand : public wxCommand
457814b5 112{
2d1df0fc
VZ
113public:
114 DrawingCommand(DrawingDocument *doc,
115 const wxString& name,
116 const DoodleSegment& segment = DoodleSegment())
117 : wxCommand(true, name),
118 m_doc(doc),
119 m_segment(segment)
120 {
121 }
122
f6bcfd97 123protected:
2d1df0fc
VZ
124 bool DoAdd() { m_doc->AddDoodleSegment(m_segment); return true; }
125 bool DoRemove() { return m_doc->PopLastSegment(&m_segment); }
126
127private:
128 DrawingDocument * const m_doc;
129 DoodleSegment m_segment;
130};
131
132// The command for adding a new segment
133class DrawingAddSegmentCommand : public DrawingCommand
134{
135public:
136 DrawingAddSegmentCommand(DrawingDocument *doc, const DoodleSegment& segment)
137 : DrawingCommand(doc, "Add new segment", segment)
138 {
139 }
140
141 virtual bool Do() { return DoAdd(); }
142 virtual bool Undo() { return DoRemove(); }
143};
144
145// The command for removing the last segment
146class DrawingRemoveSegmentCommand : public DrawingCommand
147{
f6bcfd97 148public:
2d1df0fc
VZ
149 DrawingRemoveSegmentCommand(DrawingDocument *doc)
150 : DrawingCommand(doc, "Remove last segment")
151 {
152 }
958d3a7e 153
2d1df0fc
VZ
154 virtual bool Do() { return DoRemove(); }
155 virtual bool Undo() { return DoAdd(); }
457814b5
JS
156};
157
2d1df0fc
VZ
158
159// ----------------------------------------------------------------------------
828c8f98 160// wxTextDocument: wxDocument and wxTextCtrl married
2d1df0fc
VZ
161// ----------------------------------------------------------------------------
162
828c8f98 163class wxTextDocument : public wxDocument
457814b5 164{
f6bcfd97 165public:
828c8f98
FM
166 wxTextDocument() : wxDocument() { }
167 virtual wxTextCtrl* GetTextCtrl() const = 0;
6bdf5153 168
2d1df0fc 169 virtual bool IsModified() const;
f6bcfd97 170 virtual void Modify(bool mod);
457814b5 171
828c8f98
FM
172protected:
173 virtual bool DoSaveDocument(const wxString& filename);
174 virtual bool DoOpenDocument(const wxString& filename);
175
c0c133e1 176 wxDECLARE_NO_COPY_CLASS(wxTextDocument);
828c8f98
FM
177 DECLARE_CLASS(wxTextDocument)
178};
179
180// ----------------------------------------------------------------------------
181// A very simple text document class
182// ----------------------------------------------------------------------------
183
184class TextEditDocument : public wxTextDocument
185{
186public:
187 TextEditDocument() : wxTextDocument() { }
188 virtual wxTextCtrl* GetTextCtrl() const;
189
c0c133e1 190 wxDECLARE_NO_COPY_CLASS(TextEditDocument);
2d1df0fc
VZ
191 DECLARE_DYNAMIC_CLASS(TextEditDocument)
192};
457814b5 193
2d1df0fc 194#endif // _WX_SAMPLES_DOCVIEW_DOC_H_