///////////////////////////////////////////////////////////////////////////// // Name: No names yet. // Purpose: Contrib. demo // Author: Aleksandras Gluchovas // Modified by: // Created: 19/10/98 // RCS-ID: $Id$ // Copyright: (c) Aleksandras Gluchovas // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// #ifndef __GCUPDATESMGR_G__ #define __GCUPDATESMGR_G__ #ifdef __GNUG__ #pragma interface "gcupdatesmgr.h" #endif #include "wx/fl/controlbar.h" #include "wx/fl/updatesmgr.h" #include "wx/fl/garbagec.h" /* * class implements optimized logic for refreshing * areas of frame layout - which actually need to be updated. * Is used as default updates-manager by wxFrameLayout. * * it is called "Garbage Collecting" u.mgr for it's implementation * tries to find out dependencies between bars, and to order * them ito "hierarchy", this hierarchical sorting resembles * implemenation of heap-garbage collectors, which resolve * dependencies between references. * * Example: there are situations where the order of moving * the windows does matter: * * case 1) * ------ --- * | A | |B| * ------ ---> | | * --- --- ------ * |B| | A | * | | ------ * --- * (future) * (past) * * past/future positions of A and B windows completely overlapp, i.e. * depend on each other, and there is not solution for * moving the windows witout refreshing both of them, * -- we have cyclic dependency here. The gc. alg will * find this cyclic dependecy and will force "refresh" * after movement. * * case 2) * * ------ * | A | * ------ ---> * --- * |B| ------ * | | | A | * --- ------ * --- * |B| * | | * --- * * (future) * (past) * * in this case past/future positions do not overlapp, thus * it's enough only to move windows, without refreshing them. * GC will "notice" it. * * there is also third case, when overlapping is partial * in this case the refershing can be also avoided by * moving windows in the order of "most-dependant" towards the * "least-dependent". GC handles this automatically, by * sorting windows by their dependency-level (or "hierarchy") * * See garbagec.h for more details of this method, garbagec.h/cpp * implement sorting of generic-dependencies (does not deal * with graphical objects directly) * * Summary: improves performance when complex/large windows are * moved around, by reducing number of repaints. Also helps * to avoid dirty non-client areas of moved windows * in some special cases of "overlapping anomalies" */ class cbGCUpdatesMgr : public cbSimpleUpdatesMgr { DECLARE_DYNAMIC_CLASS( cbGCUpdatesMgr ) protected: GarbageCollector mGC; void DoRepositionItems( wxList& items ); void AddItem( wxList& itemList, cbBarInfo* pBar, cbDockPane* pPane, wxRect& curBounds, wxRect& prevBounds ); public: cbGCUpdatesMgr(void) {} cbGCUpdatesMgr( wxFrameLayout* pPanel ); // notificiactions received from Frame Layout : virtual void OnStartChanges(); // refreshes parts of the frame layout, which need an update virtual void UpdateNow(); }; #endif /* __GCUPDATESMGR_G__ */