]> git.saurik.com Git - wxWidgets.git/commitdiff
Added Property List classes to main library; added proplist sample; merged
authorJulian Smart <julian@anthemion.co.uk>
Thu, 31 Dec 1998 16:15:45 +0000 (16:15 +0000)
committerJulian Smart <julian@anthemion.co.uk>
Thu, 31 Dec 1998 16:15:45 +0000 (16:15 +0000)
changes.txt files

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1292 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

77 files changed:
distrib/msw/docsrc.rsp
distrib/msw/generic.rsp
distrib/msw/wx_html.rsp
docs/changes.txt
docs/html/index.htm
docs/latex/proplist/back.gif [new file with mode: 0644]
docs/latex/proplist/body.tex [new file with mode: 0644]
docs/latex/proplist/books.bmp [new file with mode: 0644]
docs/latex/proplist/books.gif [new file with mode: 0644]
docs/latex/proplist/bullet.bmp [new file with mode: 0644]
docs/latex/proplist/changes.tex [new file with mode: 0644]
docs/latex/proplist/classes.tex [new file with mode: 0644]
docs/latex/proplist/contents.gif [new file with mode: 0644]
docs/latex/proplist/forward.gif [new file with mode: 0644]
docs/latex/proplist/prop.tex [new file with mode: 0644]
docs/latex/proplist/prop1.bmp [new file with mode: 0644]
docs/latex/proplist/prop1.eps [new file with mode: 0644]
docs/latex/proplist/prop1.gif [new file with mode: 0644]
docs/latex/proplist/prop2.bmp [new file with mode: 0644]
docs/latex/proplist/prop2.eps [new file with mode: 0644]
docs/latex/proplist/prop2.gif [new file with mode: 0644]
docs/latex/proplist/readme.txt [new file with mode: 0644]
docs/latex/proplist/tex2rtf.ini [new file with mode: 0644]
docs/latex/proplist/up.gif [new file with mode: 0644]
docs/latex/proplist/wxprop.hpj [new file with mode: 0644]
docs/motif/changes.txt [deleted file]
docs/msw/changes.txt [deleted file]
include/wx/prop.h [new file with mode: 0644]
include/wx/propform.h [new file with mode: 0644]
include/wx/proplist.h [new file with mode: 0644]
samples/bombs/makefile.dos
samples/bombs/makefile.unx
samples/makefile.g95
samples/makefile.nt
samples/makefile.unx
samples/proplist/Makefile [new file with mode: 0644]
samples/proplist/Makefile.in [new file with mode: 0644]
samples/proplist/cross.bmp [new file with mode: 0644]
samples/proplist/makefile.b32 [new file with mode: 0644]
samples/proplist/makefile.bcc [new file with mode: 0644]
samples/proplist/makefile.dos [new file with mode: 0644]
samples/proplist/makefile.g95 [new file with mode: 0644]
samples/proplist/makefile.nt [new file with mode: 0644]
samples/proplist/test.cpp [new file with mode: 0644]
samples/proplist/test.def [new file with mode: 0644]
samples/proplist/test.h [new file with mode: 0644]
samples/proplist/test.rc [new file with mode: 0644]
samples/proplist/tick.bmp [new file with mode: 0644]
src/common/dbtable.cpp
src/generic/prop.cpp [new file with mode: 0644]
src/generic/propform.cpp [new file with mode: 0644]
src/generic/proplist.cpp [new file with mode: 0644]
src/make_cw.mcp
src/motif/makefile.unx
src/msw/makefile.b32
src/msw/makefile.bcc
src/msw/makefile.dos
src/msw/makefile.g95
src/msw/makefile.nt
src/msw/makefile.wat
src/stubs/makefile.nt
src/stubs/makefile.unx
utils/dialoged/docs/body.tex
utils/dialoged/docs/bugs.tex
utils/dialoged/docs/changes.tex
utils/dialoged/docs/classes.tex
utils/dialoged/docs/dialoged.tex
utils/dialoged/src/Makefile.in
utils/dialoged/src/dlghndlr.cpp
utils/dialoged/src/makefile.b32
utils/dialoged/src/makefile.bcc
utils/dialoged/src/makefile.dos
utils/dialoged/src/makefile.nt
utils/dialoged/src/makefile.unx
utils/dialoged/src/makefile.wat
utils/wxprop/src/.cvsignore [deleted file]
utils/wxprop/src/test.rc [deleted file]

index 1c18faefe84d5873dbb5487196810a55481d892a..d343f70080f7479f065b380d6aed1532308131fd 100644 (file)
@@ -10,6 +10,18 @@ docs/latex/wx/*.bmp
 docs/latex/wx/*.gif
 docs/latex/wx/*.wmf
 
+docs/latex/proplist/*.tex
+docs/latex/proplist/*.sty
+docs/latex/proplist/*.bib
+docs/latex/proplist/*.hpj
+docs/latex/proplist/*.ini
+docs/latex/proplist/*.txt
+docs/latex/proplist/*.cnt
+docs/latex/proplist/*.eps
+docs/latex/proplist/*.bmp
+docs/latex/proplist/*.gif
+docs/latex/proplist/*.wmf
+
 docs/latex/porting/*.tex
 docs/latex/porting/*.sty
 docs/latex/porting/*.bib
index a63419daadb943c71988ca6b2a353e48e00b8c4a..73a2e4d1f743805aa82802ddd2c6cb9ba9fef53c 100644 (file)
@@ -179,19 +179,6 @@ utils/serialize/*.xbm
 utils/serialize/*.xpm
 utils/serialize/*.txt
 
-utils/wxprop/Makefile
-utils/wxprop/src/*.h
-utils/wxprop/src/*.cpp
-utils/wxprop/src/*.def
-utils/wxprop/src/*.rc
-utils/wxprop/src/makefile*
-utils/wxprop/src/*.xbm
-utils/wxprop/src/*.xpm
-utils/wxprop/src/*.txt
-utils/wxprop/src/*.ico
-utils/wxprop/src/*.bmp
-utils/wxprop/lib/dummy
-
 utils/dialoged/Makefile
 utils/dialoged/src/bitmaps/*.xbm
 utils/dialoged/src/bitmaps/*.xpm
@@ -420,6 +407,15 @@ samples/fractal/*.xpm
 samples/fractal/*.ico
 samples/fractal/*.rc
 
+samples/proplist/*.cpp
+samples/proplist/*.h
+samples/proplist/*.def
+samples/proplist/makefile*
+samples/proplist/*.xbm
+samples/proplist/*.xpm
+samples/proplist/*.ico
+samples/proplist/*.rc
+
 samples/layout/*.cpp
 samples/layout/*.h
 samples/layout/*.def
index 70992d30558c8cf59b7690b61a124229676546b0..a67cc06bc330bd9d45be876377b41cf347a6e6c2 100644 (file)
@@ -22,8 +22,8 @@ docs/html/wxgraph/*.gif
 docs/html/wxhelp/*.htm
 docs/html/wxhelp/*.gif
 
-docs/html/wxprop/*.htm
-docs/html/wxprop/*.gif
+docs/html/proplist/*.htm
+docs/html/proplist/*.gif
 
 docs/html/winstall/*.htm
 docs/html/winstall/*.gif
index e46bf6630460400b6171e3ba74ae49478221da9f..1a8b76e2d7e5ea06ee730f5da150cbdbed63ba16 100644 (file)
-Generic wxWindows 2.0 Change Log
---------------------------------
+wxWindows 2.0 Change Log
+------------------------
+
+Alpha 18, December 29th 1998
+----------------------------
+
+wxMSW:
+
+- Win16 support working again (VC++ 1.5)
+- Win16 now uses generic wxNotebook, wxListCtrl,
+  wxTreeCtrl -- more or less working now, although
+  a little work on wxNotebook is still needed.
+  Under 16-bit Windows, get assertion when you click
+  on a tab.
+- Wrote 16-bit BC++ makefiles: samples don't yet link.
+- Added CodeWarrior support to distribution courtesy
+  of Stefan Csomor.
+
+wxMotif:
+
+- Cured scrolling problem: scrollbars now show/hide themselves
+  without (permanently) resizing the window.
+- Removed some commented-out lines in wxScrolledWindow::AdjustScrollbars
+  that disabled scrollbar paging.
+- Set background colour of drawing area in wxWindow, so e.g. wxListCtrl
+  colours correctly.
+- Removed major bug whereby dialogs were unmanaged automatically
+  when any button was pressed.
+- Fixed colours of wxWindow scrollbars, made list and text controls
+  have a white background.
+- Fixed dialog colour setting.
+- Added settable fonts and colours for wxMenu/wxMenuBar. Now
+  they have sensible colours by default.
+- Fixed a bug in wxStaticBox.
+- Cured wxTreeCtrl bug: now works pretty well!
+- Debugged DrawEllipticArc (a ! in the wrong place).
+- Added SetClippingRegion( const wxRegion& region ).
+- Added wxPoint, wxSize, wxRect versions of SetSize etc.
+
+Alpha 17, November 22nd 1998
+----------------------------
+
+wxMSW:
+
+- More documentation updates, especially for
+  wxLayoutWindow classes and debugging facilities.
+- Changed wxDebugContext to use wxDebugLog instead
+  of wxTrace.
+- Now supports VC++ 6.0, and hopefully BC++ 5.0.
+  However, DLL support may be broken for BC++ since
+  VC++ 6 required changing of WXDLLEXPORT keyword
+  position.
+- Numerous miscellaneous changes.
+
+wxMotif:
+
+- Reimplemented MDI using wxNotebook instead of the MDI widgets, which
+  were too buggy (probably not design for dynamic addition/removal of
+  child frames).
+- Some improvements to the wxNotebook implementation.
+- wxToolBar now uses a bulletin board instead of a form, in an attempt
+  to make it possible to add ordinary wxControls to a toolbar.
+- Cured problem with not being able to use global memory operators,
+  by defining two more global operators, so that the delete will match
+  the debugging implementation.
+- Added wxUSE_DEBUG_NEW_ALWAYS so we can distinguish between using
+  global memory operators (usually OK) and #defining new to be
+  WXDEBUG_NEW (sometimes it might not be OK).
+- Added time.cpp to makefile; set wxUSE_DATETIME to 1.
+- Added a parent-existance check to popup menu code to make it not crash.
+- Added some optimization in wxWindow::SetSize to produce less flicker.
+  It remains to be seen whether this produces any resize bugs.
+
+It's a long time since I updated this file. Previously done:
+
+- wxFrame, wxDialog done.
+- wxScrolledWindow done (but backing pixmap not used at present).
+- wxBitmap done though could be tidied it up at some point.
+- Most basic controls are there, if not rigorously tested.
+- Some MDI support (menus appear on child frames at present).
+- wxNotebook almost done.
+- wxToolBar done (horizontal only, which would be easy to extend
+  to vertical toolbars).
+
+More recently:
+
+- Colour and font changing done (question mark over what happens
+  to scrollbars).
+- Accelerators done (for menu items and buttons). Also event loop
+  tidied up in wxApp so that events are filtered through ProcessXEvent.
+- wxWindow::GetUpdateRegion should now work.
+
+Alpha 16, September 8th 1998
+----------------------------
+
+wxMSW:
+
+- Added wxSashWindow, wxSashLayoutWindow classes, and sashtest
+  sample.
+- Guilhem's socket classes added, plus wxsocket sample.
+- A few more makefiles added.
+- GnuWin32/BC++ compatibility mods.
+- Further doc updates.
+- wxProp updates for correct working with wxGTK.
+
+wxMotif:
+
+- First start at Motif port.
+- Made makefiles for wxMotif source directory and minimal sample.
+- First go at wxApp, wxWindow, wxDialog, wxPen, wxBrush, wxFont,
+  wxColour, wxButton, wxCheckBox, wxTextCtrl, wxStaticText,
+  wxMenu, wxMenuItem, wxMenuBar
+
+Alpha 15, August 31st 1998
+--------------------------
+
+wxMSW:
+
+- wxBitmap debugged.
+- wxDC::GetDepth added.
+- Contribution added whereby wxBitmap will be
+  converted to DC depth if they don't match.
+- wxConfig API improved, documentation updated.
+- Printing classes name conventions cleaned up.
+- wxUpdateUIEvent now derives from wxCommandEvent
+  so event can travel up the window hierachy.
+
+Alpha 14, July 31st 1998
+------------------------
+
+wxMSW:
+
+- Toolbar API has been simplified, and now
+  wxFrame::GetClientArea returns the available client
+  area when toolbar, status bar etc. have been accounted for.
+  wxFrame::CreateToolBar added in line with CreateStatusBar.
+- Documentation updates, incl. for wxToolBar.
+- New wxAcceleratorTable class plus wxFrame::SetAcceleratorTable.
+- Various additions from other folk, e.g. streams, wxConfig
+  changes, wxNotebook.
+- Added wxDocMDIParentFrame, wxDocMDIChildFrame for doc/view.
+
+Alpha 13, July 8th 1998
+-----------------------
+
+wxMSW:
+
+- Implemented wxPoint as identical to POINT on Windows, and
+  altered wxDC wxPoint functions to use wxPoint directly in
+  Windows functions, for efficiency.
+- Cured wxASSERT bug in wxStatusBar95.
+- #ifdefed out some bits in oleutils.cpp for compilers that
+  don't support it.
+- Added some operators to wxPoint, wxSize.
+- Added inline wxDC functions using wxPoint, wxSize, wxRect.
+
+Alpha 12, July 7th 1998
+-----------------------
+
+wxMSW:
 
-Note: for platform-specific changes, see wx/docs/XXX/changes.txt
-where XXX is one of msw, motif, xt, gtk, mac.
+- Added wxApp::GetComCtl32Version, and wxTB_FLAT style, so can
+  have flat toolbars on Win98 or Win95 with IE >= 3 installed.
 
 Alpha 11, July 3rd 1998
 -----------------------
 
+wxMSW:
+
+- Added thread.h, thread.cpp.
+- Changed Enabled, Checked to IsEnabled, IsChecked in wxMenu,
+  wxMenuBar.
+- Changed wxMenuItem::SetBackColor to SetBackgroundColour,
+  SetTextColor to SetTextColour, and added or made public several
+  wxMenuItem accessors.
+- Added two overloads to wxRegion::Contains. Added
+  wxRegion::IsEmpty for a more consistent naming convention.
+- Added Vadim's wxDataObject and wxDropSource.
+- ENTER/LEAVE events now work.
+- Cured wxMemoryDC bug where the DC wasn't being deleted.
+- Cured wxGauge SetSize major bugginess.
+- Cured problem where if a GDI object was created on the stack,
+  then went out of scope, then another object was selected into
+  the DC, GDI objects would leak. This is because the assignment
+  to e.g. wxDC::m_pen would delete the GDI object without it first
+  being selected out of the DC. Cured by selecting the old DC object
+  first, then doing the assignment.
+- Split up wxGaugeMSW, wxGauge95, wxSliderMSW, wxSlider95
+- Various other bug fixes and additions.
+
+Generic:
+
 - Major work on Dialog Editor (still plenty to go).
 - Expanded documentation a bit more.
 
+Alpha 10, May 7th 1998
+----------------------
+
+wxMSW:
+
+- Added desiredWidth, desiredHeight parameters to wxBitmapHandler
+  and wxIcon functions so that you can specify what size of
+  icon should be loaded. Probably will remain a Windows-specific thing.
+- wxStatusBar95 now works for MDI frames.
+- Toolbars in MDI frames now behave normally. They still
+  require application-supplied positioning code though.
+- Changed installation instructions, makefiles and batch files
+  for compiling with Gnu-Win32/Mingw32/EGCS. Also timercmn.cpp
+  change to support Mingw32/EGCS. Bison now used by default.
+
 Alpha 9, April 27th 1998
 ------------------------
 
+wxMSW:
+
+- Cured bug in wxStatusBar95 that caused a crash if multiple
+  fields were used.
+- Added Gnu-Win32 b19/Mingw32 support by changing resource
+  compilation and pragmas.
+- Cured wxMenu bug introduced in alpha 8 - didn't respond to
+  commands because VZ changed the id setting in wxMenu::MSWCommand.
+
+Generic:
+
 - Corrected some bugs, such as the wxModule compilation problem.
 - Added Gnu-Win32 b19/Mingw32 support by changing resource
   compilation and pragmas.
@@ -21,6 +230,32 @@ Alpha 9, April 27th 1998
 Alpha 8, April 17th 1998
 ------------------------
 
+wxMSW:
+
+- Added IsNull to wxGDIObject to check if the ref data is present or not.
+- Added PNG handler and sample - doesn't work for 16-bit PNGs for
+  some reason :-(
+- Added wxJoystick class and event handling, and simple demo.
+- Added simple wxWave class. Needs Stop() function.
+- Added wxModule (module.h/module.cpp) to allow definition
+  of modules to be initialized and cleaned up on wxWindows
+  startup/exit.
+- Start of Mingw32 compatibility (see minimal and dialogs samples
+  makefile.m95 files, and install.txt).
+- Note: Windows printing has stopped working... will investigate.
+VADIM'S CHANGES:
+- Updated wxString: bug fixes, added wxArrayString, some
+  compatibility functions.
+- Updated log.h/cpp, added wxApp::CreateLogTarget.
+- file.h: new wxTempFile class.
+- defs.h: added wxSB_SIZE_GRIP for wxStatusBar95
+- statbr95: wxStatusBar95 control.
+- registry.h/cpp: wxRegKey class for Win95 registry.
+- listbox.cpp: corrected some bugs with owner-drawn listboxes.
+- wxConfig and wxFileConfig classes.
+
+Generic:
+
 - Added src/other/png, src/other/zlib directories.
 - Added samples/png.
 - IMPORTANT: Changed 'no id' number from 0 to -1, in wxEVT_ macros.
@@ -31,6 +266,27 @@ Alpha 8, April 17th 1998
 Alpha 7, March 30th 1998
 ------------------------
 
+wxMSW:
+
+- Added tab classes, tab sample.
+- Now can return FALSE from OnInit and windows will be
+  cleaned up properly before exit.
+- Improved border handling so panels don't get borders
+  automatically.
+- Debugged MDI activation from Window menu.
+- Changes to memory debug handling, including checking for
+  memory leaks on application exit - but see issues.txt for
+  unresolved issues.
+- Added wxTaskBarIcon (taskbar.cpp/h, plus samples/taskbar)
+  to allow maintenance of an icon in the Windows 95 taskbar
+  tray area.
+- Got MFC sample working (MFC and wxWindows in the same
+  application), partly by tweaking ntwxwin.mak settings.
+- Got DLL compilation working again (VC++).
+- Changed wxProp/Dialog Editor filenames.
+
+Generic:
+
 - Added tab classes, tab sample.
 - Revised memory.cpp, memory.h slightly; memory.h now #defines
   new to WXDEBUG_NEW in DEBUG mode. Windows implementation app.cpp
@@ -48,6 +304,36 @@ Alpha 7, March 30th 1998
 Alpha 6, March 10th 1998
 ------------------------
 
+wxMSW:
+
+- Found stack error bug - stopped unwanted OnIdle recursion.
+- Removed bug in wxTreeCtrl::InsertItem I added in alpha 5.
+- Changed exit behaviour in wxApp/wxFrame/wxDialog. Now will
+  check if the number of top-level windows is zero before
+  exiting. Also, wxApp::GetTopWindow will return either
+  m_topWindow or the first member of wxTopLevelWindows, so you
+  don't have to call wxApp::SetTopWindow.
+- Added dynarray.h/dynarray.cpp (from Vadim).
+- Added first cut at OLE drag and drop (from Vadim). dnd sample
+  added. Drop target only at this stage. See src/msw/ole/*.cpp,
+  wx/include/msw/ole/*.h. WIN32 only because of UUID usage.
+  Doesn't work with GnuWin32 - no appropriate headers e.g. for
+  IUnknown.
+  Doesn't work with BC++ either - crashes on program startup.
+- Added Vadim's owner-draw modifications - will probably remain
+  Windows-only. This enhances wxMenu, wxListBox. See ownerdrw sample.
+- Added wxLB_OWNERDRAW for owner-draw listboxes.
+- Vadim's wxCheckListBox derives from wxListBox. See checklst sample.
+  Doesn't entirely work for WIN16.
+- Vadim has added wxMenuItem as a separate file menuitem.cpp. It
+  can also be used as an argument to wxMenu::Append, not just for
+  internal implementation.
+- Some #ifdefs done for MINGW32 compilation (just alter OPTIONS
+  in makeg95.env, together with mingw32.bat). However, resource
+  binding is not working yet so most apps with dialogs crash.
+
+Generic:
+
 - Added Vadim's dynarray.h, dynarray.cpp.
 - Added Vadim's menuitem.cpp.
 - Added Windows-specific wxCheckListBox,
@@ -57,6 +343,23 @@ Alpha 6, March 10th 1998
 Alpha 5, 14th February 1998
 --------------------------
 
+wxMSW:
+
+- GENERIC AND MSW-SPECIFIC CODE NOW TREATED AS TWO SEPARATE
+  DISTRIBUTIONS. This change log will therefore now refer to
+  the Windows-specific code only. See docs/changes.txt for generic
+  changes.
+- Removed Windows-specific reference counting system (GDI
+  resources were cleaned up in idle time) - minimal
+  advantages now we have a wxWin reference counting system.
+- Added missing WXDLLEXPORT keywords so DLL compilation works
+  again.
+- Removed most warnings for GnuWin32 compilation.
+- Added wxRegion/wxRegionIterator, but haven't yet used it in
+  e.g. wxDC.
+
+Generic:
+
 - GENERIC AND MSW-SPECIFIC CODE NOW TREATED AS TWO SEPARATE
   DISTRIBUTIONS. This change log will therefore now refer to
   the generic code only. See docs/msw/changes.txt for Windows-specific
@@ -89,6 +392,8 @@ Alpha 5, 14th February 1998
 Alpha 4, 31st January 1998
 --------------------------
 
+All:
+
 - Changed wxDC functions to take longs instead of floats. GetSize now takes
   integer pointers, plus a version that returns a wxSize.
 - const keyword added to various wxDC functions.
@@ -142,6 +447,8 @@ Alpha 4, 31st January 1998
 Alpha 3, September 1997
 -----------------------
 
+All:
+
 - wxListCtrl, wxTreeCtrl, wxImageList classes done.
 - Instigated new file hierarchy, split files and classes up more logically.
 - PrologIO and some other utils now put into core library.
@@ -151,6 +458,8 @@ Alpha 3, September 1997
 Alpha 2, 30th April 1997
 ------------------------
 
+All:
+
 - EVT_... macros now have at least one argument, for conformance
   with MetroWerks compiler.
 - Added ids to .wxr file format.
@@ -170,6 +479,8 @@ Alpha 2, 30th April 1997
 Alpha 1, 5th April 1997
 -----------------------
 
+Generic:
+
 At this point, the following has been achieved:
 
 - A lot, but not all, of the code has been revamped for better
index e20772b00225d04218a67f25b3c43ed654dd5c8d..5ba390c826c462758871271a8b11b6ee9297033e 100644 (file)
@@ -56,7 +56,7 @@ from the <a href="http://wxwin.home.ml.org">wxWindows Web site</a>.<P>
 <li><a href="wx/wx.htm">Reference Manual</a>
 <li><a href="porting/port.htm">Porting Guide</a> (wxWindows 1.xx to 2.0)
 <li><a href="dialoged/dlged.htm">Dialog Editor</a>
-<li><a href="wxprop/prop.htm">Property Classes</a>
+<li><a href="proplist/prop.htm">Property List Classes</a>
 <li><a href="wxtree/tree.htm">wxTreeLayout</a>
 <li><a href="odbc/odbc.htm">Remstar ODBC Classes</a>
 </ul>
diff --git a/docs/latex/proplist/back.gif b/docs/latex/proplist/back.gif
new file mode 100644 (file)
index 0000000..bfd15ce
Binary files /dev/null and b/docs/latex/proplist/back.gif differ
diff --git a/docs/latex/proplist/body.tex b/docs/latex/proplist/body.tex
new file mode 100644 (file)
index 0000000..41ff42a
--- /dev/null
@@ -0,0 +1,106 @@
+\chapter{Introduction}\label{introduction}
+\pagenumbering{arabic}%
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}%
+
+The Property Sheet Classes help the programmer to specify complex dialogs and
+their relationship with their associated data. By specifying data as a
+wxPropertySheet containing wxProperty objects, the programmer can use
+a range of available or custom wxPropertyView classes to allow the user to
+edit this data. Classes derived from wxPropertyView act as mediators between the
+wxPropertySheet and the actual window (and associated panel items).
+
+For example, the wxPropertyListView is a kind of wxPropertyView which displays
+data in a Visual Basic-style property list (see \helpref{the next section}{appearance} for
+screen shots). This is a listbox containing names and values, with
+an edit control and other optional controls via which the user edits the selected
+data item.
+
+wxPropertyFormView is another kind of wxPropertyView which mediates between
+the data and a panel or dialog box which has already been created. This makes it a contender for
+the replacement of wxForm, since programmer-controlled layout is going to be much more
+satisfactory. If automatic layout is desired, then wxPropertyListView could be used instead.
+
+The main intention of this class library was to provide property {\it list} behaviour, but
+it has been generalised as much as possible so that the concept of a property sheet and its viewers
+can reduce programming effort in a range of user interface tasks.
+
+For further details on the classes and how they are used, please see \helpref{Property classes overview}{propertyoverview}.
+
+\section{The appearance and behaviour of a property list view}\label{appearance}
+
+The property list, as seen in an increasing number of development tools
+such as Visual Basic and Delphi, is a convenient and compact method for
+displaying and editing a number of items without the need for one
+control per item, and without the need for designing a special form. The
+controls are as follows:
+
+\begin{itemize}\itemsep=0pt
+\item A listbox showing the properties and their current values, which has double-click
+properties dependent on the nature of the current property;
+\item a text editing area at the top of the display, allowing the user to edit
+the currently selected property if appropriate;
+\item `confirm' and `cancel' buttons to confirm or cancel an edit (for the property, not the
+whole sheet);
+\item an optional list that appears when the user can make a choice from several known possible values;
+\item a small Edit button to invoke `detailed editing' (perhaps showing or hiding the above value list, or
+maybe invoking a common dialog);
+\item optional OK/Close, Cancel and Help buttons for the whole dialog.
+\end{itemize}
+
+The concept of `detailed editing' versus quick editing gives the user a choice
+of editing mode, so novice and expert behaviour can be catered for, or the user can just
+use what he feels comfortable with.
+
+Behaviour alters depending on the kind of property being edited. For example, a boolean value has
+the following behaviour:
+
+\begin{itemize}\itemsep=0pt
+\item Double-clicking on the item toggles between TRUE and FALSE.
+\item Showing the value list enables the user to select TRUE or FALSE.
+\item The user may be able to type in the word TRUE or FALSE, or the edit control
+may be read-only to disallow this since it is error-prone.
+\end{itemize}
+
+A list of strings may pop up a dialog for editing them, a simple string just allows text editing,
+double-clicking a colour property may show a colour selector, double-clicking on a filename property may
+show a file selector (in addition to being able to type in the name in the edit control), etc.
+
+Note that the `type' of property, such as string or integer, does not
+necessarily determine the behaviour of the property. The programmer has
+to be able to specify different behaviours for the same type, depending
+on the meaning of the property. For example, a colour and a filename may
+both be strings, but their editing behaviour should be different. This
+is why objects of type wxPropertyValidator need to be used, to define
+behaviour for a given class of properties or even specific property
+name.  Objects of class wxPropertyView contain a list of property
+registries, which enable reuse of bunches of these validators in
+different circumstances. Or a wxProperty can be explicitly set to use a
+particular validator object. 
+
+The following screen shot of the property classes test program shows the
+user editing a string, which is constrained to be one of three possible
+values.
+
+$$\image{8cm;0cm}{prop1.eps}$$\\
+
+The second picture shows the user having entered a integer that
+was outside the range specified to the validator. Note that in this picture,
+the value list is hidden because it is not used when editing an integer.
+
+$$\image{8cm;0cm}{prop2.eps}$$
+
+\chapter{Files}\label{files}
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}%
+
+The property class library comprises the following files:
+
+\begin{itemize}\itemsep=0pt
+\item prop.h: base property class header
+\item proplist.h: wxPropertyListView and associated classes
+\item propform.h: wxPropertyListView and associated classes
+\item prop.cpp: base property class implementation
+\item proplist.cpp: wxPropertyListView and associated class implementions
+\item propform.cpp: wxPropertyFormView and associated class implementions
+\end{itemize}
diff --git a/docs/latex/proplist/books.bmp b/docs/latex/proplist/books.bmp
new file mode 100644 (file)
index 0000000..cf1e148
Binary files /dev/null and b/docs/latex/proplist/books.bmp differ
diff --git a/docs/latex/proplist/books.gif b/docs/latex/proplist/books.gif
new file mode 100644 (file)
index 0000000..4c67b72
Binary files /dev/null and b/docs/latex/proplist/books.gif differ
diff --git a/docs/latex/proplist/bullet.bmp b/docs/latex/proplist/bullet.bmp
new file mode 100644 (file)
index 0000000..aad8fc7
Binary files /dev/null and b/docs/latex/proplist/bullet.bmp differ
diff --git a/docs/latex/proplist/changes.tex b/docs/latex/proplist/changes.tex
new file mode 100644 (file)
index 0000000..d3513d1
--- /dev/null
@@ -0,0 +1,27 @@
+\chapter{Change log}\label{changes}
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}%
+
+January - December 1998, Version 2.0
+
+\begin{itemize}\itemsep=0pt
+\item Conversion to wxWindows 2.0.
+\end{itemize}
+
+November 26th 1995, Version 1.1
+
+\begin{itemize}\itemsep=0pt
+\item Added wxListOfStringsListValidator - allows adding, deleting, editing
+strings.
+\item Added wxPropertyValue::ClearList, wxPropertyValue::Delete,
+wxPropertyValue::wxPropertyValue(wxStringList *).
+\item Added wxPropertyValue::Set/GetModified, wxPropertySheet::SetAllModified.
+\item Added wxPropertyView::OnPropertyChanged support, for immediate feedback.
+\end{itemize}
+
+October 1995, Version 1.0
+
+\begin{itemize}\itemsep=0pt
+\item First release.
+\end{itemize}
+
diff --git a/docs/latex/proplist/classes.tex b/docs/latex/proplist/classes.tex
new file mode 100644 (file)
index 0000000..d197d77
--- /dev/null
@@ -0,0 +1,1756 @@
+\chapter{Alphabetical class reference}\label{classref}
+\setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}%
+
+\overview{Property classes overview}{propertyoverview}
+
+
+\section{\class{wxBoolFormValidator}: wxPropertyFormValidator}\label{wxboolformvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a boolean value for a form view. The associated panel item must be a wxCheckBox.
+
+\membersection{wxBoolFormValidator::wxBoolFormValidator}
+
+\func{void}{wxBoolFormValidator}{\param{long }{flags=0}}
+
+Constructor.
+
+\section{\class{wxBoolListValidator}: wxPropertyListValidator}\label{wxboollistvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a boolean value for a list view.
+
+\membersection{wxBoolListValidator::wxBoolListValidator}
+
+\func{void}{wxBoolListValidator}{\param{long }{flags=0}}
+
+Constructor.
+
+\section{\class{wxIntegerFormValidator}: wxPropertyFormValidator}\label{wxintegerformvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a range of integer values for a form view. The associated panel item must be a wxText
+or wxSlider.
+
+\membersection{wxIntegerFormValidator::wxIntegerFormValidator}
+
+\func{void}{wxIntegerFormValidator}{\param{long }{min=0}, \param{long }{max=0},
+ \param{long}{ flags=0}}
+
+Constructor. Assigning zero to minimum and maximum values indicates that there is no range to check.
+
+
+\section{\class{wxIntegerListValidator}: wxPropertyListValidator}\label{wxintegerlistvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a range of integer values for a list view.
+
+\membersection{wxIntegerListValidator::wxIntegerListValidator}
+
+\func{void}{wxIntegerListValidator}{\param{long }{min=0}, \param{long }{max=0},
+ \param{long}{ flags=wxPROP\_ALLOW\_TEXT\_EDITING}}
+
+Constructor. Assigning zero to minimum and maximum values indicates that there is no range to check.
+
+\section{\class{wxFilenameListValidator}: wxPropertyListValidator}\label{wxfilenamelistvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a filename for a list view, allowing the user to edit it textually and also popping up
+a file selector in ``detailed editing" mode.
+
+\membersection{wxFilenameListValidator::wxFilenameListValidator}
+
+\func{void}{wxFilenameListValidator}{\param{wxString }{message = ``Select a file"}, \param{wxString }{wildcard = ``*.*"},
+  \param{long}{ flags=0}}
+
+Constructor. Supply an optional message and wildcard.
+
+\section{\class{wxListOfStringsListValidator}: wxPropertyListValidator}\label{wxlistofstringslistvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a list of strings for a list view. When editing the property,
+a dialog box is presented for adding, deleting or editing entries in the list.
+At present no constraints may be supplied.
+
+You can construct a string list property value by constructing a wxStringList object.
+
+For example:
+
+\begin{verbatim}
+  myListValidatorRegistry.RegisterValidator((wxString)"stringlist",
+      new wxListOfStringsListValidator);
+
+  wxStringList *strings = new wxStringList("earth", "fire", "wind", "water", NULL);
+
+  sheet->AddProperty(new wxProperty("fred", strings, "stringlist"));
+\end{verbatim}
+
+\membersection{wxListOfStringsListValidator::wxListofStringsListValidator}
+
+\func{void}{wxListOfStringsListValidator}{\param{long}{ flags=0}}
+
+Constructor.
+
+\section{\class{wxProperty}: wxObject}\label{wxproperty}
+
+The {\bf wxProperty} class represents a property, with a \helpref{wxPropertyValue}{wxpropertyvalue}\rtfsp
+containing the actual value, a name a role, an optional validator, and
+an optional associated window. 
+
+A property might correspond to an actual C++ data member, or it
+might correspond to a conceptual property, such as the width of a window.
+There is no explicit data member {\it wxWindow::width}, but it may be convenient
+to invent such a property for the purposes of editing attributes of the window.
+The properties in the property sheet can be mapped to ``reality" by
+whatever means (in this case by calling wxWindow::SetSize when the user has
+finished editing the property sheet).
+
+A validator may be associated with the property in order to ensure that this and
+only this validator will be used for editing and validating the property.
+An alternative method is to use the {\it role} parameter to specify what kind
+of validator would be appropriate; for example, specifying ``filename" for the role
+would allow the property view to find an appropriate validator at edit time.
+
+
+\membersection{wxProperty::wxProperty}
+
+\func{void}{wxProperty}{\void}
+
+\func{void}{wxProperty}{\param{wxProperty\& }{prop}}
+
+\func{void}{wxProperty}{\param{wxString}{ name}, \param{wxString}{ role}, \param{wxPropertyValidator *}{validator=NULL}}
+
+\func{void}{wxProperty}{\param{wxString}{ name}, \param{const wxPropertyValue\&}{ val}, \param{wxString}{ role}, \param{wxPropertyValidator *}{validator=NULL}}
+
+Constructors.
+
+\membersection{wxProperty::\destruct{wxProperty}}
+
+\func{void}{\destruct{wxProperty}}{\void}
+
+Destructor. Destroys the wxPropertyValue, and the property validator if there is one. However, if the
+actual C++ value in the wxPropertyValue is a pointer, the data in that variable is not destroyed.
+
+\membersection{wxProperty::GetValue}
+
+\func{wxPropertyValue\&}{GetValue}{\void}
+
+Returns a reference to the property value.
+
+\membersection{wxProperty::GetValidator}
+
+\func{wxPropertyValidator *}{GetValidator}{\void}
+
+Returns a pointer to the associated property validator (if any).
+
+\membersection{wxProperty::GetName}
+
+\func{wxString\&}{GetName}{\void}
+
+Returns the name of the property.
+
+\membersection{wxProperty::GetRole}
+
+\func{wxRole\&}{GetRole}{\void}
+
+Returns the role of the property, to be used when choosing an appropriate validator.
+
+\membersection{wxProperty::GetWindow}
+
+\func{wxWindow *}{GetWindow}{\void}
+
+Returns the window associated with the property (if any).
+
+\membersection{wxProperty::SetValue}
+
+\func{void}{SetValue}{\param{wxPropertyValue\&}{ val}}
+
+Sets the value of the property.
+
+\membersection{wxProperty::SetName}
+
+\func{void}{SetName}{\param{wxString\&}{ name}}
+
+Sets the name of the property.
+
+\membersection{wxProperty::SetRole}
+
+\func{void}{SetRole}{\param{wxString\&}{ role}}
+
+Sets the role  of the property.
+
+\membersection{wxProperty::SetValidator}
+
+\func{void}{SetValidator}{\param{wxPropertyValidator *}{validator}}
+
+Sets the validator: this will be deleted when the property is deleted.
+
+\membersection{wxProperty::SetWindow}
+
+\func{void}{SetWindow}{\param{wxWindow *}{win}}
+
+Sets the window associated with the property.
+
+\membersection{wxProperty::operator $=$}
+
+\func{void}{operator $=$}{\param{const wxPropertyValue\&}{ val}}
+
+Assignment operator.
+
+\section{\class{wxPropertyFormValidator}: wxPropertyValidator}\label{wxpropertyformvalidator}
+
+The {\bf wxPropertyFormValidator} abstract class is the root of classes that define validation
+for a wxPropertyFormView.
+
+
+\section{\class{wxPropertyFormDialog}: wxDialogBox}\label{wxpropertyformdialog}
+
+The {\bf wxPropertyFormDialog} class is a prepackaged dialog which can
+be used for viewing a form property sheet. Pass a property form view object, and the dialog
+will pass OnClose and OnDefaultAction listbox messages to the view class for
+processing.
+
+\membersection{wxPropertyFormDialog::wxPropertyFormDialog}
+
+\func{void}{wxPropertyFormDialog}{\param{wxPropertyFormView *}{view}, \param{wxWindow *}{parent}, \param{char *}{title},
+ \param{Bool}{ modal=FALSE}, \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
+ \param{long}{ style=wxDEFAULT\_DIALOG\_STYLE}, \param{char *}{name=``dialogBox"}}
+
+Constructor.
+
+\membersection{wxPropertyFormDialog::\destruct{wxPropertyFormDialog}}
+
+\func{void}{\destruct{wxPropertyFormDialog}}{\void}
+
+Destructor.
+
+
+\section{\class{wxPropertyFormFrame}: wxFrame}\label{wxpropertyformframe}
+
+The {\bf wxPropertyFormFrame} class is a prepackaged frame which can
+be used for viewing a property form. Pass a property form view object, and the frame
+will pass OnClose messages to the view class for processing.
+
+Call Initialize to create the panel and associate the view; override OnCreatePanel
+if you wish to use a panel class other than the default wxPropertyFormPanel.
+
+\membersection{wxPropertyFormFrame::wxPropertyFormFrame}
+
+\func{void}{wxPropertyFormFrame}{\param{wxPropertyFormView *}{view}, \param{wxFrame *}{parent}, \param{char *}{title},
+ \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
+ \param{long}{ style=wxSDI $\|$ wxDEFAULT\_FRAME}, \param{char *}{name=``frame"}}
+
+Constructor.
+
+\membersection{wxPropertyFormFrame::\destruct{wxPropertyFormFrame}}
+
+\func{void}{\destruct{wxPropertyFormFrame}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyFormFrame::GetPropertyPanel}
+
+\func{wxPanel *}{GetPropertyPanel}{\void}
+
+Returns the panel associated with the frame.
+
+\membersection{wxPropertyFormFrame::Initialize}
+
+\func{Bool}{Initialize}{\void}
+
+Must be called to create the panel and associate the view with the panel and frame.
+
+\membersection{wxPropertyFormFrame::OnCreatePanel}
+
+\func{wxPanel *}{OnCreatePanel}{\param{wxFrame *}{parent}, \param{wxPropertyFormView *}{view}}
+
+Creates a panel. Override this to create a panel type other than wxPropertyFormPanel.
+
+
+\section{\class{wxPropertyFormPanel}: wxPanel}\label{wxpropertyformpanel}
+
+The {\bf wxPropertyFormPanel} class is a prepackaged panel which can
+be used for viewing a property form. Pass a property form view object, and the panel
+will pass OnDefaultAction listbox messages to the view class for
+processing.
+
+\membersection{wxPropertyFormPanel::wxPropertyFormPanel}
+
+\func{void}{wxPropertyFormPanel}{\param{wxPropertyFormView *}{view}, \param{wxWindow *}{parent},
+ \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
+ \param{long}{ style=0}, \param{char *}{name=``panel"}}
+
+Constructor.
+
+\membersection{wxPropertyFormPanel::\destruct{wxPropertyFormPanel}}
+
+\func{void}{\destruct{wxPropertyFormPanel}}{\void}
+
+Destructor.
+
+
+
+\section{\class{wxPropertyFormValidator}: wxPropertyValidator}\label{wxpropertyformvalidatir}
+
+\overview{wxPropertyFormValidator overview}{wxpropertyformvalidatoroverview}
+
+The {\bf wxPropertyFormValidator} class defines a base class for form validators. By overriding virtual functions,
+the programmer can create custom behaviour for kinds of property.
+
+\membersection{wxPropertyFormValidator::wxPropertyFormValidator}
+
+\func{void}{wxPropertyFormValidator}{\param{long}{ flags = 0}}
+
+Constructor.
+
+\membersection{wxPropertyFormValidator::\destruct{wxPropertyFormValidator}}
+
+\func{void}{\destruct{wxPropertyFormValidator}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyFormValidator::OnCommand}
+
+\func{Bool}{OnCommand}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
+ \param{wxWindow *}{parentWindow}, \param{wxCommandEvent\& }{event}}
+
+Called when the control corresponding to the property receives a command (if not intercepted
+by a callback associated with the actual control).
+
+\membersection{wxPropertyFormValidator::OnCheckValue}
+
+\func{Bool}{OnCheckValue}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
+ \param{wxWindow *}{parentWindow}}
+Called when the view checks the property value. The value checked by this validator should be taken from the
+panel item corresponding to the property.
+
+\membersection{wxPropertyFormValidator::OnDisplayValue}
+
+\func{Bool}{OnDisplayValue}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Should display the property value in the appropriate control.
+\membersection{wxPropertyFormValidator::OnDoubleClick}
+
+\func{Bool}{OnDoubleClick}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Called when the control corresponding to the property is double clicked (listboxes only).
+
+\membersection{wxPropertyFormValidator::OnRetrieveValue}
+
+\func{Bool}{OnRetrieveValue}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Should do the transfer from the property editing area to the property itself.
+
+
+\section{\class{wxPropertyFormView}: wxPropertyView}\label{wxpropertyformview}
+
+\overview{wxPropertyFormView overview}{wxpropertyformviewoverview}
+
+The {\bf wxPropertyFormView} class shows a wxPropertySheet as a view onto a panel or dialog
+box which has already been created.
+
+\membersection{wxPropertyFormView::wxPropertyFormView}
+
+\func{void}{wxPropertyFormView}{\param{long}{ flags = 0}}
+
+Constructor.
+
+\membersection{wxPropertyFormView::\destruct{wxPropertyFormView}}
+
+\func{void}{\destruct{wxPropertyFormView}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyFormView::AssociateNames}\label{wxpropertyformviewassociatenames}
+
+\func{void}{AssociateNames}{\void}
+
+Associates the properties with the controls on the panel. For each panel item, if the
+panel item name is the same as a property name, the two objects will be associated.
+This function should be called manually since the programmer may wish to do the
+association manually.
+
+\membersection{wxPropertyFormView::Check}\label{wxpropertyformviewcheck}
+
+\func{Bool}{Check}{\void}
+
+Checks all properties by calling the appropriate validators; returns FALSE if a validation failed.
+
+\membersection{wxPropertyFormView::GetPanel}\label{wxpropertyformviewgetpanel}
+
+\func{wxPanel *}{GetPanel}{\void}
+
+Returns the panel associated with the view.
+
+\membersection{wxPropertyFormView::GetManagedWindow}\label{wxpropertyformviewgetmanagedwindow}
+
+\func{wxWindow *}{GetManagedWindow}{\void}
+
+Returns the managed window (a frame or dialog) associated with the view.
+
+\membersection{wxPropertyFormView::OnOk}\label{wxpropertyformviewonok}
+
+\func{void}{OnOk}{\void}
+
+Virtual function that will be called when the OK button on the physical window is pressed.
+By default, checks and updates the form values, closes and deletes the frame or dialog, then deletes the view.
+
+\membersection{wxPropertyFormView::OnCancel}\label{wxpropertyformviewoncancel}
+
+\func{void}{OnCancel}{\void}
+
+Virtual function that will be called when the Cancel button on the physical window is pressed.
+By default, closes and deletes the frame or dialog, then deletes the view.
+
+\membersection{wxPropertyFormView::OnHelp}\label{wxpropertyformviewonhelp}
+
+\func{void}{OnHelp}{\void}
+
+Virtual function that will be called when the Help button on the physical window is pressed.
+This needs to be overridden by the application for anything interesting to happen.
+
+\membersection{wxPropertyFormView::OnRevert}\label{wxpropertyformviewonrevert}
+
+\func{void}{OnRevert}{\void}
+
+Virtual function that will be called when the Revert button on the physical window is pressed.
+By default transfers the wxProperty values to the panel items (in effect
+undoing any unsaved changes in the items).
+
+\membersection{wxPropertyFormView::OnUpdate}\label{wxpropertyformviewonupdate}
+
+\func{void}{OnUpdate}{\void}
+
+Virtual function that will be called when the Update button on the physical window is pressed.
+By defaults transfers the displayed values to the wxProperty objects.
+
+\membersection{wxPropertyFormView::SetManagedWindow}\label{wxpropertyformviewsetmanagedwindow}
+
+\func{void}{SetManagedWindow}{\param{wxWindow *}{win}}
+
+Sets the managed window (a frame or dialog) associated with the view.
+
+\membersection{wxPropertyFormView::TransferToDialog}\label{wxpropertyformviewtransfertodialog}
+
+\func{Bool}{TransferToDialog}{\void}
+
+Transfers property values to the controls in the dialog.
+
+\membersection{wxPropertyFormView::TransferToPropertySheet}\label{wxpropertyformviewtransfertopropertysheet}
+
+\func{Bool}{TransferToPropertySheet}{\void}
+
+Transfers property values from the controls in the dialog to the property sheet.
+
+
+\section{\class{wxPropertyListDialog}: wxDialogBox}\label{wxpropertylistdialog}
+
+The {\bf wxPropertyListDialog} class is a prepackaged dialog which can
+be used for viewing a property list. Pass a property list view object, and the dialog
+will pass OnClose and OnDefaultAction listbox messages to the view class for
+processing.
+
+\membersection{wxPropertyListDialog::wxPropertyListDialog}
+
+\func{void}{wxPropertyListDialog}{\param{wxPropertyListView *}{view}, \param{wxWindow *}{parent}, \param{char *}{title},
+ \param{Bool}{ modal=FALSE}, \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
+ \param{long}{ style=wxDEFAULT\_DIALOG\_STYLE}, \param{char *}{name=``dialogBox"}}
+
+Constructor.
+
+\membersection{wxPropertyListDialog::\destruct{wxPropertyListDialog}}
+
+\func{void}{\destruct{wxPropertyListDialog}}{\void}
+
+Destructor.
+
+
+\section{\class{wxPropertyListFrame}: wxFrame}\label{wxpropertylistframe}
+
+The {\bf wxPropertyListFrame} class is a prepackaged frame which can
+be used for viewing a property list. Pass a property list view object, and the frame
+will pass OnClose messages to the view class for processing.
+
+Call Initialize to create the panel and associate the view; override OnCreatePanel
+if you wish to use a panel class other than the default wxPropertyListPanel.
+
+\membersection{wxPropertyListFrame::wxPropertyListFrame}
+
+\func{void}{wxPropertyListFrame}{\param{wxPropertyListView *}{view}, \param{wxFrame *}{parent}, \param{char *}{title},
+ \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
+ \param{long}{ style=wxSDI $\|$ wxDEFAULT\_FRAME}, \param{char *}{name=``frame"}}
+
+Constructor.
+
+\membersection{wxPropertyListFrame::\destruct{wxPropertyListFrame}}
+
+\func{void}{\destruct{wxPropertyListFrame}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyListFrame::GetPropertyPanel}
+
+\func{wxPanel *}{GetPropertyPanel}{\void}
+
+Returns the panel associated with the frame.
+
+\membersection{wxPropertyListFrame::Initialize}
+
+\func{Bool}{Initialize}{\void}
+
+Must be called to create the panel and associate the view with the panel and frame.
+
+\membersection{wxPropertyListFrame::OnCreatePanel}
+
+\func{wxPanel *}{OnCreatePanel}{\param{wxFrame *}{parent}, \param{wxPropertyListView *}{view}}
+
+Creates a panel. Override this to create a panel type other than wxPropertyListPanel.
+
+
+\section{\class{wxPropertyListPanel}: wxPanel}\label{wxpropertylistpanel}
+
+The {\bf wxPropertyListPanel} class is a prepackaged panel which can
+be used for viewing a property list. Pass a property list view object, and the panel
+will pass OnDefaultAction listbox messages to the view class for
+processing.
+
+\membersection{wxPropertyListPanel::wxPropertyListPanel}
+
+\func{void}{wxPropertyListPanel}{\param{wxPropertyListView *}{view}, \param{wxWindow *}{parent},
+ \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
+ \param{long}{ style=0}, \param{char *}{name=``panel"}}
+
+Constructor.
+
+\membersection{wxPropertyListPanel::\destruct{wxPropertyListPanel}}
+
+\func{void}{\destruct{wxPropertyListPanel}}{\void}
+
+Destructor.
+
+
+
+
+\section{\class{wxPropertyListValidator}: wxPropertyValidator}\label{wxpropertylistvalidator}
+
+\overview{wxPropertyListValidator overview}{wxpropertylistvalidatoroverview}
+
+The {\bf wxPropertyListValidator} abstract class is the base class for
+deriving validators for property lists.
+
+\membersection{wxPropertyListValidator::wxPropertyListValidator}
+
+\func{void}{wxPropertyListValidator}{\param{long}{ flags = wxPROP\_ALLOW\_TEXT\_EDITING}}
+
+Constructor.
+
+\membersection{wxPropertyListValidator::\destruct{wxPropertyListValidator}}
+
+\func{void}{\destruct{wxPropertyListValidator}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyListValidator::OnCheckValue}
+
+\func{Bool}{OnCheckValue}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+Called when the Tick (Confirm) button is pressed or focus is list. Return FALSE if the value
+was invalid, which is a signal restores the old value. Return TRUE if the value was valid.
+
+\membersection{wxPropertyListValidator::OnClearControls}
+
+\func{Bool}{OnClearControls}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+Allows the clearing (enabling, disabling) of property list controls, when the focus leaves the current property.
+
+\membersection{wxPropertyListValidator::OnClearDetailControls}
+
+\func{Bool}{OnClearDetailControls}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+Called when the focus is lost, if the validator is in detailed editing mode.
+
+\membersection{wxPropertyListValidator::OnDisplayValue}
+
+\func{Bool}{OnDisplayValue}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Should display the value in the appropriate controls. The default implementation gets the
+textual value from the property and inserts it into the text edit control.
+\membersection{wxPropertyListValidator::OnDoubleClick}
+
+\func{Bool}{OnDoubleClick}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Called when the property is double clicked. Extra functionality can be provided,
+such as cycling through possible values.
+
+\membersection{wxPropertyListValidator::OnEdit}
+
+\func{Bool}{OnEdit}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+Called when the Edit (detailed editing) button is pressed. The default implementation
+calls wxPropertyListView::BeginDetailedEditing; a filename validator (for example) overrides
+this function to show the file selector.
+
+\membersection{wxPropertyListValidator::OnPrepareControls}
+
+\func{Bool}{OnPrepareControls}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Called to allow the validator to setup the display, such enabling or disabling buttons, and
+setting the values and selection in the standard listbox control (the one optionally used for displaying
+value options).
+
+\membersection{wxPropertyListValidator::OnPrepareDetailControls}
+
+\func{Bool}{OnPrepareDetailControls}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+Called when the property is edited `in detail', i.e. when the Edit button is pressed.
+
+\membersection{wxPropertyListValidator::OnRetrieveValue}
+
+\func{Bool}{OnRetrieveValue}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Called when Tick (Confirm) is pressed or focus is lost or view wants to update
+the property list. Should do the transfer from the property editing area to the property itself
+
+\membersection{wxPropertyListValidator::OnSelect}
+
+\func{Bool}{OnSelect}{\param{Bool}{ select}, \param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Called when the property is selected or deselected: typically displays the value
+in the edit control (having chosen a suitable control to display: (non)editable text or listbox).
+
+\membersection{wxPropertyListValidator::OnValueListSelect}
+
+\func{Bool}{OnValueListSelect}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
+ \param{wxWindow *}{parentWindow}}
+
+Called when the value listbox is selected. The default behaviour is to copy
+string to text control, and retrieve the value into the property.
+
+
+
+\section{\class{wxPropertyListView}: wxPropertyView}\label{wxpropertylistview}
+
+\overview{wxPropertyListView overview}{wxpropertylistviewoverview}
+
+The {\bf wxPropertyListView} class shows a wxPropertySheet as a Visual Basic-style property list.
+
+\membersection{wxPropertyListView::wxPropertyListView}
+
+\func{void}{wxPropertyListView}{\param{long}{ flags = wxPROP\_BUTTON\_DEFAULT}}
+
+Constructor.
+
+The {\it flags} argument can be a bit list of the following:
+
+\begin{itemize}\itemsep=0pt
+\item wxPROP\_BUTTON\_CLOSE
+\item wxPROP\_BUTTON\_OK
+\item wxPROP\_BUTTON\_CANCEL
+\item wxPROP\_BUTTON\_CHECK\_CROSS
+\item wxPROP\_BUTTON\_HELP
+\item wxPROP\_DYNAMIC\_VALUE\_FIELD
+\item wxPROP\_PULLDOWN
+\end{itemize}
+
+\membersection{wxPropertyListView::\destruct{wxPropertyListView}}
+
+\func{void}{\destruct{wxPropertyListView}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyListView::AssociatePanel}\label{wxpropertylistviewassociatepanel}
+
+\func{void}{AssociatePanel}{\param{wxPanel *}{panel}}
+
+Associates the window on which the controls will be displayed, with the view (sets an internal pointer to the window).
+
+\membersection{wxPropertyListView::BeginShowingProperty}\label{wxpropertylistviewbeginshowingproperty}
+
+\func{Bool}{BeginShowingProperty}{\param{wxProperty *}{property}}
+
+Finds the appropriate validator and loads the property into the controls, by calling
+wxPropertyValidator::OnPrepareControls and then wxPropertyListView::DisplayProperty.
+
+\membersection{wxPropertyListView::DisplayProperty}\label{wxpropertylistviewdisplayproperty}
+
+\func{Bool}{DisplayProperty}{\param{wxProperty *}{property}}
+
+Calls wxPropertyValidator::OnDisplayValue for the current property's validator. This function
+gets called by wxPropertyListView::BeginShowingProperty, which is in turn called
+from ShowProperty, called by OnPropertySelect, called by the listbox callback when selected.
+
+\membersection{wxPropertyListView::EndShowingProperty}\label{wxpropertylistviewendshowingproperty}
+
+\func{Bool}{EndShowingProperty}{\param{wxProperty *}{property}}
+
+Finds the appropriate validator and unloads the property from the controls, by calling
+wxPropertyListView::RetrieveProperty, wxPropertyValidator::OnClearControls and (if we're in
+detailed editing mdoe) wxPropertyValidator::OnClearDetailControls.
+
+\membersection{wxPropertyListView::GetPanel}\label{wxpropertylistviewgetpanel}
+
+\func{wxPanel *}{GetPanel}{\void}
+
+Returns the panel associated with the view.
+
+\membersection{wxPropertyListView::GetManagedWindow}\label{wxpropertylistviewgetmanagedwindow}
+
+\func{wxWindow *}{GetManagedWindow}{\void}
+
+Returns the managed window (a frame or dialog) associated with the view.
+
+\membersection{wxPropertyListView::GetWindowCancelButton}\label{wxpropertylistviewgetwindowcancelbutton}
+
+\func{wxButton *}{GetWindowCancelButton}{\void}
+
+Returns the window cancel button, if any.
+
+\membersection{wxPropertyListView::GetWindowCloseButton}\label{wxpropertylistviewgetwindowclosebutton}
+
+\func{wxButton *}{GetWindowCloseButton}{\void}
+
+Returns the window close or OK button, if any.
+
+\membersection{wxPropertyListView::GetWindowHelpButton}\label{wxpropertylistviewgetwindowhelpbutton}
+
+\func{wxButton *}{GetWindowHelpButton}{\void}
+
+Returns the window help button, if any.
+
+\membersection{wxPropertyListView::SetManagedWindow}\label{wxpropertylistviewsetmanagedwindow}
+
+\func{void}{SetManagedWindow}{\param{wxWindow *}{win}}
+
+Sets the managed window (a frame or dialog) associated with the view.
+
+\membersection{wxPropertyListView::UpdatePropertyDisplayInList}\label{wxpropertylistviewupdatepropdisplay}
+
+\func{Bool}{UpdatePropertyDisplayInList}{\param{wxProperty *}{property}}
+
+Updates the display for the given changed property.
+
+\membersection{wxPropertyListView::UpdatePropertyList}\label{wxpropertylistviewupdateproplist}
+
+\func{Bool}{UpdatePropertyList}{\param{Bool }{clearEditArea = TRUE}}
+
+Updates the whole property list display.
+
+
+\section{\class{wxPropertySheet}: wxObject}\label{wxpropertysheet}
+
+\overview{wxPropertySheet overview}{wxpropertysheetoverview}
+
+The {\bf wxPropertySheet} class is used for storing a number of
+wxProperty objects (essentially names and values).
+
+\membersection{wxPropertySheet::wxPropertySheet}
+
+\func{void}{wxPropertySheet}{\void}
+
+Constructor.
+
+\membersection{wxPropertySheet::\destruct{wxPropertySheet}}
+
+\func{void}{\destruct{wxPropertySheet}}{\void}
+
+Destructor. Destroys all contained properties.
+
+\membersection{wxPropertySheet::AddProperty}\label{wxpropertysheetaddproperty}
+
+\func{void}{AddProperty}{\param{wxProperty *}{property}}
+
+Adds a property to the sheet.
+
+\membersection{wxPropertySheet::Clear}\label{wxpropertysheetclear}
+
+\func{void}{Clear}{\void}
+
+Clears all the properties from the sheet (deleting them).
+
+\membersection{wxPropertySheet::GetProperties}\label{wxpropertysheetgetproperties}
+
+\func{wxList\&}{GetProperties}{\void}
+
+Returns a reference to the internal list of properties.
+
+\membersection{wxPropertySheet::GetProperty}\label{wxpropertysheetgetproperty}
+
+\func{wxProperty *}{GetProperty}{\param{char *}{name}}
+
+Gets a property by name.
+
+\membersection{wxPropertySheet::SetAllModified}
+
+\func{void}{SetAllModified}{\param{Bool}{ flag}}
+
+Sets the `modified' flag of each property value.
+
+
+
+\section{\class{wxPropertyValidator}: wxEvtHandler}\label{wxpropertyvalidator}
+
+\overview{wxPropertyValidator overview}{wxpropertyvalidatoroverview}
+
+The {\bf wxPropertyValidator} abstract class is the base class for deriving
+validators for properties.
+
+\membersection{wxPropertyValidator::wxPropertyValidator}
+
+\func{void}{wxPropertyValidator}{\param{long}{ flags = 0}}
+
+Constructor.
+
+\membersection{wxPropertyValidator::\destruct{wxPropertyValidator}}
+
+\func{void}{\destruct{wxPropertyValidator}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyValidator::GetFlags}
+
+\func{long}{GetFlags}{\void}
+
+Returns the flags for the validator.
+
+\membersection{wxPropertyValidator::GetValidatorProperty}
+
+\func{wxProperty *}{GetValidatorProperty}{\void}
+
+Gets the property for the validator.
+
+\membersection{wxPropertyValidator::SetValidatorProperty}
+
+\func{void}{SetValidatorProperty}{\param{wxProperty *}{property}}
+
+Sets the property for the validator.
+
+
+\section{\class{wxPropertyValidatorRegistry}: wxHashTable}\label{wxpropertyvalidatorregistry}
+
+The {\bf wxPropertyValidatorRegistry} class is used for storing validators,
+indexed by the `role name' of the property, by which groups of property
+can be identified for the purpose of validation and editing.
+
+\membersection{wxPropertyValidatorRegistry::wxPropertyValidatorRegistry}
+
+\func{void}{wxPropertyValidatorRegistry}{\void}
+
+Constructor.
+
+\membersection{wxPropertyValidatorRegistry::\destruct{wxPropertyValidatorRegistry}}
+
+\func{void}{\destruct{wxPropertyValidatorRegistry}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyValidatorRegistry::Clear}
+
+\func{void}{ClearRegistry}{\void}
+
+Clears the registry, deleting the validators.
+
+\membersection{wxPropertyValidatorRegistry::GetValidator}
+
+\func{wxPropertyValidator *}{GetValidator}{\param{wxString\& }{roleName}}
+
+Retrieve a validator by the property role name.
+
+\membersection{wxPropertyValidatorRegistry::RegisterValidator}\label{wxpropertyvalidatorregistervalidator}
+
+\func{void}{RegisterValidator}{\param{wxString\& }{roleName}, \param{wxPropertyValidator *}{validator}}
+
+Register a validator with the registry. {\it roleName} is a name indicating the
+role of the property, such as ``filename''. Later, when a validator is chosen for
+editing a property, this role name is matched against the class names of the property,
+if the property does not already have a validator explicitly associated with it.
+
+
+\section{\class{wxPropertyValue}: wxObject}\label{wxpropertyvalue}
+
+The {\bf wxPropertyValue} class represents the value of a property,
+and is normally associated with a wxProperty object.
+
+A wxPropertyValue has one of the following types:
+
+\begin{itemize}\itemsep=0pt
+\item wxPropertyValueNull
+\item wxPropertyValueInteger
+\item wxPropertyValueReal
+\item wxPropertyValueBool
+\item wxPropertyValueString
+\item wxPropertyValueList
+\item wxPropertyValueIntegerPtr
+\item wxPropertyValueRealPtr
+\item wxPropertyValueBoolPtr
+\item wxPropertyValueStringPtr
+\end{itemize}
+
+\membersection{wxPropertyValue::wxPropertyValue}
+
+\func{void}{wxPropertyValue}{\void}
+
+Default constructor.
+
+\func{void}{wxPropertyValue}{\param{const wxPropertyValue\& }{copyFrom}}
+
+Copy constructor.
+
+\func{void}{wxPropertyValue}{\param{char *}{val}}
+
+Construction from a string value.
+
+\func{void}{wxPropertyValue}{\param{long}{ val}}
+
+Construction from an integer value. You may need to cast to (long) to
+avoid confusion with other constructors (such as the Bool constructor).
+
+\func{void}{wxPropertyValue}{\param{Bool}{ val}}
+
+Construction from a boolean value.
+
+\func{void}{wxPropertyValue}{\param{float}{ val}}
+
+Construction from a floating point value.
+
+\func{void}{wxPropertyValue}{\param{double}{ val}}
+
+Construction from a floating point value.
+
+\func{void}{wxPropertyValue}{\param{wxList *}{ val}}
+
+Construction from a list of wxPropertyValue objects. The
+list, but not each contained wxPropertyValue, will be deleted
+by the constructor. The wxPropertyValues will be assigned to
+this wxPropertyValue list. In other words, so do not delete wxList or
+its data after calling this constructor.
+
+\func{void}{wxPropertyValue}{\param{wxStringList *}{ val}}
+
+Construction from a list of strings. The list (including the strings
+contained in it) will be deleted by the constructor, so do not
+destroy {\it val} explicitly.
+
+\func{void}{wxPropertyValue}{\param{char **}{val}}
+
+Construction from a string pointer.
+
+\func{void}{wxPropertyValue}{\param{long *}{val}}
+
+Construction from an integer pointer.
+
+\func{void}{wxPropertyValue}{\param{Bool *}{val}}
+
+Construction from an boolean pointer.
+
+\func{void}{wxPropertyValue}{\param{float *}{val}}
+
+Construction from a floating point pointer.
+
+The last four constructors use pointers to various C++ types, and do not
+store the types themselves; this allows the values to stand in for actual
+data values defined elsewhere.
+
+\membersection{wxPropertyValue::\destruct{wxPropertyValue}}
+
+\func{void}{\destruct{wxPropertyValue}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyValue::Append}
+
+\func{void}{Append}{\param{wxPropertyValue *}{expr}}
+
+Appends a property value to the list.
+
+\membersection{wxPropertyValue::BoolValue}
+
+\func{Bool}{BoolValue}{\void}
+
+Returns the boolean value.
+
+\membersection{wxPropertyValue::BoolValuePtr}
+
+\func{Bool *}{BoolValuePtr}{\void}
+
+Returns the pointer to the boolean value.
+
+\membersection{wxPropertyValue::ClearList}
+
+\func{void}{ClearList}{\void}
+
+Deletes the contents of the list.
+
+\membersection{wxPropertyValue::Delete}
+
+\func{void}{Delete}{\param{wxPropertyValue *}{expr}}
+
+Deletes {\it expr} from this list.
+
+\membersection{wxPropertyValue::GetFirst}
+
+\func{wxPropertyValue *}{GetFirst}{\void}
+
+Gets the first value in the list.
+
+\membersection{wxPropertyValue::GetLast}
+
+\func{wxPropertyValue *}{GetFirst}{\void}
+
+Gets the last value in the list.
+
+\membersection{wxPropertyValue::GetModified}
+
+\func{Bool}{GetModified}{\void}
+
+Returns TRUE if the value was modified since being created
+(or since SetModified was called).
+
+\membersection{wxPropertyValue::GetNext}
+
+\func{wxPropertyValue *}{GetNext}{\void}
+
+Gets the next value in the list (the one after `this').
+
+\membersection{wxPropertyValue::GetStringRepresentation}
+
+\func{wxString}{GetStringRepresentation}{\void}
+
+Gets a string representation of the value.
+
+\membersection{wxPropertyValue::IntegerValue}
+
+\func{long}{IntegerValue}{\void}
+
+Returns the integer value.
+
+\membersection{wxPropertyValue::Insert}
+
+\func{void}{Insert}{\param{wxPropertyValue *}{expr}}
+
+Inserts a property value at the front of a list.
+
+\membersection{wxPropertyValue::IntegerValuePtr}
+
+\func{long *}{IntegerValuePtr}{\void}
+
+Returns the pointer to the integer value.
+
+\membersection{wxPropertyValue::Nth}
+
+\func{wxPropertyValue *}{Nth}{\param{int}{ n}}
+
+Returns the nth value of a list expression (starting from zero).
+
+\membersection{wxPropertyValue::Number}
+
+\func{int}{Number}{\void}
+
+Returns the number of elements in a list expression.
+
+\membersection{wxPropertyValue::RealValue}
+
+\func{float}{RealValue}{\void}
+
+Returns the floating point value.
+
+\membersection{wxPropertyValue::RealValuePtr}
+
+\func{float *}{RealValuePtr}{\void}
+
+Returns the pointer to the floating point value.
+
+\membersection{wxPropertyValue::SetModified}
+
+\func{void}{SetModified}{\param{Bool}{ flag}}
+
+Sets the `modified' flag.
+
+\membersection{wxPropertyValue::StringValue}
+
+\func{char *}{StringValue}{\void}
+
+Returns the string value.
+
+\membersection{wxPropertyValue::StringValuePtr}
+
+\func{char **}{StringValuePtr}{\void}
+
+Returns the pointer to the string value.
+
+\membersection{wxPropertyValue::Type}
+
+\func{wxPropertyValueType}{Type}{\void}
+
+Returns the value type.
+
+\membersection{wxPropertyValue::operator $=$}
+
+\func{void}{operator $=$}{\param{const wxPropertyValue\& }{val}}
+
+\func{void}{operator $=$}{\param{const char *}{val}}
+
+\func{void}{operator $=$}{\param{const long }{val}}
+
+\func{void}{operator $=$}{\param{const Bool }{val}}
+
+\func{void}{operator $=$}{\param{const float }{val}}
+
+\func{void}{operator $=$}{\param{const char **}{val}}
+
+\func{void}{operator $=$}{\param{const long *}{val}}
+
+\func{void}{operator $=$}{\param{const Bool *}{val}}
+
+\func{void}{operator $=$}{\param{const float *}{val}}
+
+Assignment operators.
+
+
+
+\section{\class{wxPropertyView}: wxEvtHandler}\label{wxpropertyview}
+
+\overview{wxPropertyView overview}{wxpropertyviewoverview}
+
+The {\bf wxPropertyView} abstract class is the base class for views
+of property sheets, acting as intermediaries between properties and
+actual windows.
+
+\membersection{wxPropertyView::wxPropertyView}
+
+\func{void}{wxPropertyView}{\param{long}{ flags = wxPROP\_BUTTON\_DEFAULT}}
+
+Constructor.
+
+The {\it flags} argument can be a bit list of the following:
+
+\begin{itemize}\itemsep=0pt
+\item wxPROP\_BUTTON\_CLOSE
+\item wxPROP\_BUTTON\_OK
+\item wxPROP\_BUTTON\_CANCEL
+\item wxPROP\_BUTTON\_CHECK\_CROSS
+\item wxPROP\_BUTTON\_HELP
+\item wxPROP\_DYNAMIC\_VALUE\_FIELD
+\item wxPROP\_PULLDOWN
+\end{itemize}
+
+\membersection{wxPropertyView::\destruct{wxPropertyView}}
+
+\func{void}{\destruct{wxPropertyView}}{\void}
+
+Destructor.
+
+\membersection{wxPropertyView::AddRegistry}\label{wxpropertyviewaddregistry}
+
+\func{void}{AddRegistry}{\param{wxPropertyValidatorRegistry *}{registry}}
+
+Adds a registry (list of property validators) the view's list of registries, which is initially empty.
+
+\membersection{wxPropertyView::FindPropertyValidator}\label{wxpropertyviewfindpropertyvalidator}
+
+\func{wxPropertyValidator *}{FindPropertyValidator}{\param{wxProperty *}{property}}
+
+Finds the property validator that is most appropriate to this property.
+
+\membersection{wxPropertyView::GetPropertySheet}\label{wxpropertyviewgetpropertysheet}
+
+\func{wxPropertySheet *}{GetPropertySheet}{\void}
+
+Gets the property sheet for this view.
+
+\membersection{wxPropertyView::GetRegistryList}\label{wxpropertyviewgetregistrylist}
+
+\func{wxList\&}{GetRegistryList}{\void}
+
+Returns a reference to the list of property validator registries.
+
+\membersection{wxPropertyView::OnOk}\label{wxpropertyviewonok}
+
+\func{void}{OnOk}{\void}
+
+Virtual function that will be called when the OK button on the physical window is pressed (if it exists).
+
+\membersection{wxPropertyView::OnCancel}\label{wxpropertyviewoncancel}
+
+\func{void}{OnCancel}{\void}
+
+Virtual function that will be called when the Cancel button on the physical window is pressed (if it exists).
+
+\membersection{wxPropertyView::OnClose}\label{wxpropertyviewonclose}
+
+\func{Bool}{OnClose}{\void}
+
+Virtual function that will be called when the physical window is closed. The default implementation returns FALSE.
+
+\membersection{wxPropertyView::OnHelp}\label{wxpropertyviewonhelp}
+
+\func{void}{OnHelp}{\void}
+
+Virtual function that will be called when the Help button on the physical window is pressed (if it exists).
+
+\membersection{wxPropertyView::OnPropertyChanged}\label{wxpropertyviewonpropertychanged}
+
+\func{void}{OnPropertyChanged}{\param{wxProperty *}{property}}
+
+Virtual function called by a view or validator when a property's value changed. Validators
+must be written correctly for this to be called. You can override this function
+to respond immediately to property value changes.
+
+\membersection{wxPropertyView::OnUpdateView}\label{wxpropertyviewonupdateview}
+
+\func{Bool}{OnUpdateView}{\void}
+
+Called by the viewed object to update the view. The default implementation just returns
+FALSE.
+
+\membersection{wxPropertyView::SetPropertySheet}\label{wxpropertyviewsetpropertysheet}
+
+\func{void}{SetPropertySheet}{\param{wxPropertySheet *}{sheet}}
+
+Sets the property sheet for this view.
+
+\membersection{wxPropertyView::ShowView}\label{wxpropertyviewshowview}
+
+\func{void}{ShowView}{\param{wxPropertySheet *}{sheet}, \param{wxPanel *}{panel}}
+
+Associates this view with the given panel, and shows the view.
+
+\section{\class{wxRealFormValidator}: wxPropertyFormValidator}\label{wxrealformvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a range of real values for form views. The associated panel item must be a wxText.
+
+\membersection{wxRealFormValidator::wxRealFormValidator}
+
+\func{void}{wxRealFormValidator}{\param{float }{min=0.0}, \param{float }{max=0.0},
+ \param{long}{ flags=0}}
+
+Constructor. Assigning zero to minimum and maximum values indicates that there is no range to check.
+
+
+\section{\class{wxStringFormValidator}: wxPropertyFormValidator}\label{wxstringformvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a string value for a form view, with an optional choice of possible values.
+The associated panel item must be a wxText, wxListBox or wxChoice. For wxListBox and wxChoice items,
+if the item is empty, the validator attempts to initialize the item from the strings in
+the validator. Note that this does not happen for XView wxChoice items since XView cannot reinitialize a wxChoice.
+\membersection{wxStringFormValidator::wxStringFormValidator}
+
+\func{void}{wxStringFormValidator}{\param{wxStringList *}{list=NULL}, \param{long}{ flags=0}}
+
+Constructor. Supply a list of strings to indicate a choice, or no strings to allow the
+user to freely edit the string. The string list will be deleted when the validator is deleted.
+
+
+\section{\class{wxRealListValidator}: wxPropertyListValidator}\label{wxreallistvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a range of real values for property lists.
+
+\membersection{wxRealListValidator::wxreallistvalidator}
+
+\func{void}{wxRealListValidator}{\param{float }{min=0.0}, \param{float }{max=0.0},
+ \param{long}{ flags=wxPROP\_ALLOW\_TEXT\_EDITING}}
+
+Constructor. Assigning zero to minimum and maximum values indicates that there is no range to check.
+
+
+\section{\class{wxStringListValidator}: wxPropertyListValidator}\label{wxstringlistvalidator}
+
+\overview{Validator classes}{validatorclasses}
+
+This class validates a string value, with an optional choice of possible values.
+
+\membersection{wxStringListValidator::wxStringListValidator}
+
+\func{void}{wxStringListValidator}{\param{wxStringList *}{list=NULL}, \param{long}{ flags=0}}
+
+Constructor. Supply a list of strings to indicate a choice, or no strings to allow the
+user to freely edit the string. The string list will be deleted when the validator is deleted.
+
+
+\chapter{Classes by category}\label{classesbycat}
+
+A classification of property sheet classes by category.
+
+\section{Data classes}
+
+\begin{itemize}\itemsep=0pt
+\item \helpref{wxProperty}{wxproperty}
+\item \helpref{wxPropertyValue}{wxpropertyvalue}
+\item \helpref{wxPropertySheet}{wxpropertysheet}
+\end{itemize}
+
+
+\section{Validator classes}\label{validatorclasses}
+
+Validators check that the values the user has entered for a property are
+valid. They can also define specific ways of entering data, such as a
+file selector for a filename, and they are responsible for transferring
+values between the wxProperty and the physical display. 
+
+Base classes:
+
+\begin{itemize}\itemsep=0pt
+\item \helpref{wxPropertyValidator}{wxproperty}
+\item \helpref{wxPropertyListValidator}{wxpropertylistvalidator}
+\item \helpref{wxPropertyFormValidator}{wxpropertyformvalidator}
+\end{itemize}
+
+List view validators:
+
+\begin{itemize}\itemsep=0pt
+\item \helpref{wxBoolListValidator}{wxboollistvalidator}
+\item \helpref{wxFilenameListValidator}{wxfilenamelistvalidator}
+\item \helpref{wxIntegerListValidator}{wxintegerlistvalidator}
+\item \helpref{wxListOfStringsListValidator}{wxlistofstringslistvalidator}
+\item \helpref{wxRealListValidator}{wxreallistvalidator}
+\item \helpref{wxStringListValidator}{wxstringlistvalidator}
+\end{itemize}
+
+Form view validators:
+
+\begin{itemize}\itemsep=0pt
+\item \helpref{wxBoolFormValidator}{wxboolformvalidator}
+\item \helpref{wxIntegerFormValidator}{wxintegerformvalidator}
+\item \helpref{wxRealFormValidator}{wxrealformvalidator}
+\item \helpref{wxStringFormValidator}{wxstringformvalidator}
+\end{itemize}
+
+\section{View classes}\label{viewclasses}
+
+View classes mediate between a property sheet and a physical window.
+
+\begin{itemize}\itemsep=0pt
+\item \helpref{wxPropertyView}{wxpropertyview}
+\item \helpref{wxPropertyListView}{wxpropertylistview}
+\item \helpref{wxPropertyFormView}{wxpropertyformview}
+\end{itemize}
+
+\section{Window classes}\label{windowclasses}
+
+The class library defines some window classes that can be used as-is with a suitable
+view class and property sheet.
+
+\begin{itemize}\itemsep=0pt
+\item \helpref{wxPropertyFormFrame}{wxpropertyformframe}
+\item \helpref{wxPropertyFormDialog}{wxpropertyformdialog}
+\item \helpref{wxPropertyFormPanel}{wxpropertyformpanel}
+\item \helpref{wxPropertyListFrame}{wxpropertylistframe}
+\item \helpref{wxPropertyListDialog}{wxpropertylistdialog}
+\item \helpref{wxPropertyListPanel}{wxpropertylistpanel}
+\end{itemize}
+
+\section{Registry classes}
+
+A validator registry is a list of validators that can be applied to properties in a property sheet.
+There may be one or more registries per property view.
+
+\begin{itemize}\itemsep=0pt
+\item \helpref{wxPropertyValidatorRegistry}{wxpropertyvalidatorregistry}
+\end{itemize}
+
+
+\chapter{Topic overviews}\label{overviews}
+
+This chapter contains a selection of topic overviews.
+
+\section{Property classes overview}\label{propertyoverview}
+
+The property classes help a programmer to express relationships between
+data and physical windows, in particular:
+
+\begin{itemize}\itemsep=0pt
+\item the transfer of data to and from the physical controls;
+\item the behaviour of various controls and custom windows for particular
+types of data;
+\item the validation of data, notifying the user when incorrect data is entered,
+or even better, constraining the input so only valid data can be entered.
+\end{itemize}
+
+With a consistent framework, the programmer should be able to use existing
+components and design new ones in a principled manner, to solve many data entry
+requirements.
+
+Each datum is represented in a \helpref{wxProperty}{wxproperty}, which has a name and a value.
+Various C++ types are permitted in the value of a property, and the property can store a pointer
+to the data instead of a copy of the data. A \helpref{wxPropertySheet}{wxpropertysheet} represents a number of these properties.
+
+These two classes are independent from the way in which the data is visually manipulated. To
+mediate between property sheets and windows, the abstract class \helpref{wxPropertyView}{wxpropertyview} is
+available for programmers to derive new kinds of view. One kind of view that is available is the \helpref{wxPropertyListView}{wxpropertylistview},
+which displays the data in a Visual Basic-style list, with a small number of controls for editing
+the currently selected property. Another is \helpref{wxPropertyFormView}{wxpropertyformview} which
+mediates between an existing dialog or panel and the property sheet.
+
+The hard work of mediation is actually performed by validators, which are instances of classes
+derived from \helpref{wxPropertyValidator}{wxpropertyvalidator}. A validator is associated with
+a particular property and is responsible for
+responding to user interface events, and displaying, updating and checking the property value.
+Because a validator's behaviour depends largely on the kind of view being used, there has to be
+a separate hierarchy of validators for each class of view. So for wxPropertyListView, there is
+an abstract class \helpref{wxPropertyListValidator}{wxpropertylistvalidator} from which concrete
+classes are derived, such as \helpref{wxRealListValidator}{wxreallistvalidator} and
+\rtfsp\helpref{wxStringListValidator}{wxstringlistvalidator}.
+
+A validator can be explicitly set for a property, so there is no doubt which validator
+should be used to edit that property. However, it is also possible to define a registry
+of validators, and have the validator chosen on the basis of the {\it role} of the property.
+So a property with a ``filename" role would match the ``filename" validator, which pops
+up a file selector when the user double clicks on the property.
+
+You don't have to define your own frame or window classes: there are some predefined
+that will work with the property list view. See \helpref{Window classes}{windowclasses} for
+further details.
+
+\subsection{Example 1: Property list view}
+
+The following code fragment shows the essentials of creating a registry of
+standard validators, a property sheet containing some properties, and
+a property list view and dialog or frame. RegisterValidators will be
+called on program start, and PropertySheetTest is called in response to a
+menu command.
+
+Note how some properties are created with an explicit reference to
+a validator, and others are provided with a ``role'' which can be matched
+against a validator in the registry.
+
+The interface generated by this test program is shown in the section \helpref{Appearance and
+behaviour of a property list view}{appearance}.
+
+\begin{verbatim}
+void RegisterValidators(void)
+{
+  myListValidatorRegistry.RegisterValidator((wxString)"real", new wxRealListValidator);
+  myListValidatorRegistry.RegisterValidator((wxString)"string", new wxStringListValidator);
+  myListValidatorRegistry.RegisterValidator((wxString)"integer", new wxIntegerListValidator);
+  myListValidatorRegistry.RegisterValidator((wxString)"bool", new wxBoolListValidator);
+}
+
+void PropertyListTest(Bool useDialog)
+{
+  wxPropertySheet *sheet = new wxPropertySheet;
+
+  sheet->AddProperty(new wxProperty("fred", 1.0, "real"));
+  sheet->AddProperty(new wxProperty("tough choice", (Bool)TRUE, "bool"));
+  sheet->AddProperty(new wxProperty("ian", (long)45, "integer", new wxIntegerListValidator(-50, 50)));
+  sheet->AddProperty(new wxProperty("bill", 25.0, "real", new wxRealListValidator(0.0, 100.0)));
+  sheet->AddProperty(new wxProperty("julian", "one", "string"));
+  sheet->AddProperty(new wxProperty("bitmap", "none", "string", new wxFilenameListValidator("Select a bitmap file", "*.bmp")));
+  wxStringList *strings = new wxStringList("one", "two", "three", NULL);
+  sheet->AddProperty(new wxProperty("constrained", "one", "string", new wxStringListValidator(strings)));
+
+  wxPropertyListView *view =
+    new wxPropertyListView(NULL,
+     wxPROP_BUTTON_CHECK_CROSS|wxPROP_DYNAMIC_VALUE_FIELD|wxPROP_PULLDOWN);
+
+  wxDialogBox *propDialog = NULL;
+  wxPropertyListFrame *propFrame = NULL;
+  if (useDialog)
+  {
+    propDialog = new wxPropertyListDialog(view, NULL, "Property Sheet Test", TRUE, -1, -1, 400, 500);
+  }
+  else
+  {
+    propFrame = new wxPropertyListFrame(view, NULL, "Property Sheet Test", -1, -1, 400, 500);
+  }
+  
+  view->AddRegistry(&myListValidatorRegistry);
+
+  if (useDialog)
+  {
+    view->ShowView(sheet, propDialog);
+    propDialog->Centre(wxBOTH);
+    propDialog->Show(TRUE);
+  }
+  else
+  {
+    propFrame->Initialize();
+    view->ShowView(sheet, propFrame->GetPropertyPanel());
+    propFrame->Centre(wxBOTH);
+    propFrame->Show(TRUE);
+  }
+}
+\end{verbatim}
+
+\subsection{Example 2: Property form view}
+
+This example is similar to Example 1, but uses a property form view to
+edit a property sheet using a predefined dialog box.
+
+\begin{verbatim}
+void RegisterValidators(void)
+{
+  myFormValidatorRegistry.RegisterValidator((wxString)"real", new wxRealFormValidator);
+  myFormValidatorRegistry.RegisterValidator((wxString)"string", new wxStringFormValidator);
+  myFormValidatorRegistry.RegisterValidator((wxString)"integer", new wxIntegerFormValidator);
+  myFormValidatorRegistry.RegisterValidator((wxString)"bool", new wxBoolFormValidator);
+}
+
+void PropertyFormTest(Bool useDialog)
+{
+  wxPropertySheet *sheet = new wxPropertySheet;
+
+  sheet->AddProperty(new wxProperty("fred", 25.0, "real", new wxRealFormValidator(0.0, 100.0)));
+  sheet->AddProperty(new wxProperty("tough choice", (Bool)TRUE, "bool"));
+  sheet->AddProperty(new wxProperty("ian", (long)45, "integer", new wxIntegerFormValidator(-50, 50)));
+  sheet->AddProperty(new wxProperty("julian", "one", "string"));
+  wxStringList *strings = new wxStringList("one", "two", "three", NULL);
+  sheet->AddProperty(new wxProperty("constrained", "one", "string", new wxStringFormValidator(strings)));
+
+  wxPropertyFormView *view = new wxPropertyFormView(NULL);
+
+  wxDialogBox *propDialog = NULL;
+  wxPropertyFormFrame *propFrame = NULL;
+  if (useDialog)
+  {
+    propDialog = new wxPropertyFormDialog(view, NULL, "Property Form Test", TRUE, -1, -1, 400, 300);
+  }
+  else
+  {
+    propFrame = new wxPropertyFormFrame(view, NULL, "Property Form Test", -1, -1, 400, 300);
+    propFrame->Initialize();
+  }
+  
+  wxPanel *panel = propDialog ? propDialog : propFrame->GetPropertyPanel();
+  panel->SetLabelPosition(wxVERTICAL);
+  
+  // Add items to the panel
+  
+  (void) new wxButton(panel, (wxFunction)NULL, "OK", -1, -1, -1, -1, 0, "ok");
+  (void) new wxButton(panel, (wxFunction)NULL, "Cancel", -1, -1, 80, -1, 0, "cancel");
+  (void) new wxButton(panel, (wxFunction)NULL, "Update", -1, -1, 80, -1, 0, "update");
+  (void) new wxButton(panel, (wxFunction)NULL, "Revert", -1, -1, -1, -1, 0, "revert");
+  panel->NewLine();
+  
+  // The name of this text item matches the "fred" property
+  (void) new wxText(panel, (wxFunction)NULL, "Fred", "", -1, -1, 90, -1, 0, "fred");
+  (void) new wxCheckBox(panel, (wxFunction)NULL, "Yes or no", -1, -1, -1, -1, 0, "tough choice");
+  (void) new wxSlider(panel, (wxFunction)NULL, "Sliding scale", 0, -50, 50, 100, -1, -1, wxHORIZONTAL, "ian");
+  panel->NewLine();
+  (void) new wxListBox(panel, (wxFunction)NULL, "Constrained", wxSINGLE, -1, -1, 100, 90, 0, NULL, 0, "constrained");
+
+  view->AddRegistry(&myFormValidatorRegistry);
+
+  if (useDialog)
+  {
+    view->ShowView(sheet, propDialog);
+    view->AssociateNames();
+    view->TransferToDialog();
+    propDialog->Centre(wxBOTH);
+    propDialog->Show(TRUE);
+  }
+  else
+  {
+    view->ShowView(sheet, propFrame->GetPropertyPanel());
+    view->AssociateNames();
+    view->TransferToDialog();
+    propFrame->Centre(wxBOTH);
+    propFrame->Show(TRUE);
+  }
+}
+\end{verbatim}
+
+\section{Validator classes overview}\label{validatoroverview}
+
+Classes: \helpref{Validator classes}{validatorclasses}
+
+The validator classes provide functionality for mediating between a wxProperty and
+the actual display. There is a separate family of validator classes for each
+class of view, since the differences in user interface for these views implies
+that little common functionality can be shared amongst validators.
+
+\subsection{wxPropertyValidator overview}\label{wxpropertyvalidatoroverview}
+
+Class: \helpref{wxPropertyValidator}{wxpropertyvalidator}
+
+This class is the root of all property validator classes. It contains a small
+amount of common functionality, including functions to convert between
+strings and C++ values.
+
+A validator is notionally an object which sits between a property and its displayed
+value, and checks that the value the user enters is correct, giving an error message
+if the validation fails. In fact, the validator does more than that, and is akin to
+a view class but at a finer level of detail. It is also responsible for
+loading the dialog box control with the value from the property, putting it back
+into the property, preparing special controls for editing the value, and
+may even invoke special dialogs for editing the value in a convenient way.
+
+In a property list dialog, there is quite a lot of scope for supplying custom dialogs,
+such as file or colour selectors. For a form dialog, there is less scope because
+there is no concept of `detailed editing' of a value: one control is associated with
+one property, and there is no provision for invoking further dialogs. The reader
+may like to work out how the form view could be extended to provide some of the
+functionality of the property list!
+
+Validator objects may be associated explictly with a wxProperty, or they may be
+indirectly associated by virtue of a property `kind' that matches validators having
+that kind. In the latter case, such validators are stored in a validator registry
+which is passed to the view before the dialog is shown. If the validator takes
+arguments, such as minimum and maximum values in the case of a wxIntegerListValidator,
+then the validator must be associated explicitly with the property. The validator
+will be deleted when the property is deleted.
+
+\subsection{wxPropertyListValidator overview}\label{wxpropertylistvalidatoroverview}
+
+Class: \helpref{wxPropertyListValidator}{wxpropertylistvalidator}
+
+This class is the abstract base class for property list view validators.
+The list view acts upon a user interface containing a list of properties,
+a text item for direct property value editing, confirm/cancel buttons for the value,
+a pulldown list for making a choice between values, and OK/Cancel/Help buttons
+for the dialog (see \helpref{property list appearance}{appearance}).
+
+By overriding virtual functions, the programmer can create custom
+behaviour for different kinds of property. Custom behaviour can use just the
+available controls on the property list dialog, or the validator can
+invoke custom editors with quite different controls, which pop up in
+`detailed editing' mode.
+
+See the detailed class documentation for the members you should override
+to give your validator appropriate behaviour.
+
+\subsection{wxPropertyFormValidator overview}\label{wxpropertyformvalidatoroverview}
+
+This class is the abstract base class for property form view validators.
+The form view acts upon an existing dialog box or panel, where either the
+panel item names correspond to property names, or the programmer has explicitly
+associated the panel item with the property.
+
+By overriding virtual functions, the programmer determines how
+values are displayed or retrieved, and the checking that the validator does.
+
+See the detailed class documentation for the members you should override
+to give your validator appropriate behaviour.
+
+\section{View classes overview}\label{viewoverview}
+
+Classes: \helpref{View classes}{viewclasses}
+
+An instance of a view class relates a property sheet with an actual window.
+Currently, there are two classes of view: wxPropertyListView and wxPropertyFormView.
+
+\subsection{wxPropertyView overview}\label{wxpropertyviewoverview}
+
+Class: \helpref{wxPropertyView}{wxpropertyview}
+
+This is the abstract base class for property views.
+
+\subsection{wxPropertyListView overview}\label{wxpropertylistviewoverview}
+
+Class: \helpref{wxPropertyListView}{wxpropertylistview}
+
+The property list view defines the relationship between a property sheet and
+a property list dialog or panel. It manages user interface events such as
+clicking on a property, pressing return in the text edit field, and clicking
+on Confirm or Cancel. These events cause member functions of the
+class to be called, and these in turn may call member functions of
+the appropriate validator to be called, to prepare controls, check the property value,
+invoke detailed editing, etc.
+
+\subsection{wxPropertyFormView overview}\label{wxpropertyformviewoverview}
+
+Class: \helpref{wxPropertyFormView}{wxpropertyformview}
+
+The property form view manages the relationship between a property sheet
+and an existing dialog or panel.
+
+You must first create a panel or dialog box for the view to work on.
+The panel should contain panel items with names that correspond to
+properties in your property sheet; or you can explicitly set the
+panel item for each property.
+
+Apart from any custom panel items that you wish to control independently
+of the property-editing items, wxPropertyFormView takes over the
+processing of item events. It can also control normal dialog behaviour such
+as OK, Cancel, so you should also create some standard buttons that the property view
+can recognise. Just create the buttons with standard names and the view
+will do the rest. The following button names are recognised:
+
+\begin{itemize}\itemsep=0pt
+\item {\bf ok}: indicates the OK button. Calls wxPropertyFormView::OnOk. By default,
+checks and updates the form values, closes and deletes the frame or dialog, then deletes the view.
+\item {\bf cancel}: indicates the Cancel button. Calls wxPropertyFormView::OnCancel. By default,
+closes and deletes the frame or dialog, then deletes the view.
+\item {\bf help}: indicates the Help button. Calls wxPropertyFormView::OnHelp. This needs
+to be overridden by the application for anything interesting to happen.
+\item {\bf revert}: indicates the Revert button. Calls wxPropertyFormView::OnRevert,
+which by default transfers the wxProperty values to the panel items (in effect
+undoing any unsaved changes in the items).
+\item {\bf update}: indicates the Revert button. Calls wxPropertyFormView::OnUpdate, which
+by defaults transfers the displayed values to the wxProperty objects.
+\end{itemize}
+
+\section{wxPropertySheet overview}\label{wxpropertysheetoverview}
+
+Classes: \helpref{wxPropertySheet}{wxpropertysheet}, \helpref{wxProperty}{wxproperty}, \helpref{wxPropertyValue}{wxpropertyvalue}
+
+A property sheet defines zero or more properties. This is a bit like an explicit representation of
+a C++ object. wxProperty objects can have values which are pointers to C++ values, or they
+can allocate their own storage for values.
+
+Because the property sheet representation is explicit and can be manipulated by
+a program, it is a convenient form to be used for a variety of
+editing purposes. wxPropertyListView and wxPropertyFormView are two classes that
+specify the relationship between a property sheet and a user interface. You could imagine
+other uses for wxPropertySheet, for example to generate a form-like user interface without
+the need for GUI programming. Or for storing the names and values of command-line switches, with the
+option to subsequently edit these values using a wxPropertyListView.
+
+A typical use for a property sheet is to represent values of an object
+which are only implicit in the current representation of it. For
+example, in Visual Basic and similar programming environments, you can
+`edit a button', or rather, edit the button's properties.  One of the
+properties you can edit is {\it width} - but there is no explicit
+representation of width in a wxWindows button; instead, you call SetSize
+and GetSize members. To translate this into a consisent,
+property-oriented scheme, we could derive a new class
+wxButtonWithProperties, which has two new functions: SetProperty and
+GetProperty.  SetProperty accepts a property name and a value, and calls
+an appropriate function for the property that is being passed.
+GetProperty accepts a property name, returning a property value. So
+instead of having to use the usual arbitrary set of C++ member functions
+to set or access attributes of a window, programmer deals merely with
+SetValue/GetValue, and property names and values.
+We now have a single point at which we can modify or query an object by specifying
+names and values at run-time. (The implementation of SetProperty and GetProperty
+is probably quite messy and involves a large if-then-else statement to
+test the property name and act accordingly.)
+
+When the user invokes the property editor for a wxButtonWithProperties, the system
+creates a wxPropertySheet with `imaginary' properties such as width, height, font size
+and so on. For each property, wxButtonWithProperties::GetProperty is called, and the result is
+passed to the corresponding wxProperty. The wxPropertySheet is passed to a wxPropertyListView
+as described elsewhere, and the user edits away. When the user has finished editing, the system calls
+wxButtonWithProperties::SetProperty to transfer the wxProperty value back into the button
+by way of an appropriate call, wxWindow::SetSize in the case of width and height properties.
+
+
+
diff --git a/docs/latex/proplist/contents.gif b/docs/latex/proplist/contents.gif
new file mode 100644 (file)
index 0000000..3dddfa3
Binary files /dev/null and b/docs/latex/proplist/contents.gif differ
diff --git a/docs/latex/proplist/forward.gif b/docs/latex/proplist/forward.gif
new file mode 100644 (file)
index 0000000..9c81e8c
Binary files /dev/null and b/docs/latex/proplist/forward.gif differ
diff --git a/docs/latex/proplist/prop.tex b/docs/latex/proplist/prop.tex
new file mode 100644 (file)
index 0000000..cb1a4a2
--- /dev/null
@@ -0,0 +1,47 @@
+\documentstyle[a4,makeidx,verbatim,texhelp,fancyhea,mysober,mytitle]{report}
+\input psbox.tex
+% Remove this for processing with dvi2ps instead of dvips
+%\special{!/@scaleunit 1 def}
+\parskip=10pt
+\parindent=0pt
+\title{User Manual for wxWindows Property Sheet Classes Version 2.0}
+\winhelponly{\author{by Julian Smart, Anthemion Software\\$$\image{}{prop1}$$}}
+\winhelpignore{\author{Julian Smart, Anthemion Software}
+\date{December 1998}
+}
+\makeindex
+\begin{document}
+\maketitle
+\pagestyle{fancyplain}
+\bibliographystyle{plain}
+\setheader{{\it CONTENTS}}{}{}{}{}{{\it CONTENTS}}
+\setfooter{\thepage}{}{}{}{}{\thepage}%
+\pagenumbering{roman}
+\tableofcontents
+
+\chapter*{Copyright notice}
+\setheader{{\it COPYRIGHT}}{}{}{}{}{{\it COPYRIGHT}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}%
+
+\begin{center}
+Copyright (c) 1998 Julian Smart, Anthemion Software
+\end{center}
+
+Please see the wxWindows licence for conditions of use.
+
+\input{body.tex}
+\input{classes.tex}
+\input{changes.tex}
+
+%\newpage
+%
+% Note: In RTF, the \printindex must come before the
+% change of header/footer, since the \printindex inserts
+% the RTF \sect command which divides one chapter from
+% the next.
+\rtfonly{\printindex
+\addcontentsline{toc}{chapter}{Index}
+\setheader{{\it INDEX}}{}{}{}{}{{\it INDEX}}%
+\setfooter{\thepage}{}{}{}{}{\thepage}%
+}
+\end{document}
diff --git a/docs/latex/proplist/prop1.bmp b/docs/latex/proplist/prop1.bmp
new file mode 100644 (file)
index 0000000..92c6bee
Binary files /dev/null and b/docs/latex/proplist/prop1.bmp differ
diff --git a/docs/latex/proplist/prop1.eps b/docs/latex/proplist/prop1.eps
new file mode 100644 (file)
index 0000000..02ac7d6
--- /dev/null
@@ -0,0 +1,539 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: prop1.eps
+%%Creator: XV Version 2.20  Rev: 4/24/92  -  by John Bradley
+%%BoundingBox: 167 292 445 500
+%%Pages: 1
+%%DocumentFonts:
+%%EndComments
+%%EndProlog
+
+%%Page: 1 1
+
+% remember original state
+/origstate save def
+
+% build a temporary dictionary
+20 dict begin
+
+% lower left corner
+167 292 translate
+
+% size of image (on paper, in 1/72inch coords)
+278 208 scale
+
+% define 'colorimage' if it isn't defined
+%   ('colortogray' and 'mergeprocs' come from xwd2ps
+%     via xgrab)
+/colorimage where   % do we know about 'colorimage'?
+  { pop }           % yes: pop off the 'dict' returned
+  {                 % no:  define one
+    /colortogray {  % define an RGB->I function
+      /rgbdata exch store    % call input 'rgbdata'
+      rgbdata length 3 idiv
+      /npixls exch store
+      /rgbindx 0 store
+      /grays npixls string store  % str to hold the result
+      0 1 npixls 1 sub {
+        grays exch
+        rgbdata rgbindx       get 20 mul    % Red
+        rgbdata rgbindx 1 add get 32 mul    % Green
+        rgbdata rgbindx 2 add get 12 mul    % Blue
+        add add 64 idiv      % I = .5G + .31R + .18B
+        put
+        /rgbindx rgbindx 3 add store
+      } for
+      grays
+    } bind def
+
+    % Utility procedure for colorimage operator.
+    % This procedure takes two procedures off the
+    % stack and merges them into a single procedure.
+
+    /mergeprocs { % def
+      dup length
+      3 -1 roll
+      dup
+      length
+      dup
+      5 1 roll
+      3 -1 roll
+      add
+      array cvx
+      dup
+      3 -1 roll
+      0 exch
+      putinterval
+      dup
+      4 2 roll
+      putinterval
+    } bind def
+
+    /colorimage { % def
+      pop pop     % remove 'false 3' operands
+      {colortogray} mergeprocs
+      image
+    } bind def
+  } ifelse          % end of 'false' case
+
+
+
+% define the colormap
+/cmap 42 string def
+
+
+% load up the colormap
+currentfile cmap readhexstring
+000000 bf0000 00bf00 bfbf00 0000bf 00bfbf c0c0c0 808080 ff0000 00ff00 
+ffff00 0000ff 00ffff ffffff 
+pop pop   % lose return values from readhexstring
+
+
+% rlecmapimage expects to have 'w h bits matrix' on stack
+/rlecmapimage {
+  /buffer 1 string def
+  /rgbval 3 string def
+  /block  384 string def
+
+  % proc to read a block from file, and return RGB data
+  { currentfile buffer readhexstring pop
+    /bcount exch 0 get store
+    bcount 128 ge
+    {  % it's a non-run block
+      0 1 bcount 128 sub
+      { currentfile buffer readhexstring pop pop
+
+        % look up value in color map
+        /rgbval cmap buffer 0 get 3 mul 3 getinterval store
+
+        % and put it in position i*3 in block
+        block exch 3 mul rgbval putinterval
+      } for
+      block  0  bcount 127 sub 3 mul  getinterval
+    }
+
+    { % else it's a run block
+      currentfile buffer readhexstring pop pop
+
+      % look up value in colormap
+      /rgbval cmap buffer 0 get 3 mul 3 getinterval store
+
+      0 1 bcount { block exch 3 mul rgbval putinterval } for
+
+      block 0 bcount 1 add 3 mul getinterval
+    } ifelse
+  } % end of proc
+  false 3 colorimage
+} bind def
+
+
+278 208 8                      % dimensions of data
+[278 0 0 -208 0 208]           % mapping matrix
+rlecmapimage
+
+7f067f0614060000
+81060d7f0d7f0d110d810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d068106047f047f040c040106810700
+82060d068106048204060d820d060783070d0702010203098102047f047a040106810700
+
+82060d068106048704060b060001020781070283020702098109028102047f0446040e0d
+81000d0d0d81000481040d0d0d81000481040682060700
+82060d0681060482040806810600820002078507020902070201028109047f044604810d
+060b068307000d060b068207000482040d060b068207000481040682060700
+82060d0681060481040685060800040307820702098409020702098109040104050d2d04
+030d0204010d1a04050d6604810d060b068307000d06810600070001068207000482040d
+060b068207000481040682060700
+82060d068106048704060b0604000a0789070209020702070209040104010d0204010d1d
+04010d0b04010d0104010d0104010d1204010d0704010d1004010d5504810d060b068307
+000d06810600070001068207000482040d06010601000306010001068207000481040682
+060700
+82060d068106048204070681060001000107010286070209020702040104010d0204010d
+1d04010d0b04010d0504010d1204010d0704010d1004010d5504810d060b068307000d06
+820600060506810006830607000482040d06020601000106010002068207000481040682
+060700
+82060d0681060485040d0607060d010d8407020002090109820200040104010d0204010d
+81040d010d0104030d0104040d0204030d0104020d81040d010d81040d820d040d810d04
+0304010d0504040d0204030d0204030d0104020d0604010d0404030d0204020d0104020d
+5404810d060b068307000d06820600060506810006830607000482040d06030603000306
+8207000481040682060700
+82060d068106048104070507010006020204050d0104010d0104010d0104010d81040d81
+0d0481040d820d040d810d0481040d820d040d810d0481040d810d0481040d820d040d81
+0d040404030d0204020d81040d820d040d810d0481040d820d040d810d0481040d820d04
+0d810d040604010d0304010d0104010d81040d820d040d820d040d810d045404810d060b
+068307000d06820600060506810006830607000482040d06040601000406820700048104
+0682060700
+82060d068106048104050505010006030204010d0504010d0104010d0104010d81040d81
+0d0481040d820d040d040d81040d810d0481040d810d0481040d820d040d810d04070401
+0d0104010d0104010d81040d040d81040d040d81040d810d040604010d0304050d010401
+0d0204010d5504810d060b068307000d06820600060506810006830607000482040d0603
+06030003068207000481040682060700
+82060d0681060481040c010c8205080c830c05030a020a81030a810a040104010d050401
+0d0104010d0104010d81040d810d0481040d820d040d810d040304010d0104010d010401
+0d81040d810d040704010d0104010d0104010d81040d810d040304010d0404010d070401
+0d0304010d0604010d0104010d5504810d060b068307000d068206000605068100068306
+07000482040d06020601000106010002068207000481040682060700
+82060d068106048c040c05070507050c05030a030a840a03000a040104010d0504010d01
+04010d0104010d81040d810d0481040d820d040d810d0481040d820d040d810d0481040d
+810d040104020d0504010d0104010d0104010d0104010d81040d810d0481040d820d040d
+810d0481040d820d040d810d040604010d0304010d0104010d81040d820d040d820d040d
+810d045404810d060106050003068307000d06820600060506810006830607000482040d
+06010601000306010001068207000481040682060700
+82060d0681060482040c08020886070c05030a030a010a82030a040104010d0504010d02
+04030d0104040d0204030d0104010d0204010d0104010d0704030d0204010d0104010d01
+04030d0204030d0204010d0604010d0404030d0204020d0204010d5404810d0601060500
+03068307000d06810600070001068207000482040d060b068207000481040682060700
+82060d0681060482040c080208010c8205030a810a0384030a030a041404010d1404010d
+7f041804810d060b068307000d060b068207000482040d060b0682070004810406820607
+00
+82060d0681060482040c080308850c05030a030a010a82000a041404010d1204020d7f04
+1904810d070c0782000d070c0781000482040d070c0781000481040682060700
+82060d0681060483040c05080208850c05030a030a810a0382030a047f0446041f000104
+0f0001040106810700
+82060d0681060481040c050c8205030a050a7f047b040106810700
+82060d068106047f047f040c040106810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d0637067f073907810d061c06810700
+82060d06030616000306160001068107007f00360082060d0681060015000406810700
+82060d06020681000d140d820700068206000d140d8507000607000d7f0d350d84060d06
+000d140d820700060206810700
+82060d06020682000d06120601078100068306000d061206010784000607000d7f0d350d
+84060d06000d130d01078100060206810700
+82060d06020682000d06120601078100068306000d061206010784000607000d7f0d350d
+84060d06000d810d06110601078100060206810700
+82060d06020682000d06120601078100068306000d061206010784000607000d7f0d350d
+84060d06000d810d06110601078100060206810700
+82060d06020682000d0603068100060606810006030601078100068306000d0612060107
+84000607000d820d000d7f0d320d84060d06000d810d06110601078100060206810700
+82060d06020682000d06030683000600060306810006040601078100068306000d061206
+010785000607000d0081000d7f0d320d84060d06000d810d061106010781000602068107
+00
+82060d06020682000d06040683000600060106810006050601078100068306000d060b06
+8100060406010785000607000d000100810d0081000d820d000d810d0081000d810d0002
+007f0d220d84060d06000d810d06110601078100060206810700
+82060d06020682000d06050685000600060006060601078100068306000d060a06830006
+00060306010785000607000d0081000d810d0082000d000100810d0082000d0081000d81
+0d0081000d7f0d200d84060d06000d810d06110601078100060206810700
+82060d06020682000d0606068300060006070601078100068306000d0609068300060006
+0406010785000607000d0081000d810d0082000d000100810d0082000d0081000d810d00
+81000d7f0d200d84060d06000d810d06110601078100060206810700
+82060d06020682000d0607068300060006060601078100068306000d0604068100060106
+83000600060506010785000607000d0081000d010d0200810d000100010d0100010d0100
+7f0d210d84060d06000d810d06110601078100060206810700
+82060d06020682000d06060685000600060006050601078100068306000d060306870006
+0006000600060606010785000607000d0081000d010d0200810d000100010d0100010d01
+007f0d210d84060d06000d810d06110601078100060206810700
+82060d06020682000d06050681000601068300060006040601078100068306000d060406
+850006000600060706010784000607000d810d0081000d810d0081000d010d0100020d03
+007f0d220d84060d06000d810d0603060100810600820006008100060406010781000602
+06810700
+82060d06020682000d06040681000603068300060006030601078100068306000d060506
+83000600060806010784000607000d7f0d350d84060d06000d810d060306010081060082
+000600810006040601078100060206810700
+82060d06020682000d060306010005060100040601078100068306000d06060681000609
+06010784000607000d7f0d350d84060d06000d810d06110601078100060206810700
+82060d06020682000d06120601078100068306000d061206010784000607000d7f0d350d
+84060d06000d810d06110601078100060206810700
+82060d06020682000d06120601078100068306000d061206010784000607000d7f0d350d
+84060d06000d810d06110601078100060206810700
+82060d06020682000d0714078100068306000d07140784000607000d7f0d350d85060d06
+000d0714078100060206810700
+82060d06020682000d0714078100068306000d07140784000607000d7f0d350d84060d06
+000715078100060206810700
+82060d06030616000306160001068207000d7f0d350d82060d0681060015000406810700
+
+82060d0637068107067f063706810d061c06810700
+82060d0637067f0d3a0d1d06810700
+82060d0601067f077f070a07810d060106810700
+82060d0601068107007f007f00070082060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d010d0300010d0400020d03007f0d720d82060d060106810700
+82060d0601068207000d810d0081000d810d0082000d0081000d810d0082000d0081000d
+810d0081000d7f0d700d82060d060106810700
+82060d0601068207000d810d0081000d810d0082000d0081000d810d0082000d0004007f
+0d710d82060d060106810700
+82060d0601068207000d810d0081000d810d0082000d0081000d810d0082000d0081000d
+7f0d740d82060d060106810700
+82060d0601068207000d810d0081000d810d0082000d0081000d810d0082000d0081000d
+810d0081000d7f0d700d82060d060106810700
+82060d0601068207000d010d0300010d0100010d0100010d03007f0d720d82060d060106
+810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d060106ff0700040a040a040a040a040a040a040a040a040a040a040a040a040a04
+0a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a04
+0a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a04
+0a040a040a040a040a040a040a040a040a040a040a040a040a040aff040a040a040a040a
+040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a
+040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a
+040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a
+040a040a040a040a040a040a8c040a040a040a040a040a060d060106810700
+82060d0601068307000a047f047f04050482060d060106810700
+82060d060106820700047f047f040504830a060d060106810700
+82060d0601068307000a0482040d047f047f04020482060d060106810700
+82060d0601068207000481040d810d047f047f040104830a060d060106810700
+82060d0601068307000a0d020d81040d810d0482040d0481040d810d0481040d020d7f04
+720482060d060106810700
+82060d0601068207000481040d810d0481040d820d040d010d81040d820d040d810d0481
+040d810d047f046f04830a060d060106810700
+82060d0601068407000a040d810d0481040d820d040d010d81040d820d040d810d048104
+0d810d047f04700482060d060106810700
+82060d0601068207000481040d810d040104020d81040d010d0104010d0104010d7f0470
+04830a060d060106810700
+82060d0601068407000a040d810d040104020d81040d010d0104010d0104010d7f047104
+82060d060106810700
+82060d060106820700040104010d0104010d0204010d0204030d7f047104830a060d0601
+06810700
+82060d0601068307000a047f047f04050482060d060106810700
+82060d060106820700047f047f040504830a060d060106810700
+82060d060106ff07000a040a040a040a040a040a040a040a040a040a040a040a040a040a
+040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a
+040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a
+040a040a040a040a040a040a040a040a040a040a040a040a040a04ff0a040a040a040a04
+0a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a04
+0a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a04
+0a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a040a04
+0a040a040a040a040a040a048c0a040a040a040a040a04060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d010d81000d810d0081000d7f0d7e0d82060d060106810700
+82060d0601068207000d810d0081000d810d0081000d7f0d7e0d82060d060106810700
+82060d0601068307000d000200810d000300010d0300010d0300020d03007f0d690d8206
+0d060106810700
+82060d0601068207000d810d0081000d810d0081000d810d0082000d0081000d010d0100
+010d0100810d0081000d810d0081000d7f0d670d82060d060106810700
+82060d0601068207000d810d0081000d810d0081000d810d0082000d0081000d010d0500
+810d0004007f0d680d82060d060106810700
+82060d0601068207000d810d0081000d810d0081000d810d0082000d0081000d010d0100
+040d01007f0d6c0d82060d060106810700
+82060d0601068207000d810d0081000d810d0081000d810d0082000d0081000d010d0100
+010d0100810d0081000d810d0081000d7f0d670d82060d060106810700
+82060d0601068207000d010d0100810d0081000d810d0082000d0081000d020d0300020d
+03007f0d690d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068207000d7f0d7f0d060d82060d060106810700
+82060d0601068107067f067f060806810d060106810700
+82060d0601067f0d7f0d0b0d0206810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d0601067f077f070b070206810700
+82060d0601068107007f007f000800810d060106810700
+82060d0601068207000d7f0d760d0e060100810d060106810700
+82060d0601068207000d7f0d760d81060d0b0d81070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d1c0d0100120d01000e0d81000d6b0d0400400d82060d060a0681
+070082000d060106810700
+82060d0601068207000d010d81000d190d81000d120d81000d7b0d85000d000d000d3f0d
+82060d060a0681070082000d060106810700
+82060d0601068207000d810d000300030d0200010d0100010d0100020d0100810d008400
+0d000d0081000d090d0300010d82000d0081000d020d0200020d0200040d0300020d0200
+5f0d81000d020d0100810d0082000d0081000d810d0081000d010d02002c0d82060d0603
+06810006040681070082000d060106810700
+82060d0601068207000d010d81000d040d81000d010d81000d820d000d010d81000d820d
+000d810d0081000d810d0081000d820d000d070d81000d010d81000d810d0081000d820d
+000d820d000d010d81000d020d81000d020d81000d010d81000d820d000d010d81000d5d
+0d81000d030d0100030d81000d010d81000d820d000d010d81000d2a0d82060d06020602
+00040681070082000d060106810700
+82060d0601068207000d010d81000d040d81000d010d81000d820d000d010d81000d820d
+000d010d81000d820d000d010d81000d070d81000d040d81000d010d81000d820d000d01
+0d81000d020d81000d020d81000d040d04005e0d81000d030d81000d030d81000d010d81
+000d810d0003002b0d82060d0601060400030681070082000d060106810700
+82060d0601068207000d010d81000d010d81000d820d000d010d81000d820d000d810d00
+81000d820d000d010d81000d820d000d010d81000d070d81000d040d81000d010d81000d
+820d000d010d81000d020d81000d020d81000d040d81000d610d81000d030d81000d030d
+81000d810d0081000d820d000d2e0d82060d068106000500020681070082000d06010681
+0700
+82060d0601068207000d020d0200030d0200030d0100810d0081000d810d000200810d00
+0100810d000100080d0300810d000100810d000100010d0200020d0400020d0300020d03
+005d0d0200020d0300030d0100810d0081000d810d0002002b0d82060d060a0681070082
+000d060106810700
+82060d0601068207000d1a0d81000d7f0d590d82060d060a0681070082000d0601068107
+00
+82060d0601068207000d170d02007f0d5b0d82060d060a0681070082000d060106810700
+
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d8106070c070100810d060106810700
+82060d0601068207000d7f0d760d1000810d060106810700
+82060d0601068207000d7f0d760d92060d060d060d060d060d060d060d060d000d060106
+810700
+82060d0601068207000d7f0d770d91060d060d060d060d060d060d060d06000d06010681
+0700
+82060d0601068207000d030d81000d7f0d2d0d81000d020d0300390d92060d060d060d06
+0d060d060d060d060d000d060106810700
+82060d0601068207000d7f0d320d0100030d81000d3c0d91060d060d060d060d060d060d
+060d06000d060106810700
+82060d0601068207000d010d0200040d0200010d0100810d0081000d7f0d1c0d83000d00
+0d020d81000d3b0d92060d060d060d060d060d060d060d060d000d060106810700
+82060d0601068207000d030d81000d020d81000d010d81000d810d0081000d820d000d7f
+0d1a0d81000d820d000d020d02003b0d91060d060d060d060d060d060d060d06000d0601
+06810700
+82060d0601068207000d030d81000d030d0300010d81000d010d81000d7f0d1a0d040005
+0d81000d380d92060d060d060d060d060d060d060d060d000d060106810700
+82060d0601068207000d030d81000d020d81000d010d81000d820d000d010d81000d7f0d
+1d0d81000d010d81000d010d81000d380d0e060100810d060106810700
+82060d0601068207000d010d0400010d0800810d0001007f0d1c0d0200020d02003a0d81
+060d0b0d81070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d810d0081000d060d81000d030d0100040d01007f0d170d020003
+0d0300390d82060d060a0681070082000d060106810700
+82060d0601068207000d010d81000d0d0d81000d040d81000d7f0d150d81000d010d8100
+0d010d81000d3b0d82060d060a0681070082000d060106810700
+82060d0601068207000d010d82000d0081000d010d0200050d81000d040d81000d7f0d18
+0d81000d020d81000d3b0d82060d060a0681070082000d060106810700
+82060d0601068207000d010d0100010d81000d020d81000d040d81000d040d81000d7f0d
+170d81000d030d02003a0d82060d060a0681070082000d060106810700
+82060d0601068207000d010d81000d010d81000d020d81000d040d81000d040d81000d7f
+0d160d81000d070d81000d380d82060d060a0681070082000d060106810700
+82060d0601068207000d010d81000d010d81000d020d81000d040d81000d040d81000d7f
+0d150d81000d040d81000d010d81000d380d82060d060a0681070082000d060106810700
+
+82060d0601068207000d810d000300020d0400010d0400010d04007f0d140d0400020d02
+003a0d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d030d81000d0a0d0100050d81000d7f0d5b0d82060d060a068107
+0082000d060106810700
+82060d0601068207000d110d81000d7f0d620d82060d060a0681070082000d0601068107
+00
+82060d0601068207000d010d0300010d0100010d0100030d81000d020d0200040d020001
+0d0100810d0081000d7f0d070d0200010d0100810d0081000d020d0200330d82060d060a
+0681070082000d060106810700
+82060d0601068207000d040d81000d010d81000d010d81000d020d81000d040d81000d02
+0d81000d010d81000d810d0081000d820d000d7f0d050d81000d010d81000d810d008100
+0d820d000d820d000d010d81000d310d82060d060a0681070082000d060106810700
+82060d0601068207000d040d81000d010d81000d010d81000d020d81000d040d81000d03
+0d0300010d81000d010d81000d7f0d050d81000d010d81000d820d000d010d81000d810d
+000300320d82060d060a0681070082000d060106810700
+82060d0601068207000d040d81000d010d81000d810d0081000d020d81000d040d81000d
+020d81000d010d81000d820d000d010d81000d7f0d050d81000d010d81000d820d000d01
+0d81000d820d000d350d82060d060a0681070082000d060106810700
+82060d0601068207000d040d81000d020d0100810d0082000d000300010d0400010d0800
+810d0001007f0d060d0200010d0200810d000100010d0300320d82060d060a0681070082
+000d060106810700
+82060d0601068207000d040d81000d7f0d6f0d82060d060a0681070082000d0601068107
+00
+82060d0601068207000d010d02007f0d710d82060d060a0681070082000d060106810700
+
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d7f0d760d82060d060a0681070082000d060106810700
+82060d0601068207000d810d0081000d060d81000d7f0d690d82060d060a068107008200
+0d060106810700
+82060d0601068207000d010d81000d0b0d81000d7f0d640d82060d060a0681070082000d
+060106810700
+82060d0601068207000d010d82000d0081000d010d0200020d0400010d0200820d000d02
+0d0200010d0100810d0081000d7f0d050d0100810d0081000d020d0200010d0100810d00
+81000d020d02002c0d82060d060a0681070082000d060106810700
+82060d0601068207000d010d0100010d81000d020d81000d020d81000d040d85000d000d
+000d820d000d010d81000d810d0081000d820d000d7f0d050d0100010d81000d820d000d
+010d81000d810d0081000d820d000d820d000d010d81000d2a0d82060d060a0681070082
+000d060106810700
+82060d0601068207000d010d81000d010d81000d020d81000d020d81000d040d85000d00
+0d000d010d0300010d81000d010d81000d7f0d050d81000d010d81000d820d000d010d81
+000d820d000d010d81000d810d0003002b0d82060d060a0681070082000d060106810700
+
+82060d0601068207000d010d81000d010d81000d020d81000d020d81000d010d81000d86
+0d000d000d000d820d000d010d81000d820d000d010d81000d7f0d050d81000d010d8100
+0d820d000d010d81000d820d000d010d81000d820d000d2e0d82060d060a068107008200
+0d060106810700
+82060d0601068207000d810d000300020d0400020d0200010d0600810d000400810d0002
+007f0d060d0200810d000100010d0200010d0200810d000100010d03002b0d8106070c07
+0100810d060106810700
+82060d0601068207000d240d81000d7f0d4f0d1000810d060106810700
+82060d0601068207000d230d02007f0d4f0d0e060100810d060106810700
+82060d0601068207000d7f0d760d81060d0b0d81070082000d060106810700
+82060d060106820700047f04760482060d060a0681070082000d060106810700
+82060d060106820700047f04760482060d060a0681070082000d060106810700
+82060d060106820700047f04760482060d060a0681070082000d060106810700
+82060d060106820700047f04760482060d060a0681070082000d060106810700
+82060d060106820700043404810d041304010d7f04290482060d06810600050002068107
+0082000d060106810700
+82060d060106820700041d04810d042b04810d046204810d04430482060d060106040003
+0681070082000d060106810700
+82060d060106820700040204030d0204020d0104010d81040d810d040204030d81040d03
+0d0204010d81040d810d040104020d0204020d0204010d81040d810d040204020d030401
+0d82040d046104040d0104020d81040d010d0104020d330482060d060206020004068107
+0082000d060106810700
+82060d060106820700040104810d040104810d0482040d040104810d0481040d810d0482
+040d0482040d040404810d040504010d0304810d040104810d040204810d040204010d01
+04810d0482040d040104810d0482040d0481040d810d046204810d040404810d04010481
+0d0482040d040104810d04310482060d060306810006040681070082000d060106810700
+
+82060d060106820700040104810d040404810d040104810d0482040d040104810d040104
+020d0204810d040504810d040404030d0304810d040204810d040104810d0481040d030d
+0104810d040104810d046204810d040404850d040d040d0482040d040104810d04310482
+060d060a0681070082000d060106810700
+82060d060106820700040104810d040404810d040104810d0482040d040104810d040404
+810d0482040d040104810d040104810d040304810d040104810d040204810d040204810d
+040104810d0482040d040404810d040104810d046204810d040104810d0486040d040d04
+0d0482040d040104810d04310482060d060a0681070082000d060106810700
+82060d060106820700040204030d0204020d0104020d81040d010d81040d020d0304020d
+0204030d0204050d81040d030d81040d010d81040d010d0104030d0204040d6304020d03
+04830d040d040204020d330482060d060a0681070082000d060106810700
+82060d060106820700047f04760482060d060a0681070082000d060106810700
+82060d060106820700047f0476048106070c070100810d060106810700
+82060d060106820700047f0476041000810d060106810700
+82060d0601068107067f0677061000810d060106810700
+82060d0601067f0d7f0d0b0d0206810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+82060d067f067f061006810700
+8106077f077f0712070000
+7f007f001500
+
+%
+% Compression made this file 6.27% of the uncompressed size.
+%
+
+
+showpage
+
+% stop using temporary dictionary
+end
+
+% restore original state
+origstate restore
+
+%%Trailer
diff --git a/docs/latex/proplist/prop1.gif b/docs/latex/proplist/prop1.gif
new file mode 100644 (file)
index 0000000..4344434
Binary files /dev/null and b/docs/latex/proplist/prop1.gif differ
diff --git a/docs/latex/proplist/prop2.bmp b/docs/latex/proplist/prop2.bmp
new file mode 100644 (file)
index 0000000..d909f41
Binary files /dev/null and b/docs/latex/proplist/prop2.bmp differ
diff --git a/docs/latex/proplist/prop2.eps b/docs/latex/proplist/prop2.eps
new file mode 100644 (file)
index 0000000..398e70c
--- /dev/null
@@ -0,0 +1,664 @@
+%!PS-Adobe-2.0 EPSF-2.0
+%%Title: prop2.eps
+%%Creator: XV Version 2.20  Rev: 4/24/92  -  by John Bradley
+%%BoundingBox: 167 221 466 500
+%%Pages: 1
+%%DocumentFonts:
+%%EndComments
+%%EndProlog
+
+%%Page: 1 1
+
+% remember original state
+/origstate save def
+
+% build a temporary dictionary
+20 dict begin
+
+% lower left corner
+167 221 translate
+
+% size of image (on paper, in 1/72inch coords)
+299 279 scale
+
+% define 'colorimage' if it isn't defined
+%   ('colortogray' and 'mergeprocs' come from xwd2ps
+%     via xgrab)
+/colorimage where   % do we know about 'colorimage'?
+  { pop }           % yes: pop off the 'dict' returned
+  {                 % no:  define one
+    /colortogray {  % define an RGB->I function
+      /rgbdata exch store    % call input 'rgbdata'
+      rgbdata length 3 idiv
+      /npixls exch store
+      /rgbindx 0 store
+      /grays npixls string store  % str to hold the result
+      0 1 npixls 1 sub {
+        grays exch
+        rgbdata rgbindx       get 20 mul    % Red
+        rgbdata rgbindx 1 add get 32 mul    % Green
+        rgbdata rgbindx 2 add get 12 mul    % Blue
+        add add 64 idiv      % I = .5G + .31R + .18B
+        put
+        /rgbindx rgbindx 3 add store
+      } for
+      grays
+    } bind def
+
+    % Utility procedure for colorimage operator.
+    % This procedure takes two procedures off the
+    % stack and merges them into a single procedure.
+
+    /mergeprocs { % def
+      dup length
+      3 -1 roll
+      dup
+      length
+      dup
+      5 1 roll
+      3 -1 roll
+      add
+      array cvx
+      dup
+      3 -1 roll
+      0 exch
+      putinterval
+      dup
+      4 2 roll
+      putinterval
+    } bind def
+
+    /colorimage { % def
+      pop pop     % remove 'false 3' operands
+      {colortogray} mergeprocs
+      image
+    } bind def
+  } ifelse          % end of 'false' case
+
+
+
+% define the colormap
+/cmap 42 string def
+
+
+% load up the colormap
+currentfile cmap readhexstring
+000000 bf0000 00bf00 bfbf00 0000bf 00bfbf c0c0c0 808080 ff0000 00ff00 
+ffff00 0000ff 00ffff ffffff 
+pop pop   % lose return values from readhexstring
+
+
+% rlecmapimage expects to have 'w h bits matrix' on stack
+/rlecmapimage {
+  /buffer 1 string def
+  /rgbval 3 string def
+  /block  384 string def
+
+  % proc to read a block from file, and return RGB data
+  { currentfile buffer readhexstring pop
+    /bcount exch 0 get store
+    bcount 128 ge
+    {  % it's a non-run block
+      0 1 bcount 128 sub
+      { currentfile buffer readhexstring pop pop
+
+        % look up value in color map
+        /rgbval cmap buffer 0 get 3 mul 3 getinterval store
+
+        % and put it in position i*3 in block
+        block exch 3 mul rgbval putinterval
+      } for
+      block  0  bcount 127 sub 3 mul  getinterval
+    }
+
+    { % else it's a run block
+      currentfile buffer readhexstring pop pop
+
+      % look up value in colormap
+      /rgbval cmap buffer 0 get 3 mul 3 getinterval store
+
+      0 1 bcount { block exch 3 mul rgbval putinterval } for
+
+      block 0 bcount 1 add 3 mul getinterval
+    } ifelse
+  } % end of proc
+  false 3 colorimage
+} bind def
+
+
+299 279 8                      % dimensions of data
+[299 0 0 -279 0 279]           % mapping matrix
+rlecmapimage
+
+7f0003007f072607
+07077f067f0618068100070707
+070781060d7f0d7f0d150d820700070707
+070782060d067f067f061406820700070707
+070782060d067f067f061406820700070707
+070782060d068106077f077f0710070106820700070707
+070782060d068106078207060d820d060783070d0702010203098102077f077e07010682
+0700070707
+070782060d068106078707060b060001020781070283020702098109028102077f074a07
+0e0d81000d0d0d81000781070d0d0d81000781070683060700070707
+070782060d0681060782070806810600820002078507020902070201028109077f074a07
+810d060b068307000d060b068207000782070d060b068207000781070683060700070707
+
+070782060d06810607810706850608000403078207020984090207020981090701070506
+2d070306020701061a0705066a07810d060b068307000d06810600070001068207000782
+070d060b068207000781070683060700070707
+070782060d068106078707060b0604000a07890702090207020702090701070106020701
+061d0701060b07010601070106010701061207010607070106100701065907810d060b06
+8307000d06810600070001068207000782070d0601060100030601000106820700078107
+0683060700070707
+070782060d0681060701070106020001070102860702090207020701070106020701061d
+0701060b070106050701061207010607070106100701065907810d060b068307000d0682
+0600060506810006830607000782070d0602060100010601000206820700078107068306
+0700070707
+070782060d0681060785070d0607060d010d840702000209010982020007010701060207
+010681070601060107030601070406020703060107020681070601068107068206070681
+060703070106050704060207030602070306010702060607010604070306020702060107
+02065807810d060b068307000d06820600060506810006830607000782070d0603060300
+03068207000781070683060700070707
+070782060d06810607070701000602020705060107010601070106010701068107068106
+078107068206070681060781070682060706810607810706810607810706820607068106
+070407030602070206810706820607068106078107068206070681060781070682060706
+81060706070106030701060107010681070682060706820607068106075807810d060b06
+8307000d06820600060506810006830607000782070d0604060100040682070007810706
+83060700070707
+070782060d06810607810705050501000603020701060507010601070106010701068107
+068106078107068206070604068107068106078107068106078107068206070681060707
+070106010701060107010681070604068107060406810706810607060701060307050601
+070106020701065907810d060b068307000d06820600060506810006830607000782070d
+060306030003068207000781070683060700070707
+070782060d0681060781070c010c8205080c830c05030a020a81030a810a070107010605
+070106010701060107010681070681060781070682060706810607030701060107010601
+070106810706810607070701060107010601070106810706810607030701060407010607
+0701060307010606070106010701065907810d060b068307000d06820600060506810006
+830607000782070d06020601000106010002068207000781070683060700070707
+070782060d068106078c070c05070507050c05030a030a840a03000a0701070106050701
+060107010601070106810706810607810706820607068106078107068206070681060781
+070681060701070206050701060107010601070106010701068107068106078107068206
+070681060781070682060706810607060701060307010601070106810706820607068206
+07068106075807810d060106050003068307000d06820600060506810006830607000782
+070d06010601000306010001068207000781070683060700070707
+070782060d0681060782070c08020886070c05030a030a010a82030a0701070106050701
+060207030601070406020703060107010602070106010701060707030602070106010701
+06010703060207030602070106060701060407030602070206020701065807810d060106
+050003068307000d06810600070001068207000782070d060b0682070007810706830607
+00070707
+070782060d0681060782070c080208010c8205030a810a0384030a030a07140701061407
+01067f071c07810d060b068307000d060b068207000782070d060b068207000781070683
+060700070707
+070782060d0681060782070c080308850c05030a030a010a82000a071407010612070206
+7f071d07810d070c0782000d070c0781000782070d070c07810007810706830607000707
+07
+070782060d0681060783070c05080208850c05030a030a810a0382030a077f074a071f00
+01070f0001070106820700070707
+070782060d0681060781070c050c8205030a050a7f077f070106820700070707
+070782060d068106077f077f0710070106820700070707
+070782060d067f067f061406820700070707
+070782060d067f067f061406820700070707
+070782060d0637067f073d07810d061c06820700070707
+070782060d06030616000306160001068107007f003a0082060d06810600150004068207
+00070707
+070782060d06020681000d140d820700068206000d140d8507000607000d7f0d390d8406
+0d06000d140d820700060206820700070707
+070782060d06020682000d06120601078100068306000d061206010784000607000d7f0d
+390d84060d06000d130d01078100060206820700070707
+070782060d06020682000d06120601078100068306000d061206010784000607000d7f0d
+390d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d06120601078100068306000d061206010784000607000d7f0d
+390d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d0603068100060606810006030601078100068306000d061206
+010784000607000d010d0100020d0200020d0200020d02007f0d230d84060d06000d810d
+06110601078100060206820700070707
+070782060d06020682000d060306020003060200040601078100068306000d060b068100
+060406010784000607000d810d000100010d0100810d0082000d0082000d0082000d0082
+000d0081000d7f0d210d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d060406020001060200050601078100068306000d060a060200
+0406010785000607000d000200010d0100810d0082000d0082000d0082000d0082000d00
+81000d7f0d210d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d0605060500060601078100068306000d060906030004060107
+87000607000d000d0081000d810d0082000d0082000d0082000d0082000d0082000d0081
+000d7f0d210d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d0606060300070601078100068306000d060806030005060107
+84000607000d010d0100010d0100810d0082000d0082000d0082000d0082000d0081000d
+7f0d210d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d0606060300070601078100068306000d060306010001060300
+0606010784000607000d010d0100010d0100810d0082000d0082000d0082000d0082000d
+0081000d7f0d210d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d0605060500060601078100068306000d060306060007060107
+84000607000d010d0100010d0100810d0082000d0082000d0082000d0082000d0081000d
+7f0d210d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d060406020001060200050601078100068306000d0604060400
+0806010784000607000d010d0100020d0200020d0200020d02007f0d230d84060d06000d
+810d060306010781060782070607810706040601078100060206820700070707
+070782060d06020682000d060306020003060200040601078100068306000d0605060200
+0906010784000607000d7f0d390d84060d06000d810d0603060107810607820706078107
+06040601078100060206820700070707
+070782060d06020682000d060306010005060100040601078100068306000d0606068100
+060906010784000607000d7f0d390d84060d06000d810d06110601078100060206820700
+070707
+070782060d06020682000d06120601078100068306000d061206010784000607000d7f0d
+390d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d06120601078100068306000d061206010784000607000d7f0d
+390d84060d06000d810d06110601078100060206820700070707
+070782060d06020682000d0714078100068306000d07140784000607000d7f0d390d8506
+0d06000d0714078100060206820700070707
+070782060d06020682000d0714078100068306000d07140784000607000d7f0d390d8406
+0d06000715078100060206820700070707
+070782060d06030616000306160001068207000d7f0d390d82060d068106001500040682
+0700070707
+070782060d0637068107067f063b06810d061c06820700070707
+070782060d0637067f0d3e0d1d06820700070707
+070782060d0601067f077f070e07810d060106820700070707
+070782060d0601068107007f007f000b0082060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d040d0100120d01007f0d150d0200550d82060d0601068207
+00070707
+070782060d0601068207000d030d81000d140d81000d7f0d130d81000d010d81000d530d
+82060d060106820700070707
+070782060d0601068207000d020d0300010d0100810d0081000d010d0200030d0100820d
+000d7f0d130d81000d010d81000d530d82060d060106820700070707
+070782060d0601068207000d030d81000d030d0100030d81000d010d81000d820d000d81
+0d0081000d7f0d130d81000d010d81000d530d82060d060106820700070707
+070782060d0601068207000d030d81000d030d81000d030d0400010d81000d010d81000d
+7f0d130d81000d010d81000d530d82060d060106820700070707
+070782060d0601068207000d030d81000d030d81000d030d81000d040d81000d010d8100
+0d7f0d130d81000d010d81000d530d82060d060106820700070707
+070782060d0601068207000d020d0300010d0300030d0300020d04007f0d140d0200550d
+82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d1c0d0100120d01000e0d81000d6b0d0400090d0100480d82
+060d060106820700070707
+070782060d0601068207000d010d81000d190d81000d120d81000d7c0d81000d820d000d
+090d81000d470d82060d060106820700070707
+070782060d0601068207000d810d000300030d0200010d0100010d0100020d0100810d00
+84000d000d0081000d090d0300010d82000d0081000d020d0200020d0200040d0300020d
+02005e0d83000d000d020d0200040d81000d030d0300020d0200390d82060d0601068207
+00070707
+070782060d0601068207000d010d81000d040d81000d010d81000d820d000d010d81000d
+820d000d810d0081000d810d0081000d820d000d070d81000d010d81000d810d0081000d
+820d000d820d000d010d81000d020d81000d020d81000d010d81000d820d000d010d8100
+0d5c0d0200020d81000d010d81000d020d81000d020d81000d040d81000d010d81000d37
+0d82060d060106820700070707
+070782060d0601068207000d010d81000d040d81000d010d81000d820d000d010d81000d
+820d000d010d81000d820d000d010d81000d070d81000d040d81000d010d81000d820d00
+0d010d81000d020d81000d020d81000d040d04005d0d83000d000d020d0300030d81000d
+030d0200020d0400380d82060d060106820700070707
+070782060d0601068207000d010d81000d010d81000d820d000d010d81000d820d000d81
+0d0081000d820d000d010d81000d820d000d010d81000d070d81000d040d81000d010d81
+000d820d000d010d81000d020d81000d020d81000d040d81000d600d81000d030d81000d
+010d81000d020d81000d060d81000d820d000d3b0d82060d060106820700070707
+070782060d0601068207000d020d0200030d0200030d0100810d0081000d810d00020081
+0d000100810d000100080d0300810d000100810d000100010d0200020d0400020d030002
+0d03005c0d0200030d0500810d000300010d0300030d0300380d82060d06010682070007
+0707
+070782060d0601068207000d1a0d81000d7f0d6d0d82060d060106820700070707
+070782060d0601068207000d170d02007f0d6f0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d060106820700047f047f040a0482060d060106820700070707
+070782060d060106820700047f047f040a0482060d060106820700070707
+070782060d060106820700047f047f040a0482060d060106820700070707
+070782060d060106820700047f047f040a0482060d060106820700070707
+070782060d060106820700040304810d047f043204010d4f0482060d0601068207000707
+07
+070782060d060106820700047f043904810d044e0482060d060106820700070707
+070782060d060106820700040104020d0404020d0104010d81040d810d047f042404810d
+044e0482060d060106820700070707
+070782060d060106820700040304810d040204810d040104810d0481040d810d0482040d
+047f041a04040d0304810d044e0482060d060106820700070707
+070782060d060106820700040304810d040304030d0104810d040104810d047f04230481
+0d044e0482060d060106820700070707
+070782060d060106820700040304810d040204810d040104810d0482040d040104810d04
+7f042304810d044e0482060d060106820700070707
+070782060d060106820700040104040d0104080d81040d010d7f042104040d4d0482060d
+060106820700070707
+070782060d060106820700047f047f040a0482060d060106820700070707
+070782060d060106820700047f047f040a0482060d060106820700070707
+070782060d060106820700047f047f040a0482060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d810d0081000d060d81000d030d0100040d01007f0d170d02
+00030d03004d0d82060d060106820700070707
+070782060d0601068207000d010d81000d0d0d81000d040d81000d7f0d150d81000d010d
+81000d010d81000d4f0d82060d060106820700070707
+070782060d0601068207000d010d82000d0081000d010d0200050d81000d040d81000d7f
+0d180d81000d020d81000d4f0d82060d060106820700070707
+070782060d0601068207000d010d0100010d81000d020d81000d040d81000d040d81000d
+7f0d170d81000d030d02004e0d82060d060106820700070707
+070782060d0601068207000d010d81000d010d81000d020d81000d040d81000d040d8100
+0d7f0d160d81000d070d81000d4c0d82060d060106820700070707
+070782060d0601068207000d010d81000d010d81000d020d81000d040d81000d040d8100
+0d7f0d150d81000d040d81000d010d81000d4c0d82060d060106820700070707
+070782060d0601068207000d810d000300020d0400010d0400010d04007f0d140d040002
+0d02004e0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d030d81000d0a0d0100050d81000d7f0d6f0d82060d060106
+820700070707
+070782060d0601068207000d110d81000d7f0d760d82060d060106820700070707
+070782060d0601068207000d010d0300010d0100010d0100030d81000d020d0200040d02
+00010d0100810d0081000d7f0d070d0200010d0100810d0081000d020d0200470d82060d
+060106820700070707
+070782060d0601068207000d040d81000d010d81000d010d81000d020d81000d040d8100
+0d020d81000d010d81000d810d0081000d820d000d7f0d050d81000d010d81000d810d00
+81000d820d000d820d000d010d81000d450d82060d060106820700070707
+070782060d0601068207000d040d81000d010d81000d010d81000d020d81000d040d8100
+0d030d0300010d81000d010d81000d7f0d050d81000d010d81000d820d000d010d81000d
+810d000300460d82060d060106820700070707
+070782060d0601068207000d040d81000d010d81000d810d0081000d020d81000d040d81
+000d020d81000d010d81000d820d000d010d81000d7f0d050d81000d010d81000d820d00
+0d010d81000d820d000d490d82060d060106820700070707
+070782060d0601068207000d040d81000d020d0100810d0082000d000300010d0400010d
+0800810d0001007f0d060d0200010d0200810d000100010d0300460d82060d0601068207
+00070707
+070782060d0601068207000d040d81000d7f0d7f0d030d82060d060106820700070707
+070782060d0601068207000d010d02007f0d7f0d050d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d810d0081000d060d81000d7f0d7d0d82060d060106820700
+070707
+070782060d0601068207000d010d81000d0b0d81000d7f0d780d82060d06010682070007
+0707
+070782060d0601068207000d010d82000d0081000d010d0200020d0400010d0200820d00
+0d020d0200010d0100810d0081000d7f0d050d0100810d0081000d020d0200010d010081
+0d0081000d020d0200400d82060d060106820700070707
+070782060d0601068207000d010d0100010d81000d020d81000d020d81000d040d85000d
+000d000d820d000d010d81000d810d0081000d820d000d7f0d050d0100010d81000d820d
+000d010d81000d810d0081000d820d000d820d000d010d81000d3e0d82060d0601068207
+00070707
+070782060d0601068207000d010d81000d010d81000d020d81000d020d81000d040d8500
+0d000d000d010d0300010d81000d010d81000d7f0d050d81000d010d81000d820d000d01
+0d81000d820d000d010d81000d810d0003003f0d82060d060106820700070707
+070782060d0601068207000d010d81000d010d81000d020d81000d020d81000d010d8100
+0d860d000d000d000d820d000d010d81000d820d000d010d81000d7f0d050d81000d010d
+81000d820d000d010d81000d820d000d010d81000d820d000d420d82060d060106820700
+070707
+070782060d0601068207000d810d000300020d0400020d0200010d0600810d000400810d
+0002007f0d060d0200810d000100010d0200010d0200810d000100010d03003f0d82060d
+060106820700070707
+070782060d0601068207000d240d81000d7f0d630d82060d060106820700070707
+070782060d0601068207000d230d02007f0d630d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d340d81000d130d01007f0d3d0d82060d0601068207000707
+07
+070782060d0601068207000d1d0d81000d2b0d81000d620d81000d570d82060d06010682
+0700070707
+070782060d0601068207000d020d0300020d0200010d0100810d0081000d020d0300810d
+000300020d0100810d0081000d010d0200020d0200020d0100810d0081000d020d020003
+0d0100820d000d610d0400010d0200810d000100010d0200470d82060d06010682070007
+0707
+070782060d0601068207000d010d81000d010d81000d820d000d010d81000d810d008100
+0d820d000d820d000d040d81000d050d0100030d81000d010d81000d020d81000d020d01
+00010d81000d820d000d010d81000d820d000d810d0081000d620d81000d040d81000d01
+0d81000d820d000d010d81000d450d82060d060106820700070707
+070782060d0601068207000d010d81000d040d81000d010d81000d820d000d010d81000d
+010d0200020d81000d050d81000d040d0300030d81000d020d81000d010d81000d810d00
+0300010d81000d010d81000d620d81000d040d85000d000d000d820d000d010d81000d45
+0d82060d060106820700070707
+070782060d0601068207000d010d81000d040d81000d010d81000d820d000d010d81000d
+040d81000d820d000d010d81000d010d81000d030d81000d010d81000d020d81000d020d
+81000d010d81000d820d000d040d81000d010d81000d620d81000d010d81000d860d000d
+000d000d820d000d010d81000d450d82060d060106820700070707
+070782060d0601068207000d020d0300020d0200010d0200810d000100810d000200030d
+0200020d0300020d0500810d000300810d000100810d000100010d0300020d0400630d02
+00030d83000d000d020d0200470d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+070782060d0601068207000d7f0d7f0d0a0d82060d060106820700070707
+7f077f0726078100070107
+03077f0d7f0d210d820700070107
+0307820d06077f077f071c07840d060700070107
+0307830d0607047f047f041c0483060700070107
+0307830d0607047f047f041c0483060700070107
+0307830d0607047f047f040a040e0d8100048404060700070107
+0307830d0607047f047f040a04810d060b06820700048404060700070107
+0307830d06070481040d040d3a04010d7f044604810d060b068207000484040607000701
+07
+0307830d06070481040d810d040104010d1d04010d1904010d7f044604810d0601060107
+030601070106820700048404060700070107
+0307830d06070481040d810d040104010d1d04010d1904010d7f044604810d0602060107
+01060107010d83060700048404060700070107
+0307830d06070481040d810d040104010d81040d010d0104030d0104040d0204030d0104
+020d81040d010d81040d820d040d810d040304010d0104010d0104030d0104010d81040d
+810d0481040d810d0481040d020d0604030d0104020d81040d010d0104030d0104020d7f
+041a04810d0603060307010d0106820700048404060700070107
+0307830d06070481040d040d0104010d0104010d0104010d81040d810d0481040d820d04
+0d810d0481040d820d040d810d0481040d810d0481040d820d040d810d040304010d0104
+010d0404010d81040d820d040d810d0481040d820d040d810d0481040d810d040304010d
+0104010d81040d810d0481040d810d0481040d810d0481040d820d040d810d047f041a04
+810d0604060107010d0206820700048404060700070107
+0307830d06070481040d810d040404010d0104010d0104010d81040d810d0481040d820d
+040d040d81040d810d0481040d810d0481040d820d040d810d040404030d0204040d8104
+0d820d040d810d0481040d820d040d040d0404050d81040d810d0481040d810d0481040d
+810d0481040d820d040d810d047f041a04810d0603060307030682070004840406070007
+0107
+0307830d06070481040d810d040404010d0104010d0104010d81040d810d0481040d820d
+040d810d040304010d0104010d0104010d81040d810d040404030d0104010d0104010d81
+040d820d040d810d0481040d820d040d810d040704010d0404010d0104010d0104010d01
+04010d81040d810d047f041a04810d0602060107010d0107020682070004840406070007
+0107
+0307830d06070481040d810d040404010d0104010d0104010d81040d810d0481040d820d
+040d810d0481040d820d040d810d0481040d810d040104020d0704010d0204010d010401
+0d81040d820d040d820d040d010d81040d810d0481040d810d040304010d0104010d8104
+0d810d0481040d810d0481040d810d0481040d820d040d810d047f041a04810d06010601
+07010d010601070106820700048404060700070107
+0307830d06070481040d810d040404010d0204030d0104040d0204030d0104010d020401
+0d0104010d0804010d0304040d81040d810d0481040d030d0104030d0604030d0104010d
+0104010d0204030d0104010d7f041b04810d060206010d0306010d830607000484040607
+00070107
+0307830d0607041304010d1404010d7f045d04810d060b06820700048404060700070107
+
+0307830d0607041304010d1204020d7f045e04810d070c078100048404060700070107
+0307830d0607047f047f040a040f00010483060700070107
+0307830d0607047f047f041c0483060700070107
+0307830d0607047f047f041c0483060700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d06170602037f067f060406820700070107
+0307810d06160681030a830a0600067f067f060206820700070107
+0307810d06150681030a020a83060007067f067f0683060700070107
+0307810d06150681030a030a8100078107067f067f06820700070107
+0307810d06140681030a040a820600078107067f067e06820700070107
+0307810d06140681030a050a8100078107067f067e06820700070107
+0307810d06130681030a060a820600078107067f067d06820700070107
+0307810d06130681030a070a8100078107067f067d06820700070107
+0307810d06120681030a080a820600078107067f067c06820700070107
+0307810d06120681030a010a810600010081060a010a8100078107067f067c0682070007
+0107
+0307810d06110681030a020a0400020a820600078107067f067b06820700070107
+0307810d06110681030a020a0400030a8100078107061606810006030681000605068100
+0627068100061b0681000620068100062c06040001060200140681000602060400010602
+0001068100060a06820700070107
+0307810d06100681030a030a0400030a8206000781070615068100060306810006050681
+000621068100060306810006230681000618068100060906810006200681000603068100
+060106810006120681000602068100060306810006010683000600060a06820700070107
+
+0307810d06100681030a030a0400040a8100078107061606810006010681000606068100
+062106810006030681000623068100061806810006090681000620068100060306810006
+0106810006120681000602068100060306810006010683000600060a06820700070107
+0307810d060f0681030a040a0400040a8206000781070615068100060106810006010602
+000106830006000601068100068106000100040602008106008100068206000601068100
+068106008100068106008100060206030002060200050602000106820006008100060306
+840006000600810006810600810006810600010002060300010602000106010003060300
+020602000106010082060006820600068206000681060001000206020001068200060081
+000606060300010681000601068100060306020001068200060081000601060300030603
+000106810006010683000600060a06820700070107
+0307810d060f0681030a040a810300010081030a040a8100078107061506810006010681
+000604068500060006000601068300060006010681000602068100068206000684060006
+000601068300060006840600060006030681000601068300060006010681000606068200
+060081000682060006020682000600810006840600060006820600060106830006000601
+068300060006010683000600060306810006010683000600060106830006000682060006
+820600068406000600060106830006000601068200060081000682060006050681000601
+068300060006010681000606068200060081000684060006000601068100060206810006
+01068300060006010683000600060a06820700070107
+0307810d060e0681030a050a810600010081060a040a8206000781070615068300060006
+020603008406000600060106820006000300030681000682060006840600060006010681
+000682060006010681000603068100060106820006000300040603008206000601068100
+060206830006000601068300060006810600030082060006010682000600030082060006
+030681000601068200060003008206000689060006000600060006000300810600030082
+060006010681000602060100040683000600060106810006030603008206000601068300
+060006010681000606068300060006010683000600060a06820700070107
+0307810d060e0681030a060a0200070a8100078107061506830006000601068100060106
+850006000600060106830006000606068100068206000684060006000601068100060106
+810006820600060306810006010683000600060606810006010683000600060106810006
+020683000600060106830006000682060006030681000601068300060006030681000603
+068100060106830006000603068100068a06000600060006000600060306810006030681
+000601068100060906830006000601068100060206810006010683000600060106830006
+0006010681000606068300060006010683000600060a06820700070107
+0307810d060d0681030a070a830300030a060a8206000781070615068100060206810006
+010685000600060006810600830006000601068100060206810006820600068406000600
+068106008300060006840600060006030681000601068300060006010681000602068100
+060106830006000601068100060206830006000601068300060006820600060106830006
+000601068300060006010683000600060306810006010683000600060106830006000601
+068100060106810006820600060106830006000601068300060006010681000605068100
+060106830006000601068100060206810006010683000600060106830006000601068100
+0602068100060106830006000601068100060c06820700070107
+0307810d060d0681030a070a830600060a070a8100078107061506810006030603008206
+000681060083000600068106000100040681000682060006820600068106008300060006
+810600810006010681000602060300020602000506030082060006010681000602068300
+060006010681000682060006810600010002060300010602000106810006030603000206
+020002068100068206000601068100060106020002060200010681000601068100060606
+020002060200050603008206000601068100068106000200040602000206020001068100
+060a06820700070107
+0307810d060c0681030a090a81000a080a820600078107067c0681000677068207000701
+07
+0307810d060c0681030a150a810007810706780603007906820700070107
+0307810d060b0681030a090a8106008200060a070a820600078107067f06750682070007
+0107
+0307810d060b0681030a090a0300090a8100078107067f067506820700070107
+0307810d060a0681030a0a0a0300090a820600078107067f067406820700070107
+0307810d060a0681030a0a0a8106008200060a090a8100078107067f0674068207000701
+07
+0307810d060a0681030a190a81000701077f067406820700070107
+0307810d060a0681030a180a8206000701077f067406820700070107
+0307810d060b0681030a160a8206000702077f067406820700070107
+0307810d060c06810300160004077f067406820700070107
+0307810d060e061a077f067506820700070107
+0307810d060f0618077f067606820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d066b0648006a06820700070107
+0307810d066a064a006906820700070107
+0307810d066a060100450d8107008100066806820700070107
+0307810d066a060100440d010701006906820700070107
+0307810d066a060100010d18069100060006000600060006000600060006000617060107
+01006906820700070107
+0307810d066a060100010d4206010701006906820700070107
+0307810d066a060100010d18068100060d068100061706010701006906820700070107
+0307810d066a060100010d1b060300020681000601068100061906010701006906820700
+070107
+0307810d066a060100010d18068300060006020681000682060006820600068206000617
+06010701006906820700070107
+0307810d066a060100010d1a0681000602068100068406000600061b0601070100690682
+0700070107
+0307810d066a060100010d18068300060006020681000681060081000602068100061706
+010701006906820700070107
+0307810d066a060100010d1a0681000602068100068106008100061c0601070100690682
+0700070107
+0307810d066a060100010d18068300060006020681000684060006000601068100061706
+010701006906820700070107
+0307810d066a060100010d1a06810006020681000682060006820600061a060107010069
+06820700070107
+0307810d066a060100010d18068300060006020681000682060006010683000600061706
+010701006906820700070107
+0307810d066a060100010d1b060300020681000602068100061806010701006906820700
+070107
+0307810d066a060100010d18068100060d068100061706010701006906820700070107
+0307810d066a060100010d4206010701006906820700070107
+0307810d066a060100010d18069100060006000600060006000600060006000617060107
+01006906820700070107
+0307810d066a060100810d07440701006906820700070107
+0307810d066a060100460701006906820700070107
+0307810d066a064a006906820700070107
+0307810d066b0648006a06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+0307810d067f067f061f06820700070107
+7f077f0726078100070107
+02077f007f0024000207
+7f077f072a07
+7f077f072a07
+7f077f072a07
+7f077f072a07
+7f077f072a07
+7f077f072a07
+
+%
+% Compression made this file 5.68% of the uncompressed size.
+%
+
+
+showpage
+
+% stop using temporary dictionary
+end
+
+% restore original state
+origstate restore
+
+%%Trailer
diff --git a/docs/latex/proplist/prop2.gif b/docs/latex/proplist/prop2.gif
new file mode 100644 (file)
index 0000000..ec9b857
Binary files /dev/null and b/docs/latex/proplist/prop2.gif differ
diff --git a/docs/latex/proplist/readme.txt b/docs/latex/proplist/readme.txt
new file mode 100644 (file)
index 0000000..f54a18a
--- /dev/null
@@ -0,0 +1,39 @@
+
+Prototype dialog editor and property sheet classes
+--------------------------------------------------
+
+Julian Smart, October 4th 1995
+------------------------------
+
+Here's what I've done so far on a lightweight dialog editor.  The 16-bit
+Windows binaries in the bin directory are dialoged.exe (the dialog
+editor) and test.exe (a small property sheet demo). 
+
+Main points:
+
+ - You can create a new dialog box and add items to it.
+ - You can move items around, and right-click
+   to edit a few properties (very incomplete).
+ - Can't write out .wxr files yet. Loading code is in
+   wxWindows, but writing code is absent: should be put
+   into wxWindows.
+ - No attempt at resources other than dialogs yet.
+   Should have menu editor too.
+ - Should *somehow* have a protocol to allow
+   existing resources e.g. in wxCLIPS/wxPython
+   to be edited in situ.
+   This should be made simpler by the existance of
+   the plug-in event handler mechanism, which means you
+   can temporarily handle all the events yourself.
+ - See dialoged.cc: the main program is tiny because
+   it's meant to be embeddable.
+ - The wxPropertySheet (set of) classes are very
+   general and should be put into wxWin and documented.
+   
+Comments, chivvying and help all appreciated. Maybe if
+I documented what I had, it would be easier for others
+to do some work on it.
+
+Regards,
+
+Julian
\ No newline at end of file
diff --git a/docs/latex/proplist/tex2rtf.ini b/docs/latex/proplist/tex2rtf.ini
new file mode 100644 (file)
index 0000000..d3cacc5
--- /dev/null
@@ -0,0 +1,21 @@
+runTwice = yes
+titleFontSize = 12
+authorFontSize = 10
+chapterFontSize = 12
+sectionFontSize = 12
+subsectionFontSize = 12
+headerRule = yes
+footerRule = yes
+useHeadingStyles = yes
+contentsDepth = 2
+listItemIndent=40
+generateHPJ = no
+htmlBrowseButtons = bitmap
+winHelpVersion = 3
+winHelpContents = yes
+winHelpTitle = "Property Classes Manual"
+truncateFilenames = yes
+\overview [2] {\rtfonly{See also }\sethotspotcolour{off}\sethotspotunderline{on}\winhelponly{\image{}{books.bmp}}
+\htmlonly{\image{}{books.gif}}\helpref{#1}{#2}
+\sethotspotcolour{on}\sethotspotunderline{on}}
+
diff --git a/docs/latex/proplist/up.gif b/docs/latex/proplist/up.gif
new file mode 100644 (file)
index 0000000..316d0d2
Binary files /dev/null and b/docs/latex/proplist/up.gif differ
diff --git a/docs/latex/proplist/wxprop.hpj b/docs/latex/proplist/wxprop.hpj
new file mode 100644 (file)
index 0000000..d03da30
--- /dev/null
@@ -0,0 +1,17 @@
+[OPTIONS]
+BMROOT=d:\wx2\wxWind~1\utils\wxprop\docs ; Assume that bitmaps are where the source is
+TITLE=Property Classes Manual
+CONTENTS=Contents
+COMPRESS=HIGH
+
+[FILES]
+wxprop.rtf
+
+[CONFIG]
+CreateButton("Up", "&Up", "JumpId(`wxprop.hlp', `Contents')")
+BrowseButtons()
+
+[MAP]
+
+[BITMAPS]
+
diff --git a/docs/motif/changes.txt b/docs/motif/changes.txt
deleted file mode 100644 (file)
index 3c9df41..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-wxMotif CHANGES
----------------
-
-21/9/98
--------
-
-Julian:
-
-- Made makefiles for wxMotif source directory and minimal sample.
-
-- First go at wxApp, wxWindow, wxDialog, wxPen, wxBrush, wxFont,
-  wxColour, wxButton, wxCheckBox, wxTextCtrl, wxStaticText,
-  wxMenu, wxMenuItem, wxMenuBar
-
-12/11/98
---------
-
-It's a long time since I updated this file. Previously done:
-
-- wxFrame, wxDialog done.
-- wxScrolledWindow done (but backing pixmap not used at present).
-- wxBitmap done though could be tidied it up at some point.
-- Most basic controls are there, if not rigorously tested.
-- Some MDI support (menus appear on child frames at present).
-- wxNotebook almost done.
-- wxToolBar done (horizontal only, which would be easy to extend
-  to vertical toolbars).
-
-More recently:
-
-- Colour and font changing done (question mark over what happens
-  to scrollbars).
-- Accelerators done (for menu items and buttons). Also event loop
-  tidied up in wxApp so that events are filtered through ProcessXEvent.
-- wxWindow::GetUpdateRegion should now work.
-
-25/11/98
---------
-
-- Reimplemented MDI using wxNotebook instead of the MDI widgets, which
-  were too buggy (probably not design for dynamic addition/removal of
-  child frames).
-- Some improvements to the wxNotebook implementation.
-- wxToolBar now uses a bulletin board instead of a form, in an attempt
-  to make it possible to add ordinary wxControls to a toolbar.
-- Cured problem with not being able to use global memory operators,
-  by defining two more global operators, so that the delete will match
-  the debugging implementation.
-- Added wxUSE_DEBUG_NEW_ALWAYS so we can distinguish between using
-  global memory operators (usually OK) and #defining new to be
-  WXDEBUG_NEW (sometimes it might not be OK).
-- Added time.cpp to makefile; set wxUSE_DATETIME to 1.
-- Added a parent-existance check to popup menu code to make it not crash.
-- Added some optimization in wxWindow::SetSize to produce less flicker.
-  It remains to be seen whether this produces any resize bugs.
-
-3/12/98
--------
-
-- Debugged DrawEllipticArc (a ! in the wrong place).
-- Added SetClippingRegion( const wxRegion& region ).
-- Added wxPoint, wxSize, wxRect versions of SetSize etc.
-- Diagnosed but not yet cured a wxTreeCtrl bug (see todo.txt).
-
-4/12/98
--------
-
-- Got further with wxTreeCtrl, fixing wxWindow::Refresh on the way,
-  and adding Clear(const wxRect&). Mainly the scrolling to sort out now,
-  and inter-line spacing.
-- Fixed some problems with wxListCtrl espec. trying to call m_mainWin
-  functions when it wasn't initialised. As with the wxTreeCtrl sample,
-  removed usage of wxTextCtrl as a stream (doesn't seem to agree
-  with gcc) and the sample is now partially working. Some work
-  on the scrollbars is required.
-- wxListCtrl assumed that one of the args to GetClientSize can be NULL:
-  corrected.
-
-18/12/98
---------
-
-- Removed major bug whereby dialogs were unmanaged automatically
-  when any button was pressed.
-- Fixed colours of wxWindow scrollbars, made list and text controls
-  have a white background.
-- Fixed dialog colour setting.
-- Added settable fonts and colours for wxMenu/wxMenuBar. Now
-  they have sensible colours by default.
-- Fixed a bug in wxStaticBox.
-- Controls sample runs, though wxRadioBox doesn't appear and
-  the notebook flickers for a while.
-- Cured wxTreeCtrl bug: now works pretty well!
-
-28/12/98
---------
-
-- Cured scrolling problem: scrollbars now show/hide themselves
-  without (permanently) resizing the window.
-- Removed some commented-out lines in wxScrolledWindow::AdjustScrollbars
-  that disabled scrollbar paging.
-- Set background colour of drawing area in wxWindow, so e.g. wxListCtrl
-  colours correctly.
\ No newline at end of file
diff --git a/docs/msw/changes.txt b/docs/msw/changes.txt
deleted file mode 100644 (file)
index 936a799..0000000
+++ /dev/null
@@ -1,365 +0,0 @@
-
-wxWindows 2.0 for Windows Change Log
-------------------------------------
-
-Alpha 18, December 29th 1998
-----------------------------
-
-- Win16 support working again (VC++ 1.5)
-- Win16 now uses generic wxNotebook, wxListCtrl,
-  wxTreeCtrl -- more or less working now, although
-  a little work on wxNotebook is still needed.
-  Under 16-bit Windows, get assertion when you click
-  on a tab.
-- Wrote 16-bit BC++ makefiles: samples don't yet link.
-- Added CodeWarrior support to distribution courtesy
-  of Stefan Csomor.
-
-Alpha 17, November 22nd 1998
-----------------------------
-
-- More documentation updates, especially for
-  wxLayoutWindow classes and debugging facilities.
-- Changed wxDebugContext to use wxDebugLog instead
-  of wxTrace.
-- Now supports VC++ 6.0, and hopefully BC++ 5.0.
-  However, DLL support may be broken for BC++ since
-  VC++ 6 required changing of WXDLLEXPORT keyword
-  position.
-- Numerous miscellaneous changes.
-
-Alpha 16, September 8th 1998
-----------------------------
-
-- Added wxSashWindow, wxSashLayoutWindow classes, and sashtest
-  sample.
-- Guilhem's socket classes added, plus wxsocket sample.
-- A few more makefiles added.
-- GnuWin32/BC++ compatibility mods.
-- Further doc updates.
-- wxProp updates for correct working with wxGTK.
-
-Alpha 15, August 31st 1998
---------------------------
-
-- wxBitmap debugged.
-- wxDC::GetDepth added.
-- Contribution added whereby wxBitmap will be
-  converted to DC depth if they don't match.
-- wxConfig API improved, documentation updated.
-- Printing classes name conventions cleaned up.
-- wxUpdateUIEvent now derives from wxCommandEvent
-  so event can travel up the window hierachy.
-
-Alpha 14, July 31st 1998
-------------------------
-
-- Toolbar API has been simplified, and now
-  wxFrame::GetClientArea returns the available client
-  area when toolbar, status bar etc. have been accounted for.
-  wxFrame::CreateToolBar added in line with CreateStatusBar.
-- Documentation updates, incl. for wxToolBar.
-- New wxAcceleratorTable class plus wxFrame::SetAcceleratorTable.
-- Various additions from other folk, e.g. streams, wxConfig
-  changes, wxNotebook.
-- Added wxDocMDIParentFrame, wxDocMDIChildFrame for doc/view.
-
-Alpha 13, July 8th 1998
------------------------
-
-- Implemented wxPoint as identical to POINT on Windows, and
-  altered wxDC wxPoint functions to use wxPoint directly in
-  Windows functions, for efficiency.
-- Cured wxASSERT bug in wxStatusBar95.
-- #ifdefed out some bits in oleutils.cpp for compilers that
-  don't support it.
-- Added some operators to wxPoint, wxSize.
-- Added inline wxDC functions using wxPoint, wxSize, wxRect.
-
-Alpha 12, July 7th 1998
------------------------
-
-- Added wxApp::GetComCtl32Version, and wxTB_FLAT style, so can
-  have flat toolbars on Win98 or Win95 with IE >= 3 installed.
-
-Alpha 11, July 3rd 1998
------------------------
-
-- Added thread.h, thread.cpp.
-- Changed Enabled, Checked to IsEnabled, IsChecked in wxMenu,
-  wxMenuBar.
-- Changed wxMenuItem::SetBackColor to SetBackgroundColour,
-  SetTextColor to SetTextColour, and added or made public several
-  wxMenuItem accessors.
-- Added two overloads to wxRegion::Contains. Added
-  wxRegion::IsEmpty for a more consistent naming convention.
-- Added Vadim's wxDataObject and wxDropSource.
-- ENTER/LEAVE events now work.
-- Cured wxMemoryDC bug where the DC wasn't being deleted.
-- Cured wxGauge SetSize major bugginess.
-- Cured problem where if a GDI object was created on the stack,
-  then went out of scope, then another object was selected into
-  the DC, GDI objects would leak. This is because the assignment
-  to e.g. wxDC::m_pen would delete the GDI object without it first
-  being selected out of the DC. Cured by selecting the old DC object
-  first, then doing the assignment.
-- Split up wxGaugeMSW, wxGauge95, wxSliderMSW, wxSlider95
-- Various other bug fixes and additions.
-
-Alpha 10, May 7th 1998
-----------------------
-
-- Added desiredWidth, desiredHeight parameters to wxBitmapHandler
-  and wxIcon functions so that you can specify what size of
-  icon should be loaded. Probably will remain a Windows-specific thing.
-- wxStatusBar95 now works for MDI frames.
-- Toolbars in MDI frames now behave normally. They still
-  require application-supplied positioning code though.
-- Changed installation instructions, makefiles and batch files
-  for compiling with Gnu-Win32/Mingw32/EGCS. Also timercmn.cpp
-  change to support Mingw32/EGCS. Bison now used by default.
-
-Alpha 9, April 27th 1998
-------------------------
-
-- Cured bug in wxStatusBar95 that caused a crash if multiple
-  fields were used.
-- Added Gnu-Win32 b19/Mingw32 support by changing resource
-  compilation and pragmas.
-- Cured wxMenu bug introduced in alpha 8 - didn't respond to
-  commands because VZ changed the id setting in wxMenu::MSWCommand.
-
-Alpha 8, April 17th 1998
-------------------------
-
-- Added IsNull to wxGDIObject to check if the ref data is present or not.
-- Added PNG handler and sample - doesn't work for 16-bit PNGs for
-  some reason :-(
-- Added wxJoystick class and event handling, and simple demo.
-- Added simple wxWave class. Needs Stop() function.
-- Added wxModule (module.h/module.cpp) to allow definition
-  of modules to be initialized and cleaned up on wxWindows
-  startup/exit.
-- Start of Mingw32 compatibility (see minimal and dialogs samples
-  makefile.m95 files, and install.txt).
-- Note: Windows printing has stopped working... will investigate.
-VADIM'S CHANGES:
-- Updated wxString: bug fixes, added wxArrayString, some
-  compatibility functions.
-- Updated log.h/cpp, added wxApp::CreateLogTarget.
-- file.h: new wxTempFile class.
-- defs.h: added wxSB_SIZE_GRIP for wxStatusBar95
-- statbr95: wxStatusBar95 control.
-- registry.h/cpp: wxRegKey class for Win95 registry.
-- listbox.cpp: corrected some bugs with owner-drawn listboxes.
-- wxConfig and wxFileConfig classes.
-
-Alpha 7, March 30th 1998
-------------------------
-
-- Added tab classes, tab sample.
-- Now can return FALSE from OnInit and windows will be
-  cleaned up properly before exit.
-- Improved border handling so panels don't get borders
-  automatically.
-- Debugged MDI activation from Window menu.
-- Changes to memory debug handling, including checking for
-  memory leaks on application exit - but see issues.txt for
-  unresolved issues.
-- Added wxTaskBarIcon (taskbar.cpp/h, plus samples/taskbar)
-  to allow maintenance of an icon in the Windows 95 taskbar
-  tray area.
-- Got MFC sample working (MFC and wxWindows in the same
-  application), partly by tweaking ntwxwin.mak settings.
-- Got DLL compilation working again (VC++).
-- Changed wxProp/Dialog Editor filenames.
-
-Alpha 6, March 10th 1998
-------------------------
-
-- Found stack error bug - stopped unwanted OnIdle recursion.
-- Removed bug in wxTreeCtrl::InsertItem I added in alpha 5.
-- Changed exit behaviour in wxApp/wxFrame/wxDialog. Now will
-  check if the number of top-level windows is zero before
-  exiting. Also, wxApp::GetTopWindow will return either
-  m_topWindow or the first member of wxTopLevelWindows, so you
-  don't have to call wxApp::SetTopWindow.
-- Added dynarray.h/dynarray.cpp (from Vadim).
-- Added first cut at OLE drag and drop (from Vadim). dnd sample
-  added. Drop target only at this stage. See src/msw/ole/*.cpp,
-  wx/include/msw/ole/*.h. WIN32 only because of UUID usage.
-  Doesn't work with GnuWin32 - no appropriate headers e.g. for
-  IUnknown.
-  Doesn't work with BC++ either - crashes on program startup.
-- Added Vadim's owner-draw modifications - will probably remain
-  Windows-only. This enhances wxMenu, wxListBox. See ownerdrw sample.
-- Added wxLB_OWNERDRAW for owner-draw listboxes.
-- Vadim's wxCheckListBox derives from wxListBox. See checklst sample.
-  Doesn't entirely work for WIN16.
-- Vadim has added wxMenuItem as a separate file menuitem.cpp. It
-  can also be used as an argument to wxMenu::Append, not just for
-  internal implementation.
-- Some #ifdefs done for MINGW32 compilation (just alter OPTIONS
-  in makeg95.env, together with mingw32.bat). However, resource
-  binding is not working yet so most apps with dialogs crash.
-
-Alpha 5, 14th February 1998
----------------------------
-
-- GENERIC AND MSW-SPECIFIC CODE NOW TREATED AS TWO SEPARATE
-  DISTRIBUTIONS. This change log will therefore now refer to
-  the Windows-specific code only. See docs/changes.txt for generic
-  changes.
-- Removed Windows-specific reference counting system (GDI
-  resources were cleaned up in idle time) - minimal
-  advantages now we have a wxWin reference counting system.
-- Added missing WXDLLEXPORT keywords so DLL compilation works
-  again.
-- Removed most warnings for GnuWin32 compilation.
-- Added wxRegion/wxRegionIterator, but haven't yet used it in
-  e.g. wxDC.
-
-Alpha 4, 31st January 1998
---------------------------
-
-- Changed wxDC functions to take longs instead of floats. GetSize now takes
-  integer pointers, plus a version that returns a wxSize.
-- const keyword added to various wxDC functions.
-- Under Windows, wxDC no longer has any knowledge of whether
-  an associated window is scrolled or not. Instead, the device
-  origin is set by wxScrolledWindow in wxScrolledWindow::PrepareDC.
-- wxScrolledWindow applications can optionally override the virtual OnDraw
-  function instead of using the OnPaint event handler. The wxDC passed to
-  OnDraw will be translated by PrepareDC to reflect scrolling.
-  When drawing outside of OnDraw, must call PrepareDC explicitly.
-- wxToolBarBase/wxToolBarSimple similarly changed to allow for
-  scrolling toolbars.
-- Integrated wxPostScriptDC patches for 1.xx by Chris Breeze,
-  to help printing with multiple pages.
-- IPC classes given base classes (wxConnectionBase etc.) which
-  define the API used by different implementations. DDE
-  implementation updated to use these base classes.
-- wxHelpInstance now separated into wxHelpControllerBase (base
-  for all implementations), wxWinHelpController (uses standard
-  WinHelp), wxXLPHelPController (talks to wxHelp by DDE or
-  TCP/IP). There will be others eventually, such as
-  wxHTMLHelpController for Microsoft (and Netscape?) HTML Help.
-- Added Vadim Zeitlin's wxString class plus
-  internationalization code (gettext simulation, wxLocale, etc.).
-  New files from Vadim:
-  include\wx\string.h
-  include\wx\debug.h
-  include\wx\file.h
-  include\wx\log.h
-  include\wx\intl.h
-  src\common\string.cpp
-  src\common\log.cpp
-  src\common\intl.cpp
-  src\common\file.cpp
-  No longer use GNU wxString files.
-- Split off file-related functions into include\wx\filefn.h and
-  src\common\filefn.cpp.
-- Borland C++ support (WIN32) for main library and
-  samples, using makefile.b32 files.
-- Preparation done for allowing BC++ to compile wxWin as a DLL,
-  including changes to defs.h.
-- wxIntPoint removed, wxPoint is now int, and wxRealPoint
-  introduced.
-- Added wxShowEvent (generated when window is being shown or
-  hidden).
-- Got minimal, docview, mdi samples working for 16-bit VC++ and
-  cured 16-bit problem with wxTextCtrl (removed global memory
-  trick).
-- Updated GnuWin32 makefiles, checked minimal, mdi, docview samples.
-
-Alpha 3, September 1997
------------------------
-
-- wxListCtrl, wxTreeCtrl, wxImageList classes done.
-- Instigated new file hierarchy, split files and classes up more logically.
-- PrologIO and some other utils now put into core library.
-- Revamped print/preview classes, added wxPageSetupDialog.
-- Started documentation.
-
-Alpha 2, 30th April 1997
-------------------------
-
-- EVT_... macros now have at least one argument, for conformance
-  with MetroWerks compiler.
-- Added ids to .wxr file format.
-- Got Dialog Editor compiled and running again but need
-  to extend functionality to be in line with new controls.
-  Added dialoged\test app to allow dynamic loading of .wxr files
-  for testing purposes.
-- Rewrote wxBitmap to allow installable file type
-  handlers.
-- Rewrote wxBitmapButton, wxStaticBitmap to not use Fafa.
-- Wrote most of wxTreeCtrl and sample (need wxImageList to implement it
-  fully).
-- Added back wxRadioBox.
-- Tidied up wx_main.cpp, wxApp class, putting PenWin code in
-  a separate file.
-
-Alpha 1, 5th April 1997
------------------------
-
-At this point, the following has been achieved:
-
-- A lot, but not all, of the code has been revamped for better
-  naming conventions, protection of data members, and use of
-  wxString instead of char *.
-- Obsolete functionality deleted (e.g. default wxPanel layout,
-  old system event system) and code size reduced.
-- Class hierarchy changed (see design doc) - base classes such
-  as wxbWindow now removed.
-- No longer includes windows.h in wxWin headers, by using stand-in
-  Windows types where needed e.g. WXHWND.
-- PrologIO revised.
-- wxScrolledWindow, wxStatusBar and new MDI classes added.
-  MDI is now achived using separate classes, not window styles.
-- wxSystemSettings added, and made use of to reflect standard
-  Windows settings.
-- SetButtonFont/SetLabelFont replaced by SetFont; font and colour
-  settings mucho rationalised.
-- All windows are now subclassed with the same window proc to make
-  event handling far more consistent. Old internal wxWnd and derived
-  classes removed.
-- API for controls revised, in particular addition of
-  wxValidator parameters and removal of labels for some controls.
-- 1 validator written: see examples/validate.
-- Event table system introduced (see most samples and
-  wx_event.cpp/ProcessEvent, wx_event.h). wxEvtHandler
-  made more flexible, with Push/PopEventHandler allowing a chain
-  of event handlers.
-- wxRadioBox removed - will be added back soon.
-- Toolbar class hierarchy revised:
-  wxToolBarBase
-  wxToolBarSimple (= old wxToolBar)
-  wxToolBar95 (= old wxButtonBar under Win95
-  wxToolBarMSW (= old wxButtonBar under WIN16/WIN32)
-- Constraint system debugged somewhat (sizers now work properly).
-- wxFileDialog, wxDirDialog added; other common dialogs now
-  have class equivalents. Generic colour and font dialogs
-  rewritten to not need obsolete panel layout.
-- .wxr resource system partially reinstated, though needs
-  an integer ID for controls. Hopefully the resource system
-  will be replaced by something better and more efficient
-  in the future.
-- Device contexts no longer stored with window and accessed
-  with GetDC - use wxClientDC, wxPaintDC, wxWindowDC stack
-  variables instead.
-- wxSlider uses trackbar class under Win95, and wxSL_LABELS flag
-  determines whether labels are shown. Other Win95-specific flags
-  introduced, e.g. for showing ticks.
-- Styles introduced for dealing with 3D effects per window, for
-  any window: all Win95 3D effects supported, plus transparent windows.
-- Major change to allow 3D effect support without CTL3D, under
-  Win95.
-- Bitmap versions of button and checkbox separated out into new
-  classes, but unimplemented as yet because I intend to remove
-  the need for Fafa - it apparently causes GPFs in Win95 OSR 2.
-- utils/wxprop classes working (except maybe wxPropertyFormView)
-  in preparation for use in Dialog Editor.
-- GNU-WIN32 compilation verified (a month or so ago).
-
-
diff --git a/include/wx/prop.h b/include/wx/prop.h
new file mode 100644 (file)
index 0000000..e753c02
--- /dev/null
@@ -0,0 +1,325 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        prop.h
+// Purpose:     Property sheet classes
+// Author:      Julian Smart
+// Modified by:
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_PROP_H_
+#define _WX_PROP_H_
+
+#ifdef __GNUG__
+#pragma interface "prop.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/string.h"
+#include "wx/hash.h"
+#include "wx/dialog.h"
+#include "wx/frame.h"
+#include "wx/button.h"
+#include "wx/listbox.h"
+#include "wx/textctrl.h"
+#include "wx/gdicmn.h"
+#include "wx/layout.h"
+
+class wxWindow;
+class wxProperty;
+class wxPropertyValue;
+class wxPropertySheet;
+class wxPropertyView;
+class wxPropertyValidator;
+class wxPropertyValidatorRegistry;
+
+#define wxPROPERTY_VERSION 2.0
+
+// A storable sheet of values
+class wxPropertySheet: public wxObject
+{
+ DECLARE_DYNAMIC_CLASS(wxPropertySheet)
+ public:
+  wxPropertySheet(void);
+  ~wxPropertySheet(void);
+
+  // Add a property
+  virtual void AddProperty(wxProperty *property);
+
+  // Get property by name
+  virtual wxProperty *GetProperty(wxString name);
+
+  // Clear all properties
+  virtual void Clear(void);
+
+  virtual bool Save(ostream& str);
+  virtual bool Load(ostream& str);
+
+  virtual void UpdateAllViews(wxPropertyView *thisView = NULL);
+  inline virtual wxList& GetProperties(void) const { return (wxList&) m_properties; }
+  
+  // Sets/clears the modified flag for each property value
+  virtual void SetAllModified(bool flag = TRUE);
+
+ protected:
+  wxObject*         m_viewedObject;
+  wxList            m_properties;
+  wxPropertyView*   m_propertyView;
+
+};
+
+
+// Base class for property sheet views. There are currently two directly derived
+// classes: wxPropertyListView, and wxPropertyFormView.
+class wxPropertyView: public wxEvtHandler
+{
+ DECLARE_DYNAMIC_CLASS(wxPropertyView)
+ public:
+  wxPropertyView(long flags = 0);
+  ~wxPropertyView(void);
+
+  // Associates and shows the view
+  virtual void ShowView(wxPropertySheet *WXUNUSED(propertySheet), wxWindow *WXUNUSED(panel)) {}
+
+  // Update this view of the viewed object, called e.g. by
+  // the object itself.
+  virtual bool OnUpdateView(void) {return FALSE;};
+
+  // Override this to do something as soon as the property changed,
+  // if the view and validators support it.
+  virtual void OnPropertyChanged(wxProperty *WXUNUSED(property)) {}
+
+  virtual void AddRegistry(wxPropertyValidatorRegistry *registry);
+  inline virtual wxList& GetRegistryList(void) const
+   { return (wxList&) m_validatorRegistryList; }
+
+  virtual wxPropertyValidator *FindPropertyValidator(wxProperty *property);
+  inline virtual void SetPropertySheet(wxPropertySheet *sheet) { m_propertySheet = sheet; }
+  inline virtual wxPropertySheet *GetPropertySheet(void) const { return m_propertySheet; }
+
+  virtual void OnOk(void) {};
+  virtual void OnCancel(void) {};
+  virtual void OnHelp(void) {};
+
+  inline virtual bool OnClose(void) { return FALSE; }
+  inline long GetFlags(void) { return m_buttonFlags; }
+
+ protected:
+  long                  m_buttonFlags;
+  wxPropertySheet*      m_propertySheet;
+  wxProperty*           m_currentProperty;
+  wxList                m_validatorRegistryList;
+  wxPropertyValidator*  m_currentValidator;
+};
+
+
+class wxPropertyValidator: public wxEvtHandler
+{
+  DECLARE_DYNAMIC_CLASS(wxPropertyValidator)
+ public:
+  wxPropertyValidator(long flags = 0);
+  ~wxPropertyValidator(void);
+
+  inline long GetFlags(void) const { return m_validatorFlags; }
+  inline void SetValidatorProperty(wxProperty *prop) { m_validatorProperty = prop; }
+  inline wxProperty *GetValidatorProperty(void) const { return m_validatorProperty; }
+
+  virtual bool StringToFloat (char *s, float *number);
+  virtual bool StringToDouble (char *s, double *number);
+  virtual bool StringToInt (char *s, int *number);
+  virtual bool StringToLong (char *s, long *number);
+  virtual char *FloatToString (float number);
+  virtual char *DoubleToString (double number);
+  virtual char *IntToString (int number);
+  virtual char *LongToString (long number);
+
+ protected:
+  long          m_validatorFlags;
+  wxProperty*   m_validatorProperty;
+};
+
+
+// extern wxPropertyValidator *wxDefaultPropertyValidator;
+
+class wxPropertyValidatorRegistry: public wxHashTable
+{
+  DECLARE_DYNAMIC_CLASS(wxPropertyValidatorRegistry)
+ public:
+  wxPropertyValidatorRegistry(void);
+  ~wxPropertyValidatorRegistry(void);
+
+  virtual void RegisterValidator(const wxString& roleName, wxPropertyValidator *validator);
+  virtual wxPropertyValidator *GetValidator(const wxString& roleName);
+  void ClearRegistry(void);
+};
+
+/*
+ * Property value class
+ */
+
+typedef enum {
+    wxPropertyValueNull,
+    wxPropertyValueInteger,
+    wxPropertyValueReal,
+    wxPropertyValuebool,
+    wxPropertyValueString,
+    wxPropertyValueList,
+    wxPropertyValueIntegerPtr,
+    wxPropertyValueRealPtr,
+    wxPropertyValueboolPtr,
+    wxPropertyValueStringPtr
+} wxPropertyValueType;
+
+class wxPropertyValue: public wxObject
+{
+  DECLARE_DYNAMIC_CLASS(wxPropertyValue)
+
+  wxPropertyValue(void);                       // Unknown type
+  wxPropertyValue(const wxPropertyValue& copyFrom);  // Copy constructor
+  wxPropertyValue(const char *val);
+  wxPropertyValue(const wxString& val);
+  wxPropertyValue(long val);
+  wxPropertyValue(bool val);
+  wxPropertyValue(float val);
+  wxPropertyValue(double the_real);
+  wxPropertyValue(wxList *val);
+  wxPropertyValue(wxStringList *val);
+  // Pointer versions
+  wxPropertyValue(char **val);
+  wxPropertyValue(long *val);
+  wxPropertyValue(bool *val);
+  wxPropertyValue(float *val);
+
+  ~wxPropertyValue(void);
+
+  virtual inline wxPropertyValueType Type(void) const { return m_type; }
+  virtual inline void SetType(wxPropertyValueType typ) { m_type = typ; }
+  virtual long IntegerValue(void) const;
+  virtual float RealValue(void) const;
+  virtual bool BoolValue(void) const;
+  virtual char *StringValue(void) const;
+  virtual long *IntegerValuePtr(void) const;
+  virtual float *RealValuePtr(void) const;
+  virtual bool *BoolValuePtr(void) const;
+  virtual char **StringValuePtr(void) const;
+
+  // Get nth arg of clause (starting from 1)
+  virtual wxPropertyValue *Arg(wxPropertyValueType type, int arg) const;
+
+  // Return nth argument of a list expression (starting from zero)
+  virtual wxPropertyValue *Nth(int arg) const;
+  // Returns the number of elements in a list expression
+  virtual int Number(void) const;
+
+  virtual wxPropertyValue *NewCopy(void) const;
+  virtual void Copy(wxPropertyValue& copyFrom);
+
+  virtual void WritePropertyClause(ostream& stream);  // Write this expression as a top-level clause
+  virtual void WritePropertyType(ostream& stream);    // Write as any other subexpression
+
+  // Append an expression to a list
+  virtual void Append(wxPropertyValue *expr);
+  // Insert at beginning of list
+  virtual void Insert(wxPropertyValue *expr);
+
+  // Get first expr in list
+  virtual inline wxPropertyValue *GetFirst(void) const
+    { return ((m_type == wxPropertyValueList) ? m_value.first : (wxPropertyValue*)NULL); }
+
+  // Get next expr if this is a node in a list
+  virtual inline wxPropertyValue *GetNext(void) const
+    { return m_next; }
+
+  // Get last expr in list
+  virtual inline wxPropertyValue *GetLast(void) const
+    { return ((m_type == wxPropertyValueList) ? m_last : (wxPropertyValue*)NULL); }
+  
+  // Delete this node from the list
+  virtual void Delete(wxPropertyValue *node);
+
+  // Clear list
+  virtual void ClearList(void);
+
+  virtual inline void SetClientData(wxObject *data) { m_clientData = data; }
+  virtual inline wxObject *GetClientData(void) { return m_clientData; }
+
+  virtual wxString GetStringRepresentation(void);
+  
+  inline void SetModified(bool flag = TRUE) { m_modifiedFlag = flag; }
+  inline bool GetModified(void) { return m_modifiedFlag; }
+
+  // Operators
+  void operator=(const wxPropertyValue& val);
+//  void operator=(const char *val);
+  void operator=(const wxString& val);
+  void operator=(const long val);
+  void operator=(const bool val);
+  void operator=(const float val);
+  void operator=(const char **val);
+  void operator=(const long *val);
+  void operator=(const bool *val);
+  void operator=(const float *val);
+
+ public:
+  wxObject*             m_clientData;
+  wxPropertyValueType   m_type;
+  bool                  m_modifiedFlag;
+
+  union {
+    long integer; // Also doubles as bool
+    char *string;
+    float real;
+    long *integerPtr;
+    bool *boolPtr;
+    char **stringPtr;
+    float *realPtr;
+    wxPropertyValue *first;  // If is a list expr, points to the first node
+    } m_value;
+
+  wxPropertyValue*      m_next;     // If this is a node in a list, points to the next node
+  wxPropertyValue*      m_last;     // If is a list expr, points to the last node
+
+};
+
+/*
+ * Property class: contains a name and a value.
+ */
+
+class wxProperty: public wxObject
+{
+  DECLARE_DYNAMIC_CLASS(wxProperty)
+ protected:
+  bool                  m_enabled;
+ public:
+  wxPropertyValue       m_value;
+  wxString              m_name;
+  wxString              m_propertyRole;
+  wxPropertyValidator*  m_propertyValidator;
+  wxWindow*             m_propertyWindow; // Usually a panel item, if anything
+
+  wxProperty(void);
+  wxProperty(wxProperty& copyFrom);
+  wxProperty(wxString name, wxString role, wxPropertyValidator *ed = NULL);
+  wxProperty(wxString name, const wxPropertyValue& val, wxString role, wxPropertyValidator *ed = NULL);
+  ~wxProperty(void);
+
+  virtual wxPropertyValue& GetValue(void) const;
+  virtual wxPropertyValidator *GetValidator(void) const;
+  virtual wxString& GetName(void) const;
+  virtual wxString& GetRole(void) const;
+  virtual void SetValue(const wxPropertyValue& val);
+  virtual void SetValidator(wxPropertyValidator *v);
+  virtual void SetName(wxString& nm);
+  virtual void SetRole(wxString& role);
+  void operator=(const wxPropertyValue& val);
+  virtual inline void SetWindow(wxWindow *win) { m_propertyWindow = win; }
+  virtual inline wxWindow *GetWindow(void) const { return m_propertyWindow; }
+  
+  inline void Enable(bool en) { m_enabled = en; }
+  inline bool IsEnabled(void) const { return m_enabled; }
+};
+
+#endif
+  // _WX_PROP_H_
diff --git a/include/wx/propform.h b/include/wx/propform.h
new file mode 100644 (file)
index 0000000..c88c4bd
--- /dev/null
@@ -0,0 +1,297 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        propform.h
+// Purpose:     Property form classes
+// Author:      Julian Smart
+// Modified by:
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef _WX_PROPFORM_H_
+#define _WX_PROPFORM_H_
+
+#ifdef __GNUG__
+#pragma interface "propform.h"
+#endif
+
+#include "wx/prop.h"
+
+////
+//// Property form classes: for using an existing dialog or panel
+////
+
+#define wxID_PROP_REVERT        3100
+#define wxID_PROP_UPDATE        3101
+
+// Mediates between a physical panel and the property sheet
+class wxPropertyFormView: public wxPropertyView
+{
+ DECLARE_DYNAMIC_CLASS(wxPropertyFormView)
+ public:
+  wxPropertyFormView(wxWindow *propPanel = NULL, long flags = 0);
+  ~wxPropertyFormView(void);
+
+  // Associates and shows the view
+  virtual void ShowView(wxPropertySheet *propertySheet, wxWindow *panel);
+
+  // Update this view of the viewed object, called e.g. by
+  // the object itself.
+  virtual bool OnUpdateView(void);
+
+  // Transfer values from property sheet to dialog
+  virtual bool TransferToDialog(void);
+
+  // Transfer values from dialog to property sheet
+  virtual bool TransferToPropertySheet(void);
+
+  // Check that all the values are valid
+  virtual bool Check(void);
+
+  // Give each property in the sheet a panel item, by matching
+  // the name of the property to the name of the panel item.
+  // The user doesn't always want to call this; sometimes, it
+  // will have been done explicitly (e.g., no matching names).
+  virtual bool AssociateNames(void);
+
+  void OnOk(wxCommandEvent& event);
+  void OnCancel(wxCommandEvent& event);
+  void OnHelp(wxCommandEvent& event);
+  void OnUpdate(wxCommandEvent& event);
+  void OnRevert(wxCommandEvent& event);
+
+  virtual bool OnClose(void);
+  virtual void OnDoubleClick(wxControl *item);
+
+  // TODO: does OnCommand still get called...???
+  virtual void OnCommand(wxWindow& win, wxCommandEvent& event);
+
+  inline virtual void AssociatePanel(wxWindow *win) { m_propertyWindow = win; }
+  inline virtual wxWindow *GetPanel(void) const { return m_propertyWindow; }
+
+  inline virtual void SetManagedWindow(wxWindow *win) { m_managedWindow = win; }
+  inline virtual wxWindow *GetManagedWindow(void) const { return m_managedWindow; }
+
+  inline virtual wxButton *GetWindowCloseButton() const { return m_windowCloseButton; }
+  inline virtual wxButton *GetWindowCancelButton() const { return m_windowCancelButton; }
+  inline virtual wxButton *GetHelpButton() const { return m_windowHelpButton; }
+
+public:
+  static bool sm_dialogCancelled;
+
+ protected:
+  bool              m_detailedEditing;     // E.g. using listbox for choices
+
+  wxWindow*         m_propertyWindow; // Panel that the controls will appear on
+  wxWindow*         m_managedWindow; // Frame or dialog
+  
+  wxButton*         m_windowCloseButton; // Or OK
+  wxButton*         m_windowCancelButton;
+  wxButton*         m_windowHelpButton;
+
+DECLARE_EVENT_TABLE()
+
+};
+/*
+ * The type of validator used for forms (wxForm style but using an existing panel
+ * or dialog box).
+ * Classes derived from this know how to map from whatever widget they
+ * find themselves paired with, to the wxProperty and vice versa.
+ * Should the widget pointer be stored with the validator, or
+ * the wxProperty? If with the property, we don't have to supply
+ * a validator for every property. Otherwise, there ALWAYS needs
+ * to be a validator. On the other hand, not storing a wxWindow pointer
+ * in the wxProperty is more elegant. Perhaps.
+ * I think on balance, should put wxWindow pointer into wxProperty.
+ * After all, wxProperty will often be used to represent the data
+ * assocated with a window. It's that kinda thing.
+ */
+
+class wxPropertyFormValidator: public wxPropertyValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxPropertyFormValidator)
+ protected:
+ public:
+  wxPropertyFormValidator(long flags = 0): wxPropertyValidator(flags) { }
+  ~wxPropertyFormValidator(void) {}
+  
+   // Called to check value is OK (e.g. when OK is pressed)
+   // Return FALSE if value didn't check out; signal to restore old value.
+   virtual bool OnCheckValue( wxProperty *WXUNUSED(property), wxPropertyFormView *WXUNUSED(view), 
+     wxWindow *WXUNUSED(parentWindow) ) { return TRUE; }
+
+   // Does the transferance from the property editing area to the property itself.
+   // Called by the view, e.g. when closing the window.
+   virtual bool OnRetrieveValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow) = 0;
+
+   // Called by the view to transfer the property to the window.
+   virtual bool OnDisplayValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow) = 0;
+
+  virtual void OnDoubleClick( wxProperty *WXUNUSED(property), wxPropertyFormView *WXUNUSED(view), 
+     wxWindow *WXUNUSED(parentWindow) ) { } 
+  virtual void OnSetFocus( wxProperty *WXUNUSED(property), wxPropertyFormView *WXUNUSED(view), 
+     wxWindow *WXUNUSED(parentWindow) ) { }
+  virtual void OnKillFocus( wxProperty *WXUNUSED(property), wxPropertyFormView *WXUNUSED(view), 
+     wxWindow *WXUNUSED(parentWindow) ) { }
+  virtual void OnCommand( wxProperty *WXUNUSED(property), wxPropertyFormView *WXUNUSED(view), 
+     wxWindow *WXUNUSED(parentWindow), wxCommandEvent& WXUNUSED(event) ) {}
+};
+
+/*
+ * Some default validators
+ */
+class wxRealFormValidator: public wxPropertyFormValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxRealFormValidator)
+ public:
+   // 0.0, 0.0 means no range
+   wxRealFormValidator(float min = 0.0, float max = 0.0, long flags = 0):wxPropertyFormValidator(flags)
+   {
+     m_realMin = min; m_realMax = max;
+   }
+   ~wxRealFormValidator(void) {}
+
+   bool OnCheckValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+   bool OnRetrieveValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+   // Called by the view to transfer the property to the window.
+   bool OnDisplayValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+
+ protected:
+  float         m_realMin;
+  float         m_realMax;
+};
+
+class wxIntegerFormValidator: public wxPropertyFormValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxIntegerFormValidator)
+ public:
+   // 0, 0 means no range
+   wxIntegerFormValidator(long min = 0, long max = 0, long flags = 0):wxPropertyFormValidator(flags)
+   {
+     m_integerMin = min; m_integerMax = max;
+   }
+   ~wxIntegerFormValidator(void) {}
+
+   bool OnCheckValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+   bool OnRetrieveValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+   bool OnDisplayValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+
+ protected:
+  long          m_integerMin;
+  long          m_integerMax;
+};
+
+class wxBoolFormValidator: public wxPropertyFormValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxBoolFormValidator)
+ protected:
+ public:
+   wxBoolFormValidator(long flags = 0):wxPropertyFormValidator(flags)
+   {
+   }
+   ~wxBoolFormValidator(void) {}
+
+   bool OnCheckValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+   bool OnRetrieveValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+   bool OnDisplayValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+};
+
+class wxStringFormValidator: public wxPropertyFormValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxStringFormValidator)
+ public:
+   wxStringFormValidator(wxStringList *list = NULL, long flags = 0);
+
+   ~wxStringFormValidator(void)
+   {
+     if (m_strings)
+       delete m_strings;
+   }
+
+   bool OnCheckValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+   bool OnRetrieveValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+   bool OnDisplayValue(wxProperty *property, wxPropertyFormView *view, wxWindow *parentWindow);
+
+ protected:
+  wxStringList*     m_strings;
+};
+
+/*
+ * A default dialog box class to use.
+ */
+class wxPropertyFormDialog: public wxDialog
+{
+  DECLARE_CLASS(wxPropertyFormDialog)
+ public:
+  wxPropertyFormDialog(wxPropertyFormView *v, wxWindow *parent, const wxString& title,
+    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "dialogBox");
+  bool OnClose(void);
+  void OnDefaultAction(wxControl *item);
+  void OnCommand(wxWindow& win, wxCommandEvent& event);
+
+  // Extend event processing to search the view's event table
+  virtual bool ProcessEvent(wxEvent& event);
+
+ private:
+  wxPropertyFormView*       m_view;
+};
+
+/*
+ * A default panel class to use.
+ */
+class wxPropertyFormPanel: public wxPanel
+{
+  DECLARE_CLASS(wxPropertyFormPanel)
+ public:
+  wxPropertyFormPanel(wxPropertyFormView *v, wxWindow *parent, const wxPoint& pos = wxDefaultPosition,
+    const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = "panel"):
+     wxPanel(parent, -1, pos, size, style, name)
+  {
+    m_view = v;
+  }
+  void OnDefaultAction(wxControl *item);
+  void OnCommand(wxWindow& win, wxCommandEvent& event);
+
+  // Extend event processing to search the view's event table
+  virtual bool ProcessEvent(wxEvent& event);
+
+ private:
+  wxPropertyFormView*       m_view;
+};
+
+/*
+ * A default frame class to use.
+ */
+class wxPropertyFormFrame: public wxFrame
+{
+  DECLARE_CLASS(wxPropertyFormFrame)
+ public:
+  wxPropertyFormFrame(wxPropertyFormView *v, wxFrame *parent, const wxString& title,
+    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long style = wxDEFAULT_FRAME, const wxString& name = "frame"):
+     wxFrame(parent, -1, title, pos, size, style, name)
+  {
+    m_view = v;
+    m_propertyPanel = NULL;
+  }
+  bool OnClose(void);
+
+  // Must call this to create panel and associate view
+  virtual bool Initialize(void);
+  virtual wxPanel *OnCreatePanel(wxFrame *parent, wxPropertyFormView *v);
+  inline virtual wxPanel *GetPropertyPanel(void) const { return m_propertyPanel; }
+
+ private:
+  wxPropertyFormView*       m_view;
+  wxPanel*                  m_propertyPanel;
+};
+
+#endif
+  // _WX_PROPFORM_H_
diff --git a/include/wx/proplist.h b/include/wx/proplist.h
new file mode 100644 (file)
index 0000000..66f1a3c
--- /dev/null
@@ -0,0 +1,557 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        proplist.h
+// Purpose:     Property list classes
+// Author:      Julian Smart
+// Modified by:
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+ /*
+
+ TO DO:
+
+ (1) Optional popup-help for each item, and an optional Help button
+   for dialog.
+
+ (2) Align Ok, Cancel, Help buttons properly.
+
+ (3) Consider retrieving the rectangle on the panel that can be
+ drawn into (where the value listbox is) and giving an example
+ of editing graphically. May be too fancy.
+
+ (4) Deriveable types for wxPropertyValue => may need to reorganise
+ wxPropertyValue to use inheritance rather than present all-types-in-one
+ scheme.
+
+ (5) Optional popup panel for value list, perhaps.
+
+ (6) Floating point checking routine still crashes with Floating
+ point error for zany input.
+
+ (7) Property sheet with choice (or listbox) to select alternative
+ sheets... multiple views per panel, only one active. For this
+ we really need a wxChoice that can be dynamically set: XView
+ may be a problem; Motif?
+
+ (8) More example validators, e.g. colour selector.
+  */
+
+#ifndef _WX_PROPLIST_H_
+#define _WX_PROPLIST_H_
+
+#ifdef __GNUG__
+#pragma interface "proplist.h"
+#endif
+
+#include "wx/prop.h"
+
+#define wxPROP_BUTTON_CLOSE       1
+#define wxPROP_BUTTON_OK          2
+#define wxPROP_BUTTON_CANCEL      4
+#define wxPROP_BUTTON_CHECK_CROSS 8
+#define wxPROP_BUTTON_HELP        16
+#define wxPROP_DYNAMIC_VALUE_FIELD 32
+#define wxPROP_PULLDOWN           64
+#define wxPROP_SHOWVALUES         128
+
+#ifdef __XVIEW__
+#define wxPROP_BUTTON_DEFAULT wxPROP_BUTTON_OK | wxPROP_BUTTON_CANCEL | wxPROP_BUTTON_CHECK_CROSS | wxPROP_PULLDOWN
+#else
+#define wxPROP_BUTTON_DEFAULT wxPROP_BUTTON_CHECK_CROSS | wxPROP_PULLDOWN | wxPROP_SHOWVALUES
+#endif
+
+#define wxID_PROP_CROSS     3000
+#define wxID_PROP_CHECK     3001
+#define wxID_PROP_EDIT      3002
+#define wxID_PROP_TEXT      3003
+#define wxID_PROP_SELECT    3004
+#define wxID_PROP_VALUE_SELECT  3005
+
+// Mediates between a physical panel and the property sheet
+class wxPropertyListView: public wxPropertyView
+{
+ DECLARE_DYNAMIC_CLASS(wxPropertyListView)
+ public:
+  wxPropertyListView(wxPanel *propPanel = NULL, long flags = wxPROP_BUTTON_DEFAULT);
+  ~wxPropertyListView(void);
+
+  // Associates and shows the view
+  virtual void ShowView(wxPropertySheet *propertySheet, wxPanel *panel);
+
+  // Update this view of the viewed object, called e.g. by
+  // the object itself.
+  virtual bool OnUpdateView(void);
+
+  wxString MakeNameValueString(wxString name, wxString value);
+
+  // Update a single line in the list of properties
+  virtual bool UpdatePropertyDisplayInList(wxProperty *property);
+
+  // Update the whole list
+  virtual bool UpdatePropertyList(bool clearEditArea = TRUE);
+
+  // Find the wxListBox index corresponding to this property
+  virtual int FindListIndexForProperty(wxProperty *property);
+
+  // Select and show string representation in editor the given
+  // property. NULL resets to show no property.
+  virtual bool ShowProperty(wxProperty *property, bool select = TRUE);
+  virtual bool EditProperty(wxProperty *property);
+
+  // Update the display from the property
+  virtual bool DisplayProperty(wxProperty *property);
+  // Update the property from the display
+  virtual bool RetrieveProperty(wxProperty *property);
+
+  // Find appropriate validator and load property into value controls
+  virtual bool BeginShowingProperty(wxProperty *property);
+  // Find appropriate validator and unload property from value controls
+  virtual bool EndShowingProperty(wxProperty *property);
+
+  // Begin detailed editing (e.g. using value listbox)
+  virtual void BeginDetailedEditing(void);
+
+  // End detailed editing (e.g. using value listbox)
+  virtual void EndDetailedEditing(void);
+
+  // Called by the property listbox
+  void OnPropertySelect(wxCommandEvent& event);
+
+  // Called by the value listbox
+  void OnValueListSelect(wxCommandEvent& event);
+
+  virtual bool CreateControls(void);
+  virtual void ShowTextControl(bool show);
+  virtual void ShowListBoxControl(bool show);
+  virtual void EnableCheck(bool show);
+  virtual void EnableCross(bool show);
+
+  void OnOk(wxCommandEvent& event);
+  void OnCancel(wxCommandEvent& event);
+  void OnHelp(wxCommandEvent& event);
+  void OnPropertyDoubleClick(wxCommandEvent& event);
+//  virtual void OnDoubleClick(void);
+
+  void OnCheck(wxCommandEvent& event);
+  void OnCross(wxCommandEvent& event);
+  void OnEdit(wxCommandEvent& event);
+  void OnText(wxCommandEvent& event);
+
+  inline virtual wxListBox *GetPropertyScrollingList() const { return m_propertyScrollingList; }
+  inline virtual wxListBox *GetValueList() const { return m_valueList; }
+  inline virtual wxTextCtrl *GetValueText() const { return m_valueText; }
+  inline virtual wxButton *GetConfirmButton() const { return m_confirmButton; }
+  inline virtual wxButton *GetCancelButton() const { return m_cancelButton; }
+  inline virtual wxButton *GetEditButton() const { return m_editButton; }
+  inline virtual bool GetDetailedEditing(void) const { return m_detailedEditing; }
+
+  inline virtual void AssociatePanel(wxPanel *win) { m_propertyWindow = win; }
+  inline virtual wxPanel *GetPanel(void) const { return m_propertyWindow; }
+
+  inline virtual void SetManagedWindow(wxWindow *win) { m_managedWindow = win; }
+  inline virtual wxWindow *GetManagedWindow(void) const { return m_managedWindow; }
+
+  inline virtual wxButton *GetWindowCloseButton() const { return m_windowCloseButton; }
+  inline virtual wxButton *GetWindowCancelButton() const { return m_windowCancelButton; }
+  inline virtual wxButton *GetHelpButton() const { return m_windowHelpButton; }
+  
+  bool OnClose(void);
+
+public:
+  static bool       sm_dialogCancelled;
+
+ protected:
+  wxListBox*        m_propertyScrollingList;
+  wxListBox*        m_valueList;     // Should really be a combobox, but we don't have one.
+  wxTextCtrl*       m_valueText;
+  wxButton*         m_confirmButton;  // A tick, as in VB
+  wxButton*         m_cancelButton;   // A cross, as in VB
+  wxButton*         m_editButton;     // Invokes the custom validator, if any
+
+  bool              m_detailedEditing;     // E.g. using listbox for choices
+
+  static wxBitmap*  sm_tickBitmap;
+  static wxBitmap*  sm_crossBitmap;
+  
+  wxPanel*          m_propertyWindow; // Panel that the controls will appear on
+  wxWindow*         m_managedWindow; // Frame or dialog
+  
+  wxButton*         m_windowCloseButton; // Or OK
+  wxButton*         m_windowCancelButton;
+  wxButton*         m_windowHelpButton;
+
+DECLARE_EVENT_TABLE()
+};
+
+class wxPropertyTextEdit: public wxTextCtrl
+{
+ DECLARE_CLASS(wxPropertyTextEdit)
+ public:
+  wxPropertyTextEdit(wxPropertyListView *v, wxWindow *parent, const wxWindowID id,
+    const wxString& value, const wxPoint& pos = wxDefaultPosition,
+    const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = "text");
+  void OnSetFocus(void);
+  void OnKillFocus(void);
+
+  wxPropertyListView*   m_view;
+};
+
+#define wxPROP_ALLOW_TEXT_EDITING           1
+
+/*
+ * The type of validator used for property lists (Visual Basic style)
+ */
+class wxPropertyListValidator: public wxPropertyValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxPropertyListValidator)
+ protected:
+ public:
+   wxPropertyListValidator(long flags = wxPROP_ALLOW_TEXT_EDITING): wxPropertyValidator(flags) { }
+   ~wxPropertyListValidator(void) {}
+
+   // Called when the property is selected or deselected: typically displays the value
+   // in the edit control (having chosen a suitable control to display: (non)editable text or listbox)
+   virtual bool OnSelect(bool select, wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when the property is double clicked. Extra functionality can be provided, such as
+   // cycling through possible values.
+   inline virtual bool OnDoubleClick( 
+     wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
+     { return TRUE; }
+
+   // Called when the value listbox is selected. Default behaviour is to copy
+   // string to text control, and retrieve the value into the property.
+   virtual bool OnValueListSelect(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when the property value is edited using standard text control
+   inline virtual bool OnPrepareControls(
+     wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
+     { return TRUE; }
+
+   virtual bool OnClearControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+      // Called when the property is edited in detail
+   inline virtual bool OnPrepareDetailControls(
+     wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
+     { return TRUE; }
+
+   // Called if focus lost, IF we're in a modeless property editing situation.
+   inline virtual bool OnClearDetailControls(
+     wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
+     { return TRUE; }
+
+   // Called when the edit (...) button is pressed. The default implementation
+   // calls view->BeginDetailedEditing; the filename validator (for example) overrides
+   // this function to show the file selector.
+   virtual void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost.
+   // Return FALSE if value didn't check out; signal to restore old value.
+   inline virtual bool OnCheckValue(
+     wxProperty *WXUNUSED(property), wxPropertyListView *WXUNUSED(view), wxWindow *WXUNUSED(parentWindow) )
+     { return TRUE; }
+
+   // Called when TICK is pressed or focus is lost or view wants to update
+   // the property list.
+   // Does the transferance from the property editing area to the property itself
+   virtual bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   virtual bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+};
+
+/*
+ * A default dialog box class to use.
+ */
+class wxPropertyListDialog: public wxDialog
+{
+  DECLARE_CLASS(wxPropertyListDialog)
+ public:
+  wxPropertyListDialog(wxPropertyListView *v, wxWindow *parent, const wxString& title,
+    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "dialogBox");
+  bool OnClose(void);
+  void OnDefaultAction(wxControl *item);
+  void OnCancel(wxCommandEvent& event);
+
+  // Extend event processing to search the view's event table
+  virtual bool ProcessEvent(wxEvent& event);
+
+ private:
+  wxPropertyListView*   m_view;
+
+DECLARE_EVENT_TABLE()
+};
+
+/*
+ * A default panel class to use.
+ */
+class wxPropertyListPanel: public wxPanel
+{
+  DECLARE_CLASS(wxPropertyListPanel)
+ public:
+  wxPropertyListPanel(wxPropertyListView *v, wxWindow *parent, const wxPoint& pos = wxDefaultPosition,
+    const wxSize& size = wxDefaultSize,
+    long style = 0, const wxString& name = "panel"):
+     wxPanel(parent, -1, pos, size, style, name)
+  {
+    m_view = v;
+  }
+  ~wxPropertyListPanel();
+  void OnDefaultAction(wxControl *item);
+
+  inline void SetView(wxPropertyListView* v) { m_view = v; }
+  inline wxPropertyListView* GetView() const { return m_view; }
+
+  // Extend event processing to search the view's event table
+  virtual bool ProcessEvent(wxEvent& event);
+
+  // Call Layout()
+  void OnSize(wxSizeEvent& event);
+
+ private:
+  wxPropertyListView*   m_view;
+
+DECLARE_EVENT_TABLE()
+};
+
+/*
+ * A default frame class to use.
+ */
+class wxPropertyListFrame: public wxFrame
+{
+  DECLARE_CLASS(wxPropertyListFrame)
+ public:
+  wxPropertyListFrame(wxPropertyListView *v, wxFrame *parent, const wxString& title,
+    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long style = wxDEFAULT_FRAME, const wxString& name = "frame"):
+     wxFrame(parent, -1, title, pos, size, style, name)
+  {
+    m_view = v;
+    m_propertyPanel = NULL;
+  }
+  bool OnClose(void);
+
+  // Must call this to create panel and associate view
+  virtual bool Initialize(void);
+  virtual wxPropertyListPanel *OnCreatePanel(wxFrame *parent, wxPropertyListView *v);
+  inline virtual wxPropertyListPanel *GetPropertyPanel(void) const { return m_propertyPanel; }
+
+ private:
+  wxPropertyListView*       m_view;
+  wxPropertyListPanel*      m_propertyPanel;
+};
+
+/*
+ * Some default validators
+ */
+class wxRealListValidator: public wxPropertyListValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxRealListValidator)
+ public:
+   // 0.0, 0.0 means no range
+   wxRealListValidator(float min = 0.0, float max = 0.0, long flags = wxPROP_ALLOW_TEXT_EDITING):wxPropertyListValidator(flags)
+   {
+     m_realMin = min; m_realMax = max;
+   }
+   ~wxRealListValidator(void) {}
+
+   bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost.
+   // Return FALSE if value didn't check out; signal to restore old value.
+   bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost or view wants to update
+   // the property list.
+   // Does the transfer from the property editing area to the property itself
+   bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+ protected:
+  float     m_realMin;
+  float     m_realMax;
+};
+
+class wxIntegerListValidator: public wxPropertyListValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxIntegerListValidator)
+ public:
+   // 0, 0 means no range
+   wxIntegerListValidator(long min = 0, long max = 0, long flags = wxPROP_ALLOW_TEXT_EDITING):wxPropertyListValidator(flags)
+   {
+     m_integerMin = min; m_integerMax = max;
+   }
+   ~wxIntegerListValidator(void) {}
+
+   bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost.
+   // Return FALSE if value didn't check out; signal to restore old value.
+   bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost or view wants to update
+   // the property list.
+   // Does the transfer from the property editing area to the property itself
+   bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+ protected:
+  long m_integerMin;
+  long m_integerMax;
+};
+
+class wxBoolListValidator: public wxPropertyListValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxBoolListValidator)
+ protected:
+ public:
+   wxBoolListValidator(long flags = 0):wxPropertyListValidator(flags)
+   {
+   }
+   ~wxBoolListValidator(void) {}
+
+   bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost.
+   // Return FALSE if value didn't check out; signal to restore old value.
+   bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost or view wants to update
+   // the property list.
+   // Does the transfer from the property editing area to the property itself
+   bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when the property is double clicked. Extra functionality can be provided,
+   // cycling through possible values.
+   virtual bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+};
+
+class wxStringListValidator: public wxPropertyListValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxStringListValidator)
+ public:
+   wxStringListValidator(wxStringList *list = NULL, long flags = 0);
+
+   ~wxStringListValidator(void)
+   {
+     if (m_strings)
+       delete m_strings;
+   }
+
+   bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost.
+   // Return FALSE if value didn't check out; signal to restore old value.
+   bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost or view wants to update
+   // the property list.
+   // Does the transfer from the property editing area to the property itself
+   bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when the property is double clicked. Extra functionality can be provided,
+   // cycling through possible values.
+   bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+ protected:
+  wxStringList*     m_strings;
+};
+class wxFilenameListValidator: public wxPropertyListValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxFilenameListValidator)
+ public:
+   wxFilenameListValidator(wxString message = "Select a file", wxString wildcard = "*.*", long flags = 0);
+
+   ~wxFilenameListValidator(void);
+
+   // Called when TICK is pressed or focus is lost.
+   // Return FALSE if value didn't check out; signal to restore old value.
+   bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost or view wants to update
+   // the property list.
+   // Does the transferance from the property editing area to the property itself
+   bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when the edit (...) button is pressed.
+   void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+ protected:
+  wxString  m_filenameWildCard;
+  wxString  m_filenameMessage;
+  
+};
+
+class wxColourListValidator: public wxPropertyListValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxColourListValidator)
+ protected:
+ public:
+   wxColourListValidator(long flags = 0);
+
+   ~wxColourListValidator(void);
+
+   bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when the edit (...) button is pressed.
+   void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+};
+
+class wxListOfStringsListValidator: public wxPropertyListValidator
+{
+  DECLARE_DYNAMIC_CLASS(wxListOfStringsListValidator)
+ protected:
+ public:
+   wxListOfStringsListValidator(long flags = 0);
+
+   ~wxListOfStringsListValidator(void)
+   {
+   }
+
+   bool OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost.
+   // Return FALSE if value didn't check out; signal to restore old value.
+   bool OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when TICK is pressed or focus is lost or view wants to update
+   // the property list.
+   // Does the transfer from the property editing area to the property itself
+   bool OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+   bool OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   // Called when the property is double clicked.
+   bool OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+
+   bool EditStringList(wxWindow *parent, wxStringList *stringList, const char *title = "String List Editor");
+
+   // Called when the edit (...) button is pressed.
+   void OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow);
+};
+
+#endif
+  // _WX_PROPLIST_H_
index f92392997f6a01e9942df7f46573ad5997c66184..ff40632c835a416e34c840d703a13df63efce491 100644 (file)
@@ -11,7 +11,8 @@
 WXDIR = $(WXWIN)
 
 TARGET=bombs
-OBJECTS=$(TARGET).obj bombs1.obj game.obj
+OBJECTS=dialoged.obj reseditr.obj dlghndlr.obj reswrite.obj\
+  winprop.obj edtree.obj edlist.obj symbtabl.obj winstyle.obj
 
 !include $(WXDIR)\src\makeprog.msc
 
index 65a59f74d96b833d643391b25ff4af22cc82c66b..118dabbfd4ea390636bc50e0d47f8babb2e59d71 100644 (file)
@@ -11,7 +11,7 @@
 
 PROGRAM=bombs
 
-OBJECTS=$(PROGRAM).o bombs1.o game.o
+OBJECTS = bombs.o bombs1.o game.o
 
 include ../../src/makeprog.env
 
index 1de105cfb52e25b6584918b8d60df7d4295b904a..5a4e995f242ad6ba7fa91ebc841dbd9957717f04 100644 (file)
@@ -16,6 +16,8 @@ WXDIR = ..
 THISDIR=$(WXDIR)/samples
 
 all:
+               cd $(WXDIR)/samples/bombs; make -f makefile.g95
+               cd $(WXDIR)/samples/fractal; make -f makefile.g95
                cd $(WXDIR)/samples/splitter; make -f makefile.g95
                cd $(WXDIR)/samples/resource; make -f makefile.g95
                cd $(WXDIR)/samples/controls; make -f makefile.g95
@@ -26,6 +28,7 @@ all:
                cd $(WXDIR)/samples/minimal; make -f makefile.g95
                cd $(WXDIR)/samples/layout; make -f makefile.g95
                cd $(WXDIR)/samples/printing; make -f makefile.g95
+               cd $(WXDIR)/samples/proplist; make -f makefile.g95
                cd $(WXDIR)/samples/toolbar; make -f makefile.g95
                cd $(WXDIR)/samples/dialogs; make -f makefile.g95
                cd $(WXDIR)/samples/docview; make -f makefile.g95
@@ -43,11 +46,14 @@ all:
 #              cd $(WXDIR)/samples/regtest; make -f makefile.g95
 
 clean:
+               cd $(WXDIR)/samples/bombs; make -f makefile.g95 clean
+               cd $(WXDIR)/samples/fractal; make -f makefile.g95 clean
                cd $(WXDIR)/samples/splitter; make -f makefile.g95 clean
                cd $(WXDIR)/samples/mdi; make -f makefile.g95 clean
                cd $(WXDIR)/samples/minimal; make -f makefile.g95 clean
                cd $(WXDIR)/samples/layout; make -f makefile.g95 clean
                cd $(WXDIR)/samples/printing; make -f makefile.g95 clean
+               cd $(WXDIR)/samples/proplist; make -f makefile.g95 clean
                cd $(WXDIR)/samples/toolbar; make -f makefile.g95 clean
                cd $(WXDIR)/samples/dialogs; make -f makefile.g95 clean
                cd $(WXDIR)/samples/resource; make -f makefile.g95 clean
index fb649f87a68d313b1963988bff9c54306d921855..a2d1489e8ee9e1a79ea0e2eaca1ac151de98bbed 100644 (file)
@@ -74,28 +74,18 @@ all:
         nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
         cd $(WXDIR)\samples\minifram
         nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
+        cd $(WXDIR)\samples\bombs
+        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
+        cd $(WXDIR)\samples\fractal
+        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
+        cd $(WXDIR)\samples\wxpoem
+        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
+        cd $(WXDIR)\samples\types
+        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
+        cd $(WXDIR)\samples\proplist
+        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
 #        cd $(WXDIR)\samples\regtest
 #        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\hello
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\fractal
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\ipc
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\wxpoem
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\types
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\pressup
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\bombs
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\animate
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\panel
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
-#        cd $(WXDIR)\samples\odbc
-#        nmake -f makefile.nt DEBUG_FLAGS=$(DEBUG_FLAGS) LINK_DEBUG_FLAGS=$(LINK_DEBUG_FLAGS)
 
 clean:
         cd $(WXDIR)\samples\splitter
@@ -150,24 +140,14 @@ clean:
         nmake -f makefile.nt clean
         cd $(WXDIR)\samples\minifram
         nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\hello
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\fractal
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\ipc
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\types
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\pressup
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\bombs
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\odbc
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\animate
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\panel
-#        nmake -f makefile.nt clean
-#        cd $(WXDIR)\samples\wxpoem
-#        nmake -f makefile.nt clean
+        cd $(WXDIR)\samples\bombs
+        nmake -f makefile.nt clean
+        cd $(WXDIR)\samples\fractal
+        nmake -f makefile.nt clean
+        cd $(WXDIR)\samples\wxpoem
+        nmake -f makefile.nt clean
+        cd $(WXDIR)\samples\types
+        nmake -f makefile.nt clean
+        cd $(WXDIR)\samples\proplist
+        nmake -f makefile.nt clean
 
index 6eb6471224b36e1622badc4cc66696a120aaf35a..95ac7b592b9de5fd3f0ae2eb1baa651b266127c3 100644 (file)
@@ -15,6 +15,7 @@ TARGET=motif
 THISDIR = $(WXDIR)/samples
 
 all:
+       cd bombs; $(MAKE) -f makefile.unx $(TARGET)
        cd config; $(MAKE) -f makefile.unx $(TARGET)
        cd controls; $(MAKE) -f makefile.unx $(TARGET)
        cd dialogs; $(MAKE) -f makefile.unx $(TARGET)
@@ -22,6 +23,7 @@ all:
        cd docview; $(MAKE) -f makefile.unx $(TARGET)
        cd docvwmdi; $(MAKE) -f makefile.unx $(TARGET)
        cd dynamic; $(MAKE) -f makefile.unx $(TARGET)
+       cd fractal; $(MAKE) -f makefile.unx $(TARGET)
        cd grid; $(MAKE) -f makefile.unx $(TARGET)
        cd help; $(MAKE) -f makefile.unx $(TARGET)
        cd image; $(MAKE) -f makefile.unx $(TARGET)
@@ -33,6 +35,7 @@ all:
        cd nativdlg; $(MAKE) -f makefile.unx $(TARGET)
        cd notebook; $(MAKE) -f makefile.unx $(TARGET)
        cd printing; $(MAKE) -f makefile.unx $(TARGET)
+       cd proplist; $(MAKE) -f makefile.unx $(TARGET)
        cd resource; $(MAKE) -f makefile.unx $(TARGET)
        cd sashtest; $(MAKE) -f makefile.unx $(TARGET)
        cd splitter; $(MAKE) -f makefile.unx $(TARGET)
@@ -45,6 +48,7 @@ all:
        cd wxpoem; $(MAKE) -f makefile.unx $(TARGET)
 
 clean:
+       cd bombs; $(MAKE) -f makefile.unx clean$(TARGET)
        cd config; $(MAKE) -f makefile.unx clean$(TARGET)
        cd controls; $(MAKE) -f makefile.unx clean$(TARGET)
        cd dialogs; $(MAKE) -f makefile.unx clean$(TARGET)
@@ -52,6 +56,7 @@ clean:
        cd docview; $(MAKE) -f makefile.unx clean$(TARGET)
        cd docvwmdi; $(MAKE) -f makefile.unx clean$(TARGET)
        cd dynamic; $(MAKE) -f makefile.unx clean$(TARGET)
+       cd fractal; $(MAKE) -f makefile.unx clean$(TARGET)
        cd grid; $(MAKE) -f makefile.unx clean$(TARGET)
        cd help; $(MAKE) -f makefile.unx clean$(TARGET)
        cd image; $(MAKE) -f makefile.unx clean$(TARGET)
@@ -63,6 +68,7 @@ clean:
        cd nativdlg; $(MAKE) -f makefile.unx clean$(TARGET)
        cd notebook; $(MAKE) -f makefile.unx clean$(TARGET)
        cd printing; $(MAKE) -f makefile.unx clean$(TARGET)
+       cd proplist; $(MAKE) -f makefile.unx clean$(TARGET)
        cd resource; $(MAKE) -f makefile.unx clean$(TARGET)
        cd sashtest; $(MAKE) -f makefile.unx clean$(TARGET)
        cd splitter; $(MAKE) -f makefile.unx clean$(TARGET)
diff --git a/samples/proplist/Makefile b/samples/proplist/Makefile
new file mode 100644 (file)
index 0000000..bccce53
--- /dev/null
@@ -0,0 +1 @@
+include ../../setup/general/makeapp
diff --git a/samples/proplist/Makefile.in b/samples/proplist/Makefile.in
new file mode 100644 (file)
index 0000000..fd1b996
--- /dev/null
@@ -0,0 +1,26 @@
+# WXXT base directory
+WXBASEDIR=@WXBASEDIR@
+
+# set the OS type for compilation
+OS=@OS@
+# compile a library only
+RULE=bin
+
+# define library name
+BIN_TARGET=test
+# define library sources
+BIN_SRC=\
+test.cpp
+
+#define library objects
+BIN_OBJ=\
+test.o
+
+# additional things needed to link
+BIN_LINK=
+
+# additional things needed to compile
+ADD_COMPILE=
+
+# include the definitions now
+include ../../../template.mak
diff --git a/samples/proplist/cross.bmp b/samples/proplist/cross.bmp
new file mode 100644 (file)
index 0000000..079cb0d
Binary files /dev/null and b/samples/proplist/cross.bmp differ
diff --git a/samples/proplist/makefile.b32 b/samples/proplist/makefile.b32
new file mode 100644 (file)
index 0000000..0af0c5f
--- /dev/null
@@ -0,0 +1,64 @@
+#
+# File:                makefile.b32
+# Author:      Julian Smart
+# Created:     1993
+# Updated:     
+# Copyright:
+#
+# "%W% %G%"
+#
+# Makefile : Builds test example
+
+# WXWIN and BCCDIR are set by parent make
+
+WXDIR = $(WXWIN)
+!include $(WXDIR)\src\makeb32.env
+
+WXLIBDIR = $(WXDIR)\lib
+WXINC = $(WXDIR)\include\msw
+WXLIB = $(WXLIBDIR)\wx32.lib
+LIBS=$(WXLIB) cw32 import32 ole2w32
+
+TARGET=test
+
+!if "$(FINAL)" == "0"
+LINKFLAGS=/v /Tpe /L$(WXLIBDIR);$(BCCDIR)\lib
+OPT = -Od
+DEBUG_FLAGS= -v
+!else
+LINKFLAGS=/Tpe /L$(WXLIBDIR);$(BCCDIR)\lib
+OPT = -Od
+DEBUG_FLAGS =
+!endif
+CPPFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG)
+
+OBJECTS = test.obj
+
+$(TARGET).exe: $(OBJECTS) $(TARGET).res
+  tlink32 $(LINKFLAGS) @&&!
+c0w32.obj $(OBJECTS)
+$(TARGET)
+nul
+$(LIBS)
+$(TARGET).def
+$(TARGET).res
+!
+
+.$(SRCSUFF).obj:
+       bcc32 $(CPPFLAGS) -c {$< }
+
+.c.obj:
+       bcc32 $(CPPFLAGS) -P- -c {$< }
+
+test.obj:      test.$(SRCSUFF)
+
+$(TARGET).res :      $(TARGET).rc $(WXDIR)\include\wx\msw\wx.rc
+    brc32 -r /i$(BCCDIR)\include /i$(WXDIR)\include $(TARGET)
+
+clean:
+        -erase *.obj
+        -erase *.exe
+        -erase *.res
+        -erase *.map
+        -erase *.rws
+
diff --git a/samples/proplist/makefile.bcc b/samples/proplist/makefile.bcc
new file mode 100644 (file)
index 0000000..669f019
--- /dev/null
@@ -0,0 +1,19 @@
+#
+# File:                makefile.bcc
+# Author:      Julian Smart
+# Created:     1998
+# Updated:     
+#
+# Builds a BC++ 16-bit sample
+
+!if "$(WXWIN)" == ""
+!error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
+!endif
+
+WXDIR = $(WXWIN)
+
+TARGET=test
+OBJECTS=$(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.bcc
+
diff --git a/samples/proplist/makefile.dos b/samples/proplist/makefile.dos
new file mode 100644 (file)
index 0000000..983ef2d
--- /dev/null
@@ -0,0 +1,17 @@
+#
+# File:                makefile.dos
+# Author:      Julian Smart
+# Created:     1998
+# Updated:     
+#
+# Makefile : Builds 16-bit sample, VC++ 1.5
+# Use FINAL=1 argument to nmake to build final version with no debugging
+# info
+
+WXDIR = $(WXWIN)
+
+TARGET=test
+OBJECTS=$(TARGET).obj
+
+!include $(WXDIR)\src\makeprog.msc
+
diff --git a/samples/proplist/makefile.g95 b/samples/proplist/makefile.g95
new file mode 100644 (file)
index 0000000..fa8c6fb
--- /dev/null
@@ -0,0 +1,37 @@
+#
+# File:                makefile.unx
+# Author:      Julian Smart
+# Created:     1993
+# Updated:     
+# Copyright:   (c) 1993, AIAI, University of Edinburgh
+#
+# "%W% %G%"
+#
+# Makefile for test example (UNIX).
+
+WXDIR = ../..
+
+# All common UNIX compiler flags and options are now in
+# this central makefile.
+include $(WXDIR)/src/makeg95.env
+
+OBJECTS = $(OBJDIR)/test.$(OBJSUFF) $(OBJDIR)/test_resources.$(OBJSUFF)
+
+all:    $(OBJDIR) test$(GUISUFFIX)$(EXESUFF)
+
+wx:
+
+$(OBJDIR):
+       mkdir $(OBJDIR)
+
+test$(GUISUFFIX)$(EXESUFF):    $(OBJECTS) $(WXLIB)
+       $(CC) $(LDFLAGS) -o test$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
+
+$(OBJDIR)/test.$(OBJSUFF):     test.$(SRCSUFF)
+       $(CC) -c $(CPPFLAGS) -o $@ test.$(SRCSUFF)
+
+$(OBJDIR)/test_resources.o:  test.rc
+       $(RESCOMP) -i test.rc -o $(OBJDIR)/test_resources.o $(RESFLAGS)
+
+clean:
+       rm -f $(OBJECTS) test$(GUISUFFIX).exe core *.rsc *.res
diff --git a/samples/proplist/makefile.nt b/samples/proplist/makefile.nt
new file mode 100644 (file)
index 0000000..88441ea
--- /dev/null
@@ -0,0 +1,64 @@
+#
+# File:                makefile.nt
+# Author:      Julian Smart
+# Created:     1993
+# Updated:     
+# Copyright:   (c) 1993, AIAI, University of Edinburgh
+#
+# "%W% %G%"
+#
+# Makefile : Builds test example (MS VC++).
+# Use FINAL=1 argument to nmake to build final version with no debugging
+# info
+
+# Set WXDIR for your system
+WXDIR = $(WXWIN)
+
+WXUSINGDLL=0
+
+!include $(WXDIR)\src\ntwxwin.mak
+
+THISDIR = $(WXDIR)\samples\test
+PROGRAM=test
+
+OBJECTS = $(PROGRAM).obj
+
+$(PROGRAM):    $(PROGRAM).exe
+
+all:    wx $(PROGRAM).exe
+
+wx:
+        cd $(WXDIR)\src\msw
+        nmake -f makefile.nt FINAL=$(FINAL)
+        cd $(THISDIR)
+
+wxclean:
+        cd $(WXDIR)\src\msw
+        nmake -f makefile.nt clean
+        cd $(THISDIR)
+
+$(PROGRAM).exe:      $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(PROGRAM).res
+       $(link) @<<
+-out:$(PROGRAM).exe
+$(LINKFLAGS)
+$(DUMMYOBJ) $(OBJECTS) $(PROGRAM).res
+$(LIBS)
+<<
+
+
+$(PROGRAM).obj:      $(PROGRAM).$(SRCSUFF) $(DUMMYOBJ)
+        $(cc) @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
+<<
+
+$(PROGRAM).res :      $(PROGRAM).rc $(WXDIR)\include\wx\msw\wx.rc
+    $(rc) -r /i$(WXDIR)\include -fo$@ $(PROGRAM).rc
+
+
+clean:
+        -erase *.obj
+        -erase *.exe
+        -erase *.res
+        -erase *.map
+        -erase *.sbr
+        -erase *.pdb
diff --git a/samples/proplist/test.cpp b/samples/proplist/test.cpp
new file mode 100644 (file)
index 0000000..267dfda
--- /dev/null
@@ -0,0 +1,321 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        test.cpp
+// Purpose:     Property sheet test implementation
+// Author:      Julian Smart
+// Modified by:
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:    wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma implementation "test.h"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include "test.h"
+
+// A macro needed for some compilers (AIX) that need 'main' to be defined
+// in the application itself.
+IMPLEMENT_WXWIN_MAIN
+
+IMPLEMENT_APP(MyApp)
+
+wxPropertyValidatorRegistry myListValidatorRegistry;
+wxPropertyValidatorRegistry myFormValidatorRegistry;
+
+MyApp::MyApp(void)
+{
+    m_childWindow = NULL;
+    m_mainFrame = NULL;
+}
+
+bool MyApp::OnInit(void)
+{
+  RegisterValidators();
+
+  // Create the main frame window
+  m_mainFrame = new MyFrame(NULL, "wxPropertySheet Demo", wxPoint(0, 0), wxSize(300, 400), wxDEFAULT_FRAME);
+
+  // Make a menubar
+  wxMenu *file_menu = new wxMenu;
+  file_menu->Append(PROPERTY_TEST_DIALOG_LIST, "Test property list &dialog...");
+  file_menu->Append(PROPERTY_TEST_FRAME_LIST, "Test property list &frame...");
+  file_menu->AppendSeparator();
+  file_menu->Append(PROPERTY_TEST_DIALOG_FORM, "Test property form d&ialog...");
+  file_menu->Append(PROPERTY_TEST_FRAME_FORM, "Test property form f&rame...");
+  file_menu->AppendSeparator();
+  file_menu->Append(PROPERTY_QUIT, "E&xit");
+
+  wxMenu *help_menu = new wxMenu;
+  help_menu->Append(PROPERTY_ABOUT, "&About");
+
+  wxMenuBar *menu_bar = new wxMenuBar;
+
+  menu_bar->Append(file_menu, "&File");
+  menu_bar->Append(help_menu, "&Help");
+
+  // Associate the menu bar with the frame
+  m_mainFrame->SetMenuBar(menu_bar);
+
+  m_mainFrame->Centre(wxBOTH);
+  m_mainFrame->Show(TRUE);
+
+  SetTopWindow(m_mainFrame);
+    
+  return TRUE;
+}
+
+BEGIN_EVENT_TABLE(MyFrame, wxFrame)
+    EVT_CLOSE(MyFrame::OnCloseWindow)
+    EVT_MENU(PROPERTY_QUIT, MyFrame::OnQuit)
+    EVT_MENU(PROPERTY_ABOUT, MyFrame::OnAbout)
+    EVT_MENU(PROPERTY_TEST_DIALOG_LIST, MyFrame::OnDialogList)
+    EVT_MENU(PROPERTY_TEST_FRAME_LIST, MyFrame::OnFrameList)
+    EVT_MENU(PROPERTY_TEST_DIALOG_FORM, MyFrame::OnDialogForm)
+    EVT_MENU(PROPERTY_TEST_FRAME_FORM, MyFrame::OnFrameForm)
+END_EVENT_TABLE()
+
+// Define my frame constructor
+MyFrame::MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size, long type):
+  wxFrame(frame, -1, title, pos, size, type)
+{
+}
+
+// Define the behaviour for the frame closing
+// - must delete all frames except for the main one.
+void MyFrame::OnCloseWindow(wxCloseEvent& event)
+{
+    if (wxGetApp().m_childWindow)
+    {
+        wxGetApp().m_childWindow->Close(TRUE);
+    }
+
+    Destroy();
+}
+
+void MyFrame::OnQuit(wxCommandEvent& event)
+{
+    Close(TRUE);
+}
+
+void MyFrame::OnDialogList(wxCommandEvent& event)
+{
+    wxGetApp().PropertyListTest(TRUE);
+}
+
+void MyFrame::OnFrameList(wxCommandEvent& event)
+{
+    wxGetApp().PropertyListTest(FALSE);
+}
+
+void MyFrame::OnDialogForm(wxCommandEvent& event)
+{
+    wxGetApp().PropertyFormTest(TRUE);
+}
+
+void MyFrame::OnFrameForm(wxCommandEvent& event)
+{
+    wxGetApp().PropertyFormTest(FALSE);
+}
+
+void MyFrame::OnAbout(wxCommandEvent& event)
+{
+    (void)wxMessageBox("Property Classes Demo\nAuthor: Julian Smart", "About Property Classes Test");
+}
+
+void MyApp::RegisterValidators(void)
+{
+  myListValidatorRegistry.RegisterValidator((wxString)"real", new wxRealListValidator);
+  myListValidatorRegistry.RegisterValidator((wxString)"string", new wxStringListValidator);
+  myListValidatorRegistry.RegisterValidator((wxString)"integer", new wxIntegerListValidator);
+  myListValidatorRegistry.RegisterValidator((wxString)"bool", new wxBoolListValidator);
+  myListValidatorRegistry.RegisterValidator((wxString)"stringlist", new wxListOfStringsListValidator);
+
+  myFormValidatorRegistry.RegisterValidator((wxString)"real", new wxRealFormValidator);
+  myFormValidatorRegistry.RegisterValidator((wxString)"string", new wxStringFormValidator);
+  myFormValidatorRegistry.RegisterValidator((wxString)"integer", new wxIntegerFormValidator);
+  myFormValidatorRegistry.RegisterValidator((wxString)"bool", new wxBoolFormValidator);
+}
+
+void MyApp::PropertyListTest(bool useDialog)
+{
+  if (m_childWindow)
+    return;
+
+  wxPropertySheet *sheet = new wxPropertySheet;
+
+  sheet->AddProperty(new wxProperty("fred", 1.0, "real"));
+  sheet->AddProperty(new wxProperty("tough choice", (bool)TRUE, "bool"));
+  sheet->AddProperty(new wxProperty("ian", (long)45, "integer", new wxIntegerListValidator(-50, 50)));
+  sheet->AddProperty(new wxProperty("bill", 25.0, "real", new wxRealListValidator(0.0, 100.0)));
+  sheet->AddProperty(new wxProperty("julian", "one", "string"));
+  sheet->AddProperty(new wxProperty("bitmap", "none", "string", new wxFilenameListValidator("Select a bitmap file", "*.bmp")));
+  wxStringList *strings = new wxStringList("one", "two", "three", NULL);
+  sheet->AddProperty(new wxProperty("constrained", "one", "string", new wxStringListValidator(strings)));
+
+  wxStringList *strings2 = new wxStringList("earth", "fire", "wind", "water", NULL);
+  sheet->AddProperty(new wxProperty("string list", strings2, "stringlist"));
+
+  wxPropertyListView *view =
+    new wxPropertyListView(NULL,
+     wxPROP_BUTTON_CHECK_CROSS|wxPROP_DYNAMIC_VALUE_FIELD|wxPROP_PULLDOWN|wxPROP_SHOWVALUES);
+
+  wxDialog *propDialog = NULL;
+  wxPropertyListFrame *propFrame = NULL;
+  if (useDialog)
+  {
+    propDialog = new PropListDialog(view, NULL, "Property Sheet Test",
+               wxPoint(-1, -1), wxSize(400, 500), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODELESS);
+    m_childWindow = propDialog;
+  }
+  else
+  {
+    propFrame = new PropListFrame(view, NULL, "Property Sheet Test", wxPoint(-1, -1), wxSize(400, 500));
+    m_childWindow = propFrame;
+  }
+  
+  view->AddRegistry(&myListValidatorRegistry);
+
+  if (useDialog)
+  {
+    view->ShowView(sheet, propDialog);
+    propDialog->Centre(wxBOTH);
+    propDialog->Show(TRUE);
+  }
+  else
+  {
+    propFrame->Initialize();
+    view->ShowView(sheet, propFrame->GetPropertyPanel());
+
+    propFrame->Centre(wxBOTH);
+    propFrame->Show(TRUE);
+  }
+}
+
+void MyApp::PropertyFormTest(bool useDialog)
+{
+  if (m_childWindow)
+    return;
+
+#if 0
+  wxPropertySheet *sheet = new wxPropertySheet;
+
+  sheet->AddProperty(new wxProperty("fred", 25.0, "real", new wxRealFormValidator(0.0, 100.0)));
+  sheet->AddProperty(new wxProperty("tough choice", (bool)TRUE, "bool"));
+  sheet->AddProperty(new wxProperty("ian", (long)45, "integer", new wxIntegerFormValidator(-50, 50)));
+  sheet->AddProperty(new wxProperty("julian", "one", "string"));
+  wxStringList *strings = new wxStringList("one", "two", "three", NULL);
+  sheet->AddProperty(new wxProperty("constrained", "one", "string", new wxStringFormValidator(strings)));
+
+  wxPropertyFormView *view = new wxPropertyFormView(NULL);
+
+  wxDialogBox *propDialog = NULL;
+  wxPropertyFormFrame *propFrame = NULL;
+  if (useDialog)
+  {
+    propDialog = new PropFormDialog(view, NULL, "Property Form Test", wxPoint(-1, -1), wxSize(380, 250),
+               wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL);
+    m_childWindow = propDialog;
+  }
+  else
+  {
+    propFrame = new PropFormFrame(view, NULL, "Property Form Test", wxPoint(-1, -1), wxSize(280, 250));
+    propFrame->Initialize();
+    m_childWindow = propFrame;
+  }
+  
+  wxPanel *panel = propDialog ? propDialog : propFrame->GetPropertyPanel();
+  panel->SetLabelPosition(wxVERTICAL);
+  
+  // Add items to the panel
+  
+  (void) new wxButton(panel, -1, "OK", -1, -1, -1, -1, 0, "ok");
+  (void) new wxButton(panel, -1, "Cancel", -1, -1, 80, -1, 0, "cancel");
+  (void) new wxButton(panel, -1, "Update", -1, -1, 80, -1, 0, "update");
+  (void) new wxButton(panel, -1, "Revert", -1, -1, -1, -1, 0, "revert");
+  panel->NewLine();
+  
+  // The name of this text item matches the "fred" property
+  (void) new wxText(panel, -1, "Fred", "", -1, -1, 90, -1, 0, "fred");
+  (void) new wxCheckBox(panel, -1, "Yes or no", -1, -1, -1, -1, 0, "tough choice");
+  (void) new wxSlider(panel, -1, "Scale", 0, -50, 50, 150, -1, -1, wxHORIZONTAL, "ian");
+  panel->NewLine();
+  (void) new wxListBox(panel, -1, "Constrained", wxSINGLE, -1, -1, 100, 90, 0, NULL, 0, "constrained");
+
+  view->AddRegistry(&myFormValidatorRegistry);
+
+  if (useDialog)
+  {
+    view->ShowView(sheet, propDialog);
+    view->AssociateNames();
+    view->TransferToDialog();
+    propDialog->Centre(wxBOTH);
+    propDialog->Show(TRUE);
+  }
+  else
+  {
+    view->ShowView(sheet, propFrame->GetPropertyPanel());
+    view->AssociateNames();
+    view->TransferToDialog();
+    propFrame->Centre(wxBOTH);
+    propFrame->Show(TRUE);
+  }
+#endif
+}
+
+BEGIN_EVENT_TABLE(PropListFrame, wxPropertyListFrame)
+    EVT_CLOSE(PropListFrame::OnCloseWindow)
+END_EVENT_TABLE()
+
+void PropListFrame::OnCloseWindow(wxCloseEvent& event)
+{
+    wxGetApp().m_childWindow = NULL;
+
+    wxPropertyListFrame::OnCloseWindow(event);
+}
+
+BEGIN_EVENT_TABLE(PropListDialog, wxPropertyListDialog)
+    EVT_CLOSE(PropListDialog::OnCloseWindow)
+END_EVENT_TABLE()
+
+void PropListDialog::OnCloseWindow(wxCloseEvent& event)
+{
+    wxGetApp().m_childWindow = NULL;
+
+    wxPropertyListDialog::OnCloseWindow(event);
+}
+
+BEGIN_EVENT_TABLE(PropFormFrame, wxPropertyFormFrame)
+    EVT_CLOSE(PropFormFrame::OnCloseWindow)
+END_EVENT_TABLE()
+
+void PropFormFrame::OnCloseWindow(wxCloseEvent& event)
+{
+    wxGetApp().m_childWindow = NULL;
+
+    wxPropertyFormFrame::OnCloseWindow(event);
+}
+
+BEGIN_EVENT_TABLE(PropFormDialog, wxPropertyFormDialog)
+    EVT_CLOSE(PropFormDialog::OnCloseWindow)
+END_EVENT_TABLE()
+
+void PropFormDialog::OnCloseWindow(wxCloseEvent& event)
+{
+    wxGetApp().m_childWindow = NULL;
+
+    wxPropertyFormDialog::OnCloseWindow(event);
+}
+
diff --git a/samples/proplist/test.def b/samples/proplist/test.def
new file mode 100644 (file)
index 0000000..d94e329
--- /dev/null
@@ -0,0 +1,8 @@
+NAME         TEST
+DESCRIPTION  'wxProperty test'
+EXETYPE      WINDOWS
+STUB         'WINSTUB.EXE'
+CODE         PRELOAD MOVEABLE DISCARDABLE
+DATA         PRELOAD MOVEABLE MULTIPLE
+HEAPSIZE     1024
+STACKSIZE    8192
diff --git a/samples/proplist/test.h b/samples/proplist/test.h
new file mode 100644 (file)
index 0000000..44998f2
--- /dev/null
@@ -0,0 +1,127 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        test.h
+// Purpose:     Property sheet sample
+// Author:      Julian Smart
+// Modified by:
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:    wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma interface "test.h"
+#endif
+
+#ifndef _PROPTEST_H_
+#define _PROPTEST_H_
+
+#include "wx/proplist.h"
+#include "wx/propform.h"
+
+class MyChild;
+
+// Define a new application
+class MyFrame;
+class MyApp: public wxApp
+{
+public:
+    MyApp(void);
+    bool OnInit(void);
+
+    void RegisterValidators(void);
+    void PropertyListTest(bool useDialog);
+    void PropertyFormTest(bool useDialog);
+
+    MyFrame*    m_mainFrame;
+    wxWindow*   m_childWindow;
+};
+
+DECLARE_APP(MyApp)
+
+// Define a new frame
+class MyFrame: public wxFrame
+{
+  public:
+    MyFrame(wxFrame *frame, const wxString& title, const wxPoint& pos, const wxSize& size, long type);
+
+    void OnCloseWindow(wxCloseEvent& event);
+    void OnQuit(wxCommandEvent& event);
+    void OnDialogList(wxCommandEvent& event);
+    void OnFrameList(wxCommandEvent& event);
+    void OnDialogForm(wxCommandEvent& event);
+    void OnFrameForm(wxCommandEvent& event);
+    void OnAbout(wxCommandEvent& event);
+
+DECLARE_EVENT_TABLE()
+};
+
+class PropListFrame: public wxPropertyListFrame
+{
+public:
+  PropListFrame(wxPropertyListView *v, wxFrame *parent, const wxString& title,
+    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long style = wxDEFAULT_FRAME, const wxString& name = "frame"):
+        wxPropertyListFrame(v, parent, title, pos, size, style, name)
+    {
+    }
+
+    void OnCloseWindow(wxCloseEvent& event);
+
+    DECLARE_EVENT_TABLE()
+};
+
+class PropListDialog: public wxPropertyListDialog
+{
+public:
+  PropListDialog(wxPropertyListView *v, wxWindow *parent, const wxString& title,
+    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "dialogBox"):
+        wxPropertyListDialog(v, parent, title, pos, size, style, name)
+   {
+   }
+
+    void OnCloseWindow(wxCloseEvent& event);
+
+    DECLARE_EVENT_TABLE()
+};
+
+class PropFormFrame: public wxPropertyFormFrame
+{
+public:
+  PropFormFrame(wxPropertyFormView *v, wxFrame *parent, const wxString& title,
+    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long style = wxDEFAULT_FRAME, const wxString& name = "frame"):
+    wxPropertyFormFrame(v, parent, title, pos, size, style, name)
+    {
+    }
+
+    void OnCloseWindow(wxCloseEvent& event);
+
+    DECLARE_EVENT_TABLE()
+};
+
+class PropFormDialog: public wxPropertyFormDialog
+{
+public:
+  PropFormDialog(wxPropertyFormView *v, wxWindow *parent, const wxString& title,
+    const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long style = wxDEFAULT_DIALOG_STYLE, const wxString& name = "dialogBox"):
+      wxPropertyFormDialog(v, parent, title, pos, size, style, name)
+    {
+    }
+
+    void OnCloseWindow(wxCloseEvent& event);
+
+    DECLARE_EVENT_TABLE()
+};
+
+#define PROPERTY_QUIT                   1
+#define PROPERTY_ABOUT                  2
+#define PROPERTY_TEST_DIALOG_LIST       3
+#define PROPERTY_TEST_FRAME_LIST        4
+#define PROPERTY_TEST_DIALOG_FORM       5
+#define PROPERTY_TEST_FRAME_FORM        6
+
+#endif
+
diff --git a/samples/proplist/test.rc b/samples/proplist/test.rc
new file mode 100644 (file)
index 0000000..8dd6951
--- /dev/null
@@ -0,0 +1,5 @@
+tick_bmp                BITMAP  "tick.bmp"
+cross_bmp               BITMAP  "cross.bmp"
+
+#include "wx/msw/wx.rc"
+
diff --git a/samples/proplist/tick.bmp b/samples/proplist/tick.bmp
new file mode 100644 (file)
index 0000000..3673eda
Binary files /dev/null and b/samples/proplist/tick.bmp differ
index 166381dd6e9313bfdba61aba4037a179ce2892a7..645cac8005e667883d2b3ab5baeb6ff649406302 100644 (file)
@@ -1329,7 +1329,8 @@ void wxTable::SetColDefs (int index, char *fieldName, int dataType, void *pData,
                                                                 int cType, int size, bool keyField, bool upd,
                                                                 bool insAllow, bool derivedCol)
 {
-       if (strlen(fieldName) > (uint)DB_MAX_COLUMN_NAME_LEN)  // glt 4/21/97
+    // Please, no uint, it doesn't exist for VC++
+       if (strlen(fieldName) > (unsigned int) DB_MAX_COLUMN_NAME_LEN)  // glt 4/21/97
        {
                strncpy (colDefs[index].ColName, fieldName, DB_MAX_COLUMN_NAME_LEN);
                colDefs[index].ColName[DB_MAX_COLUMN_NAME_LEN] = 0;  // glt 10/23/97
diff --git a/src/generic/prop.cpp b/src/generic/prop.cpp
new file mode 100644 (file)
index 0000000..fb5e94f
--- /dev/null
@@ -0,0 +1,1119 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        prop.cpp
+// Purpose:     Propert sheet classes implementation
+// Author:      Julian Smart
+// Modified by:
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma implementation "prop.h"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#if wxUSE_IOSTREAMH
+#if defined(__WXMSW__) && !defined(__GNUWIN32__)
+#include <strstrea.h>
+#else
+#include <strstream.h>
+#endif
+#else
+#include <strstream>
+#endif
+
+#include "wx/window.h"
+#include "wx/utils.h"
+#include "wx/list.h"
+#include "wx/prop.h"
+
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyValue, wxObject)
+
+wxPropertyValue::wxPropertyValue(void)
+{
+  m_type = wxPropertyValueNull;
+  m_next = NULL;
+  m_last = NULL;
+  m_value.first = NULL;
+  m_clientData = NULL;
+  m_modifiedFlag = FALSE;
+}
+
+wxPropertyValue::wxPropertyValue(const wxPropertyValue& copyFrom)
+{
+  m_modifiedFlag = FALSE;
+  Copy((wxPropertyValue& )copyFrom);
+}
+
+wxPropertyValue::wxPropertyValue(const char *val)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueString;
+
+  m_value.string = copystring(val);
+  m_clientData = NULL;
+  m_next = NULL;
+  m_last = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(const wxString& val)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueString;
+
+  m_value.string = copystring((const char *)val);
+  m_clientData = NULL;
+  m_next = NULL;
+  m_last = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(long the_integer)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueInteger;
+  m_value.integer = the_integer;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(bool val)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValuebool;
+  m_value.integer = val;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(float the_real)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueReal;
+  m_value.real = the_real;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(double the_real)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueReal;
+  m_value.real = (float)the_real;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+// Pointer versions: we have a pointer to the real C++ value.
+wxPropertyValue::wxPropertyValue(char **val)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueStringPtr;
+
+  m_value.stringPtr = val;
+  m_clientData = NULL;
+  m_next = NULL;
+  m_last = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(long *val)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueIntegerPtr;
+  m_value.integerPtr = val;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(bool *val)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueboolPtr;
+  m_value.boolPtr = val;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(float *val)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueRealPtr;
+  m_value.realPtr = val;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+wxPropertyValue::wxPropertyValue(wxList *the_list)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueList;
+  m_clientData = NULL;
+  m_last = NULL;
+  m_value.first = NULL;
+
+  wxNode *node = the_list->First();
+  while (node)
+  {
+    wxPropertyValue *expr = (wxPropertyValue *)node->Data();
+    Append(expr);
+    node = node->Next();
+  }
+
+  delete the_list;
+}
+
+wxPropertyValue::wxPropertyValue(wxStringList *the_list)
+{
+  m_modifiedFlag = FALSE;
+  m_type = wxPropertyValueList;
+  m_clientData = NULL;
+  m_last = NULL;
+  m_value.first = NULL;
+
+  wxNode *node = the_list->First();
+  while (node)
+  {
+    char *s = (char *)node->Data();
+    Append(new wxPropertyValue(s));
+    node = node->Next();
+  }
+  delete the_list;
+}
+
+wxPropertyValue::~wxPropertyValue(void)
+{
+  switch (m_type)
+  {
+    case wxPropertyValueInteger:
+    case wxPropertyValuebool:
+    case wxPropertyValueReal:
+    {
+     break;
+    }
+   case wxPropertyValueString:
+   {
+     delete[] m_value.string;
+     break;
+   }
+   case wxPropertyValueList:
+   {
+     wxPropertyValue *expr = m_value.first;
+     while (expr)
+     {
+       wxPropertyValue *expr1 = expr->m_next;
+
+       delete expr;
+       expr = expr1;
+     }
+     break;
+   }
+   default:
+   case wxPropertyValueNull: break;
+  }
+}
+
+void wxPropertyValue::Append(wxPropertyValue *expr)
+{
+  m_modifiedFlag = TRUE;
+  if (!m_value.first)
+    m_value.first = expr;
+
+  if (m_last)
+    m_last->m_next = expr;
+  m_last = expr;
+}
+
+void wxPropertyValue::Insert(wxPropertyValue *expr)
+{
+  m_modifiedFlag = TRUE;
+  expr->m_next = m_value.first;
+  m_value.first = expr;
+
+  if (!m_last)
+    m_last = expr;
+}
+
+// Delete from list
+void wxPropertyValue::Delete(wxPropertyValue *node)
+{
+  wxPropertyValue *expr = GetFirst();
+  
+  wxPropertyValue *previous = NULL;
+  while (expr && (expr != node))
+  {
+    previous = expr;
+    expr = expr->GetNext();
+  }
+
+  if (expr)
+  {
+    if (previous)
+      previous->m_next = expr->m_next;
+      
+    // If node was the first in the list,
+    // make the list point to the NEXT one.
+    if (GetFirst() == expr)
+    {
+      m_value.first = expr->m_next;
+    }
+
+    // If node was the last in the list,
+    // make the list 'last' pointer point to the PREVIOUS one.
+    if (GetLast() == expr)
+    {
+      if (previous)
+        m_last = previous;
+      else
+        m_last = NULL;
+    }
+    m_modifiedFlag = TRUE;
+    delete expr;
+  }
+
+}
+
+void wxPropertyValue::ClearList(void)
+{
+  wxPropertyValue *val = GetFirst();
+  if (val)
+    m_modifiedFlag = TRUE;
+
+  while (val)
+  {
+    wxPropertyValue *next = val->GetNext();
+    delete val;
+    val = next;
+  }
+  m_value.first = NULL;
+  m_last = NULL;
+}
+
+wxPropertyValue *wxPropertyValue::NewCopy(void) const
+{
+  switch (m_type)
+  {
+    case wxPropertyValueInteger:
+      return new wxPropertyValue(m_value.integer);
+    case wxPropertyValuebool:
+      return new wxPropertyValue((bool) (m_value.integer != 0));
+    case wxPropertyValueReal:
+      return new wxPropertyValue(m_value.real);
+    case wxPropertyValueString:
+      return new wxPropertyValue(m_value.string);
+    case wxPropertyValueList:
+    {
+      wxPropertyValue *expr = m_value.first;
+      wxPropertyValue *new_list = new wxPropertyValue;
+      new_list->SetType(wxPropertyValueList);
+      while (expr)
+      {
+        wxPropertyValue *expr2 = expr->NewCopy();
+        new_list->Append(expr2);
+        expr = expr->m_next;
+      }
+      return new_list;
+    }
+   case wxPropertyValueIntegerPtr:
+     return new wxPropertyValue(m_value.integerPtr);
+   case wxPropertyValueRealPtr:
+     return new wxPropertyValue(m_value.realPtr);
+   case wxPropertyValueboolPtr:
+     return new wxPropertyValue(m_value.boolPtr);
+   case wxPropertyValueStringPtr:
+     return new wxPropertyValue(m_value.stringPtr);
+
+   case wxPropertyValueNull: 
+#ifdef __X__
+    cerr << "Should never get here!\n";
+#endif
+    break;
+  }
+  return NULL;
+}
+
+void wxPropertyValue::Copy(wxPropertyValue& copyFrom)
+{
+  m_type = copyFrom.Type();
+
+  switch (m_type)
+  {
+    case wxPropertyValueInteger:
+      (*this) = copyFrom.IntegerValue();
+      return ;
+
+    case wxPropertyValueReal:
+      (*this) = copyFrom.RealValue();
+      return ;
+      
+    case wxPropertyValueString:
+      (*this) = wxString(copyFrom.StringValue());
+      return ;
+      
+    case wxPropertyValuebool:
+      (*this) = copyFrom.BoolValue();
+      return ;
+
+    // Pointers
+    case wxPropertyValueboolPtr:
+      (*this) = copyFrom.BoolValuePtr();
+      return ;
+    case wxPropertyValueRealPtr:
+      (*this) = copyFrom.RealValuePtr();
+      return ;
+    case wxPropertyValueIntegerPtr:
+      (*this) = copyFrom.IntegerValuePtr();
+      return ;
+    case wxPropertyValueStringPtr:
+    {
+      char** s = copyFrom.StringValuePtr();
+      (*this) = s;
+      return ;
+    }
+      
+    case wxPropertyValueList:
+    {
+      m_value.first = NULL;
+      m_next = NULL;
+      m_last = NULL;
+      wxPropertyValue *expr = copyFrom.m_value.first;
+      while (expr)
+      {
+        wxPropertyValue *expr2 = expr->NewCopy();
+        Append(expr2);
+        expr = expr->m_next;
+      }
+      return;
+    }
+   case wxPropertyValueNull: 
+#ifdef __X__
+    cerr << "Should never get here!\n";
+#endif
+    break;
+  }
+}
+
+// Return nth argument of a clause (starting from 1)
+wxPropertyValue *wxPropertyValue::Arg(wxPropertyValueType type, int arg) const
+{
+  wxPropertyValue *expr = m_value.first;
+  for (int i = 1; i < arg; i++)
+    if (expr)
+      expr = expr->m_next;
+
+  if (expr && (expr->m_type == type))
+    return expr;
+  else
+    return NULL;
+}
+
+// Return nth argument of a list expression (starting from zero)
+wxPropertyValue *wxPropertyValue::Nth(int arg) const
+{
+  if (m_type != wxPropertyValueList)
+    return NULL;
+
+  wxPropertyValue *expr = m_value.first;
+  for (int i = 0; i < arg; i++)
+    if (expr)
+      expr = expr->m_next;
+    else return NULL;
+
+  if (expr)
+    return expr;
+  else
+    return NULL;
+}
+
+  // Returns the number of elements in a list expression
+int wxPropertyValue::Number(void) const
+{
+  if (m_type != wxPropertyValueList)
+    return 0;
+
+  int i = 0;
+  wxPropertyValue *expr = m_value.first;
+  while (expr)
+  {
+    expr = expr->m_next;
+    i ++;
+  }
+  return i;
+}
+
+void wxPropertyValue::WritePropertyClause(ostream& stream)  // Write this expression as a top-level clause
+{
+  if (m_type != wxPropertyValueList)
+    return;
+
+  wxPropertyValue *node = m_value.first;
+  if (node)
+  {
+    node->WritePropertyType(stream);
+    stream << "(";
+    node = node->m_next;
+    bool first = TRUE;
+    while (node)
+    {
+      if (!first)
+        stream << "  ";
+      node->WritePropertyType(stream);
+      node = node->m_next;
+      if (node) stream << ",\n";
+      first = FALSE;
+    }
+    stream << ").\n\n";
+  }
+}
+
+void wxPropertyValue::WritePropertyType(ostream& stream)    // Write as any other subexpression
+{
+  switch (m_type)
+  {
+    case wxPropertyValueInteger:
+    {
+      stream << m_value.integer;
+      break;
+    }
+    case wxPropertyValueIntegerPtr:
+    {
+      stream << *m_value.integerPtr;
+      break;
+    }
+    case wxPropertyValuebool:
+    {
+      if (m_value.integer)
+        stream << "True";
+      else
+        stream << "False";
+      break;
+    }
+    case wxPropertyValueboolPtr:
+    {
+      if (*m_value.integerPtr)
+        stream << "True";
+      else
+        stream << "False";
+      break;
+    }
+    case wxPropertyValueReal:
+    {
+      float f = m_value.real;
+      sprintf(wxBuffer, "%.6g", (double)f);
+      stream << wxBuffer;
+      break;
+    }
+    case wxPropertyValueRealPtr:
+    {
+      float f = *m_value.realPtr;
+/* Now the parser can cope with this.
+      // Prevent printing in 'e' notation. Any better way?
+      if (fabs(f) < 0.00001)
+        f = 0.0;
+*/
+      sprintf(wxBuffer, "%.6g", f);
+      stream << wxBuffer;
+      break;
+    }
+    case wxPropertyValueString:
+    {
+//      stream << "\"";
+      int i;
+      int len = strlen(m_value.string);
+      for (i = 0; i < len; i++)
+      {
+        char ch = m_value.string[i];
+//        if (ch == '"' || ch == '\\')
+//          stream << "\\";
+        stream << ch;
+      }
+
+//      stream << "\"";
+      break;
+    }
+    case wxPropertyValueStringPtr:
+    {
+      int i;
+      int len = strlen(*(m_value.stringPtr));
+      for (i = 0; i < len; i++)
+      {
+        char ch = *(m_value.stringPtr)[i];
+
+      }
+      break;
+    }
+    case wxPropertyValueList:
+    {
+      if (!m_value.first)
+        stream << "[]";
+      else
+      {
+        wxPropertyValue *expr = m_value.first;
+
+        stream << "[";
+        while (expr)
+        {
+          expr->WritePropertyType(stream);
+          expr = expr->m_next;
+          if (expr) stream << ", ";
+        }
+        stream << "]";
+      }
+      break;
+    }
+   case wxPropertyValueNull: break;
+  }
+}
+
+wxString wxPropertyValue::GetStringRepresentation(void)
+{
+  char buf[500];
+  buf[0] = 0;
+  
+  ostrstream str((char *)buf, (int)500, ios::out);
+  WritePropertyType(str);
+  str << '\0';
+  str.flush();
+
+  wxString theString(buf);
+  return theString;
+}
+
+void wxPropertyValue::operator=(const wxPropertyValue& val)
+{
+  m_modifiedFlag = TRUE;
+  Copy((wxPropertyValue&)val);
+}
+
+// void wxPropertyValue::operator=(const char *val)
+void wxPropertyValue::operator=(const wxString& val1)
+{
+  const char *val = (const char *)val1;
+
+  m_modifiedFlag = TRUE;
+  if (m_type == wxPropertyValueNull)
+    m_type = wxPropertyValueString;
+
+  if (m_type == wxPropertyValueString)
+  {
+    if (val)
+      m_value.string = copystring(val);
+    else
+      m_value.string = NULL;
+  }
+  else if (m_type == wxPropertyValueStringPtr)
+  {
+    if (*m_value.stringPtr)
+      delete[] *m_value.stringPtr;
+    if (val)
+      *m_value.stringPtr = copystring(val);
+    else
+      *m_value.stringPtr = NULL;
+  }
+  
+  m_clientData = NULL;
+  m_next = NULL;
+  m_last = NULL;
+
+}
+
+void wxPropertyValue::operator=(const long val)
+{
+  m_modifiedFlag = TRUE;
+  if (m_type == wxPropertyValueNull)
+    m_type = wxPropertyValueInteger;
+
+  if (m_type == wxPropertyValueInteger)
+    m_value.integer = val;
+  else if (m_type == wxPropertyValueIntegerPtr)
+    *m_value.integerPtr = val;
+  else if (m_type == wxPropertyValueReal)
+    m_value.real = (float)val;
+  else if (m_type == wxPropertyValueRealPtr)
+    *m_value.realPtr = (float)val;
+
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+void wxPropertyValue::operator=(const bool val)
+{
+  m_modifiedFlag = TRUE;
+  if (m_type == wxPropertyValueNull)
+    m_type = wxPropertyValuebool;
+
+  if (m_type == wxPropertyValuebool)
+    m_value.integer = (long)val;
+  else if (m_type == wxPropertyValueboolPtr)
+    *m_value.boolPtr = val;
+
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+void wxPropertyValue::operator=(const float val)
+{
+  m_modifiedFlag = TRUE;
+  if (m_type == wxPropertyValueNull)
+    m_type = wxPropertyValueReal;
+
+  if (m_type == wxPropertyValueInteger)
+    m_value.integer = (long)val;
+  else if (m_type == wxPropertyValueIntegerPtr)
+    *m_value.integerPtr = (long)val;
+  else if (m_type == wxPropertyValueReal)
+    m_value.real = val;
+  else if (m_type == wxPropertyValueRealPtr)
+    *m_value.realPtr = val;
+
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+void wxPropertyValue::operator=(const char **val)
+{
+  m_modifiedFlag = TRUE;
+  m_type = wxPropertyValueStringPtr;
+
+  if (val)
+    m_value.stringPtr = (char **)val;
+  else
+    m_value.stringPtr = NULL;
+  m_clientData = NULL;
+  m_next = NULL;
+  m_last = NULL;
+
+}
+
+void wxPropertyValue::operator=(const long *val)
+{
+  m_modifiedFlag = TRUE;
+  m_type = wxPropertyValueIntegerPtr;
+  m_value.integerPtr = (long *)val;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+void wxPropertyValue::operator=(const bool *val)
+{
+  m_modifiedFlag = TRUE;
+  m_type = wxPropertyValueboolPtr;
+  m_value.boolPtr = (bool *)val;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+void wxPropertyValue::operator=(const float *val)
+{
+  m_modifiedFlag = TRUE;
+  m_type = wxPropertyValueRealPtr;
+  m_value.realPtr = (float *)val;
+  m_clientData = NULL;
+  m_next = NULL;
+}
+
+long wxPropertyValue::IntegerValue(void) const
+  {
+    if (m_type == wxPropertyValueInteger)
+      return m_value.integer;
+    else if (m_type == wxPropertyValueReal)
+      return (long)m_value.real;
+    else if (m_type == wxPropertyValueIntegerPtr)
+      return *m_value.integerPtr;
+    else if (m_type == wxPropertyValueRealPtr)
+      return (long)(*m_value.realPtr);
+    else return 0;
+  }
+
+long *wxPropertyValue::IntegerValuePtr(void) const
+{
+  return m_value.integerPtr;
+}
+
+float wxPropertyValue::RealValue(void) const {
+    if (m_type == wxPropertyValueReal)
+      return m_value.real;
+    else if (m_type == wxPropertyValueRealPtr)
+      return *m_value.realPtr;
+    else if (m_type == wxPropertyValueInteger)
+      return (float)m_value.integer;
+    else if (m_type == wxPropertyValueIntegerPtr)
+      return (float)*(m_value.integerPtr);
+    else return 0.0;
+  }
+
+float *wxPropertyValue::RealValuePtr(void) const
+{
+  return m_value.realPtr;
+}
+
+bool wxPropertyValue::BoolValue(void) const {
+    if (m_type == wxPropertyValueReal)
+      return (m_value.real != 0.0);
+    if (m_type == wxPropertyValueRealPtr)
+      return (*(m_value.realPtr) != 0.0);
+    else if (m_type == wxPropertyValueInteger)
+      return (m_value.integer != 0);
+    else if (m_type == wxPropertyValueIntegerPtr)
+      return (*(m_value.integerPtr) != 0);
+    else if (m_type == wxPropertyValuebool)
+      return (m_value.integer != 0);
+    else if (m_type == wxPropertyValueboolPtr)
+      return (*(m_value.boolPtr) != 0);
+    else return FALSE;
+  }
+
+bool *wxPropertyValue::BoolValuePtr(void) const
+{
+  return m_value.boolPtr;
+}
+
+char *wxPropertyValue::StringValue(void) const {
+    if (m_type == wxPropertyValueString)
+      return m_value.string;
+    else if (m_type == wxPropertyValueStringPtr)
+      return *(m_value.stringPtr);
+    else return NULL;
+  }
+
+char **wxPropertyValue::StringValuePtr(void) const
+{
+  return m_value.stringPtr;
+}
+
+/*
+ * A property (name plus value)
+ */
+IMPLEMENT_DYNAMIC_CLASS(wxProperty, wxObject)
+
+wxProperty::wxProperty(void)
+{
+  m_propertyRole = (char *)NULL;
+  m_propertyValidator = NULL;
+  m_propertyWindow = NULL;
+  m_enabled = TRUE;
+}
+
+wxProperty::wxProperty(wxProperty& copyFrom)
+{
+  m_value = copyFrom.GetValue();
+  m_name = copyFrom.GetName();
+  m_propertyRole = copyFrom.GetRole();
+  m_propertyValidator = copyFrom.GetValidator();
+  m_enabled = copyFrom.IsEnabled();
+  m_propertyWindow = NULL;
+}
+
+wxProperty::wxProperty(wxString nm, wxString role, wxPropertyValidator *ed):m_name(nm), m_propertyRole(role)
+{
+  m_propertyValidator = ed;
+  m_propertyWindow = NULL;
+  m_enabled = TRUE;
+}
+
+wxProperty::wxProperty(wxString nm, const wxPropertyValue& val, wxString role, wxPropertyValidator *ed):
+  m_name(nm), m_value(val), m_propertyRole(role)
+{
+  m_propertyValidator = ed;
+  m_propertyWindow = NULL;
+  m_enabled = TRUE;
+}
+
+wxProperty::~wxProperty(void)
+{
+  if (m_propertyValidator)
+    delete m_propertyValidator;
+}
+
+wxPropertyValue& wxProperty::GetValue(void) const
+{
+  return (wxPropertyValue&) m_value;
+}
+
+wxPropertyValidator *wxProperty::GetValidator(void) const
+{
+  return m_propertyValidator;
+}
+
+wxString& wxProperty::GetName(void) const
+{
+  return (wxString&) m_name;
+}
+
+wxString& wxProperty::GetRole(void) const
+{
+  return (wxString&) m_propertyRole;
+}
+
+void wxProperty::SetValue(const wxPropertyValue& val)
+{
+  m_value = val;
+}
+
+void wxProperty::SetValidator(wxPropertyValidator *ed)
+{
+  m_propertyValidator = ed;
+}
+
+void wxProperty::SetRole(wxString& role)
+{
+  m_propertyRole = role;
+}
+
+void wxProperty::SetName(wxString& nm)
+{
+  m_name = nm;
+}
+
+void wxProperty::operator=(const wxPropertyValue& val)
+{
+  m_value = val;
+}
+
+/*
+ * Base property view class
+ */
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyView, wxEvtHandler)
+
+wxPropertyView::wxPropertyView(long flags)
+{
+  m_buttonFlags = flags;
+  m_propertySheet = NULL;
+  m_currentValidator = NULL;
+  m_currentProperty = NULL;
+}
+
+wxPropertyView::~wxPropertyView(void)
+{
+}
+
+void wxPropertyView::AddRegistry(wxPropertyValidatorRegistry *registry)
+{
+  m_validatorRegistryList.Append(registry);
+}
+
+wxPropertyValidator *wxPropertyView::FindPropertyValidator(wxProperty *property)
+{
+  if (property->GetValidator())
+    return property->GetValidator();
+    
+  wxNode *node = m_validatorRegistryList.First();
+  while (node)
+  {
+    wxPropertyValidatorRegistry *registry = (wxPropertyValidatorRegistry *)node->Data();
+    wxPropertyValidator *validator = registry->GetValidator(property->GetRole());
+    if (validator)
+      return validator;
+    node = node->Next();
+  }
+  return NULL;
+/*
+  if (!wxDefaultPropertyValidator)
+    wxDefaultPropertyValidator = new wxPropertyListValidator;
+  return wxDefaultPropertyValidator;
+*/
+}
+
+/*
+ * Property sheet
+ */
+
+IMPLEMENT_DYNAMIC_CLASS(wxPropertySheet, wxObject)
+
+wxPropertySheet::wxPropertySheet(void):m_properties(wxKEY_STRING)
+{
+}
+
+wxPropertySheet::~wxPropertySheet(void)
+{
+  Clear();
+}
+
+bool wxPropertySheet::Save( ostream& WXUNUSED(str) )
+{
+  return FALSE;
+}
+
+bool wxPropertySheet::Load( ostream& WXUNUSED(str) )
+{
+  return FALSE;
+}
+
+void wxPropertySheet::UpdateAllViews( wxPropertyView *WXUNUSED(thisView) )
+{
+}
+
+// Add a property
+void wxPropertySheet::AddProperty(wxProperty *property)
+{
+  m_properties.Append((const char*) property->GetName(), property);
+}
+
+// Get property by name
+wxProperty *wxPropertySheet::GetProperty(wxString name)
+{
+  wxNode *node = m_properties.Find((const char*) name);
+  if (!node)
+    return NULL;
+  else
+    return (wxProperty *)node->Data();
+}
+
+// Clear all properties
+void wxPropertySheet::Clear(void)
+{
+  wxNode *node = m_properties.First();
+  while (node)
+  {
+    wxProperty *prop = (wxProperty *)node->Data();
+    wxNode *next = node->Next();
+    delete prop;
+    delete node;
+    node = next;
+  }
+}
+
+// Sets/clears the modified flag for each property value
+void wxPropertySheet::SetAllModified(bool flag)
+{
+  wxNode *node = m_properties.First();
+  while (node)
+  {
+    wxProperty *prop = (wxProperty *)node->Data();
+    prop->GetValue().SetModified(flag);
+    node = node->Next();
+  }  
+}
+
+/*
+ * Property validator registry
+ *
+ */
+
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyValidatorRegistry, wxHashTable)
+
+wxPropertyValidatorRegistry::wxPropertyValidatorRegistry(void):wxHashTable(wxKEY_STRING)
+{
+}
+
+wxPropertyValidatorRegistry::~wxPropertyValidatorRegistry(void)
+{
+  ClearRegistry();
+}
+
+void wxPropertyValidatorRegistry::RegisterValidator(const wxString& typeName, wxPropertyValidator *validator)
+{
+  Put((const char*) typeName, validator);
+}
+
+wxPropertyValidator *wxPropertyValidatorRegistry::GetValidator(const wxString& typeName)
+{
+  return (wxPropertyValidator *)Get((const char*) typeName);
+}
+
+void wxPropertyValidatorRegistry::ClearRegistry(void)
+{
+  BeginFind();
+  wxNode *node;
+  while (node = Next())
+  {
+    delete (wxPropertyValidator *)node->Data();
+  }
+}
+
+ /*
+  * Property validator
+  */
+
+
+IMPLEMENT_ABSTRACT_CLASS(wxPropertyValidator, wxEvtHandler)
+
+wxPropertyValidator::wxPropertyValidator(long flags)
+{
+  m_validatorFlags = flags;
+  m_validatorProperty = NULL;
+}
+
+wxPropertyValidator::~wxPropertyValidator(void)
+{}
+
+bool wxPropertyValidator::StringToFloat (char *s, float *number) {
+       double num;
+       bool ok = StringToDouble (s, &num);
+       *number = (float) num;
+       return ok;
+}
+
+bool wxPropertyValidator::StringToDouble (char *s, double *number) {
+    bool ok = TRUE;
+    char *value_ptr;
+    *number = strtod (s, &value_ptr);
+    if (value_ptr) {
+               int len = strlen (value_ptr);
+               for (int i = 0; i < len; i++) {
+                       ok = (isspace (value_ptr[i]) != 0);
+                       if (!ok) return FALSE;
+               }
+    }
+    return ok;
+}
+
+bool wxPropertyValidator::StringToInt (char *s, int *number) {
+       long num;
+       bool ok = StringToLong (s, &num);
+       *number = (int) num;
+       return ok;
+}
+
+bool wxPropertyValidator::StringToLong (char *s, long *number) {
+    bool ok = TRUE;
+    char *value_ptr;
+    *number = strtol (s, &value_ptr, 10);
+    if (value_ptr) {
+               int len = strlen (value_ptr);
+               for (int i = 0; i < len; i++) {
+                       ok = (isspace (value_ptr[i]) != 0);
+                       if (!ok) return FALSE;
+               }
+    }
+    return ok;
+}
+
+char *wxPropertyValidator::FloatToString (float number) {
+       static char buf[20];
+       sprintf (buf, "%.6g", number);
+       return buf;
+}
+
+char *wxPropertyValidator::DoubleToString (double number) {
+       static char buf[20];
+       sprintf (buf, "%.6g", number);
+       return buf;
+}
+
+char *wxPropertyValidator::IntToString (int number) {
+       return ::IntToString (number);
+}
+
+char *wxPropertyValidator::LongToString (long number) {
+       return ::LongToString (number);
+  }
+
+
diff --git a/src/generic/propform.cpp b/src/generic/propform.cpp
new file mode 100644 (file)
index 0000000..2a94303
--- /dev/null
@@ -0,0 +1,743 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        propform.cpp
+// Purpose:     Property form classes
+// Author:      Julian Smart
+// Modified by:
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma implementation "propform.h"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#if wxUSE_IOSTREAMH
+#if defined(__WXMSW__) && !defined(__GNUWIN32__)
+#include <strstrea.h>
+#else
+#include <strstream.h>
+#endif
+#else
+#include <strstream>
+#endif
+
+#include "wx/window.h"
+#include "wx/utils.h"
+#include "wx/list.h"
+#include "wx/propform.h"
+
+/*
+ * Property view
+ */
+
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyFormView, wxPropertyView)
+
+BEGIN_EVENT_TABLE(wxPropertyFormView, wxPropertyView)
+       EVT_BUTTON(wxID_OK,             wxPropertyFormView::OnOk)
+       EVT_BUTTON(wxID_CANCEL,         wxPropertyFormView::OnCancel)
+       EVT_BUTTON(wxID_HELP,           wxPropertyFormView::OnHelp)
+       EVT_BUTTON(wxID_PROP_REVERT,    wxPropertyFormView::OnRevert)
+       EVT_BUTTON(wxID_PROP_UPDATE,    wxPropertyFormView::OnUpdate)
+END_EVENT_TABLE()
+
+bool wxPropertyFormView::sm_dialogCancelled = FALSE;
+
+wxPropertyFormView::wxPropertyFormView(wxWindow *propPanel, long flags):wxPropertyView(flags)
+{
+  m_propertyWindow = propPanel;
+  m_managedWindow = NULL;
+
+  m_windowCloseButton = NULL;
+  m_windowCancelButton = NULL;
+  m_windowHelpButton = NULL;
+
+  m_detailedEditing = FALSE;
+}
+
+wxPropertyFormView::~wxPropertyFormView(void)
+{
+}
+
+void wxPropertyFormView::ShowView(wxPropertySheet *ps, wxWindow *panel)
+{
+  m_propertySheet = ps;
+
+  AssociatePanel(panel);
+//  CreateControls();
+//  UpdatePropertyList();
+}
+
+// Update this view of the viewed object, called e.g. by
+// the object itself.
+bool wxPropertyFormView::OnUpdateView(void)
+{
+  return TRUE;
+}
+
+bool wxPropertyFormView::Check(void)
+{
+  if (!m_propertySheet)
+    return FALSE;
+    
+  wxNode *node = m_propertySheet->GetProperties().First();
+  while (node)
+  {
+    wxProperty *prop = (wxProperty *)node->Data();
+    wxPropertyValidator *validator = FindPropertyValidator(prop);
+    if (validator && validator->IsKindOf(CLASSINFO(wxPropertyFormValidator)))
+    {
+      wxPropertyFormValidator *formValidator = (wxPropertyFormValidator *)validator;
+      if (!formValidator->OnCheckValue(prop, this, m_propertyWindow))
+        return FALSE;
+    }
+    node = node->Next();
+  }
+  return TRUE;
+}
+
+bool wxPropertyFormView::TransferToPropertySheet(void)
+{
+  if (!m_propertySheet)
+    return FALSE;
+    
+  wxNode *node = m_propertySheet->GetProperties().First();
+  while (node)
+  {
+    wxProperty *prop = (wxProperty *)node->Data();
+    wxPropertyValidator *validator = FindPropertyValidator(prop);
+    if (validator && validator->IsKindOf(CLASSINFO(wxPropertyFormValidator)))
+    {
+      wxPropertyFormValidator *formValidator = (wxPropertyFormValidator *)validator;
+      formValidator->OnRetrieveValue(prop, this, m_propertyWindow);
+    }
+    node = node->Next();
+  }
+  return TRUE;
+}
+
+bool wxPropertyFormView::TransferToDialog(void)
+{
+  if (!m_propertySheet)
+    return FALSE;
+    
+  wxNode *node = m_propertySheet->GetProperties().First();
+  while (node)
+  {
+    wxProperty *prop = (wxProperty *)node->Data();
+    wxPropertyValidator *validator = FindPropertyValidator(prop);
+    if (validator && validator->IsKindOf(CLASSINFO(wxPropertyFormValidator)))
+    {
+      wxPropertyFormValidator *formValidator = (wxPropertyFormValidator *)validator;
+      formValidator->OnDisplayValue(prop, this, m_propertyWindow);
+    }
+    node = node->Next();
+  }
+  return TRUE;
+}
+
+bool wxPropertyFormView::AssociateNames(void)
+{
+  if (!m_propertySheet || !m_propertyWindow)
+    return FALSE;
+
+  wxNode *node = m_propertyWindow->GetChildren().First();
+  while (node)
+  {
+    wxWindow *win = (wxWindow *)node->Data();
+    if (win->GetName() != "")
+    {
+      wxProperty *prop = m_propertySheet->GetProperty(win->GetName());
+      if (prop)
+        prop->SetWindow(win);
+    }
+    node = node->Next();
+  }
+  return TRUE;
+}
+
+
+bool wxPropertyFormView::OnClose(void)
+{
+  delete this;
+  return TRUE;
+}
+
+void wxPropertyFormView::OnOk(wxCommandEvent& WXUNUSED(event))
+{
+  // Retrieve the value if any
+  if (!Check())
+    return;
+  
+  sm_dialogCancelled = FALSE;
+  TransferToPropertySheet();
+
+  m_managedWindow->Close(TRUE);
+}
+
+void wxPropertyFormView::OnCancel(wxCommandEvent& WXUNUSED(event))
+{
+  sm_dialogCancelled = TRUE;
+
+  m_managedWindow->Close(TRUE);
+}
+
+void wxPropertyFormView::OnHelp(wxCommandEvent& WXUNUSED(event))
+{
+}
+
+void wxPropertyFormView::OnUpdate(wxCommandEvent& WXUNUSED(event))
+{
+    if (Check())
+        TransferToPropertySheet();
+}
+
+void wxPropertyFormView::OnRevert(wxCommandEvent& WXUNUSED(event))
+{
+  TransferToDialog();
+}
+
+void wxPropertyFormView::OnCommand(wxWindow& win, wxCommandEvent& event)
+{
+  if (!m_propertySheet)
+    return;
+    
+  if (win.GetName() == "")
+    return;
+
+  if (strcmp(win.GetName(), "ok") == 0)
+    OnOk(event);
+  else if (strcmp(win.GetName(), "cancel") == 0)
+    OnCancel(event);
+  else if (strcmp(win.GetName(), "help") == 0)
+    OnHelp(event);
+  else if (strcmp(win.GetName(), "update") == 0)
+    OnUpdate(event);
+  else if (strcmp(win.GetName(), "revert") == 0)
+    OnRevert(event);
+  else
+  {
+    // Find a validator to route the command to.
+    wxNode *node = m_propertySheet->GetProperties().First();
+    while (node)
+    {
+      wxProperty *prop = (wxProperty *)node->Data();
+      if (prop->GetWindow() && (prop->GetWindow() == &win))
+      {
+        wxPropertyValidator *validator = FindPropertyValidator(prop);
+        if (validator && validator->IsKindOf(CLASSINFO(wxPropertyFormValidator)))
+        {
+          wxPropertyFormValidator *formValidator = (wxPropertyFormValidator *)validator;
+          formValidator->OnCommand(prop, this, m_propertyWindow, event);
+          return;
+        }
+      }
+      node = node->Next();
+    }
+  }
+}
+
+void wxPropertyFormView::OnDoubleClick(wxControl *item)
+{
+  if (!m_propertySheet)
+    return;
+    
+  // Find a validator to route the command to.
+  wxNode *node = m_propertySheet->GetProperties().First();
+  while (node)
+  {
+    wxProperty *prop = (wxProperty *)node->Data();
+    if (prop->GetWindow() && ((wxControl *)prop->GetWindow() == item))
+    {
+      wxPropertyValidator *validator = FindPropertyValidator(prop);
+      if (validator && validator->IsKindOf(CLASSINFO(wxPropertyFormValidator)))
+      {
+        wxPropertyFormValidator *formValidator = (wxPropertyFormValidator *)validator;
+        formValidator->OnDoubleClick(prop, this, m_propertyWindow);
+        return;
+      }
+    }
+    node = node->Next();
+  }
+}
+
+/*
+ * Property form dialog box
+ */
+IMPLEMENT_CLASS(wxPropertyFormDialog, wxDialog)
+
+wxPropertyFormDialog::wxPropertyFormDialog(wxPropertyFormView *v, wxWindow *parent, const wxString& title,
+       const wxPoint& pos, const wxSize& size, long style, const wxString& name):
+     wxDialog(parent, -1, title, pos, size, style, name)
+{
+  m_view = v;
+  m_view->AssociatePanel(this);
+  m_view->SetManagedWindow(this);
+//  SetAutoLayout(TRUE);
+}
+
+bool wxPropertyFormDialog::OnClose(void)
+{
+  if (m_view)
+  {
+    m_view->OnClose();
+       m_view = NULL;
+       return TRUE;
+  }
+  else
+    return FALSE;
+}
+
+void wxPropertyFormDialog::OnDefaultAction(wxControl *item)
+{
+  m_view->OnDoubleClick(item);
+}
+
+void wxPropertyFormDialog::OnCommand(wxWindow& win, wxCommandEvent& event)
+{
+  if ( m_view )
+       m_view->OnCommand(win, event);
+}
+
+// Extend event processing to search the view's event table
+bool wxPropertyFormDialog::ProcessEvent(wxEvent& event)
+{
+       if ( !m_view || ! m_view->ProcessEvent(event) )
+               return wxEvtHandler::ProcessEvent(event);
+       else
+               return TRUE;
+}
+
+
+/*
+ * Property form panel
+ */
+IMPLEMENT_CLASS(wxPropertyFormPanel, wxPanel)
+
+void wxPropertyFormPanel::OnDefaultAction(wxControl *item)
+{
+  m_view->OnDoubleClick(item);
+}
+
+void wxPropertyFormPanel::OnCommand(wxWindow& win, wxCommandEvent& event)
+{
+  m_view->OnCommand(win, event);
+}
+
+// Extend event processing to search the view's event table
+bool wxPropertyFormPanel::ProcessEvent(wxEvent& event)
+{
+       if ( !m_view || ! m_view->ProcessEvent(event) )
+               return wxEvtHandler::ProcessEvent(event);
+       else
+               return TRUE;
+}
+
+/*
+ * Property frame
+ */
+IMPLEMENT_CLASS(wxPropertyFormFrame, wxFrame)
+
+bool wxPropertyFormFrame::OnClose(void)
+{
+  if (m_view)
+    return m_view->OnClose();
+  else
+    return FALSE;
+}
+
+wxPanel *wxPropertyFormFrame::OnCreatePanel(wxFrame *parent, wxPropertyFormView *v)
+{
+  return new wxPropertyFormPanel(v, parent);
+}
+
+bool wxPropertyFormFrame::Initialize(void)
+{
+  m_propertyPanel = OnCreatePanel(this, m_view);
+  if (m_propertyPanel)
+  {
+    m_view->AssociatePanel(m_propertyPanel);
+    m_view->SetManagedWindow(this);
+    return TRUE;
+  }
+  else
+    return FALSE;
+}
+
+ /*
+  * Property form specific validator
+  */
+  
+IMPLEMENT_ABSTRACT_CLASS(wxPropertyFormValidator, wxPropertyValidator)
+
+
+/*
+ * Default validators
+ */
+
+IMPLEMENT_DYNAMIC_CLASS(wxRealFormValidator, wxPropertyFormValidator)
+
+///
+/// Real number form validator
+/// 
+bool wxRealFormValidator::OnCheckValue( wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *parentWindow)
+{
+  if (m_realMin == 0.0 && m_realMax == 0.0)
+    return TRUE;
+    
+  // The item used for viewing the real number: should be a text item.
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow || !m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+    return FALSE;
+
+  wxString value(((wxTextCtrl *)m_propertyWindow)->GetValue());
+
+  float val = 0.0;
+  if (!StringToFloat(WXSTRINGCAST value, &val))
+  {
+    char buf[200];
+    sprintf(buf, "Value %s is not a valid real number!", (const char *)value);
+    wxMessageBox(buf, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  
+  if (val < m_realMin || val > m_realMax)
+  {
+    char buf[200];
+    sprintf(buf, "Value must be a real number between %.2f and %.2f!", m_realMin, m_realMax);
+    wxMessageBox(buf, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+bool wxRealFormValidator::OnRetrieveValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow) )
+{
+  // The item used for viewing the real number: should be a text item.
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow || !m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+    return FALSE;
+
+  wxString value(((wxTextCtrl *)m_propertyWindow)->GetValue());
+
+  if (value.Length() == 0)
+    return FALSE;
+    
+  float f = (float)atof((const char *)value);
+  property->GetValue() = f;
+  return TRUE;
+}
+
+bool wxRealFormValidator::OnDisplayValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow) )
+{
+  // The item used for viewing the real number: should be a text item.
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow || !m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+    return FALSE;
+
+  wxTextCtrl *textItem = (wxTextCtrl *)m_propertyWindow;
+  textItem->SetValue(FloatToString(property->GetValue().RealValue()));
+  return TRUE;
+}
+
+///
+/// Integer validator
+/// 
+IMPLEMENT_DYNAMIC_CLASS(wxIntegerFormValidator, wxPropertyFormValidator)
+
+bool wxIntegerFormValidator::OnCheckValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *parentWindow)
+{
+  if (m_integerMin == 0.0 && m_integerMax == 0.0)
+    return TRUE;
+    
+  // The item used for viewing the real number: should be a text item or a slider
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow)
+    return FALSE;
+
+  long val = 0;
+
+  if (m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+  {
+    wxString value(((wxTextCtrl *)m_propertyWindow)->GetValue());
+
+    if (!StringToLong(WXSTRINGCAST value, &val))
+    {
+      char buf[200];
+      sprintf(buf, "Value %s is not a valid integer!", (const char *)value);
+      wxMessageBox(buf, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+      return FALSE;
+    }
+  }
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxSlider)))
+  {
+    val = (long)((wxSlider *)m_propertyWindow)->GetValue();
+  }
+  else
+    return FALSE;
+    
+  if (val < m_integerMin || val > m_integerMax)
+  {
+    char buf[200];
+    sprintf(buf, "Value must be an integer between %ld and %ld!", m_integerMin, m_integerMax);
+    wxMessageBox(buf, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+bool wxIntegerFormValidator::OnRetrieveValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow))
+{
+  // The item used for viewing the real number: should be a text item or a slider
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow)
+    return FALSE;
+
+  if (m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+  {
+    wxString value(((wxTextCtrl *)m_propertyWindow)->GetValue());
+
+    if (value.Length() == 0)
+      return FALSE;
+    
+    long i = atol((const char *)value);
+    property->GetValue() = i;
+  }
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxSlider)))
+  {
+    property->GetValue() = (long)((wxSlider *)m_propertyWindow)->GetValue();
+  }
+  else
+    return FALSE;
+    
+  return TRUE;
+}
+
+bool wxIntegerFormValidator::OnDisplayValue( wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow))
+{
+  // The item used for viewing the real number: should be a text item or a slider
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow)
+    return FALSE;
+
+  if (m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+  {
+    wxTextCtrl *textItem = (wxTextCtrl *)m_propertyWindow;
+    textItem->SetValue(LongToString(property->GetValue().IntegerValue()));
+  }
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxSlider)))
+  {
+    ((wxSlider *)m_propertyWindow)->SetValue((int)property->GetValue().IntegerValue());
+  }
+  else
+    return FALSE;
+  return TRUE;
+}
+
+///
+/// Boolean validator
+/// 
+IMPLEMENT_DYNAMIC_CLASS(wxBoolFormValidator, wxPropertyFormValidator)
+
+bool wxBoolFormValidator::OnCheckValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow))
+{
+  // The item used for viewing the boolean: should be a checkbox
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow || !m_propertyWindow->IsKindOf(CLASSINFO(wxCheckBox)))
+    return FALSE;
+
+  return TRUE;
+}
+
+bool wxBoolFormValidator::OnRetrieveValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow) )
+{
+  // The item used for viewing the boolean: should be a checkbox.
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow || !m_propertyWindow->IsKindOf(CLASSINFO(wxCheckBox)))
+    return FALSE;
+
+  wxCheckBox *checkBox = (wxCheckBox *)m_propertyWindow;
+
+  property->GetValue() = (bool)checkBox->GetValue();
+  return TRUE;
+}
+
+bool wxBoolFormValidator::OnDisplayValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow))
+{
+  // The item used for viewing the boolean: should be a checkbox.
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow || !m_propertyWindow->IsKindOf(CLASSINFO(wxCheckBox)))
+    return FALSE;
+
+  wxCheckBox *checkBox = (wxCheckBox *)m_propertyWindow;
+  checkBox->SetValue((bool)property->GetValue().BoolValue());
+  return TRUE;
+}
+
+///
+/// String validator
+/// 
+IMPLEMENT_DYNAMIC_CLASS(wxStringFormValidator, wxPropertyFormValidator)
+
+wxStringFormValidator::wxStringFormValidator(wxStringList *list, long flags):
+  wxPropertyFormValidator(flags)
+{
+  m_strings = list;
+}
+
+bool wxStringFormValidator::OnCheckValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *parentWindow )
+{
+  if (!m_strings)
+    return TRUE;
+
+  // The item used for viewing the string: should be a text item, choice item or listbox.
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow)
+    return FALSE;
+  if (m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+  {
+    wxTextCtrl *text = (wxTextCtrl *)m_propertyWindow;
+    if (!m_strings->Member(text->GetValue()))
+    {
+      wxString s("Value ");
+      s += text->GetValue();
+      s += " is not valid.";
+      wxMessageBox(s, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+      return FALSE;
+    }
+  }
+  else
+  {
+    // Any other item constrains the string value,
+    // so we don't have to check it.
+  }
+  return TRUE;
+}
+
+bool wxStringFormValidator::OnRetrieveValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow) )
+{
+  // The item used for viewing the string: should be a text item, choice item or listbox.
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow)
+    return FALSE;
+  if (m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+  {
+    wxTextCtrl *text = (wxTextCtrl *)m_propertyWindow;
+    property->GetValue() = text->GetValue();
+  }
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxListBox)))
+  {
+    wxListBox *lbox = (wxListBox *)m_propertyWindow;
+    if (lbox->GetSelection() > -1)
+      property->GetValue() = lbox->GetStringSelection();
+  }
+/*
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxRadioBox)))
+  {
+    wxRadioBox *rbox = (wxRadioBox *)m_propertyWindow;
+    int n = 0;
+    if ((n = rbox->GetSelection()) > -1)
+      property->GetValue() = rbox->GetString(n);
+  }
+*/
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxChoice)))
+  {
+    wxChoice *choice = (wxChoice *)m_propertyWindow;
+    if (choice->GetSelection() > -1)
+      property->GetValue() = choice->GetStringSelection();
+  }
+  else
+    return FALSE;
+  return TRUE;
+}
+
+bool wxStringFormValidator::OnDisplayValue(wxProperty *property, wxPropertyFormView *WXUNUSED(view), 
+  wxWindow *WXUNUSED(parentWindow) )
+{
+  // The item used for viewing the string: should be a text item, choice item or listbox.
+  wxWindow *m_propertyWindow = property->GetWindow();
+  if (!m_propertyWindow)
+    return FALSE;
+  if (m_propertyWindow->IsKindOf(CLASSINFO(wxTextCtrl)))
+  {
+    wxTextCtrl *text = (wxTextCtrl *)m_propertyWindow;
+    text->SetValue(property->GetValue().StringValue());
+  }
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxListBox)))
+  {
+    wxListBox *lbox = (wxListBox *)m_propertyWindow;
+    if (lbox->Number() == 0 && m_strings)
+    {
+      // Try to initialize the listbox from 'strings'
+      wxNode *node = m_strings->First();
+      while (node)
+      {
+        char *s = (char *)node->Data();
+        lbox->Append(s);
+        node = node->Next();
+      }
+    }
+    lbox->SetStringSelection(property->GetValue().StringValue());
+  }
+/*
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxRadioBox)))
+  {
+    wxRadioBox *rbox = (wxRadioBox *)m_propertyWindow;
+    rbox->SetStringSelection(property->GetValue().StringValue());
+  }
+*/
+  else if (m_propertyWindow->IsKindOf(CLASSINFO(wxChoice)))
+  {
+    wxChoice *choice = (wxChoice *)m_propertyWindow;
+#ifndef __XVIEW__
+    if (choice->Number() == 0 && m_strings)
+    {
+      // Try to initialize the choice item from 'strings'
+      // XView doesn't allow this kind of thing.
+      wxNode *node = m_strings->First();
+      while (node)
+      {
+        char *s = (char *)node->Data();
+        choice->Append(s);
+        node = node->Next();
+      }
+    }
+#endif
+    choice->SetStringSelection(property->GetValue().StringValue());
+  }
+  else
+    return FALSE;
+  return TRUE;
+}
+
diff --git a/src/generic/proplist.cpp b/src/generic/proplist.cpp
new file mode 100644 (file)
index 0000000..52b80b5
--- /dev/null
@@ -0,0 +1,1948 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        proplist.cpp
+// Purpose:     Property list classes
+// Author:      Julian Smart
+// Modified by:
+// Created:     04/01/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Julian Smart
+// Licence:    wxWindows licence
+/////////////////////////////////////////////////////////////////////////////
+
+#ifdef __GNUG__
+#pragma implementation "proplist.h"
+#endif
+
+// For compilers that support precompilation, includes "wx/wx.h".
+#include "wx/wxprec.h"
+
+#ifdef __BORLANDC__
+#pragma hdrstop
+#endif
+
+#ifndef WX_PRECOMP
+#include "wx/wx.h"
+#endif
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#if wxUSE_IOSTREAMH
+#if defined(__WXMSW__) && !defined(__GNUWIN32__)
+#include <strstrea.h>
+#else
+#include <strstream.h>
+#endif
+#else
+#include <strstream>
+#endif
+
+#include "wx/window.h"
+#include "wx/utils.h"
+#include "wx/list.h"
+#include "wx/colordlg.h"
+#include "wx/proplist.h"
+
+/*
+ * Property text edit control
+ */
+IMPLEMENT_CLASS(wxPropertyTextEdit, wxTextCtrl)
+
+wxPropertyTextEdit::wxPropertyTextEdit(wxPropertyListView *v, wxWindow *parent,
+    const wxWindowID id, const wxString& value,
+       const wxPoint& pos, const wxSize& size,
+    long style, const wxString& name):
+ wxTextCtrl(parent, id, value, pos, size, style, wxDefaultValidator, name)
+{
+  m_view = v;
+}
+
+void wxPropertyTextEdit::OnSetFocus(void)
+{
+}
+
+void wxPropertyTextEdit::OnKillFocus(void)
+{
+}
+
+/*
+ * Property list view
+ */
+
+IMPLEMENT_DYNAMIC_CLASS(wxPropertyListView, wxPropertyView)
+
+BEGIN_EVENT_TABLE(wxPropertyListView, wxPropertyView)
+       EVT_BUTTON(wxID_OK,             wxPropertyListView::OnOk)
+       EVT_BUTTON(wxID_CANCEL,         wxPropertyListView::OnCancel)
+       EVT_BUTTON(wxID_HELP,           wxPropertyListView::OnHelp)
+       EVT_BUTTON(wxID_PROP_CROSS,     wxPropertyListView::OnCross)
+       EVT_BUTTON(wxID_PROP_CHECK,     wxPropertyListView::OnCheck)
+       EVT_BUTTON(wxID_PROP_EDIT,      wxPropertyListView::OnEdit)
+       EVT_TEXT_ENTER(wxID_PROP_TEXT,  wxPropertyListView::OnText)
+       EVT_LISTBOX(wxID_PROP_SELECT,   wxPropertyListView::OnPropertySelect)
+    EVT_COMMAND(wxID_PROP_SELECT, wxEVT_COMMAND_LISTBOX_DOUBLECLICKED, wxPropertyListView::OnPropertyDoubleClick)
+       EVT_LISTBOX(wxID_PROP_VALUE_SELECT,     wxPropertyListView::OnValueListSelect)
+END_EVENT_TABLE()
+
+bool wxPropertyListView::sm_dialogCancelled = FALSE;
+wxBitmap *wxPropertyListView::sm_tickBitmap = NULL;
+wxBitmap *wxPropertyListView::sm_crossBitmap = NULL;
+
+wxPropertyListView::wxPropertyListView(wxPanel *propPanel, long flags):wxPropertyView(flags)
+{
+  m_propertyScrollingList = NULL;
+  m_valueList = NULL;
+  m_valueText = NULL;
+  m_editButton = NULL;
+  m_confirmButton = NULL;
+  m_cancelButton = NULL;
+  m_propertyWindow = propPanel;
+  m_managedWindow = NULL;
+
+  m_windowCloseButton = NULL;
+  m_windowCancelButton = NULL;
+  m_windowHelpButton = NULL;
+
+  m_detailedEditing = FALSE;
+}
+
+wxPropertyListView::~wxPropertyListView(void)
+{
+/*
+  if (m_tickBitmap)
+    delete m_tickBitmap;
+  if (m_crossBitmap)
+    delete m_crossBitmap;
+*/
+}
+
+void wxPropertyListView::ShowView(wxPropertySheet *ps, wxPanel *panel)
+{
+  m_propertySheet = ps;
+
+  AssociatePanel(panel);
+  CreateControls();
+
+  UpdatePropertyList();
+  panel->Layout();
+}
+
+// Update this view of the viewed object, called e.g. by
+// the object itself.
+bool wxPropertyListView::OnUpdateView(void)
+{
+  return TRUE;
+}
+
+bool wxPropertyListView::UpdatePropertyList(bool clearEditArea)
+{
+  if (!m_propertyScrollingList || !m_propertySheet)
+    return FALSE;
+
+  m_propertyScrollingList->Clear();
+  if (clearEditArea)
+  {
+    m_valueList->Clear();
+    m_valueText->SetValue("");
+  }
+  wxNode *node = m_propertySheet->GetProperties().First();
+
+  // Should sort them... later...
+  while (node)
+  {
+    wxProperty *property = (wxProperty *)node->Data();
+    wxString stringValueRepr(property->GetValue().GetStringRepresentation());
+    wxString paddedString(MakeNameValueString(property->GetName(), stringValueRepr));
+
+    m_propertyScrollingList->Append(paddedString.GetData(), (char *)property);
+    node = node->Next();
+  }
+  return TRUE;
+}
+
+bool wxPropertyListView::UpdatePropertyDisplayInList(wxProperty *property)
+{
+  if (!m_propertyScrollingList || !m_propertySheet)
+    return FALSE;
+
+  int currentlySelected = m_propertyScrollingList->GetSelection();
+// #ifdef __WXMSW__
+  wxString stringValueRepr(property->GetValue().GetStringRepresentation());
+  wxString paddedString(MakeNameValueString(property->GetName(), stringValueRepr));
+  int sel = FindListIndexForProperty(property);
+
+  if (sel > -1)
+  {
+    // Don't update the listbox unnecessarily because it can cause
+    // ugly flashing.
+    
+    if (paddedString != m_propertyScrollingList->GetString(sel))
+      m_propertyScrollingList->SetString(sel, paddedString.GetData());
+  }
+//#else
+//  UpdatePropertyList(FALSE);
+//#endif
+
+  // TODO: why is this necessary?
+#ifdef __WXMSW__
+  if (currentlySelected > -1)
+    m_propertyScrollingList->SetSelection(currentlySelected);
+#endif
+
+  return TRUE;
+}
+
+// Find the wxListBox index corresponding to this property
+int wxPropertyListView::FindListIndexForProperty(wxProperty *property)
+{
+  int n = m_propertyScrollingList->Number();
+  for (int i = 0; i < n; i++)
+  {
+    if (property == (wxProperty *)m_propertyScrollingList->wxListBox::GetClientData(i))
+      return i;
+  }
+  return -1;
+}
+
+wxString wxPropertyListView::MakeNameValueString(wxString name, wxString value)
+{
+  wxString theString(name);
+
+  int nameWidth = 25;
+  int padWith = nameWidth - theString.Length();
+  if (padWith < 0)
+    padWith = 0;
+
+  if (GetFlags() & wxPROP_SHOWVALUES)
+  {
+    // Want to pad with spaces
+    theString.Append(' ', padWith);
+    theString += value;
+  }
+
+  return theString;
+}
+
+// Select and show string representation in validator the given
+// property. NULL resets to show no property.
+bool wxPropertyListView::ShowProperty(wxProperty *property, bool select)
+{
+  if (m_currentProperty)
+  {
+    EndShowingProperty(m_currentProperty);
+    m_currentProperty = NULL;
+  }
+
+  m_valueList->Clear();
+  m_valueText->SetValue("");
+
+  if (property)
+  {
+    m_currentProperty = property;
+    BeginShowingProperty(property);
+  }
+  if (select)
+  {
+    int sel = FindListIndexForProperty(property);
+    if (sel > -1)
+      m_propertyScrollingList->SetSelection(sel);
+  }
+  return TRUE;
+}
+
+// Find appropriate validator and load property into value controls
+bool wxPropertyListView::BeginShowingProperty(wxProperty *property)
+{
+  m_currentValidator = FindPropertyValidator(property);
+  if (!m_currentValidator)
+    return FALSE;
+
+  if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+    return FALSE;
+
+  wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+  listValidator->OnPrepareControls(property, this, m_propertyWindow);
+  DisplayProperty(property);
+  return TRUE;
+}
+
+// Find appropriate validator and unload property from value controls
+bool wxPropertyListView::EndShowingProperty(wxProperty *property)
+{
+  if (!m_currentValidator)
+    return FALSE;
+
+  RetrieveProperty(property);
+
+  if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+    return FALSE;
+
+  wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+  listValidator->OnClearControls(property, this, m_propertyWindow);
+  if (m_detailedEditing)
+  {
+    listValidator->OnClearDetailControls(property, this, m_propertyWindow);
+    m_detailedEditing = FALSE;
+  }
+  return TRUE;
+}
+
+void wxPropertyListView::BeginDetailedEditing(void)
+{
+  if (!m_currentValidator)
+    return;
+  if (!m_currentProperty)
+    return;
+  if (m_detailedEditing)
+    return;
+  if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+    return;
+  if (!m_currentProperty->IsEnabled())
+    return;
+
+  wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+  if (listValidator->OnPrepareDetailControls(m_currentProperty, this, m_propertyWindow))
+    m_detailedEditing = TRUE;
+}
+
+void wxPropertyListView::EndDetailedEditing(void)
+{
+  if (!m_currentValidator)
+    return;
+  if (!m_currentProperty)
+    return;
+
+  RetrieveProperty(m_currentProperty);
+
+  if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+    return;
+
+  wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+  if (m_detailedEditing)
+  {
+    listValidator->OnClearDetailControls(m_currentProperty, this, m_propertyWindow);
+    m_detailedEditing = FALSE;
+  }
+}
+
+bool wxPropertyListView::DisplayProperty(wxProperty *property)
+{
+  if (!m_currentValidator)
+    return FALSE;
+
+  if (((m_currentValidator->GetFlags() & wxPROP_ALLOW_TEXT_EDITING) == 0) || !property->IsEnabled())
+    m_valueText->SetEditable(FALSE);
+  else
+    m_valueText->SetEditable(TRUE);
+
+  if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+    return FALSE;
+
+  wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+  listValidator->OnDisplayValue(property, this, m_propertyWindow);
+  return TRUE;
+}
+
+bool wxPropertyListView::RetrieveProperty(wxProperty *property)
+{
+  if (!m_currentValidator)
+    return FALSE;
+  if (!property->IsEnabled())
+    return FALSE;
+
+  if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+    return FALSE;
+
+  wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+  if (listValidator->OnCheckValue(property, this, m_propertyWindow))
+  {
+    if (listValidator->OnRetrieveValue(property, this, m_propertyWindow))
+    {
+      UpdatePropertyDisplayInList(property);
+      OnPropertyChanged(property);
+    }
+  }
+  else
+  {
+    // Revert to old value
+    listValidator->OnDisplayValue(property, this, m_propertyWindow);
+  }
+  return TRUE;
+}
+
+
+bool wxPropertyListView::EditProperty(wxProperty *WXUNUSED(property))
+{
+  return TRUE;
+}
+
+// Called by the listbox callback
+void wxPropertyListView::OnPropertySelect(wxCommandEvent& WXUNUSED(event))
+{
+  int sel = m_propertyScrollingList->GetSelection();
+  if (sel > -1)
+  {
+    wxProperty *newSel = (wxProperty *)m_propertyScrollingList->wxListBox::GetClientData(sel);
+    if (newSel && newSel != m_currentProperty)
+    {
+      ShowProperty(newSel, FALSE);
+    }
+  }
+}
+
+bool wxPropertyListView::CreateControls(void)
+{
+  wxPanel *panel = (wxPanel *)m_propertyWindow;
+
+  int largeButtonWidth = 60;
+  int largeButtonHeight = 25;
+
+  int smallButtonWidth = 25;
+  int smallButtonHeight = 20;
+
+  // XView must be allowed to choose its own sized buttons
+#ifdef __XVIEW__
+  largeButtonWidth = -1;
+  largeButtonHeight = -1;
+
+  smallButtonWidth = -1;
+  smallButtonHeight = -1;
+#endif
+  
+  if (m_valueText)
+    return TRUE;
+    
+  if (!panel)
+    return FALSE;
+
+  wxWindow *leftMostWindow = panel;
+  wxWindow *topMostWindow = panel;
+  wxWindow *rightMostWindow = panel;
+
+  wxSystemSettings settings;
+  wxFont guiFont = settings.GetSystemFont(wxSYS_DEFAULT_GUI_FONT);
+
+#ifdef __WXMSW__
+  wxFont *boringFont = wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxMODERN, wxNORMAL, wxNORMAL, FALSE, "Courier New");
+#else
+  wxFont *boringFont = wxTheFontList->FindOrCreateFont(guiFont.GetPointSize(), wxTELETYPE, wxNORMAL, wxNORMAL);
+#endif
+
+  // May need to be changed in future to eliminate clashes with app.
+  // WHAT WAS THIS FOR?
+//  panel->SetClientData((char *)this);
+
+  // These buttons are at the bottom of the window, but create them now
+  // so the constraints are evaluated in the correct order
+  if (m_buttonFlags & wxPROP_BUTTON_OK)
+  {
+    m_windowCloseButton = new wxButton(panel, wxID_OK, "OK",
+     wxPoint(-1, -1), wxSize(largeButtonWidth, largeButtonHeight));
+    m_windowCloseButton->SetDefault();
+    m_windowCloseButton->SetFocus();
+  }
+  else if (m_buttonFlags & wxPROP_BUTTON_CLOSE)
+  {
+    m_windowCloseButton = new wxButton(panel, wxID_OK, "Close",
+     wxPoint(-1, -1), wxSize(largeButtonWidth, largeButtonHeight));
+  }
+  if (m_buttonFlags & wxPROP_BUTTON_CANCEL)
+  {
+    m_windowCancelButton = new wxButton(panel, wxID_CANCEL, "Cancel",
+     wxPoint(-1, -1), wxSize(largeButtonWidth, largeButtonHeight));
+  }
+  if (m_buttonFlags & wxPROP_BUTTON_HELP)
+  {
+    m_windowHelpButton = new wxButton(panel, wxID_HELP, "Help",
+     wxPoint(-1, -1), wxSize(largeButtonWidth, largeButtonHeight));
+  }
+
+  if (m_windowCloseButton)
+  {
+    wxLayoutConstraints *c1 = new wxLayoutConstraints;
+
+    c1->left.SameAs       (panel, wxLeft, 2);
+    c1->bottom.SameAs        (panel, wxBottom, 2);
+    c1->width.AsIs();
+    c1->height.AsIs();
+    m_windowCloseButton->SetConstraints(c1);
+    leftMostWindow = m_windowCloseButton;
+  }
+  if (m_windowCancelButton)
+  {
+    wxLayoutConstraints *c2 = new wxLayoutConstraints;
+
+    c2->right.SameAs       (panel, wxRight, 2);
+    c2->bottom.SameAs          (panel, wxBottom, 2);
+    c2->width.AsIs();
+    c2->height.AsIs();
+    m_windowCancelButton->SetConstraints(c2);
+    leftMostWindow = m_windowCancelButton;
+  }
+  if (m_windowHelpButton)
+  {
+    wxLayoutConstraints *c2 = new wxLayoutConstraints;
+    if (leftMostWindow == panel)
+      c2->left.SameAs       (panel, wxLeft, 2);
+    else
+      c2->left.RightOf      (leftMostWindow, 2);
+      
+    c2->bottom.SameAs          (panel, wxBottom, 2);
+    c2->width.AsIs();
+    c2->height.AsIs();
+    m_windowHelpButton->SetConstraints(c2);
+    leftMostWindow = m_windowHelpButton;
+  }
+
+  if (m_buttonFlags & wxPROP_BUTTON_CHECK_CROSS)
+  {
+/*
+    if (!tickBitmap)
+    {
+#ifdef __WXMSW__
+      tickBitmap = new wxBitmap("tick_bmp", wxBITMAP_TYPE_RESOURCE);
+      crossBitmap =  new wxBitmap("cross_bmp", wxBITMAP_TYPE_RESOURCE);
+      if (!tickBitmap || !crossBitmap || !tickBitmap->Ok() || !crossBitmap->Ok())
+      {
+        if (tickBitmap)
+          delete tickBitmap;
+        if (crossBitmap)
+          delete crossBitmap;
+        tickBitmap = NULL;
+        crossBitmap = NULL;
+      }
+#endif
+    }
+*/
+/*
+    if (tickBitmap && crossBitmap)
+    {
+      m_confirmButton = new wxBitmapButton(panel, wxID_PROP_CHECK, tickBitmap,
+       wxPoint(-1, -1), wxSize(smallButtonWidth-5, smallButtonHeight-5));
+      m_cancelButton = new wxBitmapButton(panel, wxID_PROP_CROSS, crossBitmap,
+       wxPoint(-1, -1), wxSize(smallButtonWidth-5, smallButtonHeight-5));
+    }
+    else
+*/
+    {
+      m_confirmButton = new wxButton(panel, wxID_PROP_CHECK, ":-)",
+       wxPoint(-1, -1), wxSize(smallButtonWidth, smallButtonHeight));
+      m_cancelButton = new wxButton(panel, wxID_PROP_CROSS, "X",
+       wxPoint(-1, -1), wxSize(smallButtonWidth, smallButtonHeight));
+    }
+
+    wxLayoutConstraints *c = new wxLayoutConstraints;
+    c->left.SameAs         (panel, wxLeft, 2);
+/*
+    if (windowCloseButton)
+      c->top.Below         (m_windowCloseButton, 2);
+    else
+*/
+      c->top.SameAs        (panel, wxTop, 2);
+
+    c->width.AsIs();
+    c->height.AsIs();
+
+    m_cancelButton->SetConstraints(c);
+
+    c = new wxLayoutConstraints;
+    c->left.RightOf        (m_cancelButton, 2);
+    c->top.SameAs          (m_cancelButton, wxTop, 0);
+    c->width.AsIs();
+    c->height.AsIs();
+
+    m_confirmButton->SetConstraints(c);
+
+    m_cancelButton->Enable(FALSE);
+    m_confirmButton->Enable(FALSE);
+  }
+
+  if (m_buttonFlags & wxPROP_PULLDOWN)
+  {
+    m_editButton = new wxButton(panel, wxID_PROP_EDIT, "...",
+     wxPoint(-1, -1), wxSize(smallButtonWidth, smallButtonHeight));
+    m_editButton->Enable(FALSE);
+    wxLayoutConstraints *c = new wxLayoutConstraints;
+
+/*
+    if (m_windowCloseButton)
+      c->top.Below           (m_windowCloseButton, 2);
+    else
+*/
+      c->top.SameAs          (panel, wxTop, 2);
+
+    c->right.SameAs          (panel, wxRight, 2);
+    c->width.AsIs();
+    c->height.AsIs();
+    m_editButton->SetConstraints(c);
+  }
+
+  m_valueText = new wxPropertyTextEdit(this, panel, wxID_PROP_TEXT, "", wxPoint(-1, -1), wxSize(-1, -1), wxPROCESS_ENTER);
+  m_valueText->Enable(FALSE);
+  
+  wxLayoutConstraints *c = new wxLayoutConstraints;
+
+  if (m_cancelButton)
+    c->left.RightOf        (m_confirmButton, 2);
+  else
+    c->left.SameAs         (panel, wxLeft, 2);
+/*
+  if (m_windowCloseButton)
+    c->top.Below           (m_windowCloseButton, 2);
+  else
+*/
+    c->top.SameAs          (panel, wxTop, 2);
+
+  if (m_editButton)
+    c->right.LeftOf        (m_editButton, 2);
+  else
+    c->right.SameAs        (panel, wxRight, 2);
+  c->height.AsIs();
+
+  m_valueText->SetConstraints(c);
+
+  m_valueList = new wxListBox(panel, wxID_PROP_VALUE_SELECT, wxPoint(-1, -1), wxSize(-1, 60));
+  m_valueList->Show(FALSE);
+
+  c = new wxLayoutConstraints;
+
+  c->left.SameAs         (panel, wxLeft, 2);
+  c->top.Below           (m_valueText, 2);
+  c->right.SameAs        (panel, wxRight, 2);
+  c->height.Absolute(60);
+
+  m_valueList->SetConstraints(c);
+
+  m_propertyScrollingList = new wxListBox(panel, wxID_PROP_SELECT,
+    wxPoint(-1, -1), wxSize(300, 300));
+  m_propertyScrollingList->SetFont(* boringFont);
+
+  c = new wxLayoutConstraints;
+
+  c->left.SameAs         (panel, wxLeft, 2);
+
+  if (m_buttonFlags & wxPROP_DYNAMIC_VALUE_FIELD)
+    c->top.Below         (m_valueText, 2);
+  else
+    c->top.Below         (m_valueList, 2);
+
+  c->right.SameAs        (panel, wxRight, 2);
+
+  if (m_windowCloseButton)
+    c->bottom.Above       (m_windowCloseButton, -2);
+  else
+    c->bottom.SameAs       (panel, wxBottom, 2);
+
+  m_propertyScrollingList->SetConstraints(c);
+
+  // Note: if this is called now, it causes a GPF.
+  // Why?
+//  panel->Layout();
+
+  return TRUE;
+}
+
+void wxPropertyListView::ShowTextControl(bool show)
+{
+  if (m_valueText)
+    m_valueText->Show(show);
+}
+
+void wxPropertyListView::ShowListBoxControl(bool show)
+{
+  if (m_valueList)
+  {
+    m_valueList->Show(show);
+    if (m_buttonFlags & wxPROP_DYNAMIC_VALUE_FIELD)
+    {
+      wxLayoutConstraints *constraints = m_propertyScrollingList->GetConstraints();
+      if (constraints)
+      {
+        if (show)
+        {
+          constraints->top.Below(m_valueList, 2);
+          // Maintain back-pointer so when valueList is deleted,
+          // any reference to it from this window is removed.
+          m_valueList->AddConstraintReference(m_propertyScrollingList);
+        }
+        else
+        {
+          constraints->top.Below(m_valueText, 2);
+          m_valueText->AddConstraintReference(m_propertyScrollingList);
+        }
+        m_propertyWindow->Layout();
+      }
+    }
+  }
+}
+
+void wxPropertyListView::EnableCheck(bool show)
+{
+  if (m_confirmButton)
+    m_confirmButton->Enable(show);
+}
+
+void wxPropertyListView::EnableCross(bool show)
+{
+  if (m_cancelButton)
+    m_cancelButton->Enable(show);
+}
+
+bool wxPropertyListView::OnClose(void)
+{
+  // Retrieve the value if any
+  wxCommandEvent event;
+  OnCheck(event);
+  
+  delete this;
+  return TRUE;
+}
+
+void wxPropertyListView::OnValueListSelect(wxCommandEvent& WXUNUSED(event))
+{
+  if (m_currentProperty && m_currentValidator)
+  {
+    if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+      return;
+
+    wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+    listValidator->OnValueListSelect(m_currentProperty, this, m_propertyWindow);
+  }
+}
+
+void wxPropertyListView::OnOk(wxCommandEvent& event)
+{
+  // Retrieve the value if any
+  OnCheck(event);
+  
+  m_managedWindow->Close(TRUE);
+}
+
+void wxPropertyListView::OnCancel(wxCommandEvent& WXUNUSED(event))
+{
+//  SetReturnCode(wxID_CANCEL);
+  m_managedWindow->Close(TRUE);
+  sm_dialogCancelled = TRUE;
+}
+
+void wxPropertyListView::OnHelp(wxCommandEvent& WXUNUSED(event))
+{
+}
+
+void wxPropertyListView::OnCheck(wxCommandEvent& WXUNUSED(event))
+{
+  if (m_currentProperty)
+  {
+    RetrieveProperty(m_currentProperty);
+  }
+}
+
+void wxPropertyListView::OnCross(wxCommandEvent& WXUNUSED(event))
+{
+  if (m_currentProperty && m_currentValidator)
+  {
+    if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+      return;
+
+    wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+    // Revert to old value
+    listValidator->OnDisplayValue(m_currentProperty, this, m_propertyWindow);
+  }
+}
+
+void wxPropertyListView::OnPropertyDoubleClick(wxCommandEvent& WXUNUSED(event))
+{
+  if (m_currentProperty && m_currentValidator)
+  {
+    if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+      return;
+
+    wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+    // Revert to old value
+    listValidator->OnDoubleClick(m_currentProperty, this, m_propertyWindow);
+  }
+}
+
+void wxPropertyListView::OnEdit(wxCommandEvent& WXUNUSED(event))
+{
+  if (m_currentProperty && m_currentValidator)
+  {
+    if (!m_currentValidator->IsKindOf(CLASSINFO(wxPropertyListValidator)))
+      return;
+
+    wxPropertyListValidator *listValidator = (wxPropertyListValidator *)m_currentValidator;
+
+    listValidator->OnEdit(m_currentProperty, this, m_propertyWindow);
+  }
+}
+
+void wxPropertyListView::OnText(wxCommandEvent& event)
+{
+  if (event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER)
+  {
+    OnCheck(event);
+  }
+}
+
+/*
+ * Property dialog box
+ */
+IMPLEMENT_CLASS(wxPropertyListDialog, wxDialog)
+
+BEGIN_EVENT_TABLE(wxPropertyListDialog, wxDialog)
+    EVT_BUTTON(wxID_CANCEL,                            wxPropertyListDialog::OnCancel)
+END_EVENT_TABLE()
+
+wxPropertyListDialog::wxPropertyListDialog(wxPropertyListView *v, wxWindow *parent,
+       const wxString& title, const wxPoint& pos,
+    const wxSize& size, long style, const wxString& name):
+     wxDialog(parent, -1, title, pos, size, style, name)
+{
+  m_view = v;
+  m_view->AssociatePanel( ((wxPanel*)this) );
+  m_view->SetManagedWindow(this);
+  SetAutoLayout(TRUE);
+}
+
+bool wxPropertyListDialog::OnClose(void)
+{
+  if (m_view)
+  {
+       SetReturnCode(wxID_CANCEL);
+    m_view->OnClose();
+       m_view = NULL;
+       return TRUE;
+  }
+  else
+    return FALSE;
+}
+
+void wxPropertyListDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
+{
+       SetReturnCode(wxID_CANCEL);
+    this->Close();
+}
+
+void wxPropertyListDialog::OnDefaultAction(wxControl *item)
+{
+/*
+  if (item == m_view->GetPropertyScrollingList())
+    view->OnDoubleClick();
+*/
+}
+
+// Extend event processing to search the view's event table
+bool wxPropertyListDialog::ProcessEvent(wxEvent& event)
+{
+       if ( !m_view || ! m_view->ProcessEvent(event) )
+               return wxEvtHandler::ProcessEvent(event);
+       else
+               return TRUE;
+}
+
+/*
+ * Property panel
+ */
+IMPLEMENT_CLASS(wxPropertyListPanel, wxPanel)
+
+BEGIN_EVENT_TABLE(wxPropertyListPanel, wxPanel)
+    EVT_SIZE(wxPropertyListPanel::OnSize)
+END_EVENT_TABLE()
+
+wxPropertyListPanel::~wxPropertyListPanel()
+{
+}
+
+void wxPropertyListPanel::OnDefaultAction(wxControl *item)
+{
+/*
+  if (item == view->GetPropertyScrollingList())
+    view->OnDoubleClick();
+*/
+}
+
+// Extend event processing to search the view's event table
+bool wxPropertyListPanel::ProcessEvent(wxEvent& event)
+{
+       if ( !m_view || ! m_view->ProcessEvent(event) )
+               return wxEvtHandler::ProcessEvent(event);
+       else
+               return TRUE;
+}
+
+void wxPropertyListPanel::OnSize(wxSizeEvent& WXUNUSED(event))
+{
+    Layout();
+}
+
+/*
+ * Property frame
+ */
+IMPLEMENT_CLASS(wxPropertyListFrame, wxFrame)
+
+bool wxPropertyListFrame::OnClose(void)
+{
+  if (m_view)
+  {
+    if (m_propertyPanel)
+        m_propertyPanel->SetView(NULL);
+    m_view->OnClose();
+    m_view = NULL;
+    return TRUE;
+  }
+  else
+    return FALSE;
+}
+
+wxPropertyListPanel *wxPropertyListFrame::OnCreatePanel(wxFrame *parent, wxPropertyListView *v)
+{
+  return new wxPropertyListPanel(v, parent);
+}
+
+bool wxPropertyListFrame::Initialize(void)
+{
+  m_propertyPanel = OnCreatePanel(this, m_view);
+  if (m_propertyPanel)
+  {
+    m_view->AssociatePanel(m_propertyPanel);
+    m_view->SetManagedWindow(this);
+    m_propertyPanel->SetAutoLayout(TRUE);
+    return TRUE;
+  }
+  else
+    return FALSE;
+}
+
+ /*
+  * Property list specific validator
+  */
+  
+IMPLEMENT_ABSTRACT_CLASS(wxPropertyListValidator, wxPropertyValidator)
+
+bool wxPropertyListValidator::OnSelect(bool select, wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+//  view->GetValueText()->Show(TRUE);
+  if (select)
+    OnDisplayValue(property, view, parentWindow);
+
+  return TRUE;
+}
+
+bool wxPropertyListValidator::OnValueListSelect(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  wxString s(view->GetValueList()->GetStringSelection());
+  if (s != "")
+  {
+    view->GetValueText()->SetValue(s);
+    view->RetrieveProperty(property);
+  }
+  return TRUE;
+}
+
+bool wxPropertyListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+//  view->GetValueText()->Show(TRUE);
+  wxString str(property->GetValue().GetStringRepresentation());
+
+  view->GetValueText()->SetValue(str);
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxPropertyListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  return FALSE;
+}
+
+void wxPropertyListValidator::OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetDetailedEditing())
+    view->EndDetailedEditing();
+  else
+    view->BeginDetailedEditing();
+}
+
+bool wxPropertyListValidator::OnClearControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetConfirmButton())
+    view->GetConfirmButton()->Enable(FALSE);
+  if (view->GetCancelButton())
+    view->GetCancelButton()->Enable(FALSE);
+  if (view->GetEditButton())
+    view->GetEditButton()->Enable(FALSE);
+  return TRUE;
+}
+
+/*
+ * Default validators
+ */
+
+IMPLEMENT_DYNAMIC_CLASS(wxRealListValidator, wxPropertyListValidator)
+
+///
+/// Real number validator
+/// 
+bool wxRealListValidator::OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (m_realMin == 0.0 && m_realMax == 0.0)
+    return TRUE;
+    
+  if (!view->GetValueText())
+    return FALSE;
+  wxString value(view->GetValueText()->GetValue());
+
+  float val = 0.0;
+  if (!StringToFloat(WXSTRINGCAST value, &val))
+  {
+    char buf[200];
+    sprintf(buf, "Value %s is not a valid real number!", value.GetData());
+    wxMessageBox(buf, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  
+  if (val < m_realMin || val > m_realMax)
+  {
+    char buf[200];
+    sprintf(buf, "Value must be a real number between %.2f and %.2f!", m_realMin, m_realMax);
+    wxMessageBox(buf, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxRealListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+
+  if (strlen(view->GetValueText()->GetValue()) == 0)
+    return FALSE;
+    
+  wxString value(view->GetValueText()->GetValue());
+  float f = (float)atof(value.GetData());
+  property->GetValue() = f;
+  return TRUE;
+}
+
+bool wxRealListValidator::OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetConfirmButton())
+    view->GetConfirmButton()->Enable(TRUE);
+  if (view->GetCancelButton())
+    view->GetCancelButton()->Enable(TRUE);
+  if (view->GetEditButton())
+    view->GetEditButton()->Enable(FALSE);
+  if (view->GetValueText())
+    view->GetValueText()->Enable(TRUE);
+  return TRUE;
+}
+
+///
+/// Integer validator
+/// 
+IMPLEMENT_DYNAMIC_CLASS(wxIntegerListValidator, wxPropertyListValidator)
+
+bool wxIntegerListValidator::OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (m_integerMin == 0 && m_integerMax == 0)
+    return TRUE;
+    
+  if (!view->GetValueText())
+    return FALSE;
+  wxString value(view->GetValueText()->GetValue());
+
+  long val = 0;
+  if (!StringToLong(WXSTRINGCAST value, &val))
+  {
+    char buf[200];
+    sprintf(buf, "Value %s is not a valid integer!", value.GetData());
+    wxMessageBox(buf, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  if (val < m_integerMin || val > m_integerMax)
+  {
+    char buf[200];
+    sprintf(buf, "Value must be an integer between %ld and %ld!", m_integerMin, m_integerMax);
+    wxMessageBox(buf, "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxIntegerListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+
+  if (strlen(view->GetValueText()->GetValue()) == 0)
+    return FALSE;
+    
+  wxString value(view->GetValueText()->GetValue());
+  long val = (long)atoi(value.GetData());
+  property->GetValue() = (long)val;
+  return TRUE;
+}
+
+bool wxIntegerListValidator::OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetConfirmButton())
+    view->GetConfirmButton()->Enable(TRUE);
+  if (view->GetCancelButton())
+    view->GetCancelButton()->Enable(TRUE);
+  if (view->GetEditButton())
+    view->GetEditButton()->Enable(FALSE);
+  if (view->GetValueText())
+    view->GetValueText()->Enable(TRUE);
+  return TRUE;
+}
+
+///
+/// boolean validator
+///
+IMPLEMENT_DYNAMIC_CLASS(wxBoolListValidator, wxPropertyListValidator)
+
+bool wxBoolListValidator::OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString value(view->GetValueText()->GetValue());
+  if (value != "True" && value != "False")
+  {
+    wxMessageBox("Value must be True or False!", "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxBoolListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+
+  if (strlen(view->GetValueText()->GetValue()) == 0)
+    return FALSE;
+    
+  wxString value(view->GetValueText()->GetValue());
+  bool boolValue = FALSE;
+  if (value == "True")
+    boolValue = TRUE;
+  else
+    boolValue = FALSE;
+  property->GetValue() = (bool)boolValue;
+  return TRUE;
+}
+
+bool wxBoolListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString str(property->GetValue().GetStringRepresentation());
+
+  view->GetValueText()->SetValue(str);
+
+  if (view->GetValueList()->IsShown())
+  {
+    view->GetValueList()->SetStringSelection(str);
+  }
+  return TRUE;
+}
+
+bool wxBoolListValidator::OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetConfirmButton())
+    view->GetConfirmButton()->Enable(FALSE);
+  if (view->GetCancelButton())
+    view->GetCancelButton()->Enable(FALSE);
+  if (view->GetEditButton())
+    view->GetEditButton()->Enable(TRUE);
+  if (view->GetValueText())
+    view->GetValueText()->Enable(FALSE);
+  return TRUE;
+}
+
+bool wxBoolListValidator::OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetValueList())
+  {
+    view->ShowListBoxControl(TRUE);
+    view->GetValueList()->Enable(TRUE);
+    
+    view->GetValueList()->Append("True");
+    view->GetValueList()->Append("False");
+    char *currentString = copystring(view->GetValueText()->GetValue());
+    view->GetValueList()->SetStringSelection(currentString);
+    delete[] currentString;
+  }
+  return TRUE;
+}
+
+bool wxBoolListValidator::OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetValueList())
+  {
+    view->GetValueList()->Clear();
+    view->ShowListBoxControl(FALSE);
+    view->GetValueList()->Enable(FALSE);
+  }
+  return TRUE;
+}
+
+// Called when the property is double clicked. Extra functionality can be provided,
+// cycling through possible values.
+bool wxBoolListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  if (property->GetValue().BoolValue())
+    property->GetValue() = (bool)FALSE;
+  else
+    property->GetValue() = (bool)TRUE;
+  view->DisplayProperty(property);
+  view->UpdatePropertyDisplayInList(property);
+  view->OnPropertyChanged(property);
+  return TRUE;
+}
+
+///
+/// String validator
+/// 
+IMPLEMENT_DYNAMIC_CLASS(wxStringListValidator, wxPropertyListValidator)
+
+wxStringListValidator::wxStringListValidator(wxStringList *list, long flags):
+  wxPropertyListValidator(flags)
+{
+  m_strings = list;
+  // If no constraint, we just allow the string to be edited.
+  if (!m_strings && ((m_validatorFlags & wxPROP_ALLOW_TEXT_EDITING) == 0))
+    m_validatorFlags |= wxPROP_ALLOW_TEXT_EDITING;
+}
+
+bool wxStringListValidator::OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!m_strings)
+    return TRUE;
+
+  if (!view->GetValueText())
+    return FALSE;
+  wxString value(view->GetValueText()->GetValue());
+
+  if (!m_strings->Member(value.GetData()))
+  {
+    wxString s("Value ");
+    s += value.GetData();
+    s += " is not valid.";
+    wxMessageBox(s.GetData(), "Property value error", wxOK | wxICON_EXCLAMATION, parentWindow);
+    return FALSE;
+  }
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxStringListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString value(view->GetValueText()->GetValue());
+  property->GetValue() = value ;
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxStringListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString str(property->GetValue().GetStringRepresentation());
+  view->GetValueText()->SetValue(str);
+  if (m_strings && view->GetValueList() && view->GetValueList()->IsShown() && view->GetValueList()->Number() > 0)
+  {
+    view->GetValueList()->SetStringSelection(str);
+  }
+  return TRUE;
+}
+
+bool wxStringListValidator::OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  // Unconstrained
+  if (!m_strings)
+  {
+    if (view->GetEditButton())
+      view->GetEditButton()->Enable(FALSE);
+    if (view->GetConfirmButton())
+      view->GetConfirmButton()->Enable(TRUE);
+    if (view->GetCancelButton())
+      view->GetCancelButton()->Enable(TRUE);
+    if (view->GetValueText())
+      view->GetValueText()->Enable(TRUE);
+    return TRUE;
+  }
+  
+  // Constrained
+  if (view->GetValueText())
+    view->GetValueText()->Enable(FALSE);
+
+  if (view->GetEditButton())
+    view->GetEditButton()->Enable(TRUE);
+
+  if (view->GetConfirmButton())
+    view->GetConfirmButton()->Enable(FALSE);
+  if (view->GetCancelButton())
+    view->GetCancelButton()->Enable(FALSE);
+  return TRUE;
+}
+
+bool wxStringListValidator::OnPrepareDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetValueList())
+  {
+    view->ShowListBoxControl(TRUE);
+    view->GetValueList()->Enable(TRUE);
+    wxNode *node = m_strings->First();
+    while (node)
+    {
+      char *s = (char *)node->Data();
+      view->GetValueList()->Append(s);
+      node = node->Next();
+    }
+    char *currentString = property->GetValue().StringValue();
+    view->GetValueList()->SetStringSelection(currentString);
+  }
+  return TRUE;
+}
+
+bool wxStringListValidator::OnClearDetailControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!m_strings)
+  {
+    return TRUE;
+  }
+
+  if (view->GetValueList())
+  {
+    view->GetValueList()->Clear();
+    view->ShowListBoxControl(FALSE);
+    view->GetValueList()->Enable(FALSE);
+  }
+  return TRUE;
+}
+
+// Called when the property is double clicked. Extra functionality can be provided,
+// cycling through possible values.
+bool wxStringListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  if (!m_strings)
+    return FALSE;
+
+  wxNode *node = m_strings->First();
+  char *currentString = property->GetValue().StringValue();
+  while (node)
+  {
+    char *s = (char *)node->Data();
+    if (strcmp(s, currentString) == 0)
+    {
+      char *nextString = NULL;
+      if (node->Next())
+        nextString = (char *)node->Next()->Data();
+      else
+        nextString = (char *)m_strings->First()->Data();
+      property->GetValue() = wxString(nextString);
+      view->DisplayProperty(property);
+      view->UpdatePropertyDisplayInList(property);
+      view->OnPropertyChanged(property);
+      return TRUE;
+    }
+    else node = node->Next();
+  }
+  return TRUE;
+}
+
+///
+/// Filename validator
+/// 
+IMPLEMENT_DYNAMIC_CLASS(wxFilenameListValidator, wxPropertyListValidator)
+
+wxFilenameListValidator::wxFilenameListValidator(wxString message , wxString wildcard, long flags):
+  wxPropertyListValidator(flags), m_filenameWildCard(wildcard), m_filenameMessage(message)
+{
+}
+
+wxFilenameListValidator::~wxFilenameListValidator(void)
+{
+}
+
+bool wxFilenameListValidator::OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxFilenameListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString value(view->GetValueText()->GetValue());
+  property->GetValue() = value ;
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxFilenameListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString str(property->GetValue().GetStringRepresentation());
+  view->GetValueText()->SetValue(str);
+  return TRUE;
+}
+
+// Called when the property is double clicked. Extra functionality can be provided,
+// cycling through possible values.
+bool wxFilenameListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  OnEdit(property, view, parentWindow);
+  return TRUE;
+}
+
+bool wxFilenameListValidator::OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetConfirmButton())
+    view->GetConfirmButton()->Enable(TRUE);
+  if (view->GetCancelButton())
+    view->GetCancelButton()->Enable(TRUE);
+  if (view->GetEditButton())
+    view->GetEditButton()->Enable(TRUE);
+  if (view->GetValueText())
+    view->GetValueText()->Enable((GetFlags() & wxPROP_ALLOW_TEXT_EDITING) == wxPROP_ALLOW_TEXT_EDITING);
+  return TRUE;
+}
+
+void wxFilenameListValidator::OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return;
+
+  char *s = wxFileSelector(
+     m_filenameMessage.GetData(),
+     wxPathOnly(property->GetValue().StringValue()),
+     wxFileNameFromPath(property->GetValue().StringValue()),
+     NULL,
+     m_filenameWildCard.GetData(),
+     0,
+     parentWindow);
+  if (s)
+  {
+    property->GetValue() = wxString(s);
+    view->DisplayProperty(property);
+    view->UpdatePropertyDisplayInList(property);
+    view->OnPropertyChanged(property);
+  }
+}
+
+///
+/// Colour validator
+/// 
+IMPLEMENT_DYNAMIC_CLASS(wxColourListValidator, wxPropertyListValidator)
+
+wxColourListValidator::wxColourListValidator(long flags):
+  wxPropertyListValidator(flags)
+{
+}
+
+wxColourListValidator::~wxColourListValidator(void)
+{
+}
+
+bool wxColourListValidator::OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxColourListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString value(view->GetValueText()->GetValue());
+  
+  property->GetValue() = value ;
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself
+bool wxColourListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString str(property->GetValue().GetStringRepresentation());
+  view->GetValueText()->SetValue(str);
+  return TRUE;
+}
+
+// Called when the property is double clicked. Extra functionality can be provided,
+// cycling through possible values.
+bool wxColourListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  OnEdit(property, view, parentWindow);
+  return TRUE;
+}
+
+bool wxColourListValidator::OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetConfirmButton())
+    view->GetConfirmButton()->Enable(TRUE);
+  if (view->GetCancelButton())
+    view->GetCancelButton()->Enable(TRUE);
+  if (view->GetEditButton())
+    view->GetEditButton()->Enable(TRUE);
+  if (view->GetValueText())
+    view->GetValueText()->Enable((GetFlags() & wxPROP_ALLOW_TEXT_EDITING) == wxPROP_ALLOW_TEXT_EDITING);
+  return TRUE;
+}
+
+void wxColourListValidator::OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return;
+    
+  char *s = property->GetValue().StringValue();
+  int r = 0;
+  int g = 0;
+  int b = 0;
+  if (s)
+  {
+    r = wxHexToDec(s);
+    g = wxHexToDec(s+2);
+    b = wxHexToDec(s+4);
+  }
+  
+  wxColour col(r,g,b);
+  
+  wxColourData data;
+  data.SetChooseFull(TRUE);
+  data.SetColour(col);
+  
+  for (int i = 0; i < 16; i++)
+  {
+    wxColour colour(i*16, i*16, i*16);
+    data.SetCustomColour(i, colour);
+  }
+      
+  wxColourDialog dialog(parentWindow, &data);
+  if (dialog.ShowModal() != wxID_CANCEL)
+  {
+    wxColourData retData = dialog.GetColourData();
+    col = retData.GetColour();
+    
+    char buf[7];
+    wxDecToHex(col.Red(), buf);
+    wxDecToHex(col.Green(), buf+2);
+    wxDecToHex(col.Blue(), buf+4);
+
+    property->GetValue() = wxString(buf);
+    view->DisplayProperty(property);
+    view->UpdatePropertyDisplayInList(property);
+    view->OnPropertyChanged(property);
+  }
+}
+
+///
+/// List of strings validator. For this we need more user interface than
+/// we get with a property list; so create a new dialog for editing the list.
+///
+IMPLEMENT_DYNAMIC_CLASS(wxListOfStringsListValidator, wxPropertyListValidator)
+
+wxListOfStringsListValidator::wxListOfStringsListValidator(long flags):
+  wxPropertyListValidator(flags)
+{
+}
+
+bool wxListOfStringsListValidator::OnCheckValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  // No constraints for an arbitrary, user-editable list of strings.
+  return TRUE;
+}
+
+// Called when TICK is pressed or focus is lost or view wants to update
+// the property list.
+// Does the transferance from the property editing area to the property itself.
+// In this case, the user cannot directly edit the string list.
+bool wxListOfStringsListValidator::OnRetrieveValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  return TRUE;
+}
+
+bool wxListOfStringsListValidator::OnDisplayValue(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (!view->GetValueText())
+    return FALSE;
+  wxString str(property->GetValue().GetStringRepresentation());
+  view->GetValueText()->SetValue(str);
+  return TRUE;
+}
+
+bool wxListOfStringsListValidator::OnPrepareControls(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  if (view->GetEditButton())
+    view->GetEditButton()->Enable(TRUE);
+  if (view->GetValueText())
+    view->GetValueText()->Enable(FALSE);
+
+  if (view->GetConfirmButton())
+    view->GetConfirmButton()->Enable(FALSE);
+  if (view->GetCancelButton())
+    view->GetCancelButton()->Enable(FALSE);
+  return TRUE;
+}
+
+// Called when the property is double clicked. Extra functionality can be provided,
+// cycling through possible values.
+bool wxListOfStringsListValidator::OnDoubleClick(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  OnEdit(property, view, parentWindow);
+  return TRUE;
+}
+
+void wxListOfStringsListValidator::OnEdit(wxProperty *property, wxPropertyListView *view, wxWindow *parentWindow)
+{
+  // Convert property value to a list of strings for editing
+  wxStringList *stringList = new wxStringList;
+  
+  wxPropertyValue *expr = property->GetValue().GetFirst();
+  while (expr)
+  {
+    char *s = expr->StringValue();
+    if (s)
+      stringList->Add(s);
+    expr = expr->GetNext();
+  }
+  
+  wxString title("Editing ");
+  title += property->GetName();
+  
+  if (EditStringList(parentWindow, stringList, title.GetData()))
+  {
+    wxPropertyValue& oldValue = property->GetValue();
+    oldValue.ClearList();
+    wxNode *node = stringList->First();
+    while (node)
+    {
+      char *s = (char *)node->Data();
+      oldValue.Append(new wxPropertyValue(s));
+      
+      node = node->Next();
+    }
+    
+    view->DisplayProperty(property);
+    view->UpdatePropertyDisplayInList(property);
+    view->OnPropertyChanged(property);
+  }
+  delete stringList;
+}
+
+class wxPropertyStringListEditorDialog: public wxDialog
+{
+  public:
+    wxPropertyStringListEditorDialog(wxWindow *parent, const wxString& title,
+               const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+       long windowStyle = wxDEFAULT_DIALOG_STYLE, const wxString& name = "stringEditorDialogBox"):
+                       wxDialog(parent, -1, title, pos, size, windowStyle, name)
+    {
+      m_stringList = NULL;
+      m_stringText = NULL;
+      m_listBox = NULL;
+      sm_dialogCancelled = FALSE;
+      m_currentSelection = -1;
+    }
+    ~wxPropertyStringListEditorDialog(void) {}
+    bool OnClose(void);
+    void SaveCurrentSelection(void);
+    void ShowCurrentSelection(void);
+
+       void OnOK(wxCommandEvent& event);
+       void OnCancel(wxCommandEvent& event);
+       void OnAdd(wxCommandEvent& event);
+       void OnDelete(wxCommandEvent& event);
+       void OnStrings(wxCommandEvent& event);
+       void OnText(wxCommandEvent& event);
+
+public:
+    wxStringList*       m_stringList;
+    wxListBox*          m_listBox;
+    wxTextCtrl*         m_stringText;
+    static bool         sm_dialogCancelled;
+    int                 m_currentSelection;
+DECLARE_EVENT_TABLE()
+};
+
+#define        wxID_PROP_SL_ADD                        3000
+#define        wxID_PROP_SL_DELETE                     3001
+#define        wxID_PROP_SL_STRINGS            3002
+#define        wxID_PROP_SL_TEXT                       3003
+
+BEGIN_EVENT_TABLE(wxPropertyStringListEditorDialog, wxDialog)
+       EVT_BUTTON(wxID_OK,                             wxPropertyStringListEditorDialog::OnOK)
+    EVT_BUTTON(wxID_CANCEL,                            wxPropertyStringListEditorDialog::OnCancel)
+    EVT_BUTTON(wxID_PROP_SL_ADD,               wxPropertyStringListEditorDialog::OnAdd)
+    EVT_BUTTON(wxID_PROP_SL_DELETE,            wxPropertyStringListEditorDialog::OnDelete)
+    EVT_LISTBOX(wxID_PROP_SL_STRINGS,  wxPropertyStringListEditorDialog::OnStrings)
+    EVT_TEXT_ENTER(wxID_PROP_SL_TEXT,                  wxPropertyStringListEditorDialog::OnText)
+END_EVENT_TABLE()
+
+class wxPropertyStringListEditorText: public wxTextCtrl
+{
+ public:
+  wxPropertyStringListEditorText(wxWindow *parent, wxWindowID id, const wxString& val,
+       const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+    long windowStyle = 0, const wxString& name = "text"):
+     wxTextCtrl(parent, id, val, pos, size, windowStyle, wxDefaultValidator, name)
+  {
+  }
+  void OnKillFocus(void)
+  {
+    wxPropertyStringListEditorDialog *dialog = (wxPropertyStringListEditorDialog *)GetParent();
+    dialog->SaveCurrentSelection();
+  }
+};
+
+bool wxPropertyStringListEditorDialog::sm_dialogCancelled = FALSE;
+
+// Edit the string list.
+bool wxListOfStringsListValidator::EditStringList(wxWindow *parent, wxStringList *stringList, const char *title)
+{
+  int largeButtonWidth = 60;
+  int largeButtonHeight = 25;
+
+  wxBeginBusyCursor();
+  wxPropertyStringListEditorDialog *dialog = new wxPropertyStringListEditorDialog(parent,
+       title, wxPoint(10, 10), wxSize(400, 400), wxDEFAULT_DIALOG_STYLE|wxDIALOG_MODAL);
+  
+  dialog->m_stringList = stringList;
+  
+  dialog->m_listBox = new wxListBox(dialog, wxID_PROP_SL_STRINGS,
+    wxPoint(-1, -1), wxSize(-1, -1), 0, NULL, wxLB_SINGLE);
+
+  dialog->m_stringText = new wxPropertyStringListEditorText(dialog,
+  wxID_PROP_SL_TEXT, "", wxPoint(5, 240),
+       wxSize(300, -1), wxPROCESS_ENTER);
+  dialog->m_stringText->Enable(FALSE);
+
+  wxButton *addButton = new wxButton(dialog, wxID_PROP_SL_ADD, "Add", wxPoint(-1, -1), wxSize(largeButtonWidth, largeButtonHeight));
+  wxButton *deleteButton = new wxButton(dialog, wxID_PROP_SL_DELETE, "Delete", wxPoint(-1, -1), wxSize(largeButtonWidth, largeButtonHeight));
+  wxButton *cancelButton = new wxButton(dialog, wxID_CANCEL, "Cancel", wxPoint(-1, -1), wxSize(largeButtonWidth, largeButtonHeight));
+  wxButton *okButton = new wxButton(dialog, wxID_OK, "OK", wxPoint(-1, -1), wxSize(largeButtonWidth, largeButtonHeight));
+
+  okButton->SetDefault();
+
+  wxLayoutConstraints *c = new wxLayoutConstraints;
+
+  c->top.SameAs     (dialog, wxTop, 2);
+  c->left.SameAs    (dialog, wxLeft, 2);
+  c->right.SameAs   (dialog, wxRight, 2);
+  c->bottom.SameAs  (dialog->m_stringText, wxTop, 2);
+  dialog->m_listBox->SetConstraints(c);
+
+  c = new wxLayoutConstraints;
+  c->left.SameAs    (dialog, wxLeft, 2);
+  c->right.SameAs   (dialog, wxRight, 2);
+  c->bottom.SameAs  (addButton, wxTop, 2);
+  c->height.AsIs();
+  dialog->m_stringText->SetConstraints(c);
+
+  c = new wxLayoutConstraints;
+  c->bottom.SameAs  (dialog, wxBottom, 2);
+  c->left.SameAs    (dialog, wxLeft, 2);
+  c->width.AsIs();
+  c->height.AsIs();
+  addButton->SetConstraints(c);
+
+  c = new wxLayoutConstraints;
+  c->bottom.SameAs  (dialog, wxBottom, 2);
+  c->left.SameAs    (addButton, wxRight, 2);
+  c->width.AsIs();
+  c->height.AsIs();
+  deleteButton->SetConstraints(c);
+
+  c = new wxLayoutConstraints;
+  c->bottom.SameAs  (dialog, wxBottom, 2);
+  c->right.SameAs   (dialog, wxRight, 2);
+  c->width.AsIs();
+  c->height.AsIs();
+  cancelButton->SetConstraints(c);
+
+  c = new wxLayoutConstraints;
+  c->bottom.SameAs  (dialog, wxBottom, 2);
+  c->right.SameAs   (cancelButton, wxLeft, 2);
+  c->width.AsIs();
+  c->height.AsIs();
+  okButton->SetConstraints(c);
+
+  wxNode *node = stringList->First();
+  while (node)
+  {
+    char *str = (char *)node->Data();
+    // Save node as client data for each listbox item
+    dialog->m_listBox->Append(str, (char *)node);
+    node = node->Next();
+  }
+
+  dialog->SetClientSize(310, 305);
+  dialog->Layout();
+
+  dialog->Centre(wxBOTH);
+  wxEndBusyCursor();
+  if (dialog->ShowModal() == wxID_CANCEL)
+       return FALSE;
+  else
+       return TRUE;
+}
+
+/*
+ * String list editor callbacks
+ *
+ */
+
+void wxPropertyStringListEditorDialog::OnStrings(wxCommandEvent& WXUNUSED(event))
+{
+  int sel = m_listBox->GetSelection();
+  if (sel > -1)
+  {
+    m_currentSelection = sel;
+
+    ShowCurrentSelection();
+  }
+}
+
+void wxPropertyStringListEditorDialog::OnDelete(wxCommandEvent& WXUNUSED(event))
+{
+  int sel = m_listBox->GetSelection();
+  if (sel == -1)
+    return;
+    
+  wxNode *node = (wxNode *)m_listBox->wxListBox::GetClientData(sel);
+  if (!node)
+    return;
+    
+  m_listBox->Delete(sel);
+  delete[] (char *)node->Data();
+  delete node;
+  m_currentSelection = -1;
+  m_stringText->SetValue("");
+}
+
+void wxPropertyStringListEditorDialog::OnAdd(wxCommandEvent& WXUNUSED(event))
+{
+  SaveCurrentSelection();
+  
+  char *initialText = "";
+  wxNode *node = m_stringList->Add(initialText);
+  m_listBox->Append(initialText, (char *)node);
+  m_currentSelection = m_stringList->Number() - 1;
+  m_listBox->SetSelection(m_currentSelection);
+  ShowCurrentSelection();
+  m_stringText->SetFocus();
+}
+
+void wxPropertyStringListEditorDialog::OnOK(wxCommandEvent& WXUNUSED(event))
+{
+  SaveCurrentSelection();
+  EndModal(wxID_OK);
+  Close(TRUE);
+}
+
+void wxPropertyStringListEditorDialog::OnCancel(wxCommandEvent& WXUNUSED(event))
+{
+  sm_dialogCancelled = TRUE;
+  EndModal(wxID_CANCEL);
+  Close(TRUE);
+}
+
+void wxPropertyStringListEditorDialog::OnText(wxCommandEvent& event)
+{
+  if (event.GetEventType() == wxEVENT_TYPE_TEXT_ENTER_COMMAND)
+  {
+    SaveCurrentSelection();
+  }
+}
+
+bool wxPropertyStringListEditorDialog::OnClose(void)
+{
+  SaveCurrentSelection();
+  return TRUE;
+}
+
+void wxPropertyStringListEditorDialog::SaveCurrentSelection(void)
+{
+  if (m_currentSelection == -1)
+    return;
+    
+  wxNode *node = (wxNode *)m_listBox->wxListBox::GetClientData(m_currentSelection);
+  if (!node)
+    return;
+    
+  wxString txt(m_stringText->GetValue());
+  if (node->Data())
+    delete[] (char *)node->Data();
+  node->SetData((wxObject *)copystring(txt));
+  
+  m_listBox->SetString(m_currentSelection, (char *)node->Data());
+}
+
+void wxPropertyStringListEditorDialog::ShowCurrentSelection(void)
+{
+  if (m_currentSelection == -1)
+  {
+    m_stringText->SetValue("");
+    return;
+  }
+  wxNode *node = (wxNode *)m_listBox->wxListBox::GetClientData(m_currentSelection);
+  char *txt = (char *)node->Data();
+  m_stringText->SetValue(txt);
+  m_stringText->Enable(TRUE);
+}
+
index 66a5ba2c46d54d753d8112a2aa14407742b33e60..ebd144b0cbdfdd34019c6725826c542b413621d2 100644 (file)
Binary files a/src/make_cw.mcp and b/src/make_cw.mcp differ
index 157807bf67f1a14ff2acc5546d718906e10d34de..fd2d922b979038e6da4c0a808cfdc461400ed701 100644 (file)
@@ -146,6 +146,9 @@ LIB_CPP_SRC=\
  ../generic/panelg.cpp \
  ../generic/printps.cpp \
  ../generic/prntdlgg.cpp \
+ ../generic/prop.cpp \
+ ../generic/propform.cpp \
+ ../generic/proplist.cpp \
  ../generic/sashwin.cpp \
  ../generic/scrolwin.cpp \
  ../generic/splitter.cpp \
index 341ce0bf04b9ac20ba8158c7a5eeaeea2fb2ea86..eee75f5b2b4fc326292f82d44366feb96d6a7f36 100644 (file)
@@ -76,6 +76,9 @@ GENERICOBJS= \
   $(MSWDIR)\imaglist.obj \
   $(MSWDIR)\laywin.obj \
   $(MSWDIR)\panelg.obj \
+  $(MSWDIR)\prop.obj \
+  $(MSWDIR)\proplist.obj \
+  $(MSWDIR)\propform.obj \
   $(MSWDIR)\sashwin.obj \
   $(MSWDIR)\scrolwin.obj \
   $(MSWDIR)\splitter.obj \
@@ -606,6 +609,12 @@ $(MSWDIR)\msgdlgg.obj:     $(GENDIR)\msgdlgg.$(SRCSUFF)
 
 $(MSWDIR)\panelg.obj:     $(GENDIR)\panelg.$(SRCSUFF)
 
+$(MSWDIR)\prop.obj:     $(GENDIR)\prop.$(SRCSUFF)
+
+$(MSWDIR)\proplist.obj:     $(GENDIR)\proplist.$(SRCSUFF)
+
+$(MSWDIR)\propform.obj:     $(GENDIR)\propform.$(SRCSUFF)
+
 $(MSWDIR)\printps.obj:     $(GENDIR)\printps.$(SRCSUFF)
 
 $(MSWDIR)\prntdlgg.obj:     $(GENDIR)\prntdlgg.$(SRCSUFF)
index 3ff144b4b040f4e5fcb2d3999a6a81f30345f17f..61bf1771d06eb3f87f56974c09a93ab10d0f199e 100644 (file)
@@ -80,6 +80,9 @@ GENERICOBJS= \
   $(MSWDIR)\msgdlgg.obj \
   $(MSWDIR)\notebook.obj \
   $(MSWDIR)\panelg.obj \
+  $(MSWDIR)\prop.obj \
+  $(MSWDIR)\propform.obj \
+  $(MSWDIR)\proplist.obj \
   $(MSWDIR)\sashwin.obj \
   $(MSWDIR)\scrolwin.obj \
   $(MSWDIR)\splitter.obj \
@@ -592,6 +595,12 @@ $(MSWDIR)\printps.obj:     $(GENDIR)\printps.$(SRCSUFF)
 
 $(MSWDIR)\prntdlgg.obj:     $(GENDIR)\prntdlgg.$(SRCSUFF)
 
+$(MSWDIR)\prop.obj:     $(GENDIR)\prop.$(SRCSUFF)
+
+$(MSWDIR)\proplist.obj:     $(GENDIR)\proplist.$(SRCSUFF)
+
+$(MSWDIR)\propform.obj:     $(GENDIR)\propform.$(SRCSUFF)
+
 $(MSWDIR)\sashwin.obj:     $(GENDIR)\sashwin.$(SRCSUFF)
 
 $(MSWDIR)\scrolwin.obj:     $(GENDIR)\scrolwin.$(SRCSUFF)
index 0314a8a54da661460ec694a7f3a858cafd4d537a..07528f8dad27bd3cff653dc80b2ae24482fe40be 100644 (file)
@@ -58,6 +58,9 @@ GENERICOBJS= \
   $(GENDIR)\listctrl.obj \
   $(GENDIR)\notebook.obj \
   $(GENDIR)\panelg.obj \
+  $(GENDIR)\prop.obj \
+  $(GENDIR)\propform.obj \
+  $(GENDIR)\proplist.obj \
   $(GENDIR)\scrolwin.obj \
   $(GENDIR)\splitter.obj \
   $(GENDIR)\statusbr.obj \
@@ -990,6 +993,21 @@ $(GENDIR)/prntdlgg.obj:     $*.$(SRCSUFF)
 $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
 <<
 
+$(GENDIR)/prop.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
+<<
+
+$(GENDIR)/propform.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
+<<
+
+$(GENDIR)/proplist.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
+<<
+
 $(GENDIR)/scrolwin.obj:     $*.$(SRCSUFF)
         cl @<<
 $(CPPFLAGS) /Fo$@ /c /Tp $*.$(SRCSUFF)
index 5c61e0ad84958f41dca7370f06850d14912e533f..2550f3d3d57a5f183f2798717618f02ac8cc2ea8 100644 (file)
@@ -66,6 +66,9 @@ GENERICOBJS= \
   $(GENDIR)/laywin.$(OBJSUFF) \
   $(GENDIR)/msgdlgg.$(OBJSUFF) \
   $(GENDIR)/panelg.$(OBJSUFF) \
+  $(GENDIR)/prop.$(OBJSUFF) \
+  $(GENDIR)/propform.$(OBJSUFF) \
+  $(GENDIR)/proplist.$(OBJSUFF) \
   $(GENDIR)/sashwin.$(OBJSUFF) \
   $(GENDIR)/scrolwin.$(OBJSUFF) \
   $(GENDIR)/splitter.$(OBJSUFF) \
index 54908e24d3d2e5c31970c7fcccba2e5f2a3ec1c0..0926a42e63b5827ebea9619bb7363ee3b4781fc4 100644 (file)
@@ -53,6 +53,9 @@ GENERICOBJS= \
   $(GENDIR)\gridg.obj \
   $(GENDIR)\laywin.obj \
   $(GENDIR)\panelg.obj \
+  $(GENDIR)\prop.obj \
+  $(GENDIR)\propform.obj \
+  $(GENDIR)\proplist.obj \
   $(GENDIR)\sashwin.obj \
   $(GENDIR)\scrolwin.obj \
   $(GENDIR)\splitter.obj \
@@ -1115,6 +1118,21 @@ $(GENDIR)/panelg.obj:     $*.$(SRCSUFF)
 $(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
 <<
 
+$(GENDIR)/prop.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
+$(GENDIR)/propform.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
+$(GENDIR)/proplist.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
 $(GENDIR)/printps.obj:     $*.$(SRCSUFF)
         cl @<<
 $(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
@@ -1380,18 +1398,23 @@ docs:   allhlp allhtml allpdfrtf
 alldocs: docs
 hlp:    wxhlp portinghlp # faqhlp
 wxhlp:  $(DOCDIR)/winhelp/wx.hlp
+wxprophlp: $(DOCDIR)/winhelp/wxprop.hlp
 faqhlp: $(DOCDIR)/winhelp/faq.hlp
 refhlp: $(DOCDIR)/winhelp/techref.hlp
 rtf:    $(DOCDIR)/winhelp/wx.rtf
 faqrtf: $(DOCDIR)/winhelp/faq.rtf
+wxproprtf: $(DOCDIR)/winhelp/wxprop.rtf
 pdfrtf:    $(DOCDIR)/pdf/wx.rtf
 faqpdfrtf: $(DOCDIR)/pdf/faq.rtf
+wxproppdfrtf: $(DOCDIR)/pdf/wxprop.rtf
 refpdfrtf: $(DOCDIR)/pdf/techref.rtf
 html:  wxhtml # faqhtml
 wxhtml:        $(DOCDIR)\html\wx\wx.htm
 faqhtml: $(DOCDIR)\html\faq\faq.htm
+wxprophtml: $(DOCDIR)\html\proplist\prop.htm
 ps:     wxps referencps # faqps
 wxps:  $(WXDIR)\docs\ps\wx.ps
+wxpropps:      $(WXDIR)\docs\ps\wxprop.ps
 faqps: $(WXDIR)\docs\ps\faq.ps
 referencps:    $(WXDIR)\docs\ps\referenc.ps
 
@@ -1401,9 +1424,7 @@ portinghlp: $(DOCDIR)/winhelp/porting.hlp
 portingpdfrtf: $(DOCDIR)/pdf/porting.rtf
 portingps:     $(WXDIR)\docs\ps\porting.ps
 
-allhlp: wxhlp portinghlp # faqhlp
-        cd $(WXDIR)\utils\wxprop\src
-        nmake -f makefile.nt hlp
+allhlp: wxhlp portinghlp wxprop # faqhlp
         cd $(WXDIR)\utils\dialoged\src
         nmake -f makefile.nt hlp
         cd $(THISDIR)
@@ -1434,9 +1455,7 @@ allhlp: wxhlp portinghlp # faqhlp
 #        cd $(WXDIR)\utils\clips2c\src
 #        nmake -f makefile.nt hlp
 
-allhtml: wxhtml portinghtml # faqhtml
-        cd $(WXDIR)\utils\wxprop\src
-        nmake -f makefile.nt html
+allhtml: wxhtml portinghtml wxprophtml # faqhtml
         cd $(WXDIR)\utils\dialoged\src
         nmake -f makefile.nt html
         cd $(THISDIR)
@@ -1468,16 +1487,12 @@ allhtml: wxhtml portinghtml # faqhtml
 #        cd $(WXDIR)\utils\clips2c\src
 #        nmake -f makefile.nt html
 
-allps: wxps referencps portingps # faqps
-        cd $(WXDIR)\utils\wxprop\src
-        nmake -f makefile.nt ps
+allps: wxps referencps portingps wxpropps # faqps
         cd $(WXDIR)\utils\dialoged\src
         nmake -f makefile.nt ps
         cd $(THISDIR)
 
-allpdfrtf: pdfrtf portingpdfrtf # faqpdfrtf
-        cd $(WXDIR)\utils\wxprop\src
-        nmake -f makefile.nt pdfrtf
+allpdfrtf: pdfrtf portingpdfrtf wxproppdfrtf # faqpdfrtf
         cd $(WXDIR)\utils\dialoged\src
         nmake -f makefile.nt pdfrtf
         cd $(THISDIR)
@@ -1529,6 +1544,14 @@ $(DOCDIR)/winhelp/faq.hlp:         $(DOCDIR)/latex/faq/faq.rtf $(DOCDIR)/latex/f
         move faq.cnt $(DOCDIR)\winhelp\faq.cnt
         cd $(THISDIR)
 
+$(DOCDIR)/winhelp/wxprop.hlp:         $(DOCDIR)/latex/proplist/wxprop.rtf $(DOCDIR)/latex/proplist/wxprop.hpj
+        cd $(DOCDIR)/latex/proplist
+        -erase wxprop.ph
+        hc wxprop
+        move wxprop.hlp $(DOCDIR)\winhelp\wxprop.hlp
+        move wxprop.cnt $(DOCDIR)\winhelp\wxprop.cnt
+        cd $(THISDIR)
+
 $(DOCDIR)/winhelp/techref.hlp:         $(DOCDIR)/latex/techref/techref.rtf $(DOCDIR)/latex/techref/techref.hpj
         cd $(DOCDIR)/latex/techref
         -erase techref.ph
@@ -1552,6 +1575,11 @@ $(DOCDIR)/latex/faq/faq.rtf:         $(DOCDIR)/latex/faq/faq.tex
         -start /w tex2rtf $(DOCDIR)/latex/faq/faq.tex $(DOCDIR)/latex/faq/faq.rtf -twice -winhelp
         cd $(THISDIR)
 
+$(DOCDIR)/latex/proplist/wxprop.rtf:         $(DOCDIR)/latex/proplist/prop.tex $(DOCDIR)/latex/proplist/body.tex $(DOCDIR)/latex/proplist/classes.tex $(DOCDIR)/latex/proplist/changes.tex
+        cd $(DOCDIR)\latex\proplist
+        -start /w tex2rtf $(DOCDIR)/latex/proplist/prop.tex $(DOCDIR)/latex/proplist/wxprop.rtf -twice -winhelp
+        cd $(THISDIR)
+
 $(DOCDIR)/latex/techref/techref.rtf:         $(DOCDIR)/latex/techref/techref.tex
         cd $(DOCDIR)\latex\techref
         -start /w tex2rtf $(DOCDIR)/latex/techref/techref.tex $(DOCDIR)/latex/techref/techref.rtf -twice -winhelp
@@ -1575,6 +1603,12 @@ $(DOCDIR)/pdf/faq.rtf:         $(DOCDIR)/latex/faq/faq.tex
         -start /w tex2rtf $(DOCDIR)/latex/faq/faq.tex $(DOCDIR)/pdf/faq.rtf -twice -rtf
         cd $(THISDIR)
 
+$(DOCDIR)/pdf/wxprop.rtf:         $(DOCDIR)/latex/proplist/proplist.tex $(DOCDIR)/latex/proplist/body.tex $(DOCDIR)/latex/proplist/classes.tex $(DOCDIR)/latex/proplist/changes.tex
+        cd $(DOCDIR)\latex\proplist
+        -copy *.bmp *.wmf $(DOCDIR)\pdf
+        -start /w tex2rtf $(DOCDIR)/latex/proplist/wxprop.tex $(DOCDIR)/pdf/wxprop.rtf -twice -rtf
+        cd $(THISDIR)
+
 $(DOCDIR)/pdf/techref.rtf:         $(DOCDIR)/latex/techref/techref.tex
         cd $(DOCDIR)\latex\techref
         -copy *.bmp *.wmf $(DOCDIR)\pdf
@@ -1608,7 +1642,17 @@ $(DOCDIR)\html\faq\faq.htm:         $(DOCDIR)\latex\faq\faq.tex
         -erase $(DOCDIR)\html\faq\*.con
         -erase $(DOCDIR)\html\faq\*.ref
         -erase $(DOCDIR)\latex\faq\*.con
-        -erase $(DOCDIR)\latexfaq\*.ref
+        -erase $(DOCDIR)\latex\faq\*.ref
+        cd $(THISDIR)
+
+$(DOCDIR)\html\proplist\prop.htm:         $(DOCDIR)\latex\proplist\prop.tex $(DOCDIR)\latex\proplist\body.tex $(DOCDIR)\latex\proplist\classes.tex $(DOCDIR)\latex\proplist\changes.tex
+        cd $(DOCDIR)\latex\proplist
+        -mkdir $(DOCDIR)\html\proplist
+        -start /w tex2rtf $(DOCDIR)\latex\proplist\wxprop.tex $(DOCDIR)\html\proplist\prop.htm -twice -html
+        -erase $(DOCDIR)\html\proplist\*.con
+        -erase $(DOCDIR)\html\proplist\*.ref
+        -erase $(DOCDIR)\latex\proplist\*.con
+        -erase $(DOCDIR)\latex\proplist\*.ref
         cd $(THISDIR)
 
 $(WXDIR)\docs\latex\wx\manual.dvi:     $(DOCDIR)/latex/wx/body.tex $(DOCDIR)/latex/wx/manual.tex
index 9f95b894904567d08e9b5656e46ee6207b65b073..af089716eb44ce4a6d85a6eb4bdbab58b883fb6e 100644 (file)
@@ -31,6 +31,9 @@ GENERICOBJS= choicdgg.obj &
   gridg.obj &
   laywin.obj &
   panelg.obj &
+  prop.obj &
+  propform.obj &
+  proplist.obj &
   sashwin.obj &
   scrolwin.obj &
   splitter.obj &
@@ -721,6 +724,15 @@ panelg.obj:     $(GENDIR)\panelg.cpp
 printps.obj:     $(GENDIR)\printps.cpp
   *$(CCC) $(CPPFLAGS) $(IFLAGS) $<
 
+prop.obj:     $(GENDIR)\prop.cpp
+  *$(CCC) $(CPPFLAGS) $(IFLAGS) $<
+
+propform.obj:     $(GENDIR)\propform.cpp
+  *$(CCC) $(CPPFLAGS) $(IFLAGS) $<
+
+proplist.obj:     $(GENDIR)\proplist.cpp
+  *$(CCC) $(CPPFLAGS) $(IFLAGS) $<
+
 prntdlgg.obj:     $(GENDIR)\prntdlgg.cpp
   *$(CCC) $(CPPFLAGS) $(IFLAGS) $<
 
index 2865fbcec3665c00f87e9407ce36f1bf80c22fd8..193ad87b753ab34bbdc26c276c521af2f058fc69 100644 (file)
@@ -103,6 +103,9 @@ GENERICOBJS= \
   $(GENDIR)\gridg.obj \
   $(GENDIR)\msgdlgg.obj \
   $(GENDIR)\panelg.obj \
+  $(GENDIR)\prop.obj \
+  $(GENDIR)\propform.obj \
+  $(GENDIR)\proplist.obj \
   $(GENDIR)\printps.obj \
   $(GENDIR)\prntdlgg.obj \
   $(GENDIR)\scrolwin.obj \
@@ -893,6 +896,21 @@ $(GENDIR)/panelg.obj:     $*.$(SRCSUFF)
 $(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
 <<
 
+$(GENDIR)/prop.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
+$(GENDIR)/propform.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
+$(GENDIR)/proplist.obj:     $*.$(SRCSUFF)
+        cl @<<
+$(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
+<<
+
 $(GENDIR)/printps.obj:     $*.$(SRCSUFF)
         cl @<<
 $(CPPFLAGS) /c /Tp $*.$(SRCSUFF) /Fo$@
index 5bd62163fd42e2e75a43ca2133cdadc664da28d1..79d894b35842f3e60ea1a97b46f309faab6e9659 100644 (file)
@@ -142,6 +142,9 @@ LIB_CPP_SRC=\
  ../generic/laywin.cpp \
  ../generic/msgdlgg.cpp \
  ../generic/panelg.cpp \
+ ../generic/prop.cpp \
+ ../generic/proplist.cpp \
+ ../generic/propform.cpp \
  ../generic/printps.cpp \
  ../generic/prntdlgg.cpp \
  ../generic/sashwin.cpp \
index 7a2e89bb1db6295eae934d2ae438501d1fac2c4d..c88202c1ac267a600c9d39f91ba8c7fdb92c9c91 100644 (file)
@@ -15,18 +15,17 @@ no independent file format.
 provide immediate visual feedback of changed properties.
 \end{enumerate}
 
-Dialog Editor should be compiled and used with wxWindows 1.65 or later.
+Dialog Editor 2.0 should be compiled and used with wxWindows 2.0.
 
 \section{Current status}
 
-Dialog Editor currently runs under MS Windows. It has yet to
-be tested under Motif and XView: see \helpref{Technical notes}{technotes} for a discussion
-of what needs to be done.
+Dialog Editor currently runs under wxMSW and wxGTK. It has yet to
+be tested under wxMotif.
 
 \section{Future developments}
 
 \begin{itemize}\itemsep=0pt
-\item XView and Motif versions.
+\item Motif compilation.
 \item It would be nice to have a dialog browser, showing thumbnails of
 all dialogs in a particular directory.
 \item Maybe add a menubar editor (from wxBuilder).
@@ -42,24 +41,23 @@ all dialogs in a particular directory.
 \subsection{File menu}
 
 \begin{twocollist}\itemsep=0pt
-\twocolitem{New project}{Creates a new project (clears index and resets project name).}
 \twocolitem{New dialog}{Creates a new dialog resource.}
+\twocolitem{New project}{Creates a new project (clears index and resets project name).}
 \twocolitem{Open}{Opens an existing resource file.}
 \twocolitem{Save}{Saves the current resources.}
-\twocolitem{Save as}{Saves the current resources in a named file.}
+\twocolitem{Save As...}{Saves the current resources in a named file.}
 \twocolitem{Clear}{Clears the current resources.}
-\twocolitem{Exit}{Exit the program.}
+\twocolitem{Exit}{Exits the program.}
 \end{twocollist}
 
 \subsection{Edit menu}
 
 \begin{twocollist}\itemsep=0pt
-\twocolitem{Recreate}{Recreates the currently selected panel item from the underlying resource. This may be necessary
+\twocolitem{Test Dialog}{Creates the current dialog for test purposes.}
+\twocolitem{Recreate}{Recreates the currently selected control from the underlying resource. This may be necessary
 to regenerate items that cannot be changed dynamically, and which have got out of sync with the displayed
 item.}
 \twocolitem{Delete}{Deletes the currently selected resource.}
-\twocolitem{Toggle edit/test mode}{Toggles from edit to test mode, and vice versa. Edit mode is used for editing
-dialogs, test mode allows panel items to be manipulated as they will appear to the user.}
 \end{twocollist}
 
 \subsection{Help menu}
@@ -93,35 +91,15 @@ The command toolbar consists of the following tools:
 \latexonly{\newpage}
 \section{Tool palette}
 
-The tool palette is used to select a type of panel item to create on the dialog.
-To create a new panel item, select a tool with left-click, then left-click on the dialog to 
-window. Select the pointer tool to use left-click for selecting and deselecting
+The tool palette is used to select a type of control to create on the dialog.
+To create a new control, select a tool with left-click, then left-click on the dialog.
+Select the pointer tool to use left-click for selecting and deselecting
 items.
 
-The tool palette consists of the following tools.
-
-\begin{twocollist}%\itemsep=0pt
-\twocolitem{\icon{arrow.eps}{Pointer}}{Click this to select/deselect items on a dialog.}
-\twocolitem{\icon{message.eps}{Message}}{Text message item.}
-\twocolitem{\icon{picture.eps}{Bitmap message}}{Bitmap message item.}
-\twocolitem{\icon{button.eps}{Button}}{Text button item.}
-\twocolitem{\icon{bmpbuttn.eps}{Bitmap button}}{Bitmap button item.}
-\twocolitem{\icon{check.eps}{Checkbox}}{Checkbox item.}
-\twocolitem{\icon{radio.eps}{Radiobox}}{Radiobox item.}
-\twocolitem{\icon{listbox.eps}{Listbox}}{Listbox item.}
-\twocolitem{\icon{choice.eps}{Choice}}{Choice item.}
-\twocolitem{\icon{text.eps}{Text}}{Single-line text item.}
-\twocolitem{\icon{mtext.eps}{Multitext}}{Multi-line text item.}
-\twocolitem{\icon{slider.eps}{Slider}}{Slider item.}
-\twocolitem{\icon{group.eps}{Groupbpx}}{Groupbox item.}
-\twocolitem{\icon{gauge.eps}{Gauge}}{Gauge item.}
-\twocolitem{\icon{scroll.eps}{Scrollbar}}{Scrollbar item.}
-\end{twocollist}
-
-\section{Resource list}
+\section{Resource tree}
 
-The resource list shows a list of the dialogs, panel items and bitmaps currently loaded
-in Dialog Editor. Double-clicking on a dialog item shows the associated dialog box.
+The resource tree shows a list of the dialogs, controls and bitmaps currently loaded
+in Dialog Editor. Double-clicking on an item shows the associated resource.
 
 \chapter{Procedures}\label{procedures}
 \setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
@@ -138,16 +116,16 @@ status line.
 \section{Creating a dialog}
 
 To create a new dialog, click on the {\bf File: New} menu item, or equivalent
-toolbar button. A dialog will appear. To put a panel item on the dialog, left-click
+toolbar button. A dialog will appear. To put a control on the dialog, left-click
 on the appropriate palette icon and then left-click on the dialog. A new item
 will appear at the place you clicked.
 
-You can edit any panel item or dialog by control-left clicking. A property editor
+You can edit any control or dialog by control-left clicking. A property editor
 will appear, allowing any property to be selected and edited (see \helpref{Using property editors}{propeditors}).
 You can also edit items by right-clicking to show a menu, and then selecting {\it Edit properties}.
 
-To move a panel item, drag the item with the left mouse button, or edit
-the position values in the property editor. To resize a panel item, you
+To move a control, drag the item with the left mouse button, or edit
+the position values in the property editor. To resize a control, you
 can either select it by left-clicking and then dragging on a selection
 handle, or edit the size values in the property editor. 
 
@@ -169,7 +147,7 @@ the file selector, and properties containing list of user-definable strings use
 string editor.
 
 When you change a property value, this value is immediately reflected in
-the dialog or panel item.  If the item allows this value to be changed
+the dialog or control.  If the item allows this value to be changed
 dynamically, the relevant wxWindows function will be called internally
 to effect the change.  If the value cannot be changed dynamically, the
 item will be destroyed and re-created, which means that there will be
@@ -186,12 +164,37 @@ wxWindows resources have been enabled when building the wxWindows library.
 These files can be loaded dynamically, or included directly into program source
 with a \verb$#include$ directive. See the wxWindows user manual for further details.
 
+\section{Working with identifiers}
+
+Dialog Editor keeps track of identifiers in your resources, and reads and writes an include file of the
+form {\tt name.h} where 'name' is the root name of your {\tt .wxr} file. Dialog Editor
+knows about the predefined identifiers such as wxID\_OK.
+
+When you create a dialog or control, the identifier is initially generated. When you
+edit the identifier via a property editor, you can choose a new name, such as a predefined
+symbol and optionally change the integer assigned to the name (assuming it's not a
+predefined symbol).
+
+When you save the project, the identifier include file is saved as well. Include this file
+in your project so that you can refer to controls and dialogs by identifier rather than
+obscure integers. Note that the {\tt .wxr} file itself can only contain integer ids and not the symbols,
+due to way in which the resource file is loaded.
+
 \section{Multi-platform development}
 
-{\tt .wxr} files generated on one environment (e.g. Windows) can be used in another (e.g. Motif).
-However, because the same panel item can have different sizes on different GUIs,
+{\tt .wxr} files generated on one environment (e.g. Windows) can be used in another (e.g. GTK).
+If you use default fonts and colouring (set {\bf useSystemDefaults} to True in the dialog properties)
+then the dialog fonts and colours will take on the native values, rather than ones specified in the
+resource. Without this, colours in the dialog resource may not match system colours.
+
+Also, set {\bf useDialogUnits} to True whenever possible since this will cause the dialog
+to be created using a scale based on the current system font size, and will result in dialogs that are
+portable between screen resolutions as well as platforms.
+
+Because the same control can have different sizes on different GUIs,
 the user should be cautious in assuming that one resource file will work for all
 platforms. It may be better to plan to conditionally include or load different
 resource files for different platforms, with spacing modified to suit each
-environment.
+environment. The best thing is to try your dialog resource on several platforms
+and see whether tweaking is required for some platforms.
 
index 8c963602ea07a2e13ee5dfe84cf985944dd087c8..7cb891653bfa108ba2e750b4cdc695d4aaa527bc 100644 (file)
@@ -2,14 +2,16 @@
 \setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
 \setfooter{\thepage}{}{}{}{}{\thepage}%
 
-Version 1.0
+Version 2.0
 
 \begin{itemize}\itemsep=0pt
-\item No XView or Motif versions yet.
-\item In Watcom-compiled 32-bit Windows version, bitmap buttons and messages
-don't work properly.
-\item Some panel item properties missing, e.g. wxPASSWORD, wxREADONLY.
+\item No Motif version yet.
+\item Some control properties missing.
 \item When dragging a selected item, other selected items should follow (to be
 consistent with convention), but don't.
-\item wxSlider sizing a bit broken: a wxWindows problem.
+\item No grid.
+\item No keyboard shortcuts.
+\item No tab ordering.
+\item In dialog unit mode, controls will sometimes move slightly when properties are edited,
+because translating between units isn't always reversible (rounding errors?).
 \end{itemize}
index 67ab0785d5ad1a8da79118ef56e8ae0a49536e8b..fbe44245ffa150bccca974f1d0a1787ce39a7ea8 100644 (file)
@@ -2,6 +2,14 @@
 \setheader{{\it CHAPTER \thechapter}}{}{}{}{}{{\it CHAPTER \thechapter}}%
 \setfooter{\thepage}{}{}{}{}{\thepage}%
 
+December 31st 1998, Version 2.0
+
+\begin{itemize}\itemsep=0pt
+\item wxWindows 2.0 port.
+\item Major user interface changes.
+\item Allows identifiers to be edited and reads/writes an id header file.
+\end{itemize}
+
 March 15th 1997, Version 1.7
 
 \begin{itemize}\itemsep=0pt
index dbb9491d240253dc573bba638741840c68952447..633f2c202e56f4fcd4a2f1f99f7986cba2e53e3b 100644 (file)
 \setfooter{\thepage}{}{}{}{}{\thepage}%
 
 To be written.
-
-\begin{comment}
-
-\overview{Property classes overview}{propertyoverview}
-
-
-\section{\class{wxBoolFormValidator}: wxPropertyFormValidator}\label{wxboolformvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a boolean value for a form view. The associated panel item must be a wxCheckBox.
-
-\membersection{wxBoolFormValidator::wxBoolFormValidator}
-
-\func{void}{wxBoolFormValidator}{\param{long }{flags=0}}
-
-Constructor.
-
-\section{\class{wxBoolListValidator}: wxPropertyListValidator}\label{wxboollistvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a boolean value for a list view.
-
-\membersection{wxBoolListValidator::wxBoolListValidator}
-
-\func{void}{wxBoolListValidator}{\param{long }{flags=0}}
-
-Constructor.
-
-\section{\class{wxIntegerFormValidator}: wxPropertyFormValidator}\label{wxintegerformvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a range of integer values for a form view. The associated panel item must be a wxText
-or wxSlider.
-
-\membersection{wxIntegerFormValidator::wxIntegerFormValidator}
-
-\func{void}{wxIntegerFormValidator}{\param{long }{min=0}, \param{long }{max=0},
- \param{long}{ flags=0}}
-
-Constructor. Assigning zero to minimum and maximum values indicates that there is no range to check.
-
-
-\section{\class{wxIntegerListValidator}: wxPropertyListValidator}\label{wxintegerlistvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a range of integer values for a list view.
-
-\membersection{wxIntegerListValidator::wxIntegerListValidator}
-
-\func{void}{wxIntegerListValidator}{\param{long }{min=0}, \param{long }{max=0},
- \param{long}{ flags=wxPROP\_ALLOW\_TEXT\_EDITING}}
-
-Constructor. Assigning zero to minimum and maximum values indicates that there is no range to check.
-
-\section{\class{wxFilenameListValidator}: wxPropertyListValidator}\label{wxfilenamelistvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a filename for a list view, allowing the user to edit it textually and also popping up
-a file selector in ``detailed editing" mode.
-
-\membersection{wxFilenameListValidator::wxFilenameListValidator}
-
-\func{void}{wxFilenameListValidator}{\param{wxString }{message = ``Select a file"}, \param{wxString }{wildcard = ``*.*"},
-  \param{long}{ flags=0}}
-
-Constructor. Supply an optional message and wildcard.
-
-\section{\class{wxListOfStringsListValidator}: wxPropertyListValidator}\label{wxlistofstringslistvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a list of strings for a list view. When editing the property,
-a dialog box is presented for adding, deleting or editing entries in the list.
-At present no constraints may be supplied.
-
-You can construct a string list property value by constructing a wxStringList object.
-
-For example:
-
-\begin{verbatim}
-  myListValidatorRegistry.RegisterValidator((wxString)"stringlist",
-      new wxListOfStringsListValidator);
-
-  wxStringList *strings = new wxStringList("earth", "fire", "wind", "water", NULL);
-
-  sheet->AddProperty(new wxProperty("fred", strings, "stringlist"));
-\end{verbatim}
-
-\membersection{wxListOfStringsListValidator::wxListofStringsListValidator}
-
-\func{void}{wxListOfStringsListValidator}{\param{long}{ flags=0}}
-
-Constructor.
-
-\section{\class{wxProperty}: wxObject}\label{wxproperty}
-
-The {\bf wxProperty} class represents a property, with a \helpref{wxPropertyValue}{wxpropertyvalue}\rtfsp
-containing the actual value, a name a role, an optional validator, and
-an optional associated window. 
-
-A property might correspond to an actual C++ data member, or it
-might correspond to a conceptual property, such as the width of a window.
-There is no explicit data member {\it wxWindow::width}, but it may be convenient
-to invent such a property for the purposes of editing attributes of the window.
-The properties in the property sheet can be mapped to ``reality" by
-whatever means (in this case by calling wxWindow::SetSize when the user has
-finished editing the property sheet).
-
-A validator may be associated with the property in order to ensure that this and
-only this validator will be used for editing and validating the property.
-An alternative method is to use the {\it role} parameter to specify what kind
-of validator would be appropriate; for example, specifying ``filename" for the role
-would allow the property view to find an appropriate validator at edit time.
-
-
-\membersection{wxProperty::wxProperty}
-
-\func{void}{wxProperty}{\void}
-
-\func{void}{wxProperty}{\param{wxProperty\& }{prop}}
-
-\func{void}{wxProperty}{\param{wxString}{ name}, \param{wxString}{ role}, \param{wxPropertyValidator *}{validator=NULL}}
-
-\func{void}{wxProperty}{\param{wxString}{ name}, \param{const wxPropertyValue\&}{ val}, \param{wxString}{ role}, \param{wxPropertyValidator *}{validator=NULL}}
-
-Constructors.
-
-\membersection{wxProperty::\destruct{wxProperty}}
-
-\func{void}{\destruct{wxProperty}}{\void}
-
-Destructor. Destroys the wxPropertyValue, and the property validator if there is one. However, if the
-actual C++ value in the wxPropertyValue is a pointer, the data in that variable is not destroyed.
-
-\membersection{wxProperty::GetValue}
-
-\func{wxPropertyValue\&}{GetValue}{\void}
-
-Returns a reference to the property value.
-
-\membersection{wxProperty::GetValidator}
-
-\func{wxPropertyValidator *}{GetValidator}{\void}
-
-Returns a pointer to the associated property validator (if any).
-
-\membersection{wxProperty::GetName}
-
-\func{wxString\&}{GetName}{\void}
-
-Returns the name of the property.
-
-\membersection{wxProperty::GetRole}
-
-\func{wxRole\&}{GetRole}{\void}
-
-Returns the role of the property, to be used when choosing an appropriate validator.
-
-\membersection{wxProperty::GetWindow}
-
-\func{wxWindow *}{GetWindow}{\void}
-
-Returns the window associated with the property (if any).
-
-\membersection{wxProperty::SetValue}
-
-\func{void}{SetValue}{\param{wxPropertyValue\&}{ val}}
-
-Sets the value of the property.
-
-\membersection{wxProperty::SetName}
-
-\func{void}{SetName}{\param{wxString\&}{ name}}
-
-Sets the name of the property.
-
-\membersection{wxProperty::SetRole}
-
-\func{void}{SetRole}{\param{wxString\&}{ role}}
-
-Sets the role  of the property.
-
-\membersection{wxProperty::SetValidator}
-
-\func{void}{SetValidator}{\param{wxPropertyValidator *}{validator}}
-
-Sets the validator: this will be deleted when the property is deleted.
-
-\membersection{wxProperty::SetWindow}
-
-\func{void}{SetWindow}{\param{wxWindow *}{win}}
-
-Sets the window associated with the property.
-
-\membersection{wxProperty::operator $=$}
-
-\func{void}{operator $=$}{\param{const wxPropertyValue\&}{ val}}
-
-Assignment operator.
-
-\section{\class{wxPropertyFormValidator}: wxPropertyValidator}\label{wxpropertyformvalidator}
-
-The {\bf wxPropertyFormValidator} abstract class is the root of classes that define validation
-for a wxPropertyFormView.
-
-
-\section{\class{wxPropertyFormDialog}: wxDialogBox}\label{wxpropertyformdialog}
-
-The {\bf wxPropertyFormDialog} class is a prepackaged dialog which can
-be used for viewing a form property sheet. Pass a property form view object, and the dialog
-will pass OnClose and OnDefaultAction listbox messages to the view class for
-processing.
-
-\membersection{wxPropertyFormDialog::wxPropertyFormDialog}
-
-\func{void}{wxPropertyFormDialog}{\param{wxPropertyFormView *}{view}, \param{wxWindow *}{parent}, \param{char *}{title},
- \param{Bool}{ modal=FALSE}, \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
- \param{long}{ style=wxDEFAULT\_DIALOG\_STYLE}, \param{char *}{name=``dialogBox"}}
-
-Constructor.
-
-\membersection{wxPropertyFormDialog::\destruct{wxPropertyFormDialog}}
-
-\func{void}{\destruct{wxPropertyFormDialog}}{\void}
-
-Destructor.
-
-
-\section{\class{wxPropertyFormFrame}: wxFrame}\label{wxpropertyformframe}
-
-The {\bf wxPropertyFormFrame} class is a prepackaged frame which can
-be used for viewing a property form. Pass a property form view object, and the frame
-will pass OnClose messages to the view class for processing.
-
-Call Initialize to create the panel and associate the view; override OnCreatePanel
-if you wish to use a panel class other than the default wxPropertyFormPanel.
-
-\membersection{wxPropertyFormFrame::wxPropertyFormFrame}
-
-\func{void}{wxPropertyFormFrame}{\param{wxPropertyFormView *}{view}, \param{wxFrame *}{parent}, \param{char *}{title},
- \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
- \param{long}{ style=wxSDI $\|$ wxDEFAULT\_FRAME}, \param{char *}{name=``frame"}}
-
-Constructor.
-
-\membersection{wxPropertyFormFrame::\destruct{wxPropertyFormFrame}}
-
-\func{void}{\destruct{wxPropertyFormFrame}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyFormFrame::GetPropertyPanel}
-
-\func{wxPanel *}{GetPropertyPanel}{\void}
-
-Returns the panel associated with the frame.
-
-\membersection{wxPropertyFormFrame::Initialize}
-
-\func{Bool}{Initialize}{\void}
-
-Must be called to create the panel and associate the view with the panel and frame.
-
-\membersection{wxPropertyFormFrame::OnCreatePanel}
-
-\func{wxPanel *}{OnCreatePanel}{\param{wxFrame *}{parent}, \param{wxPropertyFormView *}{view}}
-
-Creates a panel. Override this to create a panel type other than wxPropertyFormPanel.
-
-
-\section{\class{wxPropertyFormPanel}: wxPanel}\label{wxpropertyformpanel}
-
-The {\bf wxPropertyFormPanel} class is a prepackaged panel which can
-be used for viewing a property form. Pass a property form view object, and the panel
-will pass OnDefaultAction listbox messages to the view class for
-processing.
-
-\membersection{wxPropertyFormPanel::wxPropertyFormPanel}
-
-\func{void}{wxPropertyFormPanel}{\param{wxPropertyFormView *}{view}, \param{wxWindow *}{parent},
- \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
- \param{long}{ style=0}, \param{char *}{name=``panel"}}
-
-Constructor.
-
-\membersection{wxPropertyFormPanel::\destruct{wxPropertyFormPanel}}
-
-\func{void}{\destruct{wxPropertyFormPanel}}{\void}
-
-Destructor.
-
-
-
-\section{\class{wxPropertyFormValidator}: wxPropertyValidator}\label{wxpropertyformvalidatir}
-
-\overview{wxPropertyFormValidator overview}{wxpropertyformvalidatoroverview}
-
-The {\bf wxPropertyFormValidator} class defines a base class for form validators. By overriding virtual functions,
-the programmer can create custom behaviour for kinds of property.
-
-\membersection{wxPropertyFormValidator::wxPropertyFormValidator}
-
-\func{void}{wxPropertyFormValidator}{\param{long}{ flags = 0}}
-
-Constructor.
-
-\membersection{wxPropertyFormValidator::\destruct{wxPropertyFormValidator}}
-
-\func{void}{\destruct{wxPropertyFormValidator}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyFormValidator::OnCommand}
-
-\func{Bool}{OnCommand}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
- \param{wxWindow *}{parentWindow}, \param{wxCommandEvent\& }{event}}
-
-Called when the control corresponding to the property receives a command (if not intercepted
-by a callback associated with the actual control).
-
-\membersection{wxPropertyFormValidator::OnCheckValue}
-
-\func{Bool}{OnCheckValue}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
- \param{wxWindow *}{parentWindow}}
-Called when the view checks the property value. The value checked by this validator should be taken from the
-panel item corresponding to the property.
-
-\membersection{wxPropertyFormValidator::OnDisplayValue}
-
-\func{Bool}{OnDisplayValue}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Should display the property value in the appropriate control.
-\membersection{wxPropertyFormValidator::OnDoubleClick}
-
-\func{Bool}{OnDoubleClick}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Called when the control corresponding to the property is double clicked (listboxes only).
-
-\membersection{wxPropertyFormValidator::OnRetrieveValue}
-
-\func{Bool}{OnRetrieveValue}{\param{wxProperty *}{property}, \param{wxPropertyFormView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Should do the transfer from the property editing area to the property itself.
-
-
-\section{\class{wxPropertyFormView}: wxPropertyView}\label{wxpropertyformview}
-
-\overview{wxPropertyFormView overview}{wxpropertyformviewoverview}
-
-The {\bf wxPropertyFormView} class shows a wxPropertySheet as a view onto a panel or dialog
-box which has already been created.
-
-\membersection{wxPropertyFormView::wxPropertyFormView}
-
-\func{void}{wxPropertyFormView}{\param{long}{ flags = 0}}
-
-Constructor.
-
-\membersection{wxPropertyFormView::\destruct{wxPropertyFormView}}
-
-\func{void}{\destruct{wxPropertyFormView}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyFormView::AssociateNames}\label{wxpropertyformviewassociatenames}
-
-\func{void}{AssociateNames}{\void}
-
-Associates the properties with the controls on the panel. For each panel item, if the
-panel item name is the same as a property name, the two objects will be associated.
-This function should be called manually since the programmer may wish to do the
-association manually.
-
-\membersection{wxPropertyFormView::Check}\label{wxpropertyformviewcheck}
-
-\func{Bool}{Check}{\void}
-
-Checks all properties by calling the appropriate validators; returns FALSE if a validation failed.
-
-\membersection{wxPropertyFormView::GetPanel}\label{wxpropertyformviewgetpanel}
-
-\func{wxPanel *}{GetPanel}{\void}
-
-Returns the panel associated with the view.
-
-\membersection{wxPropertyFormView::GetManagedWindow}\label{wxpropertyformviewgetmanagedwindow}
-
-\func{wxWindow *}{GetManagedWindow}{\void}
-
-Returns the managed window (a frame or dialog) associated with the view.
-
-\membersection{wxPropertyFormView::OnOk}\label{wxpropertyformviewonok}
-
-\func{void}{OnOk}{\void}
-
-Virtual function that will be called when the OK button on the physical window is pressed.
-By default, checks and updates the form values, closes and deletes the frame or dialog, then deletes the view.
-
-\membersection{wxPropertyFormView::OnCancel}\label{wxpropertyformviewoncancel}
-
-\func{void}{OnCancel}{\void}
-
-Virtual function that will be called when the Cancel button on the physical window is pressed.
-By default, closes and deletes the frame or dialog, then deletes the view.
-
-\membersection{wxPropertyFormView::OnHelp}\label{wxpropertyformviewonhelp}
-
-\func{void}{OnHelp}{\void}
-
-Virtual function that will be called when the Help button on the physical window is pressed.
-This needs to be overridden by the application for anything interesting to happen.
-
-\membersection{wxPropertyFormView::OnRevert}\label{wxpropertyformviewonrevert}
-
-\func{void}{OnRevert}{\void}
-
-Virtual function that will be called when the Revert button on the physical window is pressed.
-By default transfers the wxProperty values to the panel items (in effect
-undoing any unsaved changes in the items).
-
-\membersection{wxPropertyFormView::OnUpdate}\label{wxpropertyformviewonupdate}
-
-\func{void}{OnUpdate}{\void}
-
-Virtual function that will be called when the Update button on the physical window is pressed.
-By defaults transfers the displayed values to the wxProperty objects.
-
-\membersection{wxPropertyFormView::SetManagedWindow}\label{wxpropertyformviewsetmanagedwindow}
-
-\func{void}{SetManagedWindow}{\param{wxWindow *}{win}}
-
-Sets the managed window (a frame or dialog) associated with the view.
-
-\membersection{wxPropertyFormView::TransferToDialog}\label{wxpropertyformviewtransfertodialog}
-
-\func{Bool}{TransferToDialog}{\void}
-
-Transfers property values to the controls in the dialog.
-
-\membersection{wxPropertyFormView::TransferToPropertySheet}\label{wxpropertyformviewtransfertopropertysheet}
-
-\func{Bool}{TransferToPropertySheet}{\void}
-
-Transfers property values from the controls in the dialog to the property sheet.
-
-
-\section{\class{wxPropertyListDialog}: wxDialogBox}\label{wxpropertylistdialog}
-
-The {\bf wxPropertyListDialog} class is a prepackaged dialog which can
-be used for viewing a property list. Pass a property list view object, and the dialog
-will pass OnClose and OnDefaultAction listbox messages to the view class for
-processing.
-
-\membersection{wxPropertyListDialog::wxPropertyListDialog}
-
-\func{void}{wxPropertyListDialog}{\param{wxPropertyListView *}{view}, \param{wxWindow *}{parent}, \param{char *}{title},
- \param{Bool}{ modal=FALSE}, \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
- \param{long}{ style=wxDEFAULT\_DIALOG\_STYLE}, \param{char *}{name=``dialogBox"}}
-
-Constructor.
-
-\membersection{wxPropertyListDialog::\destruct{wxPropertyListDialog}}
-
-\func{void}{\destruct{wxPropertyListDialog}}{\void}
-
-Destructor.
-
-
-\section{\class{wxPropertyListFrame}: wxFrame}\label{wxpropertylistframe}
-
-The {\bf wxPropertyListFrame} class is a prepackaged frame which can
-be used for viewing a property list. Pass a property list view object, and the frame
-will pass OnClose messages to the view class for processing.
-
-Call Initialize to create the panel and associate the view; override OnCreatePanel
-if you wish to use a panel class other than the default wxPropertyListPanel.
-
-\membersection{wxPropertyListFrame::wxPropertyListFrame}
-
-\func{void}{wxPropertyListFrame}{\param{wxPropertyListView *}{view}, \param{wxFrame *}{parent}, \param{char *}{title},
- \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
- \param{long}{ style=wxSDI $\|$ wxDEFAULT\_FRAME}, \param{char *}{name=``frame"}}
-
-Constructor.
-
-\membersection{wxPropertyListFrame::\destruct{wxPropertyListFrame}}
-
-\func{void}{\destruct{wxPropertyListFrame}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyListFrame::GetPropertyPanel}
-
-\func{wxPanel *}{GetPropertyPanel}{\void}
-
-Returns the panel associated with the frame.
-
-\membersection{wxPropertyListFrame::Initialize}
-
-\func{Bool}{Initialize}{\void}
-
-Must be called to create the panel and associate the view with the panel and frame.
-
-\membersection{wxPropertyListFrame::OnCreatePanel}
-
-\func{wxPanel *}{OnCreatePanel}{\param{wxFrame *}{parent}, \param{wxPropertyListView *}{view}}
-
-Creates a panel. Override this to create a panel type other than wxPropertyListPanel.
-
-
-\section{\class{wxPropertyListPanel}: wxPanel}\label{wxpropertylistpanel}
-
-The {\bf wxPropertyListPanel} class is a prepackaged panel which can
-be used for viewing a property list. Pass a property list view object, and the panel
-will pass OnDefaultAction listbox messages to the view class for
-processing.
-
-\membersection{wxPropertyListPanel::wxPropertyListPanel}
-
-\func{void}{wxPropertyListPanel}{\param{wxPropertyListView *}{view}, \param{wxWindow *}{parent},
- \param{int}{ x=-1}, \param{int}{ y=-1}, \param{int}{ width=-1}, \param{int}{height=-1},
- \param{long}{ style=0}, \param{char *}{name=``panel"}}
-
-Constructor.
-
-\membersection{wxPropertyListPanel::\destruct{wxPropertyListPanel}}
-
-\func{void}{\destruct{wxPropertyListPanel}}{\void}
-
-Destructor.
-
-
-
-
-\section{\class{wxPropertyListValidator}: wxPropertyValidator}\label{wxpropertylistvalidator}
-
-\overview{wxPropertyListValidator overview}{wxpropertylistvalidatoroverview}
-
-The {\bf wxPropertyListValidator} abstract class is the base class for
-deriving validators for property lists.
-
-\membersection{wxPropertyListValidator::wxPropertyListValidator}
-
-\func{void}{wxPropertyListValidator}{\param{long}{ flags = wxPROP\_ALLOW\_TEXT\_EDITING}}
-
-Constructor.
-
-\membersection{wxPropertyListValidator::\destruct{wxPropertyListValidator}}
-
-\func{void}{\destruct{wxPropertyListValidator}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyListValidator::OnCheckValue}
-
-\func{Bool}{OnCheckValue}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-Called when the Tick (Confirm) button is pressed or focus is list. Return FALSE if the value
-was invalid, which is a signal restores the old value. Return TRUE if the value was valid.
-
-\membersection{wxPropertyListValidator::OnClearControls}
-
-\func{Bool}{OnClearControls}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-Allows the clearing (enabling, disabling) of property list controls, when the focus leaves the current property.
-
-\membersection{wxPropertyListValidator::OnClearDetailControls}
-
-\func{Bool}{OnClearDetailControls}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-Called when the focus is lost, if the validator is in detailed editing mode.
-
-\membersection{wxPropertyListValidator::OnDisplayValue}
-
-\func{Bool}{OnDisplayValue}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Should display the value in the appropriate controls. The default implementation gets the
-textual value from the property and inserts it into the text edit control.
-\membersection{wxPropertyListValidator::OnDoubleClick}
-
-\func{Bool}{OnDoubleClick}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Called when the property is double clicked. Extra functionality can be provided,
-such as cycling through possible values.
-
-\membersection{wxPropertyListValidator::OnEdit}
-
-\func{Bool}{OnEdit}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-Called when the Edit (detailed editing) button is pressed. The default implementation
-calls wxPropertyListView::BeginDetailedEditing; a filename validator (for example) overrides
-this function to show the file selector.
-
-\membersection{wxPropertyListValidator::OnPrepareControls}
-
-\func{Bool}{OnPrepareControls}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Called to allow the validator to setup the display, such enabling or disabling buttons, and
-setting the values and selection in the standard listbox control (the one optionally used for displaying
-value options).
-
-\membersection{wxPropertyListValidator::OnPrepareDetailControls}
-
-\func{Bool}{OnPrepareDetailControls}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-Called when the property is edited `in detail', i.e. when the Edit button is pressed.
-
-\membersection{wxPropertyListValidator::OnRetrieveValue}
-
-\func{Bool}{OnRetrieveValue}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Called when Tick (Confirm) is pressed or focus is lost or view wants to update
-the property list. Should do the transfer from the property editing area to the property itself
-
-\membersection{wxPropertyListValidator::OnSelect}
-
-\func{Bool}{OnSelect}{\param{Bool}{ select}, \param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Called when the property is selected or deselected: typically displays the value
-in the edit control (having chosen a suitable control to display: (non)editable text or listbox).
-
-\membersection{wxPropertyListValidator::OnValueListSelect}
-
-\func{Bool}{OnValueListSelect}{\param{wxProperty *}{property}, \param{wxPropertyListView *}{view},
- \param{wxWindow *}{parentWindow}}
-
-Called when the value listbox is selected. The default behaviour is to copy
-string to text control, and retrieve the value into the property.
-
-
-
-\section{\class{wxPropertyListView}: wxPropertyView}\label{wxpropertylistview}
-
-\overview{wxPropertyListView overview}{wxpropertylistviewoverview}
-
-The {\bf wxPropertyListView} class shows a wxPropertySheet as a Visual Basic-style property list.
-
-\membersection{wxPropertyListView::wxPropertyListView}
-
-\func{void}{wxPropertyListView}{\param{long}{ flags = wxPROP\_BUTTON\_DEFAULT}}
-
-Constructor.
-
-The {\it flags} argument can be a bit list of the following:
-
-\begin{itemize}\itemsep=0pt
-\item wxPROP\_BUTTON\_CLOSE
-\item wxPROP\_BUTTON\_OK
-\item wxPROP\_BUTTON\_CANCEL
-\item wxPROP\_BUTTON\_CHECK\_CROSS
-\item wxPROP\_BUTTON\_HELP
-\item wxPROP\_DYNAMIC\_VALUE\_FIELD
-\item wxPROP\_PULLDOWN
-\end{itemize}
-
-\membersection{wxPropertyListView::\destruct{wxPropertyListView}}
-
-\func{void}{\destruct{wxPropertyListView}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyListView::AssociatePanel}\label{wxpropertylistviewassociatepanel}
-
-\func{void}{AssociatePanel}{\param{wxPanel *}{panel}}
-
-Associates the window on which the controls will be displayed, with the view (sets an internal pointer to the window).
-
-\membersection{wxPropertyListView::BeginShowingProperty}\label{wxpropertylistviewbeginshowingproperty}
-
-\func{Bool}{BeginShowingProperty}{\param{wxProperty *}{property}}
-
-Finds the appropriate validator and loads the property into the controls, by calling
-wxPropertyValidator::OnPrepareControls and then wxPropertyListView::DisplayProperty.
-
-\membersection{wxPropertyListView::DisplayProperty}\label{wxpropertylistviewdisplayproperty}
-
-\func{Bool}{DisplayProperty}{\param{wxProperty *}{property}}
-
-Calls wxPropertyValidator::OnDisplayValue for the current property's validator. This function
-gets called by wxPropertyListView::BeginShowingProperty, which is in turn called
-from ShowProperty, called by OnPropertySelect, called by the listbox callback when selected.
-
-\membersection{wxPropertyListView::EndShowingProperty}\label{wxpropertylistviewendshowingproperty}
-
-\func{Bool}{EndShowingProperty}{\param{wxProperty *}{property}}
-
-Finds the appropriate validator and unloads the property from the controls, by calling
-wxPropertyListView::RetrieveProperty, wxPropertyValidator::OnClearControls and (if we're in
-detailed editing mdoe) wxPropertyValidator::OnClearDetailControls.
-
-\membersection{wxPropertyListView::GetPanel}\label{wxpropertylistviewgetpanel}
-
-\func{wxPanel *}{GetPanel}{\void}
-
-Returns the panel associated with the view.
-
-\membersection{wxPropertyListView::GetManagedWindow}\label{wxpropertylistviewgetmanagedwindow}
-
-\func{wxWindow *}{GetManagedWindow}{\void}
-
-Returns the managed window (a frame or dialog) associated with the view.
-
-\membersection{wxPropertyListView::GetWindowCancelButton}\label{wxpropertylistviewgetwindowcancelbutton}
-
-\func{wxButton *}{GetWindowCancelButton}{\void}
-
-Returns the window cancel button, if any.
-
-\membersection{wxPropertyListView::GetWindowCloseButton}\label{wxpropertylistviewgetwindowclosebutton}
-
-\func{wxButton *}{GetWindowCloseButton}{\void}
-
-Returns the window close or OK button, if any.
-
-\membersection{wxPropertyListView::GetWindowHelpButton}\label{wxpropertylistviewgetwindowhelpbutton}
-
-\func{wxButton *}{GetWindowHelpButton}{\void}
-
-Returns the window help button, if any.
-
-\membersection{wxPropertyListView::SetManagedWindow}\label{wxpropertylistviewsetmanagedwindow}
-
-\func{void}{SetManagedWindow}{\param{wxWindow *}{win}}
-
-Sets the managed window (a frame or dialog) associated with the view.
-
-\membersection{wxPropertyListView::UpdatePropertyDisplayInList}\label{wxpropertylistviewupdatepropdisplay}
-
-\func{Bool}{UpdatePropertyDisplayInList}{\param{wxProperty *}{property}}
-
-Updates the display for the given changed property.
-
-\membersection{wxPropertyListView::UpdatePropertyList}\label{wxpropertylistviewupdateproplist}
-
-\func{Bool}{UpdatePropertyList}{\param{Bool }{clearEditArea = TRUE}}
-
-Updates the whole property list display.
-
-
-\section{\class{wxPropertySheet}: wxObject}\label{wxpropertysheet}
-
-\overview{wxPropertySheet overview}{wxpropertysheetoverview}
-
-The {\bf wxPropertySheet} class is used for storing a number of
-wxProperty objects (essentially names and values).
-
-\membersection{wxPropertySheet::wxPropertySheet}
-
-\func{void}{wxPropertySheet}{\void}
-
-Constructor.
-
-\membersection{wxPropertySheet::\destruct{wxPropertySheet}}
-
-\func{void}{\destruct{wxPropertySheet}}{\void}
-
-Destructor. Destroys all contained properties.
-
-\membersection{wxPropertySheet::AddProperty}\label{wxpropertysheetaddproperty}
-
-\func{void}{AddProperty}{\param{wxProperty *}{property}}
-
-Adds a property to the sheet.
-
-\membersection{wxPropertySheet::Clear}\label{wxpropertysheetclear}
-
-\func{void}{Clear}{\void}
-
-Clears all the properties from the sheet (deleting them).
-
-\membersection{wxPropertySheet::GetProperties}\label{wxpropertysheetgetproperties}
-
-\func{wxList\&}{GetProperties}{\void}
-
-Returns a reference to the internal list of properties.
-
-\membersection{wxPropertySheet::GetProperty}\label{wxpropertysheetgetproperty}
-
-\func{wxProperty *}{GetProperty}{\param{char *}{name}}
-
-Gets a property by name.
-
-\membersection{wxPropertySheet::SetAllModified}
-
-\func{void}{SetAllModified}{\param{Bool}{ flag}}
-
-Sets the `modified' flag of each property value.
-
-
-
-\section{\class{wxPropertyValidator}: wxEvtHandler}\label{wxpropertyvalidator}
-
-\overview{wxPropertyValidator overview}{wxpropertyvalidatoroverview}
-
-The {\bf wxPropertyValidator} abstract class is the base class for deriving
-validators for properties.
-
-\membersection{wxPropertyValidator::wxPropertyValidator}
-
-\func{void}{wxPropertyValidator}{\param{long}{ flags = 0}}
-
-Constructor.
-
-\membersection{wxPropertyValidator::\destruct{wxPropertyValidator}}
-
-\func{void}{\destruct{wxPropertyValidator}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyValidator::GetFlags}
-
-\func{long}{GetFlags}{\void}
-
-Returns the flags for the validator.
-
-\membersection{wxPropertyValidator::GetValidatorProperty}
-
-\func{wxProperty *}{GetValidatorProperty}{\void}
-
-Gets the property for the validator.
-
-\membersection{wxPropertyValidator::SetValidatorProperty}
-
-\func{void}{SetValidatorProperty}{\param{wxProperty *}{property}}
-
-Sets the property for the validator.
-
-
-\section{\class{wxPropertyValidatorRegistry}: wxHashTable}\label{wxpropertyvalidatorregistry}
-
-The {\bf wxPropertyValidatorRegistry} class is used for storing validators,
-indexed by the `role name' of the property, by which groups of property
-can be identified for the purpose of validation and editing.
-
-\membersection{wxPropertyValidatorRegistry::wxPropertyValidatorRegistry}
-
-\func{void}{wxPropertyValidatorRegistry}{\void}
-
-Constructor.
-
-\membersection{wxPropertyValidatorRegistry::\destruct{wxPropertyValidatorRegistry}}
-
-\func{void}{\destruct{wxPropertyValidatorRegistry}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyValidatorRegistry::Clear}
-
-\func{void}{ClearRegistry}{\void}
-
-Clears the registry, deleting the validators.
-
-\membersection{wxPropertyValidatorRegistry::GetValidator}
-
-\func{wxPropertyValidator *}{GetValidator}{\param{wxString\& }{roleName}}
-
-Retrieve a validator by the property role name.
-
-\membersection{wxPropertyValidatorRegistry::RegisterValidator}\label{wxpropertyvalidatorregistervalidator}
-
-\func{void}{RegisterValidator}{\param{wxString\& }{roleName}, \param{wxPropertyValidator *}{validator}}
-
-Register a validator with the registry. {\it roleName} is a name indicating the
-role of the property, such as ``filename''. Later, when a validator is chosen for
-editing a property, this role name is matched against the class names of the property,
-if the property does not already have a validator explicitly associated with it.
-
-
-\section{\class{wxPropertyValue}: wxObject}\label{wxpropertyvalue}
-
-The {\bf wxPropertyValue} class represents the value of a property,
-and is normally associated with a wxProperty object.
-
-A wxPropertyValue has one of the following types:
-
-\begin{itemize}\itemsep=0pt
-\item wxPropertyValueNull
-\item wxPropertyValueInteger
-\item wxPropertyValueReal
-\item wxPropertyValueBool
-\item wxPropertyValueString
-\item wxPropertyValueList
-\item wxPropertyValueIntegerPtr
-\item wxPropertyValueRealPtr
-\item wxPropertyValueBoolPtr
-\item wxPropertyValueStringPtr
-\end{itemize}
-
-\membersection{wxPropertyValue::wxPropertyValue}
-
-\func{void}{wxPropertyValue}{\void}
-
-Default constructor.
-
-\func{void}{wxPropertyValue}{\param{const wxPropertyValue\& }{copyFrom}}
-
-Copy constructor.
-
-\func{void}{wxPropertyValue}{\param{char *}{val}}
-
-Construction from a string value.
-
-\func{void}{wxPropertyValue}{\param{long}{ val}}
-
-Construction from an integer value. You may need to cast to (long) to
-avoid confusion with other constructors (such as the Bool constructor).
-
-\func{void}{wxPropertyValue}{\param{Bool}{ val}}
-
-Construction from a boolean value.
-
-\func{void}{wxPropertyValue}{\param{float}{ val}}
-
-Construction from a floating point value.
-
-\func{void}{wxPropertyValue}{\param{double}{ val}}
-
-Construction from a floating point value.
-
-\func{void}{wxPropertyValue}{\param{wxList *}{ val}}
-
-Construction from a list of wxPropertyValue objects. The
-list, but not each contained wxPropertyValue, will be deleted
-by the constructor. The wxPropertyValues will be assigned to
-this wxPropertyValue list. In other words, so do not delete wxList or
-its data after calling this constructor.
-
-\func{void}{wxPropertyValue}{\param{wxStringList *}{ val}}
-
-Construction from a list of strings. The list (including the strings
-contained in it) will be deleted by the constructor, so do not
-destroy {\it val} explicitly.
-
-\func{void}{wxPropertyValue}{\param{char **}{val}}
-
-Construction from a string pointer.
-
-\func{void}{wxPropertyValue}{\param{long *}{val}}
-
-Construction from an integer pointer.
-
-\func{void}{wxPropertyValue}{\param{Bool *}{val}}
-
-Construction from an boolean pointer.
-
-\func{void}{wxPropertyValue}{\param{float *}{val}}
-
-Construction from a floating point pointer.
-
-The last four constructors use pointers to various C++ types, and do not
-store the types themselves; this allows the values to stand in for actual
-data values defined elsewhere.
-
-\membersection{wxPropertyValue::\destruct{wxPropertyValue}}
-
-\func{void}{\destruct{wxPropertyValue}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyValue::Append}
-
-\func{void}{Append}{\param{wxPropertyValue *}{expr}}
-
-Appends a property value to the list.
-
-\membersection{wxPropertyValue::BoolValue}
-
-\func{Bool}{BoolValue}{\void}
-
-Returns the boolean value.
-
-\membersection{wxPropertyValue::BoolValuePtr}
-
-\func{Bool *}{BoolValuePtr}{\void}
-
-Returns the pointer to the boolean value.
-
-\membersection{wxPropertyValue::ClearList}
-
-\func{void}{ClearList}{\void}
-
-Deletes the contents of the list.
-
-\membersection{wxPropertyValue::Delete}
-
-\func{void}{Delete}{\param{wxPropertyValue *}{expr}}
-
-Deletes {\it expr} from this list.
-
-\membersection{wxPropertyValue::GetFirst}
-
-\func{wxPropertyValue *}{GetFirst}{\void}
-
-Gets the first value in the list.
-
-\membersection{wxPropertyValue::GetLast}
-
-\func{wxPropertyValue *}{GetFirst}{\void}
-
-Gets the last value in the list.
-
-\membersection{wxPropertyValue::GetModified}
-
-\func{Bool}{GetModified}{\void}
-
-Returns TRUE if the value was modified since being created
-(or since SetModified was called).
-
-\membersection{wxPropertyValue::GetNext}
-
-\func{wxPropertyValue *}{GetNext}{\void}
-
-Gets the next value in the list (the one after `this').
-
-\membersection{wxPropertyValue::GetStringRepresentation}
-
-\func{wxString}{GetStringRepresentation}{\void}
-
-Gets a string representation of the value.
-
-\membersection{wxPropertyValue::IntegerValue}
-
-\func{long}{IntegerValue}{\void}
-
-Returns the integer value.
-
-\membersection{wxPropertyValue::Insert}
-
-\func{void}{Insert}{\param{wxPropertyValue *}{expr}}
-
-Inserts a property value at the front of a list.
-
-\membersection{wxPropertyValue::IntegerValuePtr}
-
-\func{long *}{IntegerValuePtr}{\void}
-
-Returns the pointer to the integer value.
-
-\membersection{wxPropertyValue::Nth}
-
-\func{wxPropertyValue *}{Nth}{\param{int}{ n}}
-
-Returns the nth value of a list expression (starting from zero).
-
-\membersection{wxPropertyValue::Number}
-
-\func{int}{Number}{\void}
-
-Returns the number of elements in a list expression.
-
-\membersection{wxPropertyValue::RealValue}
-
-\func{float}{RealValue}{\void}
-
-Returns the floating point value.
-
-\membersection{wxPropertyValue::RealValuePtr}
-
-\func{float *}{RealValuePtr}{\void}
-
-Returns the pointer to the floating point value.
-
-\membersection{wxPropertyValue::SetModified}
-
-\func{void}{SetModified}{\param{Bool}{ flag}}
-
-Sets the `modified' flag.
-
-\membersection{wxPropertyValue::StringValue}
-
-\func{char *}{StringValue}{\void}
-
-Returns the string value.
-
-\membersection{wxPropertyValue::StringValuePtr}
-
-\func{char **}{StringValuePtr}{\void}
-
-Returns the pointer to the string value.
-
-\membersection{wxPropertyValue::Type}
-
-\func{wxPropertyValueType}{Type}{\void}
-
-Returns the value type.
-
-\membersection{wxPropertyValue::operator $=$}
-
-\func{void}{operator $=$}{\param{const wxPropertyValue\& }{val}}
-
-\func{void}{operator $=$}{\param{const char *}{val}}
-
-\func{void}{operator $=$}{\param{const long }{val}}
-
-\func{void}{operator $=$}{\param{const Bool }{val}}
-
-\func{void}{operator $=$}{\param{const float }{val}}
-
-\func{void}{operator $=$}{\param{const char **}{val}}
-
-\func{void}{operator $=$}{\param{const long *}{val}}
-
-\func{void}{operator $=$}{\param{const Bool *}{val}}
-
-\func{void}{operator $=$}{\param{const float *}{val}}
-
-Assignment operators.
-
-
-
-\section{\class{wxPropertyView}: wxEvtHandler}\label{wxpropertyview}
-
-\overview{wxPropertyView overview}{wxpropertyviewoverview}
-
-The {\bf wxPropertyView} abstract class is the base class for views
-of property sheets, acting as intermediaries between properties and
-actual windows.
-
-\membersection{wxPropertyView::wxPropertyView}
-
-\func{void}{wxPropertyView}{\param{long}{ flags = wxPROP\_BUTTON\_DEFAULT}}
-
-Constructor.
-
-The {\it flags} argument can be a bit list of the following:
-
-\begin{itemize}\itemsep=0pt
-\item wxPROP\_BUTTON\_CLOSE
-\item wxPROP\_BUTTON\_OK
-\item wxPROP\_BUTTON\_CANCEL
-\item wxPROP\_BUTTON\_CHECK\_CROSS
-\item wxPROP\_BUTTON\_HELP
-\item wxPROP\_DYNAMIC\_VALUE\_FIELD
-\item wxPROP\_PULLDOWN
-\end{itemize}
-
-\membersection{wxPropertyView::\destruct{wxPropertyView}}
-
-\func{void}{\destruct{wxPropertyView}}{\void}
-
-Destructor.
-
-\membersection{wxPropertyView::AddRegistry}\label{wxpropertyviewaddregistry}
-
-\func{void}{AddRegistry}{\param{wxPropertyValidatorRegistry *}{registry}}
-
-Adds a registry (list of property validators) the view's list of registries, which is initially empty.
-
-\membersection{wxPropertyView::FindPropertyValidator}\label{wxpropertyviewfindpropertyvalidator}
-
-\func{wxPropertyValidator *}{FindPropertyValidator}{\param{wxProperty *}{property}}
-
-Finds the property validator that is most appropriate to this property.
-
-\membersection{wxPropertyView::GetPropertySheet}\label{wxpropertyviewgetpropertysheet}
-
-\func{wxPropertySheet *}{GetPropertySheet}{\void}
-
-Gets the property sheet for this view.
-
-\membersection{wxPropertyView::GetRegistryList}\label{wxpropertyviewgetregistrylist}
-
-\func{wxList\&}{GetRegistryList}{\void}
-
-Returns a reference to the list of property validator registries.
-
-\membersection{wxPropertyView::OnOk}\label{wxpropertyviewonok}
-
-\func{void}{OnOk}{\void}
-
-Virtual function that will be called when the OK button on the physical window is pressed (if it exists).
-
-\membersection{wxPropertyView::OnCancel}\label{wxpropertyviewoncancel}
-
-\func{void}{OnCancel}{\void}
-
-Virtual function that will be called when the Cancel button on the physical window is pressed (if it exists).
-
-\membersection{wxPropertyView::OnClose}\label{wxpropertyviewonclose}
-
-\func{Bool}{OnClose}{\void}
-
-Virtual function that will be called when the physical window is closed. The default implementation returns FALSE.
-
-\membersection{wxPropertyView::OnHelp}\label{wxpropertyviewonhelp}
-
-\func{void}{OnHelp}{\void}
-
-Virtual function that will be called when the Help button on the physical window is pressed (if it exists).
-
-\membersection{wxPropertyView::OnPropertyChanged}\label{wxpropertyviewonpropertychanged}
-
-\func{void}{OnPropertyChanged}{\param{wxProperty *}{property}}
-
-Virtual function called by a view or validator when a property's value changed. Validators
-must be written correctly for this to be called. You can override this function
-to respond immediately to property value changes.
-
-\membersection{wxPropertyView::OnUpdateView}\label{wxpropertyviewonupdateview}
-
-\func{Bool}{OnUpdateView}{\void}
-
-Called by the viewed object to update the view. The default implementation just returns
-FALSE.
-
-\membersection{wxPropertyView::SetPropertySheet}\label{wxpropertyviewsetpropertysheet}
-
-\func{void}{SetPropertySheet}{\param{wxPropertySheet *}{sheet}}
-
-Sets the property sheet for this view.
-
-\membersection{wxPropertyView::ShowView}\label{wxpropertyviewshowview}
-
-\func{void}{ShowView}{\param{wxPropertySheet *}{sheet}, \param{wxPanel *}{panel}}
-
-Associates this view with the given panel, and shows the view.
-
-\section{\class{wxRealFormValidator}: wxPropertyFormValidator}\label{wxrealformvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a range of real values for form views. The associated panel item must be a wxText.
-
-\membersection{wxRealFormValidator::wxRealFormValidator}
-
-\func{void}{wxRealFormValidator}{\param{float }{min=0.0}, \param{float }{max=0.0},
- \param{long}{ flags=0}}
-
-Constructor. Assigning zero to minimum and maximum values indicates that there is no range to check.
-
-
-\section{\class{wxStringFormValidator}: wxPropertyFormValidator}\label{wxstringformvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a string value for a form view, with an optional choice of possible values.
-The associated panel item must be a wxText, wxListBox or wxChoice. For wxListBox and wxChoice items,
-if the item is empty, the validator attempts to initialize the item from the strings in
-the validator. Note that this does not happen for XView wxChoice items since XView cannot reinitialize a wxChoice.
-\membersection{wxStringFormValidator::wxStringFormValidator}
-
-\func{void}{wxStringFormValidator}{\param{wxStringList *}{list=NULL}, \param{long}{ flags=0}}
-
-Constructor. Supply a list of strings to indicate a choice, or no strings to allow the
-user to freely edit the string. The string list will be deleted when the validator is deleted.
-
-
-\section{\class{wxRealListValidator}: wxPropertyListValidator}\label{wxreallistvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a range of real values for property lists.
-
-\membersection{wxRealListValidator::wxreallistvalidator}
-
-\func{void}{wxRealListValidator}{\param{float }{min=0.0}, \param{float }{max=0.0},
- \param{long}{ flags=wxPROP\_ALLOW\_TEXT\_EDITING}}
-
-Constructor. Assigning zero to minimum and maximum values indicates that there is no range to check.
-
-
-\section{\class{wxStringListValidator}: wxPropertyListValidator}\label{wxstringlistvalidator}
-
-\overview{Validator classes}{validatorclasses}
-
-This class validates a string value, with an optional choice of possible values.
-
-\membersection{wxStringListValidator::wxStringListValidator}
-
-\func{void}{wxStringListValidator}{\param{wxStringList *}{list=NULL}, \param{long}{ flags=0}}
-
-Constructor. Supply a list of strings to indicate a choice, or no strings to allow the
-user to freely edit the string. The string list will be deleted when the validator is deleted.
-
-
-\chapter{Classes by category}\label{classesbycat}
-
-A classification of property sheet classes by category.
-
-\section{Data classes}
-
-\begin{itemize}\itemsep=0pt
-\item \helpref{wxProperty}{wxproperty}
-\item \helpref{wxPropertyValue}{wxpropertyvalue}
-\item \helpref{wxPropertySheet}{wxpropertysheet}
-\end{itemize}
-
-
-\section{Validator classes}\label{validatorclasses}
-
-Validators check that the values the user has entered for a property are
-valid. They can also define specific ways of entering data, such as a
-file selector for a filename, and they are responsible for transferring
-values between the wxProperty and the physical display. 
-
-Base classes:
-
-\begin{itemize}\itemsep=0pt
-\item \helpref{wxPropertyValidator}{wxproperty}
-\item \helpref{wxPropertyListValidator}{wxpropertylistvalidator}
-\item \helpref{wxPropertyFormValidator}{wxpropertyformvalidator}
-\end{itemize}
-
-List view validators:
-
-\begin{itemize}\itemsep=0pt
-\item \helpref{wxBoolListValidator}{wxboollistvalidator}
-\item \helpref{wxFilenameListValidator}{wxfilenamelistvalidator}
-\item \helpref{wxIntegerListValidator}{wxintegerlistvalidator}
-\item \helpref{wxListOfStringsListValidator}{wxlistofstringslistvalidator}
-\item \helpref{wxRealListValidator}{wxreallistvalidator}
-\item \helpref{wxStringListValidator}{wxstringlistvalidator}
-\end{itemize}
-
-Form view validators:
-
-\begin{itemize}\itemsep=0pt
-\item \helpref{wxBoolFormValidator}{wxboolformvalidator}
-\item \helpref{wxIntegerFormValidator}{wxintegerformvalidator}
-\item \helpref{wxRealFormValidator}{wxrealformvalidator}
-\item \helpref{wxStringFormValidator}{wxstringformvalidator}
-\end{itemize}
-
-\section{View classes}\label{viewclasses}
-
-View classes mediate between a property sheet and a physical window.
-
-\begin{itemize}\itemsep=0pt
-\item \helpref{wxPropertyView}{wxpropertyview}
-\item \helpref{wxPropertyListView}{wxpropertylistview}
-\item \helpref{wxPropertyFormView}{wxpropertyformview}
-\end{itemize}
-
-\section{Window classes}\label{windowclasses}
-
-The class library defines some window classes that can be used as-is with a suitable
-view class and property sheet.
-
-\begin{itemize}\itemsep=0pt
-\item \helpref{wxPropertyFormFrame}{wxpropertyformframe}
-\item \helpref{wxPropertyFormDialog}{wxpropertyformdialog}
-\item \helpref{wxPropertyFormPanel}{wxpropertyformpanel}
-\item \helpref{wxPropertyListFrame}{wxpropertylistframe}
-\item \helpref{wxPropertyListDialog}{wxpropertylistdialog}
-\item \helpref{wxPropertyListPanel}{wxpropertylistpanel}
-\end{itemize}
-
-\section{Registry classes}
-
-A validator registry is a list of validators that can be applied to properties in a property sheet.
-There may be one or more registries per property view.
-
-\begin{itemize}\itemsep=0pt
-\item \helpref{wxPropertyValidatorRegistry}{wxpropertyvalidatorregistry}
-\end{itemize}
-
-
-\chapter{Topic overviews}\label{overviews}
-
-This chapter contains a selection of topic overviews.
-
-\section{Property classes overview}\label{propertyoverview}
-
-The property classes help a programmer to express relationships between
-data and physical windows, in particular:
-
-\begin{itemize}\itemsep=0pt
-\item the transfer of data to and from the physical controls;
-\item the behaviour of various controls and custom windows for particular
-types of data;
-\item the validation of data, notifying the user when incorrect data is entered,
-or even better, constraining the input so only valid data can be entered.
-\end{itemize}
-
-With a consistent framework, the programmer should be able to use existing
-components and design new ones in a principled manner, to solve many data entry
-requirements.
-
-Each datum is represented in a \helpref{wxProperty}{wxproperty}, which has a name and a value.
-Various C++ types are permitted in the value of a property, and the property can store a pointer
-to the data instead of a copy of the data. A \helpref{wxPropertySheet}{wxpropertysheet} represents a number of these properties.
-
-These two classes are independent from the way in which the data is visually manipulated. To
-mediate between property sheets and windows, the abstract class \helpref{wxPropertyView}{wxpropertyview} is
-available for programmers to derive new kinds of view. One kind of view that is available is the \helpref{wxPropertyListView}{wxpropertylistview},
-which displays the data in a Visual Basic-style list, with a small number of controls for editing
-the currently selected property. Another is \helpref{wxPropertyFormView}{wxpropertyformview} which
-mediates between an existing dialog or panel and the property sheet.
-
-The hard work of mediation is actually performed by validators, which are instances of classes
-derived from \helpref{wxPropertyValidator}{wxpropertyvalidator}. A validator is associated with
-a particular property and is responsible for
-responding to user interface events, and displaying, updating and checking the property value.
-Because a validator's behaviour depends largely on the kind of view being used, there has to be
-a separate hierarchy of validators for each class of view. So for wxPropertyListView, there is
-an abstract class \helpref{wxPropertyListValidator}{wxpropertylistvalidator} from which concrete
-classes are derived, such as \helpref{wxRealListValidator}{wxreallistvalidator} and
-\rtfsp\helpref{wxStringListValidator}{wxstringlistvalidator}.
-
-A validator can be explicitly set for a property, so there is no doubt which validator
-should be used to edit that property. However, it is also possible to define a registry
-of validators, and have the validator chosen on the basis of the {\it role} of the property.
-So a property with a ``filename" role would match the ``filename" validator, which pops
-up a file selector when the user double clicks on the property.
-
-You don't have to define your own frame or window classes: there are some predefined
-that will work with the property list view. See \helpref{Window classes}{windowclasses} for
-further details.
-
-\subsection{Example 1: Property list view}
-
-The following code fragment shows the essentials of creating a registry of
-standard validators, a property sheet containing some properties, and
-a property list view and dialog or frame. RegisterValidators will be
-called on program start, and PropertySheetTest is called in response to a
-menu command.
-
-Note how some properties are created with an explicit reference to
-a validator, and others are provided with a ``role'' which can be matched
-against a validator in the registry.
-
-The interface generated by this test program is shown in the section \helpref{Appearance and
-behaviour of a property list view}{appearance}.
-
-\begin{verbatim}
-void RegisterValidators(void)
-{
-  myListValidatorRegistry.RegisterValidator((wxString)"real", new wxRealListValidator);
-  myListValidatorRegistry.RegisterValidator((wxString)"string", new wxStringListValidator);
-  myListValidatorRegistry.RegisterValidator((wxString)"integer", new wxIntegerListValidator);
-  myListValidatorRegistry.RegisterValidator((wxString)"bool", new wxBoolListValidator);
-}
-
-void PropertyListTest(Bool useDialog)
-{
-  wxPropertySheet *sheet = new wxPropertySheet;
-
-  sheet->AddProperty(new wxProperty("fred", 1.0, "real"));
-  sheet->AddProperty(new wxProperty("tough choice", (Bool)TRUE, "bool"));
-  sheet->AddProperty(new wxProperty("ian", (long)45, "integer", new wxIntegerListValidator(-50, 50)));
-  sheet->AddProperty(new wxProperty("bill", 25.0, "real", new wxRealListValidator(0.0, 100.0)));
-  sheet->AddProperty(new wxProperty("julian", "one", "string"));
-  sheet->AddProperty(new wxProperty("bitmap", "none", "string", new wxFilenameListValidator("Select a bitmap file", "*.bmp")));
-  wxStringList *strings = new wxStringList("one", "two", "three", NULL);
-  sheet->AddProperty(new wxProperty("constrained", "one", "string", new wxStringListValidator(strings)));
-
-  wxPropertyListView *view =
-    new wxPropertyListView(NULL,
-     wxPROP_BUTTON_CHECK_CROSS|wxPROP_DYNAMIC_VALUE_FIELD|wxPROP_PULLDOWN);
-
-  wxDialogBox *propDialog = NULL;
-  wxPropertyListFrame *propFrame = NULL;
-  if (useDialog)
-  {
-    propDialog = new wxPropertyListDialog(view, NULL, "Property Sheet Test", TRUE, -1, -1, 400, 500);
-  }
-  else
-  {
-    propFrame = new wxPropertyListFrame(view, NULL, "Property Sheet Test", -1, -1, 400, 500);
-  }
-  
-  view->AddRegistry(&myListValidatorRegistry);
-
-  if (useDialog)
-  {
-    view->ShowView(sheet, propDialog);
-    propDialog->Centre(wxBOTH);
-    propDialog->Show(TRUE);
-  }
-  else
-  {
-    propFrame->Initialize();
-    view->ShowView(sheet, propFrame->GetPropertyPanel());
-    propFrame->Centre(wxBOTH);
-    propFrame->Show(TRUE);
-  }
-}
-\end{verbatim}
-
-\subsection{Example 2: Property form view}
-
-This example is similar to Example 1, but uses a property form view to
-edit a property sheet using a predefined dialog box.
-
-\begin{verbatim}
-void RegisterValidators(void)
-{
-  myFormValidatorRegistry.RegisterValidator((wxString)"real", new wxRealFormValidator);
-  myFormValidatorRegistry.RegisterValidator((wxString)"string", new wxStringFormValidator);
-  myFormValidatorRegistry.RegisterValidator((wxString)"integer", new wxIntegerFormValidator);
-  myFormValidatorRegistry.RegisterValidator((wxString)"bool", new wxBoolFormValidator);
-}
-
-void PropertyFormTest(Bool useDialog)
-{
-  wxPropertySheet *sheet = new wxPropertySheet;
-
-  sheet->AddProperty(new wxProperty("fred", 25.0, "real", new wxRealFormValidator(0.0, 100.0)));
-  sheet->AddProperty(new wxProperty("tough choice", (Bool)TRUE, "bool"));
-  sheet->AddProperty(new wxProperty("ian", (long)45, "integer", new wxIntegerFormValidator(-50, 50)));
-  sheet->AddProperty(new wxProperty("julian", "one", "string"));
-  wxStringList *strings = new wxStringList("one", "two", "three", NULL);
-  sheet->AddProperty(new wxProperty("constrained", "one", "string", new wxStringFormValidator(strings)));
-
-  wxPropertyFormView *view = new wxPropertyFormView(NULL);
-
-  wxDialogBox *propDialog = NULL;
-  wxPropertyFormFrame *propFrame = NULL;
-  if (useDialog)
-  {
-    propDialog = new wxPropertyFormDialog(view, NULL, "Property Form Test", TRUE, -1, -1, 400, 300);
-  }
-  else
-  {
-    propFrame = new wxPropertyFormFrame(view, NULL, "Property Form Test", -1, -1, 400, 300);
-    propFrame->Initialize();
-  }
-  
-  wxPanel *panel = propDialog ? propDialog : propFrame->GetPropertyPanel();
-  panel->SetLabelPosition(wxVERTICAL);
-  
-  // Add items to the panel
-  
-  (void) new wxButton(panel, (wxFunction)NULL, "OK", -1, -1, -1, -1, 0, "ok");
-  (void) new wxButton(panel, (wxFunction)NULL, "Cancel", -1, -1, 80, -1, 0, "cancel");
-  (void) new wxButton(panel, (wxFunction)NULL, "Update", -1, -1, 80, -1, 0, "update");
-  (void) new wxButton(panel, (wxFunction)NULL, "Revert", -1, -1, -1, -1, 0, "revert");
-  panel->NewLine();
-  
-  // The name of this text item matches the "fred" property
-  (void) new wxText(panel, (wxFunction)NULL, "Fred", "", -1, -1, 90, -1, 0, "fred");
-  (void) new wxCheckBox(panel, (wxFunction)NULL, "Yes or no", -1, -1, -1, -1, 0, "tough choice");
-  (void) new wxSlider(panel, (wxFunction)NULL, "Sliding scale", 0, -50, 50, 100, -1, -1, wxHORIZONTAL, "ian");
-  panel->NewLine();
-  (void) new wxListBox(panel, (wxFunction)NULL, "Constrained", wxSINGLE, -1, -1, 100, 90, 0, NULL, 0, "constrained");
-
-  view->AddRegistry(&myFormValidatorRegistry);
-
-  if (useDialog)
-  {
-    view->ShowView(sheet, propDialog);
-    view->AssociateNames();
-    view->TransferToDialog();
-    propDialog->Centre(wxBOTH);
-    propDialog->Show(TRUE);
-  }
-  else
-  {
-    view->ShowView(sheet, propFrame->GetPropertyPanel());
-    view->AssociateNames();
-    view->TransferToDialog();
-    propFrame->Centre(wxBOTH);
-    propFrame->Show(TRUE);
-  }
-}
-\end{verbatim}
-
-\section{Validator classes overview}\label{validatoroverview}
-
-Classes: \helpref{Validator classes}{validatorclasses}
-
-The validator classes provide functionality for mediating between a wxProperty and
-the actual display. There is a separate family of validator classes for each
-class of view, since the differences in user interface for these views implies
-that little common functionality can be shared amongst validators.
-
-\subsection{wxPropertyValidator overview}\label{wxpropertyvalidatoroverview}
-
-Class: \helpref{wxPropertyValidator}{wxpropertyvalidator}
-
-This class is the root of all property validator classes. It contains a small
-amount of common functionality, including functions to convert between
-strings and C++ values.
-
-A validator is notionally an object which sits between a property and its displayed
-value, and checks that the value the user enters is correct, giving an error message
-if the validation fails. In fact, the validator does more than that, and is akin to
-a view class but at a finer level of detail. It is also responsible for
-loading the dialog box control with the value from the property, putting it back
-into the property, preparing special controls for editing the value, and
-may even invoke special dialogs for editing the value in a convenient way.
-
-In a property list dialog, there is quite a lot of scope for supplying custom dialogs,
-such as file or colour selectors. For a form dialog, there is less scope because
-there is no concept of `detailed editing' of a value: one control is associated with
-one property, and there is no provision for invoking further dialogs. The reader
-may like to work out how the form view could be extended to provide some of the
-functionality of the property list!
-
-Validator objects may be associated explictly with a wxProperty, or they may be
-indirectly associated by virtue of a property `kind' that matches validators having
-that kind. In the latter case, such validators are stored in a validator registry
-which is passed to the view before the dialog is shown. If the validator takes
-arguments, such as minimum and maximum values in the case of a wxIntegerListValidator,
-then the validator must be associated explicitly with the property. The validator
-will be deleted when the property is deleted.
-
-\subsection{wxPropertyListValidator overview}\label{wxpropertylistvalidatoroverview}
-
-Class: \helpref{wxPropertyListValidator}{wxpropertylistvalidator}
-
-This class is the abstract base class for property list view validators.
-The list view acts upon a user interface containing a list of properties,
-a text item for direct property value editing, confirm/cancel buttons for the value,
-a pulldown list for making a choice between values, and OK/Cancel/Help buttons
-for the dialog (see \helpref{property list appearance}{appearance}).
-
-By overriding virtual functions, the programmer can create custom
-behaviour for different kinds of property. Custom behaviour can use just the
-available controls on the property list dialog, or the validator can
-invoke custom editors with quite different controls, which pop up in
-`detailed editing' mode.
-
-See the detailed class documentation for the members you should override
-to give your validator appropriate behaviour.
-
-\subsection{wxPropertyFormValidator overview}\label{wxpropertyformvalidatoroverview}
-
-This class is the abstract base class for property form view validators.
-The form view acts upon an existing dialog box or panel, where either the
-panel item names correspond to property names, or the programmer has explicitly
-associated the panel item with the property.
-
-By overriding virtual functions, the programmer determines how
-values are displayed or retrieved, and the checking that the validator does.
-
-See the detailed class documentation for the members you should override
-to give your validator appropriate behaviour.
-
-\section{View classes overview}\label{viewoverview}
-
-Classes: \helpref{View classes}{viewclasses}
-
-An instance of a view class relates a property sheet with an actual window.
-Currently, there are two classes of view: wxPropertyListView and wxPropertyFormView.
-
-\subsection{wxPropertyView overview}\label{wxpropertyviewoverview}
-
-Class: \helpref{wxPropertyView}{wxpropertyview}
-
-This is the abstract base class for property views.
-
-\subsection{wxPropertyListView overview}\label{wxpropertylistviewoverview}
-
-Class: \helpref{wxPropertyListView}{wxpropertylistview}
-
-The property list view defines the relationship between a property sheet and
-a property list dialog or panel. It manages user interface events such as
-clicking on a property, pressing return in the text edit field, and clicking
-on Confirm or Cancel. These events cause member functions of the
-class to be called, and these in turn may call member functions of
-the appropriate validator to be called, to prepare controls, check the property value,
-invoke detailed editing, etc.
-
-\subsection{wxPropertyFormView overview}\label{wxpropertyformviewoverview}
-
-Class: \helpref{wxPropertyFormView}{wxpropertyformview}
-
-The property form view manages the relationship between a property sheet
-and an existing dialog or panel.
-
-You must first create a panel or dialog box for the view to work on.
-The panel should contain panel items with names that correspond to
-properties in your property sheet; or you can explicitly set the
-panel item for each property.
-
-Apart from any custom panel items that you wish to control independently
-of the property-editing items, wxPropertyFormView takes over the
-processing of item events. It can also control normal dialog behaviour such
-as OK, Cancel, so you should also create some standard buttons that the property view
-can recognise. Just create the buttons with standard names and the view
-will do the rest. The following button names are recognised:
-
-\begin{itemize}\itemsep=0pt
-\item {\bf ok}: indicates the OK button. Calls wxPropertyFormView::OnOk. By default,
-checks and updates the form values, closes and deletes the frame or dialog, then deletes the view.
-\item {\bf cancel}: indicates the Cancel button. Calls wxPropertyFormView::OnCancel. By default,
-closes and deletes the frame or dialog, then deletes the view.
-\item {\bf help}: indicates the Help button. Calls wxPropertyFormView::OnHelp. This needs
-to be overridden by the application for anything interesting to happen.
-\item {\bf revert}: indicates the Revert button. Calls wxPropertyFormView::OnRevert,
-which by default transfers the wxProperty values to the panel items (in effect
-undoing any unsaved changes in the items).
-\item {\bf update}: indicates the Revert button. Calls wxPropertyFormView::OnUpdate, which
-by defaults transfers the displayed values to the wxProperty objects.
-\end{itemize}
-
-\section{wxPropertySheet overview}\label{wxpropertysheetoverview}
-
-Classes: \helpref{wxPropertySheet}{wxpropertysheet}, \helpref{wxProperty}{wxproperty}, \helpref{wxPropertyValue}{wxpropertyvalue}
-
-A property sheet defines zero or more properties. This is a bit like an explicit representation of
-a C++ object. wxProperty objects can have values which are pointers to C++ values, or they
-can allocate their own storage for values.
-
-Because the property sheet representation is explicit and can be manipulated by
-a program, it is a convenient form to be used for a variety of
-editing purposes. wxPropertyListView and wxPropertyFormView are two classes that
-specify the relationship between a property sheet and a user interface. You could imagine
-other uses for wxPropertySheet, for example to generate a form-like user interface without
-the need for GUI programming. Or for storing the names and values of command-line switches, with the
-option to subsequently edit these values using a wxPropertyListView.
-
-A typical use for a property sheet is to represent values of an object
-which are only implicit in the current representation of it. For
-example, in Visual Basic and similar programming environments, you can
-`edit a button', or rather, edit the button's properties.  One of the
-properties you can edit is {\it width} - but there is no explicit
-representation of width in a wxWindows button; instead, you call SetSize
-and GetSize members. To translate this into a consisent,
-property-oriented scheme, we could derive a new class
-wxButtonWithProperties, which has two new functions: SetProperty and
-GetProperty.  SetProperty accepts a property name and a value, and calls
-an appropriate function for the property that is being passed.
-GetProperty accepts a property name, returning a property value. So
-instead of having to use the usual arbitrary set of C++ member functions
-to set or access attributes of a window, programmer deals merely with
-SetValue/GetValue, and property names and values.
-We now have a single point at which we can modify or query an object by specifying
-names and values at run-time. (The implementation of SetProperty and GetProperty
-is probably quite messy and involves a large if-then-else statement to
-test the property name and act accordingly.)
-
-When the user invokes the property editor for a wxButtonWithProperties, the system
-creates a wxPropertySheet with `imaginary' properties such as width, height, font size
-and so on. For each property, wxButtonWithProperties::GetProperty is called, and the result is
-passed to the corresponding wxProperty. The wxPropertySheet is passed to a wxPropertyListView
-as described elsewhere, and the user edits away. When the user has finished editing, the system calls
-wxButtonWithProperties::SetProperty to transfer the wxProperty value back into the button
-by way of an appropriate call, wxWindow::SetSize in the case of width and height properties.
-
-\end{comment}
\ No newline at end of file
index f750ddf9fab83e2fc54ca328e4b5597bb120a236..795717a2ee77e20cd174dbec4a5a7f9a5f993a8f 100644 (file)
@@ -5,11 +5,9 @@
 %\special{!/@scaleunit 1 def}
 \parskip=10pt
 \parindent=0pt
-\title{User Manual for wxWindows Dialog Editor Version 1.7}
-\winhelponly{\author{by Julian Smart, A.I. Applications Institute, University of Edinburgh\\}}
-\winhelpignore{\author{Julian Smart\\Artificial Intelligence Applications Institute\\
-University of Edinburgh\\EH1 1HN}
-\date{March 1997}
+\title{User Manual for wxWindows Dialog Editor Version 2.0}
+\winhelponly{\author{by Julian Smart, Anthemion Software}
+\date{December 1998}
 }
 \makeindex
 \begin{document}
@@ -26,36 +24,20 @@ University of Edinburgh\\EH1 1HN}
 \setfooter{\thepage}{}{}{}{}{\thepage}%
 
 \begin{center}
-Copyright (c) 1996 Artificial Intelligence Applications Institute,
-The University of Edinburgh\\
+Copyright (c) 1998 Julian Smart et al
 \end{center}
 
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose is hereby granted without fee, provided that the
-above copyright notice, author statement and this permission notice appear in
-all copies of this software and related documentation.
-
-THE SOFTWARE IS PROVIDED ``AS-IS'' AND WITHOUT WARRANTY OF ANY KIND, EXPRESS,
-IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-
-IN NO EVENT SHALL THE ARTIFICIAL INTELLIGENCE APPLICATIONS INSTITUTE OR THE
-UNIVERSITY OF EDINBURGH BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR
-CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM
-LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF
-DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH
-THE USE OR PERFORMANCE OF THIS SOFTWARE.
+Please see the wxWindows licence for licensing details.
 
 \input{body.tex}
-\input{classes.tex}
 \input{changes.tex}
 \input{bugs.tex}
 \input{tech.tex}
 
-\newpage
-
-\addcontentsline{toc}{chapter}{Index}
+%\newpage
+%
+\addcontentsline{toc}{chapter}{Index}%
+\printindex%
 \setheader{{\it INDEX}}{}{}{}{}{{\it INDEX}}%
 \setfooter{\thepage}{}{}{}{}{\thepage}%
-\printindex
 \end{document}
index c4bf48b578f89bcb34c743ca97963980b13f0332..02414a2cb467afcae147a2e793ac45128e5a0ebc 100644 (file)
@@ -17,12 +17,10 @@ BIN_OBJ=dialoged.o dlghndlr.o edlist.o edtree.o \
   reseditr.o reswrite.o symbtabl.o winprop.o winstyle.o
   
 # additional things needed to link
-BIN_LINK= \
-  -lwx_prop_gtk
+BIN_LINK=
 
 # additional things needed to compile
-ADD_COMPILE= \
-  -I../../../wxprop/src
+ADD_COMPILE=
 
 # include the definitions now
 include ../../../../template.mak
index 0b128c275ae8a7e935160357970f3eb683c6bf66..ba3be91fd94fe819d9a00647983c339d3761c7b5 100644 (file)
@@ -149,6 +149,20 @@ void wxResourceEditorDialogHandler::OnLeftClick(int x, int y, int keys)
     return;
   }
 
+  // Round down to take account of dialog units
+  wxItemResource* resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(handlerDialog);
+  if (resource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
+  {
+        wxPoint pt = handlerDialog->ConvertPixelsToDialog(wxPoint(x, y));
+
+        // Convert back so we've rounded down
+        pt = handlerDialog->ConvertDialogToPixels(pt);
+        pt = handlerDialog->ConvertPixelsToDialog(pt);
+        pt = handlerDialog->ConvertDialogToPixels(pt);
+        x = pt.x;
+        y = pt.y;
+  }
+
   switch (wxResourceManager::GetCurrentResourceManager()->GetEditorControlList()->GetSelection())
   {
         case RESED_BUTTON:
@@ -1000,34 +1014,66 @@ void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys),
         height1 = (ypos + height) - y;
         break;
     }
-    handlerControl->SetSize(x1, y1, width1, height1);
-
-    // Also update the associated resource
+    // Update the associated resource
     // We need to convert to dialog units if this is not a dialog or panel, but
     // the parent resource specifies dialog units.
+    int resourceX = x1;
+    int resourceY = y1;
+    int resourceWidth = width1;
+    int resourceHeight = height1;
+
     if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
     {
         wxPoint pt = handlerControl->GetParent()->ConvertPixelsToDialog(wxPoint(x1, y1));
-        x1 = pt.x; y1 = pt.y;
         wxSize sz = handlerControl->GetParent()->ConvertPixelsToDialog(wxSize(width1, height1));
-        width1 = sz.x; height1 = sz.y;
+
+        // Convert back so we've rounded down
+        sz = handlerControl->GetParent()->ConvertDialogToPixels(sz);
+        sz = handlerControl->GetParent()->ConvertPixelsToDialog(sz);
+        resourceWidth = sz.x; resourceHeight = sz.y;
+
+        sz = handlerControl->GetParent()->ConvertDialogToPixels(sz);
+        width1 = sz.x;
+        height1 = sz.y;
+
+        pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
+        pt = handlerControl->GetParent()->ConvertPixelsToDialog(pt);
+        resourceX = pt.x; resourceY = pt.y;
+
+        pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
+        x1 = pt.x;
+        y1 = pt.y;
     }
-    resource->SetSize(x1, y1, width1, height1);
+    handlerControl->SetSize(x1, y1, width1, height1);
+    resource->SetSize(resourceX, resourceY, resourceWidth, resourceHeight);
   }
   else
   {
+    // Correction 31/12/98. We need to round down the values to take into account
+    // the fact that several pixels map to the same dialog unit.
+
     int newX = (int)(x - dragOffsetX);
     int newY = (int)(y - dragOffsetY);
-    handlerControl->Move(newX, newY);
-    OldOnMove(newX, newY);
+    int resourceX = newX;
+    int resourceY = newY;
 
-    // Also update the associated resource
+    // Update the associated resource
     if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
     {
         wxPoint pt = handlerControl->GetParent()->ConvertPixelsToDialog(wxPoint(newX, newY));
-        newX = pt.x; newY = pt.y;
+        pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
+        pt = handlerControl->GetParent()->ConvertPixelsToDialog(pt);
+        resourceX = pt.x; resourceY = pt.y;
+        pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
+
+        // Having converted it several times, we know it'll map to dialog units exactly.
+        newX = pt.x;
+        newY = pt.y;
     }
-    resource->SetSize(newX, newY, resource->GetWidth(), resource->GetHeight());
+    handlerControl->Move(newX, newY);
+    OldOnMove(newX, newY);
+
+    resource->SetSize(resourceX, resourceY, resource->GetWidth(), resource->GetHeight());
 
     // Also move other selected items
     wxNode *node = panel->GetChildren().First();
@@ -1044,18 +1090,28 @@ void wxResourceEditorControlHandler::OnDragEnd(int x, int y, int WXUNUSED(keys),
           item->GetPosition(&x1, &y1);
           int x2 = (int)(x1 + (x - dragOffsetX) - xpos);
           int y2 = (int)(y1 + (y - dragOffsetY) - ypos);
-          item->Move(x2, y2);
-          ((wxResourceEditorControlHandler *)item->GetEventHandler())->OldOnMove(x2, y2);
-          ((wxResourceEditorControlHandler *)item->GetEventHandler())->DrawSelectionHandles(dc);
 
-          // Also update the associated resource
+          // Update the associated resource
           resource = wxResourceManager::GetCurrentResourceManager()->FindResourceForWindow(item);
           if (parentResource->GetResourceStyle() & wxRESOURCE_DIALOG_UNITS)
           {
-            wxPoint pt = item->GetParent()->ConvertPixelsToDialog(wxPoint(newX, newY));
-            x2 = pt.x; y2 = pt.y;
+            wxPoint pt = item->GetParent()->ConvertPixelsToDialog(wxPoint(x2, y2));
+            pt = item->GetParent()->ConvertDialogToPixels(pt);
+            pt = item->GetParent()->ConvertPixelsToDialog(pt);
+
+            resourceX = pt.x; resourceY = pt.y;
+            pt = handlerControl->GetParent()->ConvertDialogToPixels(pt);
+
+            // Having converted it several times, we know it'll map to dialog units exactly
+            x2 = pt.x;
+            y2 = pt.y;
           }
-          resource->SetSize(x2, y2, resource->GetWidth(), resource->GetHeight());
+
+          item->Move(x2, y2);
+          ((wxResourceEditorControlHandler *)item->GetEventHandler())->OldOnMove(x2, y2);
+          ((wxResourceEditorControlHandler *)item->GetEventHandler())->DrawSelectionHandles(dc);
+
+          resource->SetSize(resourceX, resourceY, resource->GetWidth(), resource->GetHeight());
 
         }
       }
index a2f173a974121016f70f4d175f51a15bc4063a3d..80d932b105db3aa87a11058ad371b7f8c8dc71c9 100644 (file)
@@ -16,13 +16,9 @@ WXDIR = $(WXWIN)
 
 WXLIBDIR = $(WXDIR)\lib
 WXINC = $(WXDIR)\include\msw
-WXBASESRC = $(WXDIR)\src\base
 WXBASEINC = $(WXDIR)\include\base
 WXLIB = $(WXLIBDIR)\wx32.lib
-WXPROPDIR = $(WXDIR)\utils\wxprop
-WXPROPINC = $(WXPROPDIR)\src
-WXPROPLIB = $(WXDIR)\lib\wxprop.lib
-LIBS=$(WXLIB) $(WXPROPLIB) cw32 import32 ole2w32
+LIBS=$(WXLIB) cw32 import32 ole2w32
 INCFILE = includes.cfg
 
 TARGET=dialoged
@@ -40,7 +36,7 @@ CPPFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG) @$(INCFILE)
 
 OBJECTS = dialoged.obj reseditr.obj dlghndlr.obj reswrite.obj winprop.obj edtree.obj edlist.obj symbtable.obj winstyle.obj
 
-$(TARGET).exe: wxprop $(INCFILE) $(OBJECTS) $(TARGET).def $(TARGET).res
+$(TARGET).exe: $(INCFILE) $(OBJECTS) $(TARGET).def $(TARGET).res
   tlink32 $(LINKFLAGS) @&&!
 c0w32.obj $(OBJECTS)
 $(TARGET)
@@ -58,11 +54,6 @@ $(INCFILE):  $(MAKEFILENAME)
 $(TARGET).res :      $(TARGET).rc $(WXDIR)\include\msw\wx.rc
     brc32 -r /i$(BCCDIR)\include /i$(WXDIR)\include\msw /i$(WXDIR)\contrib\fafa $(TARGET)
 
-wxprop:
-    cd $(WXPROPDIR)\src
-    make -f makefile.b32
-    cd $(WXDIR)\utils\dialoged\src
-    
 clean:
         -erase *.obj *.exe *.res *.map *.rws
 
index 0214c5498680149111e256da9888394eec1f305b..d38642a5678e281608c47c6a77067048327a87ea 100644 (file)
@@ -1,87 +1,20 @@
 #
 # File:                makefile.bcc
 # Author:      Julian Smart
-# Created:     1993
+# Created:     1998
 # Updated:     
-# Copyright:   (c) 1993, AIAI, University of Edinburgh
 #
-# "%W% %G%"
-#
-# Makefile : Builds Dialog Editor (Borland, 16-bit)
-
-!if "$(BCCDIR)" == ""
-!error You must define the BCCDIR variable in autoexec.bat, e.g. BCCDIR=d:\bc4
-!endif
+# Builds a BC++ 16-bit Dialog Editor
 
 !if "$(WXWIN)" == ""
 !error You must define the WXWIN variable in autoexec.bat, e.g. WXWIN=c:\wx
 !endif
 
-!ifndef FINAL
-FINAL=0
-!endif
-
 WXDIR = $(WXWIN)
-!include $(WXDIR)\src\makebcc.env
-
-THISDIR = $(WXDIR)\utils\dialoged\src
-WXLIB = $(WXDIR)\lib\wx.lib
-WXPROPDIR = $(WXDIR)\utils\wxprop
-WXPROPINC = $(WXPROPDIR)\src
-WXPROPLIB = $(WXPROPDIR)\lib\wxprop.lib
-
-LIBS=$(WXLIB) $(WXPROPLIB) mathwl cwl import
-INC=-I$(WXDIR)\include\base -I$(WXDIR)\include\msw
-CFG=$(WXDIR)\src\wxwin.cfg
-INCFILE = includes.cfg
-
-
-!if "$(FINAL)" == "0"
-LINKFLAGS=/v/Vt /Twe /L$(WXDIR)\lib;$(BCCDIR)\lib
-OPT = -Od
-DEBUG_FLAGS= -v
-!else
-LINKFLAGS=/Twe /L$(WXDIR)\lib;$(BCCDIR)\lib
-OPT = -O2
-DEBUG_FLAGS =
-!endif
-CPPFLAGS=$(DEBUG_FLAGS) $(OPT) @$(CFG) @$(INCFILE)
-
-OBJECTS = wx_resed.obj wx_rdlg.obj wx_reswr.obj wx_repal.obj wx_rprop.obj dialoged.obj
-
-all:    dialoged.exe
-
-dialoged.exe:      $(INCFILE) $(WXLIB) $(OBJECTS) dialoged.def dialoged.res
-        tlink $(LINKFLAGS) @&&!
-c0wl.obj $(OBJECTS)
-dialoged
-nul
-$(LIBS) $(WXPROPLIB)
-dialoged.def
-!
-        rc -30 -K dialoged.res
-
-.$(SRCSUFF).obj:
-       bcc $(CPPFLAGS) -c {$< }
-
-dialoged.obj:      dialoged.$(SRCSUFF) wx_resed.h
-wx_resed.obj:      wx_resed.$(SRCSUFF) wx_resed.h wx_rprop.h
-wx_resed.obj:      wx_rdlg.$(SRCSUFF) wx_resed.h wx_rprop.h
-wx_rprop.obj:      wx_rprop.$(SRCSUFF) wx_resed.h wx_rprop.h
-wx_reswr.obj:      wx_reswr.$(SRCSUFF) wx_resed.h
-wx_repal.obj:      wx_repal.$(SRCSUFF) wx_repal.h
 
-dialoged.res :      dialoged.rc $(WXDIR)\include\msw\wx.rc
-    rc -r /i$(BCCDIR)\include /i$(WXDIR)\include\msw /i$(WXDIR)\contrib\fafa dialoged
+TARGET=dialoged
+OBJECTS=dialoged.obj reseditr.obj dlghndlr.obj reswrite.obj\
+  winprop.obj edtree.obj edlist.obj symbtabl.obj winstyle.obj
 
-$(INCFILE):    $(MAKEFILENAME)
-       copy &&!
--I..\..\wxprop\src
-! $(INCFILE)
+!include $(WXDIR)\src\makeprog.bcc
 
-clean:
-        -erase *.obj
-        -erase *.exe
-        -erase *.res
-        -erase *.map
-        -erase *.rws
index e32a94e8ddc327d32d3383e0c170a1da40272ce0..04fa91936afeee90263f7aefc0379300619d5c4b 100644 (file)
@@ -20,23 +20,8 @@ WXLIB = $(WXDIR)\lib\wx.lib
 
 DOCDIR = $(WXDIR)\utils\dialoged\docs
 
-PROPDIR = $(WXDIR)\utils\wxprop
-PROPINC = $(PROPDIR)\src
-PROPLIB = $(PROPDIR)\lib\wxprop.lib
 
-TREEDIR = $(WXDIR)\utils\wxtree
-TREEINC = $(TREEDIR)\src
-TREELIB = $(TREEDIR)\lib\wxtree.lib
-
-DIBDIR = $(WXDIR)\utils\dib
-DIBLIB = $(DIBDIR)\dib.lib
-DIBINC = $(DIBDIR)
-
-RCDIR = $(WXDIR)\utils\rcparser
-RCLIB = $(RCDIR)\lib\rcparser.lib
-RCINC = $(RCDIR)\src
-
-LIBS=$(WXLIB) $(PROPLIB) oldnames libw llibcew commdlg shell ddeml
+LIBS=$(WXLIB) oldnames libw llibcew commdlg shell ddeml
 INC=/I$(WXDIR)\include\base /I$(WXDIR)\include\msw /I$(PROPINC)
 
 !ifndef FINAL
index 0dddc4198684bae87af888dbfa8dd80d46130f18..2d9bf8889291c09c63c87135add651107f24a0d2 100644 (file)
 # Set WXDIR for your system
 WXDIR = $(WXWIN)
 THISDIR = $(WXDIR)\utils\dialoged\src
-PROPDIR = $(WXDIR)\utils\wxprop
-PROPLIB=$(PROPDIR)\lib\wxprop.lib
-EXTRALIBS=$(PROPDIR)\lib\wxprop.lib
-EXTRAINC=/I$(PROPDIR)\src
 DOCDIR=$(WXDIR)\docs
 LOCALDOCDIR=$(WXDIR)\utils\dialoged\docs
 
@@ -28,7 +24,7 @@ PROGRAM=dialoged
 OBJECTS = dialoged.obj reseditr.obj dlghndlr.obj reswrite.obj\
   winprop.obj edtree.obj edlist.obj symbtabl.obj winstyle.obj
 
-all:    wxprop dialoged.exe
+all:    dialoged.exe
 
 wx:
         cd $(WXDIR)\src\msw
@@ -40,7 +36,7 @@ wxclean:
         nmake -f makefile.nt clean
         cd $(THISDIR)
 
-$(PROGRAM).exe:      $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(PROPLIB) $(PROGRAM).res
+$(PROGRAM).exe:      $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(PROGRAM).res
        $(link) @<<
 -out:$(PROGRAM).exe
 $(LINKFLAGS)
@@ -96,16 +92,6 @@ $(CPPFLAGS) /c /Tp $*.$(SRCSUFF)
 $(PROGRAM).res :      $(PROGRAM).rc $(WXDIR)\include\wx\msw\wx.rc
     $(rc) -r /i$(WXDIR)\include -fo$@ $(PROGRAM).rc
 
-wxprop:
-    cd $(PROPDIR)\src
-    nmake -f makefile.nt FINAL=$(FINAL)
-    cd $(THISDIR)
-
-clean_wxprop:
-    cd $(PROPDIR)\src
-    nmake -f makefile.nt clean
-    cd $(THISDIR)
-
 clean:
         -erase *.obj
         -erase *.sbr
index f87d66aab051b5bbd11c8afcce8cc631512429a2..df334829488daf6bff9d7e1eb991daa847b9330a 100644 (file)
 #
 # File:                makefile.unx
 # Author:      Julian Smart
-# Created:     1993
+# Created:     1998
 # Updated:     
-# Copyright:   (c) 1993, AIAI, University of Edinburgh
+# Copyright:   (c) 1998 Julian Smart
 #
 # "%W% %G%"
 #
-# Makefile for dialoged example (UNIX).
+# Makefile for Dialog Editor (Unix)
 
-WXDIR = ../../..
+PROGRAM=dialoged
 
-# All common UNIX compiler flags and options are now in
-# this central makefile.
-include $(WXDIR)/src/make.env
+OBJECTS = dialoged.o reseditr.o dlghndlr.o reswrite.o\
+  winprop.o edtree.o edlist.o symbtabl.o winstyle.o
 
-WXPROPDIR = $(WXDIR)/utils/wxprop
-WXPROPINC = $(WXDIR)/utils/wxprop/src
-WXPROPLIB = $(WXDIR)/utils/wxprop/lib
+include ../../../src/makeprog.env
 
-DIALOGEDDIR = $(WXDIR)/utils/dialoged
-
-OBJECTS = $(OBJDIR)/dialoged.o $(OBJDIR)/wx_repal.o $(OBJDIR)/wx_resed.o $(OBJDIR)/wx_rdlg.o $(OBJDIR)/wx_reswr.o $(OBJDIR)/wx_rprop.o
-
-
-INC = $(COMPPATHS) -I$(WXDIR)/include/x -I$(WXDIR)/include/base -I$(WXPROPINC)
-
-XVIEWLDLIBS = -lwxprop_ol -lwx_ol -lxview -lolgx -lX11 -lm $(COMPLIBS)
-MOTIFLDLIBS = -lwxprop_motif -lwx_motif -lXm -lXt -lX11 -lm $(COMPLIBS)
-HPLDLIBS = -lwxprop_hp -lwx_hp -lXm -lXt -lX11 -lm $(HPCOMPLIBS)
-# Default
-LDLIBS=$(XVIEWLDLIBS)
-
-CPPFLAGS = $(XINCLUDE) $(INC) $(OPTIONS) $(GUI) -DDEBUG='$(DEBUG)' $(DEBUGFLAGS) $(WARN) $(OPT)
-LDFLAGS = $(XLIB) -L$(WXDIR)/lib -L$(WXPROPLIB)
-
-.SUFFIXES:
-
-all:    $(OBJDIR) dialoged$(GUISUFFIX)
-
-wx_ol:
-       cd $(WXDIR)/src/x; $(MAKE) -f makefile.unx xview
-
-wx_motif:
-       cd $(WXDIR)/src/x; $(MAKE) -f makefile.unx motif
-
-motif:
-       $(MAKE) -f makefile.unx dialoged_motif GUISUFFIX=_motif GUI=-Dwx_motif GUISUFFIX=_motif OPT='$(OPT)' LDLIBS='$(MOTIFLDLIBS)'\
- OPTIONS='$(OPTIONS)' DEBUG='$(DEBUG)' DEBUGFLAGS='$(DEBUGFLAGS)' WARN='$(WARN)' XLIB='$(XLIB)' XINCLUDE='$(XINCLUDE)' XVIEW_LINK=
-
-xview:
-       $(MAKE) -f makefile.unx dialoged_ol GUI=-Dwx_xview GUISUFFIX=_ol CC=$(CC) OPTIONS='$(OPTIONS)'\
- DEBUG='$(DEBUG)' DEBUGFLAGS='$(DEBUGFLAGS)' WARN='$(WARN)' XLIB='$(XLIB)' XINCLUDE='$(XINCLUDE)'
-
-hp:
-       $(MAKE) -f makefile.unx GUI=-Dwx_motif GUISUFFIX=_hp CC=CC DEBUG='$(DEBUG)' DEBUGFLAGS='$(DEBUGFLAGS)' WARN='-w' \
-         XINCLUDE='$(HPXINCLUDE)' XLIB='$(HPXLIB)' XVIEW_LINK='' LDLIBS='$(HPLDLIBS)'
-
-$(OBJDIR):
-       mkdir $(OBJDIR)
-
-dialoged$(GUISUFFIX): $(OBJECTS) $(WXLIB)
-       $(CC) $(LDFLAGS) -o dialoged$(GUISUFFIX) $(OBJECTS) $(XVIEW_LINK) $(LDLIBS)
-
-$(OBJDIR)/dialoged.o:        dialoged.$(SRCSUFF) dialoged.h
-       $(CC) -c $(CPPFLAGS) -o $@ dialoged.$(SRCSUFF)
-
-$(OBJDIR)/wx_rprop.o:        wx_rprop.$(SRCSUFF)
-       $(CC) -c $(CPPFLAGS) -o $@ wx_rprop.$(SRCSUFF)
-
-$(OBJDIR)/wx_resed.o:        wx_resed.$(SRCSUFF) wx_resed.h
-       $(CC) -c $(CPPFLAGS) -o $@ wx_resed.$(SRCSUFF)
-
-$(OBJDIR)/wx_rdlg.o:        wx_rdlg.$(SRCSUFF) wx_resed.h
-       $(CC) -c $(CPPFLAGS) -o $@ wx_rdlg.$(SRCSUFF)
-
-$(OBJDIR)/wx_repal.o:        wx_repal.$(SRCSUFF) wx_repal.h
-       $(CC) -c $(CPPFLAGS) -o $@ wx_repal.$(SRCSUFF)
-        
-$(OBJDIR)/wx_reswr.o:        wx_reswr.$(SRCSUFF) wx_resed.h
-       $(CC) -c $(CPPFLAGS) -o $@ wx_reswr.$(SRCSUFF)
-        
-wxprop_motif:
-       cd $(WXPROPDIR)/src; $(MAKE) -f makefile.unx motif OPT='$(OPT)'
-
-wxprop_ol:
-       cd $(WXPROPDIR)/src
-       $(MAKE) -f makefile.unx xview OPT='$(OPT)'
-
-clean_motif:
-       $(MAKE) -f makefile.unx GUISUFFIX=_motif cleanany
-
-clean_ol:
-       $(MAKE) -f makefile.unx GUISUFFIX=_ol cleanany
-
-clean_hp:
-       $(MAKE) -f makefile.unx GUISUFFIX=_hp cleanany
-
-cleanany:
-       rm -f $(OBJECTS) $(TESTOBJECTS) test$(GUISUFFIX) dialoged$(GUISUFFIX) core
-
-HTMLDIR=/home/hardy/html/wx/manuals
-docs:   ps xlp
-ps:     $(DIALOGEDDIR)/docs/dialoged.ps
-xlp:    $(DIALOGEDDIR)/docs/dialoged.xlp
-html:   $(HTMLDIR)/dialoged/dialoged_contents.html
-
-$(DIALOGEDDIR)/docs/dialoged.xlp:     $(DIALOGEDDIR)/docs/dialoged.tex $(DIALOGEDDIR)/docs/classes.tex $(DIALOGEDDIR)/docs/body.tex $(DIALOGEDDIR)/docs/tech.tex
-       cd ../docs; tex2rtf dialoged.tex tmp.xlp -xlp -twice
-       sed -e "s/WXHELPCONTENTS/wxChart Manual/g" < $(DIALOGEDDIR)/docs/tmp.xlp > $(DIALOGEDDIR)/docs/dialoged.xlp
-       /bin/rm -f $(DIALOGEDDIR)/docs/tmp.xlp
-
-$(HTMLDIR)/dialoged/dialoged_contents.html:   $(DIALOGEDDIR)/docs/dialoged.tex $(DIALOGEDDIR)/docs/body.tex $(DIALOGEDDIR)/docs/tech.tex
-       cd ../docs; tex2rtf dialoged.tex $(HTMLDIR)/dialoged/dialoged.html -html -twice
-
-$(DIALOGEDDIR)/docs/dialoged.dvi:     $(DIALOGEDDIR)/docs/dialoged.tex $(DIALOGEDDIR)/docs/classes.tex
-       cd $(DIALOGEDDIR)/docs; latex dialoged; latex dialoged; makeindex dialoged; latex dialoged; latex dialoged
-
-# makeindex dialoged; bibtex dialoged; latex dialoged; latex dialoged
-
-$(DIALOGEDDIR)/docs/dialoged.ps:      $(DIALOGEDDIR)/docs/dialoged.dvi
-       cd $(DIALOGEDDIR)/docs; dvips -f -r < dialoged.dvi > dialoged.ps
index 8aa0fcc046576aa9b67c2063911c2f399322d205..362b289124bfd5bed67782053426781482b6271b 100644 (file)
@@ -1,62 +1,15 @@
-# Dialog Editor makefile for Watcom
+#
+# Makefile for WATCOM
+#
+# Created by D.Chubraev, chubraev@iem.ee.ethz.ch
+# 8 Nov 1994
+#
 
-WXDIR = ..\..\..
+WXDIR = $(%WXWIN)
 
-# EXTRACPPFLAGS = $(CLIPSFLAGS)
+PROGRAM = dialoged
+OBJECTS = dialoged.obj reseditr.obj dlghndlr.obj reswrite.obj winprop.obj edtree.obj edlist.obj symbtabl.obj winstyle.obj
 
-!include $(WXDIR)\src\makewat.env
-
-WXPROPDIR = $(WXDIR)\utils\wxprop
-WXPROPLIB = $(WXPROPDIR)\lib\wxprop.lib
-WXPROPINC = $(WXPROPDIR)\src
-
-THISDIR = $(WXDIR)\utils\dialoged\src
-
-NAME = dialoged
-LNK = $(name).lnk
-
-IFLAGS      = -i=$(WXINC) -i=$(WXBASEINC) -i=$(WXPROPINC)
-
-PROGOBJECTS = dialoged.obj wx_resed.obj wx_rdlg.obj wx_reswr.obj wx_repal.obj wx_rprop.obj
-
-all: wx wxprop erasepch $(PROGOBJECTS) dialoged.exe
-
-wx: .SYMBOLIC
-    cd $(WXDIR)\src\msw
-    wmake -f makefile.wat all
-    cd $(THISDIR)
-
-wxprop: .SYMBOLIC
-    cd $(WXPROPDIR)\src
-    wmake -f makefile.wat all
-    cd $(THISDIR)
-
-$(name).exe : $(PROGOBJECTS) $(name).res $(LNK) $(WXDIR)\lib\wx$(LEVEL).lib $(WXPROPLIB)
-    wlink @$(LNK)
-    $(BINDCOMMAND) $(name).res
-
-$(name).res :      $(name).rc $(WXDIR)\include\msw\wx.rc
-     $(RC) $(RESFLAGS1) /i$(WXDIR)\include\msw /i$(WXDIR)\contrib\fafa $(name).rc
-
-$(LNK) : makefile.wat
-    %create $(LNK)
-    @%append $(LNK) $(DEBUGINFO)
-    @%append $(LNK) system $(LINKOPTION)
-    @%append $(LNK) $(MINDATA)
-    @%append $(LNK) $(MAXDATA)
-    @%append $(LNK) $(STACK)
-    @%append $(LNK) name $(name)
-    @%append $(LNK) file $(WXDIR)\lib\wx$(LEVEL).lib
-    @%append $(LNK) file $(WXPROPLIB)
-    @for %i in ($(EXTRALIBS)) do @%append $(LNK) file %i
-    @for %i in ($(PROGOBJECTS)) do @%append $(LNK) file %i
-
-cleanutils:   .SYMBOLIC
-    cd $(WXPROPDIR)\src
-    wmake -f makefile.wat clean
-    cd $(THISDIR)
-
-clean:   .SYMBOLIC
-    -erase *.obj *.bak *.err *.pch *.lbc *.res
+!include $(WXDIR)\src\makeprog.wat
 
 
diff --git a/utils/wxprop/src/.cvsignore b/utils/wxprop/src/.cvsignore
deleted file mode 100644 (file)
index 4646a42..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-Linux
-linux-gnu
-linux
diff --git a/utils/wxprop/src/test.rc b/utils/wxprop/src/test.rc
deleted file mode 100644 (file)
index 8dd6951..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-tick_bmp                BITMAP  "tick.bmp"
-cross_bmp               BITMAP  "cross.bmp"
-
-#include "wx/msw/wx.rc"
-