git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			98 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \chapter{Technical notes}\label{technotes}
 | |
| \setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
 | |
| \setfooter{\thepage}{}{}{}{}{\thepage}%
 | |
| 
 | |
| \section{Overview}
 | |
| 
 | |
| The dialog editor is written as a library, to be invoked by other programs. As you can see,
 | |
| dialoged.cc is a very small program which invokes the main window via a wxResourceManager
 | |
| object. The wxResourceManager object controls the user interface and other aspects
 | |
| of the dialog editor.
 | |
| 
 | |
| There is wxResourceTable object in wxResourceManager: this contains a list of
 | |
| all the wxItemResources currently being edited. wxResourceTable and wxItemResource
 | |
| are classes already in wxWindows, defined in wx\_res.h. In order to edit a new
 | |
| dialog box, the dialog is created, and the existing event handler is temporarily replaced
 | |
| with a new one which defines editing functionality. This allows existing dialogs - even
 | |
| instances of subclasses of wxDialogBox - to be edited, the application-specific functionality
 | |
| being temporarily taken over by the dialog editor.
 | |
| 
 | |
| In order to edit the properties of a dialog box or item, a property list editor is invoked.
 | |
| This uses the property classes from utils/wxprop. In order to map between properties and the
 | |
| actual window API, such as SetSize and GetSize, a `proxy' class called wxPropertyInfo
 | |
| has been defined, with a subclass for each class of wxWindows window to be edited.
 | |
| This class defines the main members SetProperty, GetProperty, GetPropertyNames,
 | |
| which transform the normal API into `property' terms.
 | |
| 
 | |
| Properties are mostly extracted directly from the window being edited. This is
 | |
| in contrast with wxBuilder, where everything is stored in a set of parallel
 | |
| data structures, and windows `properties' only only set. However, there
 | |
| are exceptions to this rule in the dialog editor. There {\it is} in fact a set of
 | |
| parallel objects, the wxItemResource objects which can be seen listed in
 | |
| the main Dialog Editor window as a dialog is built up. These usually parallel
 | |
| the properties in the windows, but occasionally this is not possible. For example,
 | |
| all dialog boxes being edited must be modeless: or the user would not be
 | |
| able to access other windows. However, the user must be able to specify that
 | |
| when used in an application, that dialog box will be modal. In this case,
 | |
| the value in the wxItemResource will not match that in the actual dialog box.
 | |
| 
 | |
| There is a major problem with taking values directly from the windows: this
 | |
| information sometimes does not match what went in. In Motif and XView,
 | |
| size values returned are not the same as those given. This causes speedy
 | |
| `degeneration' of window properties. Under Windows, properties are almost
 | |
| always consistent. The other platforms will need to be catered for by
 | |
| relying more on the wxItemResource objects, and not taking size
 | |
| information directly from windows.
 | |
| 
 | |
| \subsection{Dynamic setting versus recreation}
 | |
| 
 | |
| The property editor scheme relies on being able to set window properties
 | |
| dynamically: the user changes a value, and the window changes immediately
 | |
| to reflect the new value. Unfortunately, not all properties can be
 | |
| changed dynamically in wxWindows; for example, in Motif, the label position
 | |
| must be given at panel item creation time, because the way the widgets
 | |
| are laid out depend on the label position. The label position cannot then
 | |
| be changed without deleting and recreating the item.
 | |
| 
 | |
| Hence the dialog editor takes two approaches: where values are dynamically
 | |
| settable, this is done. Where they are not, the item is deleted and recreated,
 | |
| after all existing values have been transferred into the parallel wxItemResource
 | |
| object. Therefore in wx\_rprop.cc, some of the SetProperty implementations have one or
 | |
| more call to RecreateWindowFromResource.
 | |
| 
 | |
| \section{Resource associations}
 | |
| 
 | |
| wxItemResource objects (containing information about panel items and dialogs) are not visual
 | |
| objects. However, they need to be associated with the visual objects when the latter
 | |
| are created for editing purposes. Therefore there is a hash table called resourceAssociations
 | |
| in wxResourceManager. When a window is created, the resource pointer and window pointer
 | |
| are associated via the hash table. When the window is deleted, the association is removed.
 | |
| Children of a dialog are associated with child wxItemResource objects by calling
 | |
| wxFindWindowByName with the wxItemResource name.
 | |
| 
 | |
| \section{What needs to be done for XView and Motif}
 | |
| 
 | |
| The following areas need attention before Dialog Editor will run properly on these platforms.
 | |
| 
 | |
| \begin{enumerate}\itemsep=0pt
 | |
| \item For XView, the property editor needs to be made a modeless, not modal dialog, which has
 | |
| implications for flow of control in wxPropertyInfo::Edit.
 | |
| \item Properties which do not return the same value they are set to, such as width and height,
 | |
| need to be stored directly in wxItemResource and {\it not} transferred from window to wxItemResource
 | |
| in wxWindowPropertyInfo::InstantiateResource.
 | |
| \item Properties which cannot be dynamically set in XView or Motif need to have the item recreated (e.g. labelOrientation).
 | |
| \end{enumerate}
 | |
| 
 | |
| \section{Files}
 | |
| 
 | |
| The Dialog Editor source files are as follows:
 | |
| 
 | |
| \begin{itemize}\itemsep=0pt
 | |
| \item wx\_rprop.h, wx\_rprop.cc: handle property setting and getting through the `proxy' wxPropertyInfo
 | |
| classes and using the property list editor from utils/wxprop.
 | |
| \item wx\_resed.h, wx\_resed.cc: the main implementation, in particular the wxResourceManager class.
 | |
| \item wx\_reswr.cc: resource writing code.
 | |
| \item wx\_repal.cc: the dialog editor palette implementation.
 | |
| \item dialoged.h, dialoged.cc: small `stub' for invoking the user interface via a wxResourceManager object.
 | |
| \end{itemize}
 |