1 \section{Document/view overview
}\label{docviewoverview
}
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{wxCommand
}{wxcommand
},
\helpref{wxCommandProcessor
}{wxcommandprocessor
}
7 The
document/view framework is found in most application frameworks, because it
8 can dramatically simplify the code required to build many kinds of application.
10 The idea is that you can model your application primarily in terms of
{\it documents
} to store data
11 and provide interface-independent operations upon it, and
{\it views
} to visualise and manipulate
12 the data. Documents know how to do input and output given stream objects, and views are responsible
13 for taking input from physical windows and performing the manipulation on the
document data.
14 If a
document's data changes, all views should be updated to reflect the change.
16 The framework can provide many user-interface elements based on this model. Once you have defined
17 your own classes and the relationships between them, the framework takes care
18 of popping up file selectors, opening and closing files, asking the user to save
19 modifications, routing menu commands to appropriate (possibly default) code, even
20 some default print/preview functionality and support for command undo/redo.
21 The framework is highly modular, allowing overriding and replacement of functionality
22 and objects to achieve more than the default behaviour.
24 These are the overall steps involved in creating an application based on the
document/view framework:
26 \begin{enumerate
}\itemsep=
0pt
27 \item Define your own
document and view classes, overriding a minimal set of
28 member functions e.g. for input/output, drawing and initialization.
29 \item Define any subwindows
30 (such as a canvas) that are needed for the view(s). You may need to route some events
31 to views or documents, for example OnPaint needs to be routed to wxView::OnDraw.
32 \item Decide what style of interface you will use: Microsoft's MDI (multiple
33 document child frames surrounded by an overall frame), SDI (a separate, unconstrained frame
34 for each
document), or single-window (one
document open at a time, as in Windows Write).
35 \item Use the appropriate wxDocParentFrame and wxDocChildFrame classes. Construct an instance
36 of wxDocParentFrame in your wxApp::OnInit, and a wxDocChildFrame (if not single-window) when
37 you initialize a view. Create menus using standard menu ids (such as wxID
\_OPEN, wxID
\_PRINT),
38 routing non-application-specific identifiers to the base frame's OnMenuCommand.
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.
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.
49 Here are a few examples of the tailoring you can do to go beyond the default framework
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.
61 Note that to activate framework functionality, you need to use some or all of
62 the wxWindows
\helpref{predefined command identifiers
}{predefinedids
} in your menus.
64 \subsection{wxDocument overview
}\label{wxdocumentoverview
}
66 \overview{Document/view framework overview
}{docviewoverview
}
68 Class:
\helpref{wxDocument
}{wxdocument
}
70 The wxDocument class can be used to model an application's file-based
71 data. It is part of the
document/view framework supported by wxWindows,
72 and cooperates with the
\helpref{wxView
}{wxview
},
\helpref{wxDocTemplate
}{wxdoctemplate
}\rtfsp
73 and
\helpref{wxDocManager
}{wxdocmanager
} classes.
75 Using this framework can save a lot of routine user-interface programming,
76 since a range of menu commands -- such as open, save, save as -- are supported automatically.
77 The programmer just needs to define a minimal set of classes and member functions
78 for the framework to call when necessary. Data, and the means to view and edit
79 the data, are explicitly separated out in this model, and the concept of multiple
{\it views
} onto
80 the same data is supported.
82 Note that the
document/view model will suit many but not all styles of application.
83 For example, it would be overkill for a simple file conversion utility, where there
84 may be no call for
{\it views
} on
{\it documents
} or the ability to open, edit and save
85 files. But probably the majority of applications are
document-based.
87 See the example application in
{\tt samples/docview
}.
89 To use the abstract wxDocument class, you need to derive a new class and override
90 at least the member functions SaveObject and LoadObject. SaveObject and
91 LoadObject will be called by the framework when the
document needs to be saved
94 Use the macros DECLARE
\_DYNAMIC\_CLASS and IMPLEMENT
\_DYNAMIC\_CLASS in order
95 to allow the framework to create
document objects on demand. When you create
96 a
\helpref{wxDocTemplate
}{wxdoctemplate
} object on application initialization, you
97 should pass CLASSINFO(YourDocumentClass) to the wxDocTemplate constructor
98 so that it knows how to create an instance of this class.
100 If you do not wish to use the wxWindows method of creating
document
101 objects dynamically, you must override wxDocTemplate::CreateDocument
102 to return an instance of the appropriate class.
104 \subsection{wxView overview
}\label{wxviewoverview
}
106 \overview{Document/view framework overview
}{docviewoverview
}
108 Class:
\helpref{wxView
}{wxview
}
110 The wxView class can be used to model the viewing and editing component of
111 an application's file-based data. It is part of the
document/view framework supported by wxWindows,
112 and cooperates with the
\helpref{wxDocument
}{wxdocument
},
\helpref{wxDocTemplate
}{wxdoctemplate
}
113 and
\helpref{wxDocManager
}{wxdocmanager
} classes.
115 See the example application in
{\tt samples/docview
}.
117 To use the abstract wxView class, you need to derive a new class and override
118 at least the member functions OnCreate, OnDraw, OnUpdate and OnClose. You'll probably
119 want to override OnMenuCommand to respond to menu commands from the frame containing the
122 Use the macros DECLARE
\_DYNAMIC\_CLASS and IMPLEMENT
\_DYNAMIC\_CLASS in order
123 to allow the framework to create view objects on demand. When you create
124 a
\helpref{wxDocTemplate
}{wxdoctemplate
} object on application initialization, you
125 should pass CLASSINFO(YourViewClass) to the wxDocTemplate constructor
126 so that it knows how to create an instance of this class.
128 If you do not wish to use the wxWindows method of creating view
129 objects dynamically, you must override wxDocTemplate::CreateView
130 to return an instance of the appropriate class.
132 \subsection{wxDocTemplate overview
}\label{wxdoctemplateoverview
}
134 \overview{Document/view framework overview
}{docviewoverview
}
136 Class:
\helpref{wxDocTemplate
}{wxdoctemplate
}
138 The wxDocTemplate class is used to model the relationship between a
139 document class and a view class. The application creates a
document
140 template object for each
document/view pair. The list of
document
141 templates managed by the wxDocManager instance is used to create
142 documents and views. Each
document template knows what file filters
143 and default extension are appropriate for a
document/view combination,
144 and how to create a
document or view.
146 For example, you might write a small doodling application that can load
147 and save lists of line segments. If you had two views of the data -- graphical,
148 and a list of the segments -- then you would create one
document class DoodleDocument,
149 and two view classes (DoodleGraphicView and DoodleListView). You would also
150 need two
document templates, one for the graphical view and another for the
151 list view. You would pass the same
document class and default file extension to both
152 document templates, but each would be passed a different view class. When
153 the user clicks on the Open menu item, the file selector is displayed
154 with a list of possible file filters -- one for each wxDocTemplate. Selecting
155 the filter selects the wxDocTemplate, and when
156 a file is selected, that template will be used for creating a
document
157 and view. Under non-Windows platforms, the user will be prompted for
158 a list of templates before the file selector is shown, since most file selectors
159 do not allow a choice of file filters.
161 For the case where an application has one
document type and one view type,
162 a single
document template is constructed, and dialogs will be appropriately
165 wxDocTemplate is part of the
document/view framework supported by wxWindows,
166 and cooperates with the
\helpref{wxView
}{wxview
},
\helpref{wxDocument
}{wxdocument
}
167 and
\helpref{wxDocManager
}{wxdocmanager
} classes.
169 See the example application in
{\tt samples/docview
}.
171 To use the wxDocTemplate class, you do not need to derive a new class.
172 Just pass relevant information to the constructor including CLASSINFO(YourDocumentClass) and
173 CLASSINFO(YourViewClass) to allow dynamic instance creation.
174 If you do not wish to use the wxWindows method of creating
document
175 objects dynamically, you must override wxDocTemplate::CreateDocument
176 and wxDocTemplate::CreateView to return instances of the appropriate class.
178 {\it NOTE
}: the
document template has nothing to do with the C++ template construct. C++
179 templates are not used anywhere in wxWindows.
181 \subsection{wxDocManager overview
}\label{wxdocmanageroverview
}
183 \overview{Document/view framework overview
}{docviewoverview
}
185 Class:
\helpref{wxDocManager
}{wxdocmanager
}
187 The wxDocManager class is part of the
document/view framework supported by wxWindows,
188 and cooperates with the
\helpref{wxView
}{wxview
},
\helpref{wxDocument
}{wxdocument
}\rtfsp
189 and
\helpref{wxDocTemplate
}{wxdoctemplate
} classes.
191 A wxDocManager instance coordinates documents, views and
document templates. It keeps a list of
document and
192 and template instances, and much functionality is routed through this object, such
193 as providing selection and file dialogs. The application can use this class `as is' or
194 derive a class and override some members to extend or change the functionality.
195 Create an instance of this class near the beginning of your application initialization,
196 before any documents, views or templates are manipulated.
198 There may be multiple wxDocManager instances in an application.
200 See the example application in
{\tt samples/docview
}.
202 \subsection{wxCommand overview
}\label{wxcommandoverview
}
204 \overview{Document/view framework overview
}{docviewoverview
}
206 Classes:
\helpref{wxCommand
}{wxcommand
},
\helpref{wxCommandProcessor
}{wxcommandprocessor
}
208 wxCommand is a base class for modelling an application command,
209 which is an action usually performed by selecting a menu item, pressing
210 a toolbar button or any other means provided by the application to
211 change the data or view.
213 Instead of the application functionality being scattered around
214 switch statements and functions in a way that may be hard to
215 read and maintain, the functionality for a command is explicitly represented
216 as an object which can be manipulated by a framework or application.
217 When a user interface event occurs, the application
{\it submits
} a command
218 to a
\helpref{wxCommandProcessor
}{wxcommandprocessoroverview
} object to execute and
221 The wxWindows
document/view framework handles Undo and Redo by use of
222 wxCommand and wxCommandProcessor objects. You might find further uses
223 for wxCommand, such as implementing a macro facility that stores, loads
224 and replays commands.
226 An application can derive a new class for every command, or, more likely, use
227 one class parameterized with an integer or string command identifier.
229 \subsection{wxCommandProcessor overview
}\label{wxcommandprocessoroverview
}
231 \overview{Document/view framework overview
}{docviewoverview
}
233 Classes:
\helpref{wxCommandProcessor
}{wxcommandprocessor
},
\helpref{wxCommand
}{wxcommand
}
235 wxCommandProcessor is a class that maintains a history of wxCommand
236 instances, with undo/redo functionality built-in. Derive a new class from this
237 if you want different behaviour.
239 \subsection{wxFileHistory overview
}\label{wxfilehistoryoverview
}
241 \overview{Document/view framework overview
}{docviewoverview
}
243 Classes:
\helpref{wxFileHistory
}{wxfilehistory
},
\helpref{wxDocManager
}{wxdocmanager
}
245 wxFileHistory encapsulates functionality to record the last few files visited, and
246 to allow the user to quickly load these files using the list appended to the File menu.
248 Although wxFileHistory is used by wxDocManager, it can be used independently. You may wish
249 to derive from it to allow different behaviour, such as popping up a scrolling
252 By calling wxFileHistory::FileHistoryUseMenu you can associate a file menu with
253 the file history, that will be used for appending the filenames. They are
254 appended using menu identifiers in the range wxID
\_FILE1 to wxID
\_FILE9.
256 In order to respond to a file load command from one of these identifiers,
257 you need to handle them in your wxFrame::OnMenuCommand. Below is the
258 code used by the default
document/view parent frame.
261 void wxDocParentFrame::OnMenuCommand(int id)
267 if (GetEventHandler()->OnClose())
281 char *f = docManager->GetHistoryFile(id-wxID_FILE1);
283 (void)docManager->CreateDocument(f, wxDOC_SILENT);
288 docManager->OnMenuCommand(id);
294 \subsection{wxWindows predefined command identifiers
}\label{predefinedids
}
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).
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)