]> git.saurik.com Git - wxWidgets.git/blame - docs/latex/wx/tdocview.tex
whilst -> while
[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
14186b44 38you initialize a view. Create menus using standard menu ids (such as wxID\_OPEN, wxID\_PRINT).
a660d684
KB
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
fc2171bd 62the wxWidgets \helpref{predefined command identifiers}{predefinedids} in your menus.
a660d684 63
762e1997
MB
64\perlnote{The document/view framework is available in wxPerl. To use it,
65you will need the following statements in your application code:\par
66{\small
67\begin{verbatim}
68use Wx::DocView;
69use Wx ':docview'; # import constants (optional)
70\end{verbatim}
71}}
72
a660d684
KB
73\subsection{wxDocument overview}\label{wxdocumentoverview}
74
75\overview{Document/view framework overview}{docviewoverview}
76
77Class: \helpref{wxDocument}{wxdocument}
78
79The wxDocument class can be used to model an application's file-based
fc2171bd 80data. It is part of the document/view framework supported by wxWidgets,
a660d684
KB
81and cooperates with the \helpref{wxView}{wxview}, \helpref{wxDocTemplate}{wxdoctemplate}\rtfsp
82and \helpref{wxDocManager}{wxdocmanager} classes.
83
84Using this framework can save a lot of routine user-interface programming,
85since a range of menu commands -- such as open, save, save as -- are supported automatically.
86The programmer just needs to define a minimal set of classes and member functions
87for the framework to call when necessary. Data, and the means to view and edit
88the data, are explicitly separated out in this model, and the concept of multiple {\it views} onto
89the same data is supported.
90
91Note that the document/view model will suit many but not all styles of application.
92For example, it would be overkill for a simple file conversion utility, where there
93may be no call for {\it views} on {\it documents} or the ability to open, edit and save
94files. But probably the majority of applications are document-based.
95
96See the example application in {\tt samples/docview}.
97
98To use the abstract wxDocument class, you need to derive a new class and override
99at least the member functions SaveObject and LoadObject. SaveObject and
100LoadObject will be called by the framework when the document needs to be saved
101or loaded.
102
103Use the macros DECLARE\_DYNAMIC\_CLASS and IMPLEMENT\_DYNAMIC\_CLASS in order
104to allow the framework to create document objects on demand. When you create
105a \helpref{wxDocTemplate}{wxdoctemplate} object on application initialization, you
106should pass CLASSINFO(YourDocumentClass) to the wxDocTemplate constructor
107so that it knows how to create an instance of this class.
108
fc2171bd 109If you do not wish to use the wxWidgets method of creating document
a660d684
KB
110objects dynamically, you must override wxDocTemplate::CreateDocument
111to return an instance of the appropriate class.
112
113\subsection{wxView overview}\label{wxviewoverview}
114
115\overview{Document/view framework overview}{docviewoverview}
116
117Class: \helpref{wxView}{wxview}
118
119The wxView class can be used to model the viewing and editing component of
fc2171bd 120an application's file-based data. It is part of the document/view framework supported by wxWidgets,
a660d684
KB
121and cooperates with the \helpref{wxDocument}{wxdocument}, \helpref{wxDocTemplate}{wxdoctemplate}
122and \helpref{wxDocManager}{wxdocmanager} classes.
123
124See the example application in {\tt samples/docview}.
125
126To use the abstract wxView class, you need to derive a new class and override
f6bcfd97 127at least the member functions OnCreate, OnDraw, OnUpdate and OnClose. You will probably
a660d684
KB
128want to override OnMenuCommand to respond to menu commands from the frame containing the
129view.
130
131Use the macros DECLARE\_DYNAMIC\_CLASS and IMPLEMENT\_DYNAMIC\_CLASS in order
132to allow the framework to create view objects on demand. When you create
133a \helpref{wxDocTemplate}{wxdoctemplate} object on application initialization, you
134should pass CLASSINFO(YourViewClass) to the wxDocTemplate constructor
135so that it knows how to create an instance of this class.
136
fc2171bd 137If you do not wish to use the wxWidgets method of creating view
a660d684
KB
138objects dynamically, you must override wxDocTemplate::CreateView
139to return an instance of the appropriate class.
140
141\subsection{wxDocTemplate overview}\label{wxdoctemplateoverview}
142
143\overview{Document/view framework overview}{docviewoverview}
144
145Class: \helpref{wxDocTemplate}{wxdoctemplate}
146
147The wxDocTemplate class is used to model the relationship between a
148document class and a view class. The application creates a document
149template object for each document/view pair. The list of document
150templates managed by the wxDocManager instance is used to create
151documents and views. Each document template knows what file filters
152and default extension are appropriate for a document/view combination,
153and how to create a document or view.
154
155For example, you might write a small doodling application that can load
156and save lists of line segments. If you had two views of the data -- graphical,
157and a list of the segments -- then you would create one document class DoodleDocument,
158and two view classes (DoodleGraphicView and DoodleListView). You would also
159need two document templates, one for the graphical view and another for the
160list view. You would pass the same document class and default file extension to both
161document templates, but each would be passed a different view class. When
162the user clicks on the Open menu item, the file selector is displayed
163with a list of possible file filters -- one for each wxDocTemplate. Selecting
164the filter selects the wxDocTemplate, and when
165a file is selected, that template will be used for creating a document
166and view. Under non-Windows platforms, the user will be prompted for
167a list of templates before the file selector is shown, since most file selectors
168do not allow a choice of file filters.
169
170For the case where an application has one document type and one view type,
171a single document template is constructed, and dialogs will be appropriately
172simplified.
173
fc2171bd 174wxDocTemplate is part of the document/view framework supported by wxWidgets,
528e0faf 175and cooperates with the \helpref{wxView}{wxview}, \helpref{wxDocument}{wxdocument}
a660d684
KB
176and \helpref{wxDocManager}{wxdocmanager} classes.
177
178See the example application in {\tt samples/docview}.
179
180To use the wxDocTemplate class, you do not need to derive a new class.
181Just pass relevant information to the constructor including CLASSINFO(YourDocumentClass) and
182CLASSINFO(YourViewClass) to allow dynamic instance creation.
fc2171bd 183If you do not wish to use the wxWidgets method of creating document
a660d684
KB
184objects dynamically, you must override wxDocTemplate::CreateDocument
185and wxDocTemplate::CreateView to return instances of the appropriate class.
186
14186b44 187{\it NOTE}: the document template has nothing to do with the C++ template construct.
a660d684
KB
188
189\subsection{wxDocManager overview}\label{wxdocmanageroverview}
190
191\overview{Document/view framework overview}{docviewoverview}
192
193Class: \helpref{wxDocManager}{wxdocmanager}
194
fc2171bd 195The wxDocManager class is part of the document/view framework supported by wxWidgets,
a660d684
KB
196and cooperates with the \helpref{wxView}{wxview}, \helpref{wxDocument}{wxdocument}\rtfsp
197and \helpref{wxDocTemplate}{wxdoctemplate} classes.
198
f6bcfd97 199A wxDocManager instance coordinates documents, views and document templates. It keeps a list of document
a660d684
KB
200and template instances, and much functionality is routed through this object, such
201as providing selection and file dialogs. The application can use this class `as is' or
202derive a class and override some members to extend or change the functionality.
203Create an instance of this class near the beginning of your application initialization,
204before any documents, views or templates are manipulated.
205
206There may be multiple wxDocManager instances in an application.
207
208See the example application in {\tt samples/docview}.
209
210\subsection{wxCommand overview}\label{wxcommandoverview}
211
212\overview{Document/view framework overview}{docviewoverview}
213
214Classes: \helpref{wxCommand}{wxcommand}, \helpref{wxCommandProcessor}{wxcommandprocessor}
215
216wxCommand is a base class for modelling an application command,
217which is an action usually performed by selecting a menu item, pressing
218a toolbar button or any other means provided by the application to
219change the data or view.
220
221Instead of the application functionality being scattered around
222switch statements and functions in a way that may be hard to
223read and maintain, the functionality for a command is explicitly represented
224as an object which can be manipulated by a framework or application.
225When a user interface event occurs, the application {\it submits} a command
226to a \helpref{wxCommandProcessor}{wxcommandprocessoroverview} object to execute and
227store.
228
fc2171bd 229The wxWidgets document/view framework handles Undo and Redo by use of
a660d684
KB
230wxCommand and wxCommandProcessor objects. You might find further uses
231for wxCommand, such as implementing a macro facility that stores, loads
232and replays commands.
233
234An application can derive a new class for every command, or, more likely, use
235one class parameterized with an integer or string command identifier.
236
237\subsection{wxCommandProcessor overview}\label{wxcommandprocessoroverview}
238
239\overview{Document/view framework overview}{docviewoverview}
240
241Classes: \helpref{wxCommandProcessor}{wxcommandprocessor}, \helpref{wxCommand}{wxcommand}
242
243wxCommandProcessor is a class that maintains a history of wxCommand
244instances, with undo/redo functionality built-in. Derive a new class from this
245if you want different behaviour.
246
247\subsection{wxFileHistory overview}\label{wxfilehistoryoverview}
248
249\overview{Document/view framework overview}{docviewoverview}
250
251Classes: \helpref{wxFileHistory}{wxfilehistory}, \helpref{wxDocManager}{wxdocmanager}
252
253wxFileHistory encapsulates functionality to record the last few files visited, and
254to allow the user to quickly load these files using the list appended to the File menu.
255
256Although wxFileHistory is used by wxDocManager, it can be used independently. You may wish
257to derive from it to allow different behaviour, such as popping up a scrolling
258list of files.
259
260By calling wxFileHistory::FileHistoryUseMenu you can associate a file menu with
261the file history, that will be used for appending the filenames. They are
262appended using menu identifiers in the range wxID\_FILE1 to wxID\_FILE9.
263
264In order to respond to a file load command from one of these identifiers,
f7bd2698 265you need to handle them using an event handler, for example:
a660d684 266
f7bd2698 267{\small
a660d684 268\begin{verbatim}
f7bd2698
JS
269BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame)
270 EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit)
271 EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocParentFrame::OnMRUFile)
272END_EVENT_TABLE()
273
274void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event))
a660d684 275{
f7bd2698
JS
276 Close();
277}
278
279void wxDocParentFrame::OnMRUFile(wxCommandEvent& event)
280{
2edb0bde 281 wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1));
f7bd2698
JS
282 if (f != "")
283 (void)m_docManager->CreateDocument(f, wxDOC_SILENT);
a660d684
KB
284}
285\end{verbatim}
f7bd2698 286}
a660d684 287
fc2171bd 288\subsection{wxWidgets predefined command identifiers}\label{predefinedids}
a660d684
KB
289
290To allow communication between the application's menus and the
291document/view framework, several command identifiers are predefined for you
292to use in menus. The framework recognizes them and processes them if you
293forward commands from wxFrame::OnMenuCommand (or perhaps from toolbars and
294other user interface constructs).
295
296\begin{itemize}\itemsep=0pt
297\item wxID\_OPEN (5000)
298\item wxID\_CLOSE (5001)
299\item wxID\_NEW (5002)
300\item wxID\_SAVE (5003)
301\item wxID\_SAVEAS (5004)
302\item wxID\_REVERT (5005)
303\item wxID\_EXIT (5006)
304\item wxID\_UNDO (5007)
305\item wxID\_REDO (5008)
306\item wxID\_HELP (5009)
307\item wxID\_PRINT (5010)
308\item wxID\_PRINT\_SETUP (5011)
309\item wxID\_PREVIEW (5012)
310\end{itemize}
311
312