1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 %% Purpose: Document/view overview
4 %% Author: wxWidgets Team
8 %% Copyright: (c) wxWidgets Team
9 %% License: wxWindows license
10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
12 \section{Document/view overview
}\label{docviewoverview
}
14 Classes:
\helpref{wxDocument
}{wxdocument
},
\helpref{wxView
}{wxview
},
\helpref{wxDocTemplate
}{wxdoctemplate
},
\rtfsp
15 \helpref{wxDocManager
}{wxdocmanager
},
\helpref{wxDocParentFrame
}{wxdocparentframe
},
\helpref{wxDocChildFrame
}{wxdocchildframe
},
16 \rtfsp\helpref{wxDocMDIParentFrame
}{wxdocmdiparentframe
},
\helpref{wxDocMDIChildFrame
}{wxdocmdichildframe
},
17 \rtfsp\helpref{wxCommand
}{wxcommand
},
\helpref{wxCommandProcessor
}{wxcommandprocessor
}
19 The
document/view framework is found in most application frameworks, because it
20 can dramatically simplify the code required to build many kinds of application.
22 The idea is that you can model your application primarily in terms of
{\it documents
} to store data
23 and provide interface-independent operations upon it, and
{\it views
} to visualise and manipulate
24 the data. Documents know how to do input and output given stream objects, and views are responsible
25 for taking input from physical windows and performing the manipulation on the
document data.
26 If a
document's data changes, all views should be updated to reflect the change.
28 The framework can provide many user-interface elements based on this model. Once you have defined
29 your own classes and the relationships between them, the framework takes care
30 of popping up file selectors, opening and closing files, asking the user to save
31 modifications, routing menu commands to appropriate (possibly default) code, even
32 some default print/preview functionality and support for command undo/redo.
33 The framework is highly modular, allowing overriding and replacement of functionality
34 and objects to achieve more than the default behaviour.
36 These are the overall steps involved in creating an application based on the
document/view framework:
38 \begin{enumerate
}\itemsep=
0pt
39 \item Define your own
document and view classes, overriding a minimal set of
40 member functions e.g. for input/output, drawing and initialization.
41 \item Define any subwindows
42 (such as a scrolled window) that are needed for the view(s). You may need to route some events
43 to 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
45 document child frames surrounded by an overall frame), SDI (a separate, unconstrained frame
46 for 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
48 of wxDocParentFrame in your wxApp::OnInit, and a wxDocChildFrame (if not single-window) when
49 you initialize a view. Create menus using standard menu ids (such as wxID
\_OPEN, wxID
\_PRINT).
50 \item Construct a single wxDocManager instance at the beginning of your wxApp::OnInit, and then
51 as many wxDocTemplate instances as necessary to define relationships between documents and
52 views. For a simple application, there will be just one wxDocTemplate.
55 If you wish to implement Undo/Redo, you need to derive your own class(es) from wxCommand
56 and use wxCommandProcessor::Submit instead of directly executing code. The framework will
57 take care of calling Undo and Do functions as appropriate, so long as the wxID
\_UNDO and
58 wxID
\_REDO menu items are defined in the view menu.
60 Here are a few examples of the tailoring you can do to go beyond the default framework
63 \begin{itemize
}\itemsep=
0pt
64 \item Override wxDocument::OnCreateCommandProcessor to define a different Do/Undo strategy,
65 or a command history editor.
66 \item Override wxView::OnCreatePrintout to create an instance of a derived
\helpref{wxPrintout
}{wxprintout
}\rtfsp
67 class, 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.
72 Note that to activate framework functionality, you need to use some or all of
73 the wxWidgets
\helpref{predefined command identifiers
}{predefinedids
} in your menus.
75 \perlnote{The
document/view framework is available in wxPerl. To use it,
76 you will need the following statements in your application code:
\par
80 use Wx ':docview'; # import constants (optional)
84 \subsection{wxDocument overview
}\label{wxdocumentoverview
}
86 \overview{Document/view framework overview
}{docviewoverview
}
88 Class:
\helpref{wxDocument
}{wxdocument
}
90 The wxDocument class can be used to model an application's file-based
91 data. It is part of the
document/view framework supported by wxWidgets,
92 and cooperates with the
\helpref{wxView
}{wxview
},
\helpref{wxDocTemplate
}{wxdoctemplate
}\rtfsp
93 and
\helpref{wxDocManager
}{wxdocmanager
} classes.
95 Using this framework can save a lot of routine user-interface programming,
96 since a range of menu commands -- such as open, save, save as -- are supported automatically.
97 The programmer just needs to define a minimal set of classes and member functions
98 for the framework to call when necessary. Data, and the means to view and edit
99 the data, are explicitly separated out in this model, and the concept of multiple
{\it views
} onto
100 the same data is supported.
102 Note that the
document/view model will suit many but not all styles of application.
103 For example, it would be overkill for a simple file conversion utility, where there
104 may be no call for
{\it views
} on
{\it documents
} or the ability to open, edit and save
105 files. But probably the majority of applications are
document-based.
107 See the example application in
{\tt samples/docview
}.
109 To use the abstract wxDocument class, you need to derive a new class and override
110 at least the member functions SaveObject and LoadObject. SaveObject and
111 LoadObject will be called by the framework when the
document needs to be saved
114 Use the macros DECLARE
\_DYNAMIC\_CLASS and IMPLEMENT
\_DYNAMIC\_CLASS in order
115 to allow the framework to create
document objects on demand. When you create
116 a
\helpref{wxDocTemplate
}{wxdoctemplate
} object on application initialization, you
117 should pass CLASSINFO(YourDocumentClass) to the wxDocTemplate constructor
118 so that it knows how to create an instance of this class.
120 If you do not wish to use the wxWidgets method of creating
document
121 objects dynamically, you must override wxDocTemplate::CreateDocument
122 to return an instance of the appropriate class.
124 \subsection{wxView overview
}\label{wxviewoverview
}
126 \overview{Document/view framework overview
}{docviewoverview
}
128 Class:
\helpref{wxView
}{wxview
}
130 The wxView class can be used to model the viewing and editing component of
131 an application's file-based data. It is part of the
document/view framework supported by wxWidgets,
132 and cooperates with the
\helpref{wxDocument
}{wxdocument
},
\helpref{wxDocTemplate
}{wxdoctemplate
}
133 and
\helpref{wxDocManager
}{wxdocmanager
} classes.
135 See the example application in
{\tt samples/docview
}.
137 To use the abstract wxView class, you need to derive a new class and override
138 at least the member functions OnCreate, OnDraw, OnUpdate and OnClose. You will probably
139 want to respond to menu commands from the frame containing the view.
141 Use the macros DECLARE
\_DYNAMIC\_CLASS and IMPLEMENT
\_DYNAMIC\_CLASS in order
142 to allow the framework to create view objects on demand. When you create
143 a
\helpref{wxDocTemplate
}{wxdoctemplate
} object on application initialization, you
144 should pass CLASSINFO(YourViewClass) to the wxDocTemplate constructor
145 so that it knows how to create an instance of this class.
147 If you do not wish to use the wxWidgets method of creating view
148 objects dynamically, you must override wxDocTemplate::CreateView
149 to return an instance of the appropriate class.
151 \subsection{wxDocTemplate overview
}\label{wxdoctemplateoverview
}
153 \overview{Document/view framework overview
}{docviewoverview
}
155 Class:
\helpref{wxDocTemplate
}{wxdoctemplate
}
157 The wxDocTemplate class is used to model the relationship between a
158 document class and a view class. The application creates a
document
159 template object for each
document/view pair. The list of
document
160 templates managed by the wxDocManager instance is used to create
161 documents and views. Each
document template knows what file filters
162 and default extension are appropriate for a
document/view combination,
163 and how to create a
document or view.
165 For example, you might write a small doodling application that can load
166 and save lists of line segments. If you had two views of the data -- graphical,
167 and a list of the segments -- then you would create one
document class DoodleDocument,
168 and two view classes (DoodleGraphicView and DoodleListView). You would also
169 need two
document templates, one for the graphical view and another for the
170 list view. You would pass the same
document class and default file extension to both
171 document templates, but each would be passed a different view class. When
172 the user clicks on the Open menu item, the file selector is displayed
173 with a list of possible file filters -- one for each wxDocTemplate. Selecting
174 the filter selects the wxDocTemplate, and when
175 a file is selected, that template will be used for creating a
document
178 For the case where an application has one
document type and one view type,
179 a single
document template is constructed, and dialogs will be appropriately
182 wxDocTemplate is part of the
document/view framework supported by wxWidgets,
183 and cooperates with the
\helpref{wxView
}{wxview
},
\helpref{wxDocument
}{wxdocument
}
184 and
\helpref{wxDocManager
}{wxdocmanager
} classes.
186 See the example application in
{\tt samples/docview
}.
188 To use the wxDocTemplate class, you do not need to derive a new class.
189 Just pass relevant information to the constructor including CLASSINFO(YourDocumentClass) and
190 CLASSINFO(YourViewClass) to allow dynamic instance creation.
191 If you do not wish to use the wxWidgets method of creating
document
192 objects dynamically, you must override wxDocTemplate::CreateDocument
193 and wxDocTemplate::CreateView to return instances of the appropriate class.
195 {\it NOTE
}: the
document template has nothing to do with the C++ template construct.
197 \subsection{wxDocManager overview
}\label{wxdocmanageroverview
}
199 \overview{Document/view framework overview
}{docviewoverview
}
201 Class:
\helpref{wxDocManager
}{wxdocmanager
}
203 The wxDocManager class is part of the
document/view framework supported by wxWidgets,
204 and cooperates with the
\helpref{wxView
}{wxview
},
\helpref{wxDocument
}{wxdocument
}\rtfsp
205 and
\helpref{wxDocTemplate
}{wxdoctemplate
} classes.
207 A wxDocManager instance coordinates documents, views and
document templates. It keeps a list of
document
208 and template instances, and much functionality is routed through this object, such
209 as providing selection and file dialogs. The application can use this class `as is' or
210 derive a class and override some members to extend or change the functionality.
211 Create an instance of this class near the beginning of your application initialization,
212 before any documents, views or templates are manipulated.
214 There may be multiple wxDocManager instances in an application.
216 See the example application in
{\tt samples/docview
}.
218 \subsection{wxCommand overview
}\label{wxcommandoverview
}
220 \overview{Document/view framework overview
}{docviewoverview
}
222 Classes:
\helpref{wxCommand
}{wxcommand
},
\helpref{wxCommandProcessor
}{wxcommandprocessor
}
224 wxCommand is a base class for modelling an application command,
225 which is an action usually performed by selecting a menu item, pressing
226 a toolbar button or any other means provided by the application to
227 change the data or view.
229 Instead of the application functionality being scattered around
230 switch statements and functions in a way that may be hard to
231 read and maintain, the functionality for a command is explicitly represented
232 as an object which can be manipulated by a framework or application.
233 When a user interface event occurs, the application
{\it submits
} a command
234 to a
\helpref{wxCommandProcessor
}{wxcommandprocessoroverview
} object to execute and
237 The wxWidgets
document/view framework handles Undo and Redo by use of
238 wxCommand and wxCommandProcessor objects. You might find further uses
239 for wxCommand, such as implementing a macro facility that stores, loads
240 and replays commands.
242 An application can derive a new class for every command, or, more likely, use
243 one class parameterized with an integer or string command identifier.
245 \subsection{wxCommandProcessor overview
}\label{wxcommandprocessoroverview
}
247 \overview{Document/view framework overview
}{docviewoverview
}
249 Classes:
\helpref{wxCommandProcessor
}{wxcommandprocessor
},
\helpref{wxCommand
}{wxcommand
}
251 wxCommandProcessor is a class that maintains a history of wxCommand
252 instances, with undo/redo functionality built-in. Derive a new class from this
253 if you want different behaviour.
255 \subsection{wxFileHistory overview
}\label{wxfilehistoryoverview
}
257 \overview{Document/view framework overview
}{docviewoverview
}
259 Classes:
\helpref{wxFileHistory
}{wxfilehistory
},
\helpref{wxDocManager
}{wxdocmanager
}
261 wxFileHistory encapsulates functionality to record the last few files visited, and
262 to allow the user to quickly load these files using the list appended to the File menu.
264 Although wxFileHistory is used by wxDocManager, it can be used independently. You may wish
265 to derive from it to allow different behaviour, such as popping up a scrolling
268 By calling
\helpref{wxFileHistory::UseMenu()
}{wxfilehistoryusemenu
} you can
269 associate a file menu with the file history. The menu will then be used for
270 appending filenames that are added to the history. Please notice that currently
271 if the history already contained filenames when UseMenu() is called (e.g. when
272 initializing a second MDI child frame), the menu is not automatically
273 initialized with the existing filenames in the history and so you need to call
274 \helpref{AddFilesToMenu()
}{wxfilehistoryaddfilestomenu
} after UseMenu()
275 explicitly in order to initialize the menu with the existing list of MRU files.
276 (otherwise an assertion failure is raised in debug builds).
277 The filenames are appended using menu identifiers in the range
278 \texttt{wxID
\_FILE1} to
\texttt{wxID
\_FILE9}.
280 In order to respond to a file load command from one of these identifiers,
281 you need to handle them using an event handler, for example:
285 BEGIN_EVENT_TABLE(wxDocParentFrame, wxFrame)
286 EVT_MENU(wxID_EXIT, wxDocParentFrame::OnExit)
287 EVT_MENU_RANGE(wxID_FILE1, wxID_FILE9, wxDocParentFrame::OnMRUFile)
290 void wxDocParentFrame::OnExit(wxCommandEvent& WXUNUSED(event))
295 void wxDocParentFrame::OnMRUFile(wxCommandEvent& event)
297 wxString f(m_docManager->GetHistoryFile(event.GetId() - wxID_FILE1));
299 (void)m_docManager->CreateDocument(f, wxDOC_SILENT);
304 \subsection{wxWidgets predefined command identifiers
}\label{predefinedids
}
306 To allow communication between the application's menus and the
307 document/view framework, several command identifiers are predefined for you
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)