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