PageRenderTime 59ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/ExtLibs/wxWidgets/docs/doxygen/overviews/docview.h

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