git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@58559 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			111 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        docs/doxygen/overviews/persistence.h
 | 
						|
// Purpose:     overview of persistent objects
 | 
						|
// Author:      Vadim Zeitlin
 | 
						|
// Created:     2009-01-23
 | 
						|
// RCS-ID:      $Id$
 | 
						|
// Copyright:   (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
 | 
						|
// Licence:     wxWindows license
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
/**
 | 
						|
 | 
						|
@page overview_persistence Persistent Objects Overview
 | 
						|
 | 
						|
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 involves
 | 
						|
 - 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.
 | 
						|
 | 
						|
 */
 | 
						|
 |