| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 | 
							- ///////////////////////////////////////////////////////////////////////////////
 
- // Name:        wx/persist.h
 
- // Purpose:     common classes for persistence support
 
- // Author:      Vadim Zeitlin
 
- // Created:     2009-01-18
 
- // Copyright:   (c) 2009 Vadim Zeitlin <vadim@wxwidgets.org>
 
- // Licence:     wxWindows licence
 
- ///////////////////////////////////////////////////////////////////////////////
 
- #ifndef _WX_PERSIST_H_
 
- #define _WX_PERSIST_H_
 
- #include "wx/string.h"
 
- #include "wx/hashmap.h"
 
- #include "wx/confbase.h"
 
- class wxPersistentObject;
 
- WX_DECLARE_VOIDPTR_HASH_MAP(wxPersistentObject *, wxPersistentObjectsMap);
 
- // ----------------------------------------------------------------------------
 
- // global functions
 
- // ----------------------------------------------------------------------------
 
- /*
 
-    We do _not_ declare this function as doing this would force us to specialize
 
-    it for the user classes deriving from the standard persistent classes.
 
-    However we do define overloads of wxCreatePersistentObject() for all the wx
 
-    classes which means that template wxPersistentObject::Restore() picks up the
 
-    right overload to use provided that the header defining the correct overload
 
-    is included before calling it. And a compilation error happens if this is
 
-    not done.
 
- template <class T>
 
- wxPersistentObject *wxCreatePersistentObject(T *obj);
 
-  */
 
- // ----------------------------------------------------------------------------
 
- // wxPersistenceManager: global aspects of persistent windows
 
- // ----------------------------------------------------------------------------
 
- class WXDLLIMPEXP_CORE wxPersistenceManager
 
- {
 
- public:
 
-     // Call this method to specify a non-default persistence manager to use.
 
-     // This function should usually be called very early to affect creation of
 
-     // all persistent controls and the object passed to it must have a lifetime
 
-     // long enough to be still alive when the persistent controls are destroyed
 
-     // and need it to save their state so typically this would be a global or a
 
-     // wxApp member.
 
-     static void Set(wxPersistenceManager& manager);
 
-     // accessor to the unique persistence manager object
 
-     static wxPersistenceManager& Get();
 
-     // trivial but virtual dtor
 
-     //
 
-     // FIXME-VC6: this only needs to be public because of VC6 bug
 
-     virtual ~wxPersistenceManager();
 
-     // globally disable restoring or saving the persistent properties (both are
 
-     // enabled by default)
 
-     void DisableSaving() { m_doSave = false; }
 
-     void DisableRestoring() { m_doRestore = false; }
 
-     // register an object with the manager: when using the first overload,
 
-     // wxCreatePersistentObject() must be specialized for this object class;
 
-     // with the second one the persistent adapter is created by the caller
 
-     //
 
-     // the object shouldn't be already registered with us
 
-     template <class T>
 
-     wxPersistentObject *Register(T *obj)
 
-     {
 
-         return Register(obj, wxCreatePersistentObject(obj));
 
-     }
 
-     wxPersistentObject *Register(void *obj, wxPersistentObject *po);
 
-     // check if the object is registered and return the associated
 
-     // wxPersistentObject if it is or NULL otherwise
 
-     wxPersistentObject *Find(void *obj) const;
 
-     // unregister the object, this is called by wxPersistentObject itself so
 
-     // there is usually no need to do it explicitly
 
-     //
 
-     // deletes the associated wxPersistentObject
 
-     void Unregister(void *obj);
 
-     // save/restore the state of an object
 
-     //
 
-     // these methods do nothing if DisableSaving/Restoring() was called
 
-     //
 
-     // Restore() returns true if the object state was really restored
 
-     void Save(void *obj);
 
-     bool Restore(void *obj);
 
-     // combines both Save() and Unregister() calls
 
-     void SaveAndUnregister(void *obj)
 
-     {
 
-         Save(obj);
 
-         Unregister(obj);
 
-     }
 
-     // combines both Register() and Restore() calls
 
-     template <class T>
 
-     bool RegisterAndRestore(T *obj)
 
-     {
 
-         return Register(obj) && Restore(obj);
 
-     }
 
-     bool RegisterAndRestore(void *obj, wxPersistentObject *po)
 
-     {
 
-         return Register(obj, po) && Restore(obj);
 
-     }
 
-     // methods used by the persistent objects to save and restore the data
 
-     //
 
-     // currently these methods simply use wxConfig::Get() but they may be
 
-     // overridden in the derived class (once we allow creating custom
 
-     // persistent managers)
 
- #define wxPERSIST_DECLARE_SAVE_RESTORE_FOR(Type)                              \
 
-     virtual bool SaveValue(const wxPersistentObject& who,                     \
 
-                            const wxString& name,                              \
 
-                            Type value);                                       \
 
-                                                                               \
 
-     virtual bool                                                              \
 
-     RestoreValue(const wxPersistentObject& who,                               \
 
-                  const wxString& name,                                        \
 
-                  Type *value)
 
-     wxPERSIST_DECLARE_SAVE_RESTORE_FOR(bool);
 
-     wxPERSIST_DECLARE_SAVE_RESTORE_FOR(int);
 
-     wxPERSIST_DECLARE_SAVE_RESTORE_FOR(long);
 
-     wxPERSIST_DECLARE_SAVE_RESTORE_FOR(wxString);
 
- #undef wxPERSIST_DECLARE_SAVE_RESTORE_FOR
 
- protected:
 
-     // ctor is private, use Get()
 
-     wxPersistenceManager()
 
-     {
 
-         m_doSave =
 
-         m_doRestore = true;
 
-     }
 
-     // Return the config object to use, by default just the global one but a
 
-     // different one could be used by the derived class if needed.
 
-     virtual wxConfigBase *GetConfig() const { return wxConfigBase::Get(); }
 
-     // Return the path to use for saving the setting with the given name for
 
-     // the specified object (notice that the name is the name of the setting,
 
-     // not the name of the object itself which can be retrieved with GetName()).
 
-     virtual wxString GetKey(const wxPersistentObject& who,
 
-                             const wxString& name) const;
 
- private:
 
-     // map with the registered objects as keys and associated
 
-     // wxPersistentObjects as values
 
-     wxPersistentObjectsMap m_persistentObjects;
 
-     // true if we should restore/save the settings (it doesn't make much sense
 
-     // to use this class when both of them are false but setting one of them to
 
-     // false may make sense in some situations)
 
-     bool m_doSave,
 
-          m_doRestore;
 
-     wxDECLARE_NO_COPY_CLASS(wxPersistenceManager);
 
- };
 
- // ----------------------------------------------------------------------------
 
- // wxPersistentObject: ABC for anything persistent
 
- // ----------------------------------------------------------------------------
 
- class wxPersistentObject
 
- {
 
- public:
 
-     // ctor associates us with the object whose options we save/restore
 
-     wxPersistentObject(void *obj) : m_obj(obj) { }
 
-     // trivial but virtual dtor
 
-     virtual ~wxPersistentObject() { }
 
-     // methods used by wxPersistenceManager
 
-     // ------------------------------------
 
-     // save/restore the corresponding objects settings
 
-     //
 
-     // these methods shouldn't be used directly as they don't respect the
 
-     // global wxPersistenceManager::DisableSaving/Restoring() settings, use
 
-     // wxPersistenceManager methods with the same name instead
 
-     virtual void Save() const = 0;
 
-     virtual bool Restore() = 0;
 
-     // get the kind of the objects we correspond to, e.g. "Frame"
 
-     virtual wxString GetKind() const = 0;
 
-     // get the name of the object we correspond to, e.g. "Main"
 
-     virtual wxString GetName() const = 0;
 
-     // return the associated object
 
-     void *GetObject() const { return m_obj; }
 
- protected:
 
-     // wrappers for wxPersistenceManager methods which don't require passing
 
-     // "this" as the first parameter all the time
 
-     template <typename T>
 
-     bool SaveValue(const wxString& name, T value) const
 
-     {
 
-         return wxPersistenceManager::Get().SaveValue(*this, name, value);
 
-     }
 
-     template <typename T>
 
-     bool RestoreValue(const wxString& name, T *value)
 
-     {
 
-         return wxPersistenceManager::Get().RestoreValue(*this, name, value);
 
-     }
 
- private:
 
-     void * const m_obj;
 
-     wxDECLARE_NO_COPY_CLASS(wxPersistentObject);
 
- };
 
- // FIXME-VC6: VC6 has troubles with template methods of DLL-exported classes,
 
- //            apparently it believes they should be defined in the DLL (which
 
- //            is, of course, impossible as the DLL doesn't know for which types
 
- //            will they be instantiated) instead of compiling them when
 
- //            building the main application itself. Because of this problem
 
- //            (which only arises in debug build!) we can't use the usual
 
- //            RegisterAndRestore(obj) with it and need to explicitly create the
 
- //            persistence adapter. To hide this ugliness we define a global
 
- //            function which does it for us.
 
- template <typename T>
 
- inline bool wxPersistentRegisterAndRestore(T *obj)
 
- {
 
-     wxPersistentObject * const pers = wxCreatePersistentObject(obj);
 
-     return wxPersistenceManager::Get().RegisterAndRestore(obj, pers);
 
- }
 
- // A helper function which also sets the name for the (wxWindow-derived) object
 
- // before registering and restoring it.
 
- template <typename T>
 
- inline bool wxPersistentRegisterAndRestore(T *obj, const wxString& name)
 
- {
 
-     obj->SetName(name);
 
-     return wxPersistentRegisterAndRestore(obj);
 
- }
 
- #endif // _WX_PERSIST_H_
 
 
  |