| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /////////////////////////////////////////////////////////////////////////////
- // Name: docs/doxygen/overviews/persistence.h
- // Purpose: overview of persistent objects
- // Author: Vadim Zeitlin
- // Created: 2009-01-23
- // Copyright: (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
- // Licence: wxWindows licence
- /////////////////////////////////////////////////////////////////////////////
- /**
- @page overview_persistence Persistent Objects Overview
- @tableofcontents
- Persistent objects are simply the objects which automatically save their state
- when they are destroyed and restore it when they are recreated, even during
- another program invocation.
- Most often, persistent objects are, in fact, persistent windows as it is
- especially convenient to automatically restore the UI state when the program is
- restarted but an object of any class can be made persistent. Moreover,
- persistence is implemented in a non-intrusive way so that the original object
- class doesn't need to be modified at all in order to add support for saving and
- restoring its properties.
- The persistence framework includes the following components:
- - wxPersistenceManager which all persistent objects register themselves with.
- This class handles actual saving and restoring of persistent data as well as
- various global aspects of persistence, e.g. it can be used to disable
- restoring the saved data.
- - wxPersistentObject is the base class for all persistent objects or, rather,
- adaptors for the persistent objects as this class main purpose is to provide
- the bridge between the original class -- which has no special persistence
- support -- and wxPersistenceManager,
- - wxPersistentWindow<> which derives from wxPersistentObject and implements some
- of its methods using wxWindow-specific functionality. Notably,
- wxPersistenceManager handles the destruction of persistent windows
- automatically implicitly while it has to be done explicitly for the
- arbitrary persistent objects.
- - wxCreatePersistentObject() function which is used to create the
- appropriate persistence adapter for the object.
- @section persistence_using Using Persistent Windows
- wxWidgets has built-in support for a (constantly growing) number of controls.
- Currently the following classes are supported:
- - wxTopLevelWindow (and hence wxFrame and wxDialog)
- - wxBookCtrlBase (i.e. wxNotebook, wxListbook, wxToolbook and wxChoicebook)
- - wxTreebook
- To automatically save and restore the properties of the windows of classes
- listed above you need to:
- -# Set a unique name for the window using wxWindow::SetName(): this step is
- important as the name is used in the configuration file and so must be
- unique among all windows of the same class.
- -# Call wxPersistenceManager::Register() at any moment after creating the
- window and then wxPersistenceManager::Restore() when the settings may be
- restored (which can't be always done immediately, e.g. often the window
- needs to be populated first). If settings can be restored immediately after
- the window creation, as is often the case for wxTopLevelWindow, for
- example, then wxPersistenceManager::RegisterAndRestore() can be used to do
- both at once.
- -# If you do not want the settings for the window to be saved (for example
- the changes to the dialog size are usually not saved if the dialog was
- cancelled), you need to call wxPersistenceManager::Unregister() manually.
- Otherwise the settings will be automatically saved when the control itself
- is destroyed.
- Example of using a notebook control which automatically remembers the last open
- page:
- @code
- wxNotebook *book = new wxNotebook(parent, wxID_ANY);
- book->SetName("MyBook"); // do not use the default name
- book->AddPage(...);
- book->AddPage(...);
- book->AddPage(...);
- if ( !wxPersistenceManager::RegisterAndRestore(book) )
- {
- // nothing was restored, so choose the default page ourselves
- book->SetSelection(0);
- }
- @endcode
- @section persistence_defining Defining Custom Persistent Windows
- User-defined classes can be easily integrated with wxPersistenceManager. To add
- support for your custom class @c MyWidget you just need to:
- -# Define a new @c MyPersistentWidget class inheriting from
- wxPersistentWindow<MyWidget>.
- -# Implement its pure virtual GetKind() method returning a unique string
- identifying all @c MyWidget objects, typically something like @c "widget"
- -# Implement its pure virtual Save() and Restore() methods to actually save
- and restore the widget settings using wxPersistentObject::SaveValue() and
- wxPersistentObject::RestoreValue() methods.
- -# Define wxCreatePersistentObject() overload taking @c MyWidget * and
- returning a new @c MyPersistentWidget object.
- If you want to add persistence support for a class not deriving from wxWindow,
- you need to derive @c MyPersistentWidget directly from wxPersistentObject and
- so implement its pure virtual wxPersistentObject::GetName() method too.
- Additionally, you must ensure that wxPersistenceManager::SaveAndUnregister() is
- called when your object is destroyed as this can be only done automatically for
- windows.
- */
|