]>
Commit | Line | Data |
---|---|---|
1 | ///////////////////////////////////////////////////////////////////////////// | |
2 | // Name: doc.h | |
3 | // Purpose: Document classes | |
4 | // Author: Julian Smart | |
5 | // Modified by: | |
6 | // Created: 12/07/98 | |
7 | // RCS-ID: $Id$ | |
8 | // Copyright: (c) Julian Smart | |
9 | // Licence: wxWindows licence | |
10 | ///////////////////////////////////////////////////////////////////////////// | |
11 | ||
12 | #ifndef _STUDIO_DOC_H_ | |
13 | #define _STUDIO_DOC_H_ | |
14 | ||
15 | #if defined(__GNUG__) && !defined(__APPLE__) | |
16 | // #pragma interface | |
17 | #endif | |
18 | ||
19 | #include <wx/docview.h> | |
20 | #include <wx/cmdproc.h> | |
21 | #include <wx/string.h> | |
22 | ||
23 | #include <wx/ogl/ogl.h> // base header of OGL, includes and adjusts wx/deprecated/setup.h | |
24 | ||
25 | #include "shapes.h" | |
26 | ||
27 | /* | |
28 | * A diagram document, which contains a diagram. | |
29 | */ | |
30 | ||
31 | class csDiagramDocument: public wxDocument | |
32 | { | |
33 | DECLARE_DYNAMIC_CLASS(csDiagramDocument) | |
34 | public: | |
35 | csDiagramDocument(); | |
36 | ~csDiagramDocument(); | |
37 | ||
38 | #if wxUSE_PROLOGIO | |
39 | bool OnSaveDocument(const wxString& file); | |
40 | bool OnOpenDocument(const wxString& file); | |
41 | #endif // wxUSE_PROLOGIO | |
42 | ||
43 | inline wxDiagram *GetDiagram() { return &m_diagram; } | |
44 | ||
45 | bool OnCloseDocument(); | |
46 | ||
47 | protected: | |
48 | csDiagram m_diagram; | |
49 | }; | |
50 | ||
51 | /* | |
52 | Do/Undo 30/7/98 | |
53 | ||
54 | 1) We have a csCommandState, and in csDiagramCommand you have a list of | |
55 | these. This allows undo to work with several shapes at once. | |
56 | ||
57 | 2) Instead of storing info about each operation, e.g. separate pens, colours, | |
58 | etc., we simply use a copy of the shape. | |
59 | In csCommandState, we have a pointer to the actual shape in the canvas, m_currentShape. | |
60 | We also have wxShape* m_shapeState which stores the requested or previous state | |
61 | (depending on whether it's before the Do or after the Do. | |
62 | ||
63 | - In Do: save a temp copy of the old m_currentShape (i.e. the state just before it's changed). | |
64 | Change the data pointed to by m_currentShape to the new attributes stored in m_shapeState. | |
65 | Now assign the temp copy to m_shapeState, for use in Undo. | |
66 | ||
67 | wxShape* temp = m_currentShape->Copy(); // Take a copy of the current state | |
68 | m_currentShape->Set(m_shapeState); // Apply the new state (e.g. moving, changing colour etc.) | |
69 | delete m_shapeState; // Delete the previous 'old state'. | |
70 | m_shapeState = temp; // Remember the new 'old state'. | |
71 | ||
72 | */ | |
73 | ||
74 | ||
75 | class csCommandState; | |
76 | class csDiagramCommand: public wxCommand | |
77 | { | |
78 | friend class csCommandState; | |
79 | public: | |
80 | // Multi-purpose constructor for creating, deleting shapes | |
81 | csDiagramCommand(const wxString& name, csDiagramDocument *doc, | |
82 | csCommandState* onlyState = NULL); // Allow for the common case of just one state to change | |
83 | ||
84 | ~csDiagramCommand(); | |
85 | ||
86 | bool Do(); | |
87 | bool Undo(); | |
88 | ||
89 | // Add a state to the end of the list | |
90 | void AddState(csCommandState* state); | |
91 | ||
92 | // Insert a state at the beginning of the list | |
93 | void InsertState(csCommandState* state); | |
94 | ||
95 | // Schedule all lines connected to the states to be cut. | |
96 | void RemoveLines(); | |
97 | ||
98 | // Find the state that refers to this shape | |
99 | csCommandState* FindStateByShape(wxShape* shape); | |
100 | ||
101 | wxList& GetStates() const { return (wxList&) m_states; } | |
102 | ||
103 | protected: | |
104 | csDiagramDocument* m_doc; | |
105 | wxList m_states; | |
106 | }; | |
107 | ||
108 | class csCommandState: public wxObject | |
109 | { | |
110 | friend class csDiagramCommand; | |
111 | public: | |
112 | csCommandState(int cmd, wxShape* savedState, wxShape* shapeOnCanvas); | |
113 | ~csCommandState(); | |
114 | ||
115 | bool Do(); | |
116 | bool Undo(); | |
117 | ||
118 | inline void SetSavedState(wxShape *s) { m_savedState = s; } | |
119 | inline wxShape *GetSavedState() const { return m_savedState; } | |
120 | ||
121 | inline void SetShapeOnCanvas(wxShape *s) { m_shapeOnCanvas = s; } | |
122 | inline wxShape *GetShapeOnCanvas() const { return m_shapeOnCanvas; } | |
123 | protected: | |
124 | wxShape* m_savedState; // Previous state, for restoring on Undo | |
125 | wxShape* m_shapeOnCanvas; // The actual shape on the canvas | |
126 | csDiagramDocument* m_doc; | |
127 | int m_cmd; | |
128 | ||
129 | // These store the line ordering for the shapes at either end, | |
130 | // so an un-cut line can restore the ordering properly. Otherwise | |
131 | // it just adds the line at an arbitrary position. | |
132 | int m_linePositionFrom; | |
133 | int m_linePositionTo; | |
134 | }; | |
135 | ||
136 | #endif | |
137 | // _STUDIO_DOC_H_ |