]> git.saurik.com Git - wxWidgets.git/blob - docs/latex/wx/tdocview.tex
added link to wxFileHistory
[wxWidgets.git] / docs / latex / wx / tdocview.tex
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},
5 \rtfsp\helpref{wxDocMDIParentFrame}{wxdocmdiparentframe}, \helpref{wxDocMDIChildFrame}{wxdocmdichildframe},
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
31 (such as a scrolled window) that are needed for the view(s). You may need to route some events
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
38 you initialize a view. Create menus using standard menu ids (such as wxID\_OPEN, wxID\_PRINT).
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
62 the wxWidgets \helpref{predefined command identifiers}{predefinedids} in your menus.
63
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
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
80 data. It is part of the document/view framework supported by wxWidgets,
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
109 If you do not wish to use the wxWidgets method of creating document
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
120 an application's file-based data. It is part of the document/view framework supported by wxWidgets,
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
127 at least the member functions OnCreate, OnDraw, OnUpdate and OnClose. You will probably
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
137 If you do not wish to use the wxWidgets method of creating view
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
166 and view.
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
172 wxDocTemplate is part of the document/view framework supported by wxWidgets,
173 and cooperates with the \helpref{wxView}{wxview}, \helpref{wxDocument}{wxdocument}
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.
181 If you do not wish to use the wxWidgets method of creating document
182 objects dynamically, you must override wxDocTemplate::CreateDocument
183 and wxDocTemplate::CreateView to return instances of the appropriate class.
184
185 {\it NOTE}: the document template has nothing to do with the C++ template construct.
186
187 \subsection{wxDocManager overview}\label{wxdocmanageroverview}
188
189 \overview{Document/view framework overview}{docviewoverview}
190
191 Class: \helpref{wxDocManager}{wxdocmanager}
192
193 The wxDocManager class is part of the document/view framework supported by wxWidgets,
194 and cooperates with the \helpref{wxView}{wxview}, \helpref{wxDocument}{wxdocument}\rtfsp
195 and \helpref{wxDocTemplate}{wxdoctemplate} classes.
196
197 A wxDocManager instance coordinates documents, views and document templates. It keeps a list of document
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
227 The wxWidgets document/view framework handles Undo and Redo by use of
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
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}.
269
270 In order to respond to a file load command from one of these identifiers,
271 you need to handle them using an event handler, for example:
272
273 {\small
274 \begin{verbatim}
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))
281 {
282 Close();
283 }
284
285 void wxDocParentFrame::OnMRUFile(wxCommandEvent& event)
286 {
287 wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1));
288 if (f != "")
289 (void)m_docManager->CreateDocument(f, wxDOC_SILENT);
290 }
291 \end{verbatim}
292 }
293
294 \subsection{wxWidgets predefined command identifiers}\label{predefinedids}
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