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