]>
Commit | Line | Data |
---|---|---|
a660d684 KB |
1 | \section{Document/view overview}\label{docviewoverview} |
2 | ||
3 | Classes: \helpref{wxDocument}{wxdocument}, \helpref{wxView}{wxview}, \helpref{wxDocTemplate}{wxdoctemplate},\rtfsp | |
4 | \helpref{wxDocManager}{wxdocmanager}, \helpref{wxDocParentFrame}{wxdocparentframe}, \helpref{wxDocChildFrame}{wxdocchildframe}, | |
f7bd2698 | 5 | \rtfsp\helpref{wxDocMDIParentFrame}{wxdocmdiparentframe}, \helpref{wxDocMDIChildFrame}{wxdocmdichildframe}, |
a660d684 KB |
6 | \rtfsp\helpref{wxCommand}{wxcommand}, \helpref{wxCommandProcessor}{wxcommandprocessor} |
7 | ||
8 | The document/view framework is found in most application frameworks, because it | |
9 | can dramatically simplify the code required to build many kinds of application. | |
10 | ||
11 | The idea is that you can model your application primarily in terms of {\it documents} to store data | |
12 | and provide interface-independent operations upon it, and {\it views} to visualise and manipulate | |
13 | the data. Documents know how to do input and output given stream objects, and views are responsible | |
14 | for taking input from physical windows and performing the manipulation on the document data. | |
15 | If a document's data changes, all views should be updated to reflect the change. | |
16 | ||
17 | The framework can provide many user-interface elements based on this model. Once you have defined | |
18 | your own classes and the relationships between them, the framework takes care | |
19 | of popping up file selectors, opening and closing files, asking the user to save | |
20 | modifications, routing menu commands to appropriate (possibly default) code, even | |
21 | some default print/preview functionality and support for command undo/redo. | |
22 | The framework is highly modular, allowing overriding and replacement of functionality | |
23 | and objects to achieve more than the default behaviour. | |
24 | ||
25 | These are the overall steps involved in creating an application based on the document/view framework: | |
26 | ||
27 | \begin{enumerate}\itemsep=0pt | |
28 | \item Define your own document and view classes, overriding a minimal set of | |
29 | member functions e.g. for input/output, drawing and initialization. | |
30 | \item Define any subwindows | |
fe604ccd | 31 | (such as a scrolled window) that are needed for the view(s). You may need to route some events |
a660d684 KB |
32 | to views or documents, for example OnPaint needs to be routed to wxView::OnDraw. |
33 | \item Decide what style of interface you will use: Microsoft's MDI (multiple | |
34 | document child frames surrounded by an overall frame), SDI (a separate, unconstrained frame | |
35 | for each document), or single-window (one document open at a time, as in Windows Write). | |
36 | \item Use the appropriate wxDocParentFrame and wxDocChildFrame classes. Construct an instance | |
37 | of wxDocParentFrame in your wxApp::OnInit, and a wxDocChildFrame (if not single-window) when | |
14186b44 | 38 | you initialize a view. Create menus using standard menu ids (such as wxID\_OPEN, wxID\_PRINT). |
a660d684 KB |
39 | \item Construct a single wxDocManager instance at the beginning of your wxApp::OnInit, and then |
40 | as many wxDocTemplate instances as necessary to define relationships between documents and | |
41 | views. For a simple application, there will be just one wxDocTemplate. | |
42 | \end{enumerate} | |
43 | ||
44 | If you wish to implement Undo/Redo, you need to derive your own class(es) from wxCommand | |
45 | and use wxCommandProcessor::Submit instead of directly executing code. The framework will | |
46 | take care of calling Undo and Do functions as appropriate, so long as the wxID\_UNDO and | |
47 | wxID\_REDO menu items are defined in the view menu. | |
48 | ||
49 | Here are a few examples of the tailoring you can do to go beyond the default framework | |
50 | behaviour: | |
51 | ||
52 | \begin{itemize}\itemsep=0pt | |
53 | \item Override wxDocument::OnCreateCommandProcessor to define a different Do/Undo strategy, | |
54 | or a command history editor. | |
55 | \item Override wxView::OnCreatePrintout to create an instance of a derived \helpref{wxPrintout}{wxprintout}\rtfsp | |
56 | class, to provide multi-page document facilities. | |
57 | \item Override wxDocManager::SelectDocumentPath to provide a different file selector. | |
58 | \item Limit the maximum number of open documents and the maximum number of undo commands. | |
59 | \end{itemize} | |
60 | ||
61 | Note that to activate framework functionality, you need to use some or all of | |
fc2171bd | 62 | the wxWidgets \helpref{predefined command identifiers}{predefinedids} in your menus. |
a660d684 | 63 | |
762e1997 MB |
64 | \perlnote{The document/view framework is available in wxPerl. To use it, |
65 | you will need the following statements in your application code:\par | |
66 | {\small | |
67 | \begin{verbatim} | |
68 | use Wx::DocView; | |
69 | use Wx ':docview'; # import constants (optional) | |
70 | \end{verbatim} | |
71 | }} | |
72 | ||
a660d684 KB |
73 | \subsection{wxDocument overview}\label{wxdocumentoverview} |
74 | ||
75 | \overview{Document/view framework overview}{docviewoverview} | |
76 | ||
77 | Class: \helpref{wxDocument}{wxdocument} | |
78 | ||
79 | The wxDocument class can be used to model an application's file-based | |
fc2171bd | 80 | data. It is part of the document/view framework supported by wxWidgets, |
a660d684 KB |
81 | and cooperates with the \helpref{wxView}{wxview}, \helpref{wxDocTemplate}{wxdoctemplate}\rtfsp |
82 | and \helpref{wxDocManager}{wxdocmanager} classes. | |
83 | ||
84 | Using this framework can save a lot of routine user-interface programming, | |
85 | since a range of menu commands -- such as open, save, save as -- are supported automatically. | |
86 | The programmer just needs to define a minimal set of classes and member functions | |
87 | for the framework to call when necessary. Data, and the means to view and edit | |
88 | the data, are explicitly separated out in this model, and the concept of multiple {\it views} onto | |
89 | the same data is supported. | |
90 | ||
91 | Note that the document/view model will suit many but not all styles of application. | |
92 | For example, it would be overkill for a simple file conversion utility, where there | |
93 | may be no call for {\it views} on {\it documents} or the ability to open, edit and save | |
94 | files. But probably the majority of applications are document-based. | |
95 | ||
96 | See the example application in {\tt samples/docview}. | |
97 | ||
98 | To use the abstract wxDocument class, you need to derive a new class and override | |
99 | at least the member functions SaveObject and LoadObject. SaveObject and | |
100 | LoadObject will be called by the framework when the document needs to be saved | |
101 | or loaded. | |
102 | ||
103 | Use the macros DECLARE\_DYNAMIC\_CLASS and IMPLEMENT\_DYNAMIC\_CLASS in order | |
104 | to allow the framework to create document objects on demand. When you create | |
105 | a \helpref{wxDocTemplate}{wxdoctemplate} object on application initialization, you | |
106 | should pass CLASSINFO(YourDocumentClass) to the wxDocTemplate constructor | |
107 | so that it knows how to create an instance of this class. | |
108 | ||
fc2171bd | 109 | If you do not wish to use the wxWidgets method of creating document |
a660d684 KB |
110 | objects dynamically, you must override wxDocTemplate::CreateDocument |
111 | to return an instance of the appropriate class. | |
112 | ||
113 | \subsection{wxView overview}\label{wxviewoverview} | |
114 | ||
115 | \overview{Document/view framework overview}{docviewoverview} | |
116 | ||
117 | Class: \helpref{wxView}{wxview} | |
118 | ||
119 | The wxView class can be used to model the viewing and editing component of | |
fc2171bd | 120 | an application's file-based data. It is part of the document/view framework supported by wxWidgets, |
a660d684 KB |
121 | and cooperates with the \helpref{wxDocument}{wxdocument}, \helpref{wxDocTemplate}{wxdoctemplate} |
122 | and \helpref{wxDocManager}{wxdocmanager} classes. | |
123 | ||
124 | See the example application in {\tt samples/docview}. | |
125 | ||
126 | To use the abstract wxView class, you need to derive a new class and override | |
f6bcfd97 | 127 | at least the member functions OnCreate, OnDraw, OnUpdate and OnClose. You will probably |
a660d684 KB |
128 | want to override OnMenuCommand to respond to menu commands from the frame containing the |
129 | view. | |
130 | ||
131 | Use the macros DECLARE\_DYNAMIC\_CLASS and IMPLEMENT\_DYNAMIC\_CLASS in order | |
132 | to allow the framework to create view objects on demand. When you create | |
133 | a \helpref{wxDocTemplate}{wxdoctemplate} object on application initialization, you | |
134 | should pass CLASSINFO(YourViewClass) to the wxDocTemplate constructor | |
135 | so that it knows how to create an instance of this class. | |
136 | ||
fc2171bd | 137 | If you do not wish to use the wxWidgets method of creating view |
a660d684 KB |
138 | objects dynamically, you must override wxDocTemplate::CreateView |
139 | to return an instance of the appropriate class. | |
140 | ||
141 | \subsection{wxDocTemplate overview}\label{wxdoctemplateoverview} | |
142 | ||
143 | \overview{Document/view framework overview}{docviewoverview} | |
144 | ||
145 | Class: \helpref{wxDocTemplate}{wxdoctemplate} | |
146 | ||
147 | The wxDocTemplate class is used to model the relationship between a | |
148 | document class and a view class. The application creates a document | |
149 | template object for each document/view pair. The list of document | |
150 | templates managed by the wxDocManager instance is used to create | |
151 | documents and views. Each document template knows what file filters | |
152 | and default extension are appropriate for a document/view combination, | |
153 | and how to create a document or view. | |
154 | ||
155 | For example, you might write a small doodling application that can load | |
156 | and save lists of line segments. If you had two views of the data -- graphical, | |
157 | and a list of the segments -- then you would create one document class DoodleDocument, | |
158 | and two view classes (DoodleGraphicView and DoodleListView). You would also | |
159 | need two document templates, one for the graphical view and another for the | |
160 | list view. You would pass the same document class and default file extension to both | |
161 | document templates, but each would be passed a different view class. When | |
162 | the user clicks on the Open menu item, the file selector is displayed | |
163 | with a list of possible file filters -- one for each wxDocTemplate. Selecting | |
164 | the filter selects the wxDocTemplate, and when | |
165 | a file is selected, that template will be used for creating a document | |
aea22172 | 166 | and view. |
a660d684 KB |
167 | |
168 | For the case where an application has one document type and one view type, | |
169 | a single document template is constructed, and dialogs will be appropriately | |
170 | simplified. | |
171 | ||
fc2171bd | 172 | wxDocTemplate is part of the document/view framework supported by wxWidgets, |
528e0faf | 173 | and cooperates with the \helpref{wxView}{wxview}, \helpref{wxDocument}{wxdocument} |
a660d684 KB |
174 | and \helpref{wxDocManager}{wxdocmanager} classes. |
175 | ||
176 | See the example application in {\tt samples/docview}. | |
177 | ||
178 | To use the wxDocTemplate class, you do not need to derive a new class. | |
179 | Just pass relevant information to the constructor including CLASSINFO(YourDocumentClass) and | |
180 | CLASSINFO(YourViewClass) to allow dynamic instance creation. | |
fc2171bd | 181 | If you do not wish to use the wxWidgets method of creating document |
a660d684 KB |
182 | objects dynamically, you must override wxDocTemplate::CreateDocument |
183 | and wxDocTemplate::CreateView to return instances of the appropriate class. | |
184 | ||
14186b44 | 185 | {\it NOTE}: the document template has nothing to do with the C++ template construct. |
a660d684 KB |
186 | |
187 | \subsection{wxDocManager overview}\label{wxdocmanageroverview} | |
188 | ||
189 | \overview{Document/view framework overview}{docviewoverview} | |
190 | ||
191 | Class: \helpref{wxDocManager}{wxdocmanager} | |
192 | ||
fc2171bd | 193 | The wxDocManager class is part of the document/view framework supported by wxWidgets, |
a660d684 KB |
194 | and cooperates with the \helpref{wxView}{wxview}, \helpref{wxDocument}{wxdocument}\rtfsp |
195 | and \helpref{wxDocTemplate}{wxdoctemplate} classes. | |
196 | ||
f6bcfd97 | 197 | A wxDocManager instance coordinates documents, views and document templates. It keeps a list of document |
a660d684 KB |
198 | and template instances, and much functionality is routed through this object, such |
199 | as providing selection and file dialogs. The application can use this class `as is' or | |
200 | derive a class and override some members to extend or change the functionality. | |
201 | Create an instance of this class near the beginning of your application initialization, | |
202 | before any documents, views or templates are manipulated. | |
203 | ||
204 | There may be multiple wxDocManager instances in an application. | |
205 | ||
206 | See the example application in {\tt samples/docview}. | |
207 | ||
208 | \subsection{wxCommand overview}\label{wxcommandoverview} | |
209 | ||
210 | \overview{Document/view framework overview}{docviewoverview} | |
211 | ||
212 | Classes: \helpref{wxCommand}{wxcommand}, \helpref{wxCommandProcessor}{wxcommandprocessor} | |
213 | ||
214 | wxCommand is a base class for modelling an application command, | |
215 | which is an action usually performed by selecting a menu item, pressing | |
216 | a toolbar button or any other means provided by the application to | |
217 | change the data or view. | |
218 | ||
219 | Instead of the application functionality being scattered around | |
220 | switch statements and functions in a way that may be hard to | |
221 | read and maintain, the functionality for a command is explicitly represented | |
222 | as an object which can be manipulated by a framework or application. | |
223 | When a user interface event occurs, the application {\it submits} a command | |
224 | to a \helpref{wxCommandProcessor}{wxcommandprocessoroverview} object to execute and | |
225 | store. | |
226 | ||
fc2171bd | 227 | The wxWidgets document/view framework handles Undo and Redo by use of |
a660d684 KB |
228 | wxCommand and wxCommandProcessor objects. You might find further uses |
229 | for wxCommand, such as implementing a macro facility that stores, loads | |
230 | and replays commands. | |
231 | ||
232 | An application can derive a new class for every command, or, more likely, use | |
233 | one class parameterized with an integer or string command identifier. | |
234 | ||
235 | \subsection{wxCommandProcessor overview}\label{wxcommandprocessoroverview} | |
236 | ||
237 | \overview{Document/view framework overview}{docviewoverview} | |
238 | ||
239 | Classes: \helpref{wxCommandProcessor}{wxcommandprocessor}, \helpref{wxCommand}{wxcommand} | |
240 | ||
241 | wxCommandProcessor is a class that maintains a history of wxCommand | |
242 | instances, with undo/redo functionality built-in. Derive a new class from this | |
243 | if you want different behaviour. | |
244 | ||
245 | \subsection{wxFileHistory overview}\label{wxfilehistoryoverview} | |
246 | ||
247 | \overview{Document/view framework overview}{docviewoverview} | |
248 | ||
249 | Classes: \helpref{wxFileHistory}{wxfilehistory}, \helpref{wxDocManager}{wxdocmanager} | |
250 | ||
251 | wxFileHistory encapsulates functionality to record the last few files visited, and | |
252 | to allow the user to quickly load these files using the list appended to the File menu. | |
253 | ||
254 | Although wxFileHistory is used by wxDocManager, it can be used independently. You may wish | |
255 | to derive from it to allow different behaviour, such as popping up a scrolling | |
256 | list of files. | |
257 | ||
86110e1a VZ |
258 | By calling \helpref{wxFileHistory::UseMenu()}{wxfilehistoryusemenu} you can |
259 | associate a file menu with the file history. The menu will then be used for | |
260 | appending filenames that are added to the history. Please notice that currently | |
261 | if the history already contained filenames when UseMenu() is called (e.g. when | |
262 | initializing a second MDI child frame), the menu is not automatically | |
263 | initialized with the existing filenames in the history and so you need to call | |
264 | \helpref{AddFilesToMenu()}{wxfilehistoryaddfilestomenu} after UseMenu() | |
265 | explicitly in order to initialize the menu with the existing list of MRU files. | |
266 | (otherwise an assertion failure is raised in debug builds). | |
267 | The filenames are appended using menu identifiers in the range | |
268 | \texttt{wxID\_FILE1} to \texttt{wxID\_FILE9}. | |
a660d684 KB |
269 | |
270 | In order to respond to a file load command from one of these identifiers, | |
f7bd2698 | 271 | you need to handle them using an event handler, for example: |
a660d684 | 272 | |
f7bd2698 | 273 | {\small |
a660d684 | 274 | \begin{verbatim} |
f7bd2698 JS |
275 | BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame) |
276 | EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit) | |
277 | EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocParentFrame::OnMRUFile) | |
278 | END_EVENT_TABLE() | |
279 | ||
280 | void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event)) | |
a660d684 | 281 | { |
f7bd2698 JS |
282 | Close(); |
283 | } | |
284 | ||
285 | void wxDocParentFrame::OnMRUFile(wxCommandEvent& event) | |
286 | { | |
2edb0bde | 287 | wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1)); |
f7bd2698 JS |
288 | if (f != "") |
289 | (void)m_docManager->CreateDocument(f, wxDOC_SILENT); | |
a660d684 KB |
290 | } |
291 | \end{verbatim} | |
f7bd2698 | 292 | } |
a660d684 | 293 | |
fc2171bd | 294 | \subsection{wxWidgets predefined command identifiers}\label{predefinedids} |
a660d684 KB |
295 | |
296 | To allow communication between the application's menus and the | |
297 | document/view framework, several command identifiers are predefined for you | |
298 | to use in menus. The framework recognizes them and processes them if you | |
299 | forward commands from wxFrame::OnMenuCommand (or perhaps from toolbars and | |
300 | other user interface constructs). | |
301 | ||
302 | \begin{itemize}\itemsep=0pt | |
303 | \item wxID\_OPEN (5000) | |
304 | \item wxID\_CLOSE (5001) | |
305 | \item wxID\_NEW (5002) | |
306 | \item wxID\_SAVE (5003) | |
307 | \item wxID\_SAVEAS (5004) | |
308 | \item wxID\_REVERT (5005) | |
309 | \item wxID\_EXIT (5006) | |
310 | \item wxID\_UNDO (5007) | |
311 | \item wxID\_REDO (5008) | |
312 | \item wxID\_HELP (5009) | |
313 | \item wxID\_PRINT (5010) | |
314 | \item wxID\_PRINT\_SETUP (5011) | |
315 | \item wxID\_PREVIEW (5012) | |
316 | \end{itemize} | |
317 | ||
318 |