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