]>
Commit | Line | Data |
---|---|---|
15b6757b | 1 | ///////////////////////////////////////////////////////////////////////////// |
d54cf7ff | 2 | // Name: docview.h |
15b6757b FM |
3 | // Purpose: topic overview |
4 | // Author: wxWidgets team | |
526954c5 | 5 | // Licence: wxWindows licence |
15b6757b FM |
6 | ///////////////////////////////////////////////////////////////////////////// |
7 | ||
880efa2a | 8 | /** |
36c9828f | 9 | |
928f1a07 FM |
10 | @page overview_docview Document/View Framework |
11 | ||
ce154616 | 12 | @tableofcontents |
928f1a07 FM |
13 | |
14 | The document/view framework is found in most application frameworks, because it | |
15 | can dramatically simplify the code required to build many kinds of application. | |
16 | ||
ce154616 BP |
17 | The idea is that you can model your application primarily in terms of |
18 | @e documents to store data and provide interface-independent operations upon | |
19 | it, and @e views to visualise and manipulate the data. Documents know how to do | |
20 | input and output given stream objects, and views are responsible for taking | |
21 | input from physical windows and performing the manipulation on the document | |
22 | data. | |
928f1a07 | 23 | |
ce154616 BP |
24 | If a document's data changes, all views should be updated to reflect the |
25 | change. The framework can provide many user-interface elements based on this | |
26 | model. | |
928f1a07 | 27 | |
ce154616 BP |
28 | Once you have defined your own classes and the relationships between them, the |
29 | framework takes care of popping up file selectors, opening and closing files, | |
30 | asking the user to save modifications, routing menu commands to appropriate | |
31 | (possibly default) code, even some default print/preview functionality and | |
32 | support for command undo/redo. | |
928f1a07 | 33 | |
ce154616 BP |
34 | The framework is highly modular, allowing overriding and replacement of |
35 | functionality and objects to achieve more than the default behaviour. | |
928f1a07 FM |
36 | |
37 | These are the overall steps involved in creating an application based on the | |
38 | document/view framework: | |
39 | ||
40 | @li Define your own document and view classes, overriding a minimal set of | |
41 | member functions e.g. for input/output, drawing and initialization. | |
ce154616 BP |
42 | @li Define any subwindows (such as a scrolled window) that are needed for the |
43 | view(s). You may need to route some events to views or documents, for | |
44 | example, "OnPaint" needs to be routed to wxView::OnDraw. | |
928f1a07 | 45 | @li Decide what style of interface you will use: Microsoft's MDI (multiple |
ce154616 BP |
46 | document child frames surrounded by an overall frame), SDI (a separate, |
47 | unconstrained frame for each document), or single-window (one document open | |
48 | at a time, as in Windows Write). | |
49 | @li Use the appropriate wxDocParentFrame and wxDocChildFrame classes. Construct | |
50 | an instance of wxDocParentFrame in your wxApp::OnInit, and a | |
51 | wxDocChildFrame (if not single-window) when you initialize a view. Create | |
52 | menus using standard menu ids (such as wxID_OPEN, wxID_PRINT). | |
53 | @li Construct a single wxDocManager instance at the beginning of your | |
54 | wxApp::OnInit, and then as many wxDocTemplate instances as necessary to | |
55 | define relationships between documents and views. For a simple application, | |
56 | there will be just one wxDocTemplate. | |
57 | ||
58 | If you wish to implement Undo/Redo, you need to derive your own class(es) from | |
59 | wxCommand and use wxCommandProcessor::Submit instead of directly executing | |
60 | code. The framework will take care of calling Undo and Do functions as | |
61 | appropriate, so long as the wxID_UNDO and wxID_REDO menu items are defined in | |
62 | the view menu. | |
63 | ||
64 | Here are a few examples of the tailoring you can do to go beyond the default | |
65 | framework behaviour: | |
66 | ||
67 | @li Override wxDocument::OnCreateCommandProcessor to define a different Do/Undo | |
68 | strategy, or a command history editor. | |
69 | @li Override wxView::OnCreatePrintout to create an instance of a derived | |
70 | wxPrintout class, to provide multi-page document facilities. | |
71 | @li Override wxDocManager::SelectDocumentPath to provide a different file | |
72 | selector. | |
73 | @li Limit the maximum number of open documents and the maximum number of undo | |
74 | commands. | |
36c9828f | 75 | |
928f1a07 FM |
76 | Note that to activate framework functionality, you need to use some or all of |
77 | the wxWidgets @ref overview_docview_predefid in your menus. | |
36c9828f | 78 | |
928f1a07 | 79 | @beginWxPerlOnly |
ce154616 BP |
80 | The document/view framework is available in wxPerl. To use it, you will need |
81 | the following statements in your application code: | |
36c9828f | 82 | |
ce154616 | 83 | @code{.pl} |
928f1a07 FM |
84 | use Wx::DocView; |
85 | use Wx ':docview'; # import constants (optional) | |
86 | @endcode | |
87 | @endWxPerlOnly | |
88 | ||
ce154616 | 89 | @see @ref group_class_docview, |
36c9828f | 90 | |
36c9828f | 91 | |
928f1a07 | 92 | |
ce154616 | 93 | @section overview_docview_wxdoc wxDocument Overview |
928f1a07 | 94 | |
ce154616 BP |
95 | The wxDocument class can be used to model an application's file-based data. It |
96 | is part of the document/view framework supported by wxWidgets, and cooperates | |
97 | with the wxView, wxDocTemplate and wxDocManager classes. Using this framework | |
98 | can save a lot of routine user-interface programming, since a range of menu | |
99 | commands -- such as open, save, save as -- are supported automatically. | |
928f1a07 | 100 | |
ce154616 BP |
101 | The programmer just needs to define a minimal set of classes and member |
102 | functions for the framework to call when necessary. Data, and the means to view | |
103 | and edit the data, are explicitly separated out in this model, and the concept | |
104 | of multiple @e views onto the same data is supported. | |
d54cf7ff | 105 | |
ce154616 BP |
106 | Note that the document/view model will suit many but not all styles of |
107 | application. For example, it would be overkill for a simple file conversion | |
108 | utility, where there may be no call for @e views on @e documents or the ability | |
109 | to open, edit and save files. But probably the majority of applications are | |
110 | document-based. | |
d54cf7ff | 111 | |
ce154616 BP |
112 | See the example application in @c samples/docview. To use the abstract |
113 | wxDocument class, you need to derive a new class and override at least the | |
114 | member functions SaveObject and LoadObject. SaveObject and LoadObject will be | |
115 | called by the framework when the document needs to be saved or loaded. | |
d54cf7ff | 116 | |
ce154616 BP |
117 | Use the macros DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS in order to |
118 | allow the framework to create document objects on demand. When you create a | |
119 | wxDocTemplate object on application initialization, you should pass | |
120 | CLASSINFO(YourDocumentClass) to the wxDocTemplate constructor so that it knows | |
121 | how to create an instance of this class. | |
d54cf7ff | 122 | |
ce154616 BP |
123 | If you do not wish to use the wxWidgets method of creating document objects |
124 | dynamically, you must override wxDocTemplate::CreateDocument to return an | |
125 | instance of the appropriate class. | |
36c9828f | 126 | |
36c9828f | 127 | |
d54cf7ff | 128 | |
ce154616 | 129 | @section overview_docview_wxview wxView Overview |
d54cf7ff | 130 | |
ce154616 BP |
131 | The wxView class can be used to model the viewing and editing component of an |
132 | application's file-based data. It is part of the document/view framework | |
133 | supported by wxWidgets, and cooperates with the wxDocument, wxDocTemplate and | |
134 | wxDocManager classes. | |
d54cf7ff | 135 | |
928f1a07 | 136 | See the example application in @c samples/docview. |
d54cf7ff | 137 | |
928f1a07 | 138 | To use the abstract wxView class, you need to derive a new class and override |
ce154616 BP |
139 | at least the member functions OnCreate, OnDraw, OnUpdate and OnClose. You will |
140 | probably want to respond to menu commands from the frame containing the view. | |
141 | ||
142 | Use the macros DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS in order to | |
143 | allow the framework to create view objects on demand. When you create a | |
144 | wxDocTemplate object on application initialization, you should pass | |
145 | CLASSINFO(YourViewClass) to the wxDocTemplate constructor so that it knows how | |
146 | to create an instance of this class. | |
147 | ||
148 | If you do not wish to use the wxWidgets method of creating view objects | |
149 | dynamically, you must override wxDocTemplate::CreateView to return an instance | |
150 | of the appropriate class. | |
151 | ||
152 | ||
153 | ||
154 | @section overview_docview_wxdoctemplate wxDocTemplate Overview | |
155 | ||
156 | The wxDocTemplate class is used to model the relationship between a document | |
157 | class and a view class. The application creates a document template object for | |
158 | each document/view pair. The list of document templates managed by the | |
159 | wxDocManager instance is used to create documents and views. Each document | |
160 | template knows what file filters and default extension are appropriate for a | |
161 | document/view combination, and how to create a document or view. | |
162 | ||
163 | For example, you might write a small doodling application that can load and | |
164 | save lists of line segments. If you had two views of the data -- graphical, and | |
165 | a list of the segments -- then you would create one document class | |
166 | DoodleDocument, and two view classes (DoodleGraphicView and DoodleListView). | |
167 | You would also need two document templates, one for the graphical view and | |
168 | another for the list view. You would pass the same document class and default | |
169 | file extension to both document templates, but each would be passed a different | |
170 | view class. When the user clicks on the Open menu item, the file selector is | |
171 | displayed with a list of possible file filters -- one for each wxDocTemplate. | |
172 | Selecting the filter selects the wxDocTemplate, and when a file is selected, | |
173 | that template will be used for creating a document and view. | |
d54cf7ff | 174 | |
928f1a07 FM |
175 | For the case where an application has one document type and one view type, |
176 | a single document template is constructed, and dialogs will be appropriately | |
177 | simplified. | |
d54cf7ff | 178 | |
928f1a07 FM |
179 | wxDocTemplate is part of the document/view framework supported by wxWidgets, |
180 | and cooperates with the wxView, wxDocument and wxDocManager classes. | |
d54cf7ff | 181 | |
928f1a07 | 182 | See the example application in @c samples/docview. |
d54cf7ff | 183 | |
ce154616 BP |
184 | To use the wxDocTemplate class, you do not need to derive a new class. Just |
185 | pass relevant information to the constructor including | |
186 | CLASSINFO(YourDocumentClass) and CLASSINFO(YourViewClass) to allow dynamic | |
187 | instance creation. | |
d54cf7ff | 188 | |
928f1a07 FM |
189 | If you do not wish to use the wxWidgets method of creating document |
190 | objects dynamically, you must override wxDocTemplate::CreateDocument | |
191 | and wxDocTemplate::CreateView to return instances of the appropriate class. | |
36c9828f | 192 | |
928f1a07 | 193 | @note The document template has nothing to do with the C++ template construct. |
d54cf7ff FM |
194 | |
195 | ||
196 | ||
ce154616 | 197 | @section overview_docview_wxdocmanager wxDocManager Overview |
d54cf7ff | 198 | |
ce154616 BP |
199 | The wxDocManager class is part of the document/view framework supported by |
200 | wxWidgets, and cooperates with the wxView, wxDocument and wxDocTemplate | |
201 | classes. | |
d54cf7ff | 202 | |
ce154616 BP |
203 | A wxDocManager instance coordinates documents, views and document templates. It |
204 | keeps a list of document and template instances, and much functionality is | |
205 | routed through this object, such as providing selection and file dialogs. The | |
206 | application can use this class 'as is' or derive a class and override some | |
207 | members to extend or change the functionality. | |
d54cf7ff | 208 | |
ce154616 BP |
209 | Create an instance of this class near the beginning of your application |
210 | initialization, before any documents, views or templates are manipulated. | |
36c9828f | 211 | |
ce154616 BP |
212 | There may be multiple wxDocManager instances in an application. See the example |
213 | application in @c samples/docview. | |
36c9828f | 214 | |
d54cf7ff | 215 | |
a7c0de8a VZ |
216 | @section overview_docview_events Event Propagation in Document/View framework |
217 | ||
218 | While wxDocument, wxDocManager and wxView are abstract objects, with which the | |
219 | user can't interact directly, all of them derive from wxEvtHandler class and | |
220 | can handle events arising in the windows showing the document with which the | |
221 | user does interact. This is implemented by adding additional steps to the event | |
222 | handling process described in @ref overview_events_processing, so the full list | |
223 | of the handlers searched for an event occurring directly in wxDocChildFrame is: | |
224 | <ol> | |
225 | <li>wxDocument opened in this frame.</li> | |
226 | <li>wxView shown in this frame.</li> | |
227 | <li>wxDocManager associated with the parent wxDocParentFrame.</li> | |
228 | <li>wxDocChildFrame itself.</li> | |
229 | <li>wxDocParentFrame, as per the usual event bubbling up to parent rules.</li> | |
230 | <li>wxApp, again as the usual fallback for all events.</li> | |
231 | </ol> | |
232 | ||
233 | This is mostly useful to define handlers for some menu commands directly in | |
234 | wxDocument or wxView and is also used by the framework itself to define the | |
235 | handlers for several standard commands, such as wxID_NEW or wxID_SAVE, in | |
236 | wxDocManager itself. Notice that due to the order of the event handler search | |
237 | detailed above, the handling of these commands can @e not be overridden at | |
238 | wxDocParentFrame level but must be done at the level of wxDocManager itself. | |
239 | ||
d54cf7ff | 240 | |
ce154616 | 241 | @section overview_docview_wxcommand wxCommand Overview |
d54cf7ff | 242 | |
ce154616 BP |
243 | wxCommand is a base class for modelling an application command, which is an |
244 | action usually performed by selecting a menu item, pressing a toolbar button or | |
245 | any other means provided by the application to change the data or view. | |
d54cf7ff | 246 | |
ce154616 BP |
247 | Instead of the application functionality being scattered around switch |
248 | statements and functions in a way that may be hard to read and maintain, the | |
249 | functionality for a command is explicitly represented as an object which can be | |
250 | manipulated by a framework or application. | |
d54cf7ff | 251 | |
ce154616 BP |
252 | When a user interface event occurs, the application @e submits a command to a |
253 | wxCommandProcessor object to execute and store. | |
d54cf7ff | 254 | |
ce154616 BP |
255 | The wxWidgets document/view framework handles Undo and Redo by use of wxCommand |
256 | and wxCommandProcessor objects. You might find further uses for wxCommand, such | |
257 | as implementing a macro facility that stores, loads and replays commands. | |
d54cf7ff | 258 | |
928f1a07 FM |
259 | An application can derive a new class for every command, or, more likely, use |
260 | one class parameterized with an integer or string command identifier. | |
36c9828f | 261 | |
36c9828f | 262 | |
d54cf7ff | 263 | |
ce154616 | 264 | @section overview_docview_wxcommandproc wxCommandProcessor Overview |
d54cf7ff | 265 | |
ce154616 BP |
266 | wxCommandProcessor is a class that maintains a history of wxCommand instances, |
267 | with undo/redo functionality built-in. Derive a new class from this if you want | |
268 | different behaviour. | |
36c9828f | 269 | |
36c9828f | 270 | |
d54cf7ff | 271 | |
ce154616 | 272 | @section overview_docview_filehistory wxFileHistory Overview |
d54cf7ff | 273 | |
ce154616 BP |
274 | wxFileHistory encapsulates functionality to record the last few files visited, |
275 | and to allow the user to quickly load these files using the list appended to | |
276 | the File menu. Although wxFileHistory is used by wxDocManager, it can be used | |
277 | independently. You may wish to derive from it to allow different behaviour, | |
278 | such as popping up a scrolling list of files. | |
d54cf7ff | 279 | |
ce154616 BP |
280 | By calling wxFileHistory::UseMenu() you can associate a file menu with the file |
281 | history. The menu will then be used for appending filenames that are added to | |
282 | the history. | |
d54cf7ff | 283 | |
ce154616 BP |
284 | Please notice that currently if the history already contained filenames when |
285 | UseMenu() is called (e.g. when initializing a second MDI child frame), the menu | |
286 | is not automatically initialized with the existing filenames in the history and | |
287 | so you need to call wxFileHistory::AddFilesToMenu() after UseMenu() explicitly | |
288 | in order to initialize the menu with the existing list of MRU files (otherwise | |
289 | an assertion failure is raised in debug builds). | |
d54cf7ff | 290 | |
ce154616 BP |
291 | The filenames are appended using menu identifiers in the range @c wxID_FILE1 to |
292 | @c wxID_FILE9. | |
d54cf7ff | 293 | |
ce154616 BP |
294 | In order to respond to a file load command from one of these identifiers, you |
295 | need to handle them using an event handler, for example: | |
36c9828f | 296 | |
928f1a07 FM |
297 | @code |
298 | BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame) | |
299 | EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit) | |
300 | EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocParentFrame::OnMRUFile) | |
301 | END_EVENT_TABLE() | |
36c9828f | 302 | |
928f1a07 FM |
303 | void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event)) |
304 | { | |
305 | Close(); | |
306 | } | |
36c9828f | 307 | |
928f1a07 FM |
308 | void wxDocParentFrame::OnMRUFile(wxCommandEvent& event) |
309 | { | |
310 | wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1)); | |
311 | if (!f.empty()) | |
312 | (void)m_docManager-CreateDocument(f, wxDOC_SILENT); | |
313 | } | |
314 | @endcode | |
36c9828f FM |
315 | |
316 | ||
317 | ||
ce154616 | 318 | @section overview_docview_predefid Predefined Command Identifiers |
36c9828f | 319 | |
ce154616 BP |
320 | To allow communication between the application's menus and the document/view |
321 | framework, several command identifiers are predefined for you to use in menus. | |
36c9828f | 322 | |
928f1a07 FM |
323 | @verbatim |
324 | wxID_OPEN (5000) | |
325 | wxID_CLOSE (5001) | |
326 | wxID_NEW (5002) | |
327 | wxID_SAVE (5003) | |
328 | wxID_SAVEAS (5004) | |
329 | wxID_REVERT (5005) | |
330 | wxID_EXIT (5006) | |
331 | wxID_UNDO (5007) | |
332 | wxID_REDO (5008) | |
333 | wxID_HELP (5009) | |
334 | wxID_PRINT (5010) | |
335 | wxID_PRINT_SETUP (5011) | |
336 | wxID_PREVIEW (5012) | |
337 | @endverbatim | |
36c9828f | 338 | |
d54cf7ff | 339 | */ |