]> git.saurik.com Git - wxWidgets.git/blobdiff - contrib/include/wx/fl/gcupdatesmgr.h
Added fl (frame layout) to wxWindows, from source tidied by Hans Van Leemputten ...
[wxWidgets.git] / contrib / include / wx / fl / gcupdatesmgr.h
diff --git a/contrib/include/wx/fl/gcupdatesmgr.h b/contrib/include/wx/fl/gcupdatesmgr.h
new file mode 100644 (file)
index 0000000..e8fabc5
--- /dev/null
@@ -0,0 +1,123 @@
+/////////////////////////////////////////////////////////////////////////////
+// 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__ */
+