]> git.saurik.com Git - wxWidgets.git/blame - docs/doxygen/overviews/docview.h
Revert "Make wxMSW stack walking methods work with Unicode identifiers."
[wxWidgets.git] / docs / doxygen / overviews / docview.h
CommitLineData
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
14The document/view framework is found in most application frameworks, because it
15can dramatically simplify the code required to build many kinds of application.
16
ce154616
BP
17The idea is that you can model your application primarily in terms of
18@e documents to store data and provide interface-independent operations upon
19it, and @e views to visualise and manipulate the data. Documents know how to do
20input and output given stream objects, and views are responsible for taking
21input from physical windows and performing the manipulation on the document
22data.
928f1a07 23
ce154616
BP
24If a document's data changes, all views should be updated to reflect the
25change. The framework can provide many user-interface elements based on this
26model.
928f1a07 27
ce154616
BP
28Once you have defined your own classes and the relationships between them, the
29framework takes care of popping up file selectors, opening and closing files,
30asking the user to save modifications, routing menu commands to appropriate
31(possibly default) code, even some default print/preview functionality and
32support for command undo/redo.
928f1a07 33
ce154616
BP
34The framework is highly modular, allowing overriding and replacement of
35functionality and objects to achieve more than the default behaviour.
928f1a07
FM
36
37These are the overall steps involved in creating an application based on the
38document/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
58If you wish to implement Undo/Redo, you need to derive your own class(es) from
59wxCommand and use wxCommandProcessor::Submit instead of directly executing
60code. The framework will take care of calling Undo and Do functions as
61appropriate, so long as the wxID_UNDO and wxID_REDO menu items are defined in
62the view menu.
63
64Here are a few examples of the tailoring you can do to go beyond the default
65framework 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
76Note that to activate framework functionality, you need to use some or all of
77the wxWidgets @ref overview_docview_predefid in your menus.
36c9828f 78
928f1a07 79@beginWxPerlOnly
ce154616
BP
80The document/view framework is available in wxPerl. To use it, you will need
81the following statements in your application code:
36c9828f 82
ce154616 83@code{.pl}
928f1a07
FM
84use Wx::DocView;
85use 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
95The wxDocument class can be used to model an application's file-based data. It
96is part of the document/view framework supported by wxWidgets, and cooperates
97with the wxView, wxDocTemplate and wxDocManager classes. Using this framework
98can save a lot of routine user-interface programming, since a range of menu
99commands -- such as open, save, save as -- are supported automatically.
928f1a07 100
ce154616
BP
101The programmer just needs to define a minimal set of classes and member
102functions for the framework to call when necessary. Data, and the means to view
103and edit the data, are explicitly separated out in this model, and the concept
104of multiple @e views onto the same data is supported.
d54cf7ff 105
ce154616
BP
106Note that the document/view model will suit many but not all styles of
107application. For example, it would be overkill for a simple file conversion
108utility, where there may be no call for @e views on @e documents or the ability
109to open, edit and save files. But probably the majority of applications are
110document-based.
d54cf7ff 111
ce154616
BP
112See the example application in @c samples/docview. To use the abstract
113wxDocument class, you need to derive a new class and override at least the
114member functions SaveObject and LoadObject. SaveObject and LoadObject will be
115called by the framework when the document needs to be saved or loaded.
d54cf7ff 116
ce154616
BP
117Use the macros DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS in order to
118allow the framework to create document objects on demand. When you create a
119wxDocTemplate object on application initialization, you should pass
120CLASSINFO(YourDocumentClass) to the wxDocTemplate constructor so that it knows
121how to create an instance of this class.
d54cf7ff 122
ce154616
BP
123If you do not wish to use the wxWidgets method of creating document objects
124dynamically, you must override wxDocTemplate::CreateDocument to return an
125instance of the appropriate class.
36c9828f 126
36c9828f 127
d54cf7ff 128
ce154616 129@section overview_docview_wxview wxView Overview
d54cf7ff 130
ce154616
BP
131The wxView class can be used to model the viewing and editing component of an
132application's file-based data. It is part of the document/view framework
133supported by wxWidgets, and cooperates with the wxDocument, wxDocTemplate and
134wxDocManager classes.
d54cf7ff 135
928f1a07 136See the example application in @c samples/docview.
d54cf7ff 137
928f1a07 138To use the abstract wxView class, you need to derive a new class and override
ce154616
BP
139at least the member functions OnCreate, OnDraw, OnUpdate and OnClose. You will
140probably want to respond to menu commands from the frame containing the view.
141
142Use the macros DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS in order to
143allow the framework to create view objects on demand. When you create a
144wxDocTemplate object on application initialization, you should pass
145CLASSINFO(YourViewClass) to the wxDocTemplate constructor so that it knows how
146to create an instance of this class.
147
148If you do not wish to use the wxWidgets method of creating view objects
149dynamically, you must override wxDocTemplate::CreateView to return an instance
150of the appropriate class.
151
152
153
154@section overview_docview_wxdoctemplate wxDocTemplate Overview
155
156The wxDocTemplate class is used to model the relationship between a document
157class and a view class. The application creates a document template object for
158each document/view pair. The list of document templates managed by the
159wxDocManager instance is used to create documents and views. Each document
160template knows what file filters and default extension are appropriate for a
161document/view combination, and how to create a document or view.
162
163For example, you might write a small doodling application that can load and
164save lists of line segments. If you had two views of the data -- graphical, and
165a list of the segments -- then you would create one document class
166DoodleDocument, and two view classes (DoodleGraphicView and DoodleListView).
167You would also need two document templates, one for the graphical view and
168another for the list view. You would pass the same document class and default
169file extension to both document templates, but each would be passed a different
170view class. When the user clicks on the Open menu item, the file selector is
171displayed with a list of possible file filters -- one for each wxDocTemplate.
172Selecting the filter selects the wxDocTemplate, and when a file is selected,
173that template will be used for creating a document and view.
d54cf7ff 174
928f1a07
FM
175For the case where an application has one document type and one view type,
176a single document template is constructed, and dialogs will be appropriately
177simplified.
d54cf7ff 178
928f1a07
FM
179wxDocTemplate is part of the document/view framework supported by wxWidgets,
180and cooperates with the wxView, wxDocument and wxDocManager classes.
d54cf7ff 181
928f1a07 182See the example application in @c samples/docview.
d54cf7ff 183
ce154616
BP
184To use the wxDocTemplate class, you do not need to derive a new class. Just
185pass relevant information to the constructor including
186CLASSINFO(YourDocumentClass) and CLASSINFO(YourViewClass) to allow dynamic
187instance creation.
d54cf7ff 188
928f1a07
FM
189If you do not wish to use the wxWidgets method of creating document
190objects dynamically, you must override wxDocTemplate::CreateDocument
191and 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
199The wxDocManager class is part of the document/view framework supported by
200wxWidgets, and cooperates with the wxView, wxDocument and wxDocTemplate
201classes.
d54cf7ff 202
ce154616
BP
203A wxDocManager instance coordinates documents, views and document templates. It
204keeps a list of document and template instances, and much functionality is
205routed through this object, such as providing selection and file dialogs. The
206application can use this class 'as is' or derive a class and override some
207members to extend or change the functionality.
d54cf7ff 208
ce154616
BP
209Create an instance of this class near the beginning of your application
210initialization, before any documents, views or templates are manipulated.
36c9828f 211
ce154616
BP
212There may be multiple wxDocManager instances in an application. See the example
213application in @c samples/docview.
36c9828f 214
d54cf7ff 215
a7c0de8a
VZ
216@section overview_docview_events Event Propagation in Document/View framework
217
218While wxDocument, wxDocManager and wxView are abstract objects, with which the
219user can't interact directly, all of them derive from wxEvtHandler class and
220can handle events arising in the windows showing the document with which the
221user does interact. This is implemented by adding additional steps to the event
222handling process described in @ref overview_events_processing, so the full list
223of 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
233This is mostly useful to define handlers for some menu commands directly in
234wxDocument or wxView and is also used by the framework itself to define the
235handlers for several standard commands, such as wxID_NEW or wxID_SAVE, in
236wxDocManager itself. Notice that due to the order of the event handler search
237detailed above, the handling of these commands can @e not be overridden at
238wxDocParentFrame 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
243wxCommand is a base class for modelling an application command, which is an
244action usually performed by selecting a menu item, pressing a toolbar button or
245any other means provided by the application to change the data or view.
d54cf7ff 246
ce154616
BP
247Instead of the application functionality being scattered around switch
248statements and functions in a way that may be hard to read and maintain, the
249functionality for a command is explicitly represented as an object which can be
250manipulated by a framework or application.
d54cf7ff 251
ce154616
BP
252When a user interface event occurs, the application @e submits a command to a
253wxCommandProcessor object to execute and store.
d54cf7ff 254
ce154616
BP
255The wxWidgets document/view framework handles Undo and Redo by use of wxCommand
256and wxCommandProcessor objects. You might find further uses for wxCommand, such
257as implementing a macro facility that stores, loads and replays commands.
d54cf7ff 258
928f1a07
FM
259An application can derive a new class for every command, or, more likely, use
260one 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
266wxCommandProcessor is a class that maintains a history of wxCommand instances,
267with undo/redo functionality built-in. Derive a new class from this if you want
268different behaviour.
36c9828f 269
36c9828f 270
d54cf7ff 271
ce154616 272@section overview_docview_filehistory wxFileHistory Overview
d54cf7ff 273
ce154616
BP
274wxFileHistory encapsulates functionality to record the last few files visited,
275and to allow the user to quickly load these files using the list appended to
276the File menu. Although wxFileHistory is used by wxDocManager, it can be used
277independently. You may wish to derive from it to allow different behaviour,
278such as popping up a scrolling list of files.
d54cf7ff 279
ce154616
BP
280By calling wxFileHistory::UseMenu() you can associate a file menu with the file
281history. The menu will then be used for appending filenames that are added to
282the history.
d54cf7ff 283
ce154616
BP
284Please notice that currently if the history already contained filenames when
285UseMenu() is called (e.g. when initializing a second MDI child frame), the menu
286is not automatically initialized with the existing filenames in the history and
287so you need to call wxFileHistory::AddFilesToMenu() after UseMenu() explicitly
288in order to initialize the menu with the existing list of MRU files (otherwise
289an assertion failure is raised in debug builds).
d54cf7ff 290
ce154616
BP
291The filenames are appended using menu identifiers in the range @c wxID_FILE1 to
292@c wxID_FILE9.
d54cf7ff 293
ce154616
BP
294In order to respond to a file load command from one of these identifiers, you
295need to handle them using an event handler, for example:
36c9828f 296
928f1a07
FM
297@code
298BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame)
299 EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit)
300 EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocParentFrame::OnMRUFile)
301END_EVENT_TABLE()
36c9828f 302
928f1a07
FM
303void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event))
304{
305 Close();
306}
36c9828f 307
928f1a07
FM
308void 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
320To allow communication between the application's menus and the document/view
321framework, several command identifiers are predefined for you to use in menus.
36c9828f 322
928f1a07
FM
323@verbatim
324wxID_OPEN (5000)
325wxID_CLOSE (5001)
326wxID_NEW (5002)
327wxID_SAVE (5003)
328wxID_SAVEAS (5004)
329wxID_REVERT (5005)
330wxID_EXIT (5006)
331wxID_UNDO (5007)
332wxID_REDO (5008)
333wxID_HELP (5009)
334wxID_PRINT (5010)
335wxID_PRINT_SETUP (5011)
336wxID_PREVIEW (5012)
337@endverbatim
36c9828f 338
d54cf7ff 339*/