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