]> git.saurik.com Git - wxWidgets.git/blobdiff - utils/framelayout/src/controlbar.h
Added Aleksandras' framelayout code, with more or less working Linux Makefiles
[wxWidgets.git] / utils / framelayout / src / controlbar.h
diff --git a/utils/framelayout/src/controlbar.h b/utils/framelayout/src/controlbar.h
new file mode 100644 (file)
index 0000000..9169024
--- /dev/null
@@ -0,0 +1,1652 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name:        No names yet.
+// Purpose:     Central header file for control-bar related classes
+//
+// Author:      Aleksandras Gluchovas <mailto:alex@soften.ktu.lt>
+// Modified by:
+// Created:     06/09/98
+// RCS-ID:      $Id$
+// Copyright:   (c) Aleksandras Gluchovas
+// Licence:    wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+#ifndef __CONTROLBAR_G__
+#define __CONTROLBAR_G__
+
+#ifdef __GNUG__
+#pragma interface "controlbar.h"
+#endif
+
+#include "wx/defs.h"
+#include "wx/string.h"
+#include "wx/window.h"
+#include "wx/dynarray.h"
+
+#define WXCONTROLBAR_VERSION      1.3
+
+// forward declarations
+
+class  wxFrameLayout;
+
+class  cbDockPane;
+class  cbUpdatesManagerBase;
+class  cbBarDimHandlerBase;
+class  cbPluginBase;
+class  cbPluginEvent;
+class  cbPaneDrawPlugin;
+
+class cbBarInfo;
+class cbRowInfo;
+class cbDimInfo;
+class cbCommonPaneProperties;
+
+typedef cbBarInfo* BarInfoPtrT;
+typedef cbRowInfo* RowInfoPtrT;
+
+WX_DEFINE_ARRAY( BarInfoPtrT, BarArrayT );
+WX_DEFINE_ARRAY( RowInfoPtrT, RowArrayT );
+
+// control bar states
+
+#define wxCBAR_DOCKED_HORIZONTALLY 0
+#define wxCBAR_DOCKED_VERTICALLY   1
+#define wxCBAR_FLOATING            2
+#define wxCBAR_HIDDEN              3
+
+// the states are enumerated above
+#define MAX_BAR_STATES             4
+
+// control bar alignments
+
+#if !defined(wxTOP)
+
+#define wxTOP     0
+#define wxBOTTOM   1
+#define wxLEFT    2
+#define wxRIGHT    3
+
+#endif
+
+// one pane for each alignment
+#define MAX_PANES      4
+
+// masks for each pane
+
+#define wxTOP_PANE        0x0001
+#define wxBOTTOM_PANE  0x0002
+#define wxLEFT_PANE       0x0004
+#define wxRIGHT_PANE   0x0008
+
+#define wxALL_PANES    0x000F
+
+// enumeration of hittest results, see cbDockPane::HitTestPaneItems(..) 
+
+enum CB_HITTEST_RESULT
+{
+       CB_NO_ITEMS_HITTED,
+
+       CB_UPPER_ROW_HANDLE_HITTED,
+       CB_LOWER_ROW_HANDLE_HITTED,
+       CB_LEFT_BAR_HANDLE_HITTED,
+       CB_RIGHT_BAR_HANDLE_HITTED,
+       CB_BAR_CONTENT_HITTED
+};
+
+// FIXME:: somehow in debug v. originall wxASSERT's are not compiled in...
+
+//#undef  wxASSERT
+//#define wxASSERT(x) if ( !(x) ) throw;
+
+// helper class, used for spying for not-handled mouse events on control-bars
+// and forwarding them to the frame layout
+
+class cbBarSpy : public wxEvtHandler 
+{
+public:
+       DECLARE_DYNAMIC_CLASS( cbBarSpy )
+
+       wxFrameLayout* mpLayout;
+       wxWindow*      mpBarWnd;
+
+public:
+       cbBarSpy(void);
+
+       cbBarSpy( wxFrameLayout* pPanel );
+
+       void SetBarWindow( wxWindow* pWnd );
+
+       // overriden
+
+       virtual bool ProcessEvent(wxEvent& event);
+};
+
+/* wxFrameLayout manages containment and docking of control bars. 
+ * which can be docked along top, bottom, righ, or left side of the 
+ * parent frame
+ */
+
+class wxFrameLayout : public wxEvtHandler
+{
+public:
+       DECLARE_DYNAMIC_CLASS( wxFrameLayout )
+
+public: /* protected really, acessed only by plugins and serializers */
+
+       friend class cbDockPane;
+       friend class wxBarHandler;
+
+       wxWindow*    mpFrame;           // parent frame
+       wxWindow*    mpFrameClient;         // client window
+       cbDockPane*  mPanes[MAX_PANES]; // panes in the panel
+
+       // misc. cursors
+       wxCursor*    mpHorizCursor;
+       wxCursor*    mpVertCursor;
+       wxCursor*    mpNormalCursor;
+       wxCursor*    mpDragCursor;
+       wxCursor*    mpNECursor; // no-entry cursor
+
+       // pens for decoration and shades
+
+       wxPen        mDarkPen;   // default wxColour(128,128,128)
+       wxPen        mLightPen;  // default white
+       wxPen        mGrayPen;   // default wxColour(192,192,192)
+       wxPen        mBlackPen;  // default wxColour(  0,  0,  0)
+       wxPen        mBorderPen; // default wxColour(128,192,192)
+
+       wxPen        mNullPen;   // transparent pen
+
+       // pane to which the all mouse input is currently directed (caputred)
+
+       cbDockPane*  mpPaneInFocus;
+
+       // pane, from which mouse pointer had just leaft
+
+       cbDockPane*  mpLRUPane;    
+
+       // bounds of client window in parent frame's coordinates
+
+       wxRect       mClntWndBounds;
+       wxRect       mPrevClntWndBounds;
+
+       bool         mFloatingOn;
+       wxPoint      mNextFloatedWndPos;
+       wxSize       mFloatingPosStep;
+
+       // current plugin (right-most) plugin which receives events first
+
+       cbPluginBase* mpTopPlugin;
+
+       // plugin, which currently has caputred all input events, otherwise NULL 
+
+       cbPluginBase* mpCaputesInput;
+
+       // list of event handlers which are "pushed" onto each bar, to catch 
+       // mouse events which are not handled by bars, and froward them to the ,
+       // frome-layout and further to plugins
+
+       wxList        mBarSpyList;
+
+       // list of top-most frames which contain floated bars
+
+       wxList        mFloatedFrames;
+
+       // linked list of references to all bars (docked/floated/hidden)
+
+       BarArrayT    mAllBars;
+
+       // FOR NOW:: dirty stuff...
+       bool         mClientWndRefreshPending;
+       bool         mRecalcPending;
+       bool         mCheckFocusWhenIdle;
+
+public: /* protected really (accessed only by plugins) */
+
+       // refrence to custom updates manager 
+       cbUpdatesManagerBase* mpUpdatesMgr;
+
+       // called to set calculated layout to window objects
+       void PositionClientWindow();
+       void PositionPanes();
+       void CreateCursors();
+
+       void RepositionFloatedBar( cbBarInfo* pBar );
+       void DoSetBarState( cbBarInfo* pBar );
+
+       bool LocateBar( cbBarInfo* pBarInfo, 
+                                       cbRowInfo**  ppRow,
+                                       cbDockPane** ppPane );
+
+
+       bool HitTestPane( cbDockPane* pPane, int x, int y );
+       cbDockPane* HitTestPanes( const wxRect& rect, cbDockPane* pCurPane );
+
+       // returns panes, to which the given bar belongs
+
+       cbDockPane* GetBarPane( cbBarInfo* pBar );
+
+       // delegated from "bar-spy"
+       void ForwardMouseEvent( wxMouseEvent& event, 
+                                                       cbDockPane*   pToPane,
+                                                       int           eventType );
+
+       void RouteMouseEvent( wxMouseEvent& event, int pluginEvtType );
+
+       void ShowFloatedWindows( bool show );
+
+       void UnhookFromFrame();
+       void HookUpToFrame();
+
+       // NOTE:: reparenting of windows may NOT work on all platforms
+       //        (reparenting allows control-bars to be floated)
+
+       bool CanReparent();
+       void ReparentWindow( wxWindow* pChild, wxWindow* pNewParent );
+
+       wxRect& GetPrevClientRect() { return mPrevClntWndBounds; }
+
+       void OnPaint( wxPaintEvent& event );
+       void OnEraseBackground( wxEraseEvent& event );
+       void OnKillFocus( wxFocusEvent& event );
+       void OnSetFocus( wxFocusEvent& event );
+       void OnActivate( wxActivateEvent& event );
+       void OnIdle( wxIdleEvent& event );
+
+       // factory method
+       virtual cbUpdatesManagerBase* CreateUpdatesManager();
+
+public: /* public members */
+
+       wxFrameLayout(void); // used only while serializing
+
+       wxFrameLayout( wxWindow* pParentFrame, 
+                                  wxWindow* pFrameClient = NULL, 
+                                  bool      activateNow  = TRUE );
+
+       // (doesn't destory bar windows)
+       virtual ~wxFrameLayout();
+
+       // (by default floating of control-bars is ON)
+       virtual void EnableFloating( bool enable = TRUE );
+
+       // Can be called after some other layout has been deactivated,
+       // and this one must "take over" the current contents of frame window.
+       //
+       // Effectivelly hooks itself to the frame window, re-displays all not-hidden 
+       // bar-windows and repaints decorations
+
+       virtual void Activate();
+
+       // unhooks itself from frame window, and hides all not-hidden windows
+       //
+       // NOTE:: two frame-layouts should not be active at the same time in the
+       //        same frame window, it would cause messy overlapping of bar windows 
+       //        from both layouts
+
+       virtual void Deactivate();
+
+       // also hides the client window if presents
+
+       void HideBarWindows();
+
+       virtual void DestroyBarWindows();
+
+       // passes the client window (e.g. MDI-client frame) to be controled by
+       // frame layout, the size and position of which should be adjusted to be 
+       // surrounded by controlbar panes, whenever frame is resized, or dimesnions 
+       // of control panes change
+
+       void SetFrameClient( wxWindow* pFrameClient );
+
+       wxWindow* GetFrameClient();
+
+       wxWindow& GetParentFrame() { return *mpFrame; }
+
+       // used by updates-managers
+       cbDockPane** GetPanesArray() { return mPanes; }
+
+       // see pane alignment types 
+       cbDockPane* GetPane( int alignment )
+
+               { return mPanes[alignment]; }
+
+       // Adds bar information to frame-layout, appearence of layout is not refreshed
+       // immediatelly, RefreshNow() can be called if necessary.
+       //
+       // NOTES:: argument pBarWnd can by NULL, resulting bar decorations to be drawn
+       //         around the empty rectangle (filled with default background colour).
+       //         Argument dimInfo, can be re-used for adding any number of bars, since
+       //         it is not used directly, instead it's members are copied. If dimensions- 
+       //         handler is present, it's instance shared (reference counted). Dimension 
+       //         handler should always be allocated on the heap!)
+
+       virtual void AddBar( wxWindow*        pBarWnd, 
+                                                cbDimInfo&       dimInfo,
+
+                                                // defaults:
+
+                                                int alignment    = wxTOP,
+                                                int rowNo        = 0,      // vert. position - row in the pane (if docked state)
+                                                int columnPos    = 0,      // horiz. position in the row in pixels (if docked state)
+                                                const wxString& name="bar",// name, by which the bar could be referred
+                                                                           // in layout costumization dialogs
+
+                                                bool spyEvents    = FALSE,     // if TRUE - input events for the bar should 
+                                                                                                       // be "spyed" in order to forward not-handled 
+                                                                                                       // mouse clicks to frame layout (e.g. to enable 
+                                                                                                       // easy-draggablity of toolbars just by clicking 
+                                                                                                       // on their interior regions). For widgets like 
+                                                                                                       // text/tree control this value should be FALSE 
+                                                                                                       // (since there's _no_ certain way to detect 
+                                                                                                       //  whether the event was actually handled...)
+
+                                                int state        = wxCBAR_DOCKED_HORIZONTALLY // e.g. wxCBAR_FLOATING
+                                                                                                                                          // or wxCBAR_HIDDEN
+                                          );
+
+       // can be used for repositioning already existing bars. The given bar is first removed
+       // from the pane it currently belongs to, and inserted into the pane, which "matches"
+       // the given recantular area. If pToPane is not NULL, bar is docked to this given pane
+       
+       // to dock the bar which is floated, use wxFrameLayout::DockBar(..) method
+
+       virtual bool RedockBar( cbBarInfo* pBar, const wxRect& shapeInParent, 
+                                                       cbDockPane* pToPane = NULL, bool updateNow = TRUE );
+
+       // methods for access and modification of bars in frame layout
+
+       cbBarInfo* FindBarByName( const wxString& name );
+
+       BarArrayT& GetBars();
+
+       // changes bar's docking state (see possible control bar states)
+
+       void SetBarState( cbBarInfo* pBar, int newStatem, bool updateNow );
+
+       // reflects changes in bar information structure visually
+       // (e.g. moves bar, changes it's dimension info, pane to which it is docked)
+
+       void ApplyBarProperties( cbBarInfo* pBar );
+
+       // removes bar from layout permanently, hides it's corresponding window if present
+
+       void RemoveBar( cbBarInfo* pBar );
+
+       // recalcualtes layout of panes, and all bars/rows in each pane
+
+       virtual void RecalcLayout( bool repositionBarsNow = FALSE );
+
+       int     GetClientHeight();
+       int     GetClientWidth();
+       wxRect& GetClientRect()         { return mClntWndBounds;     }
+
+       // NOTE:: in future ubdates-manager will become a normal plugin
+       
+       cbUpdatesManagerBase& GetUpdatesManager();
+       
+       // destroys the previous manager if any, set the new one
+
+       void SetUpdatesManager( cbUpdatesManagerBase* pUMgr );
+
+       // NOTE:: changing properties of panes, does not result immediate on-screen update
+
+       virtual void GetPaneProperties( cbCommonPaneProperties& props, int alignment = wxTOP );
+
+       virtual void SetPaneProperties( const cbCommonPaneProperties& props, 
+                                           int paneMask = wxALL_PANES );
+
+       // TODO:: margins should go into cbCommonPaneProperties in the future
+       //
+       // NOTE:: this method should be called before any custom plugins are attached
+
+       virtual void SetMargins( int top, int bottom, int left, int right,
+                                    int paneMask = wxALL_PANES );
+
+       virtual void SetPaneBackground( const wxColour& colour );
+
+       // recalculates layoute and performs on-screen update of all panes
+
+       void RefreshNow( bool recalcLayout = TRUE );
+
+       // event handlers
+
+       void OnSize       ( wxSizeEvent&  event );
+       void OnLButtonDown( wxMouseEvent& event );
+       void OnLDblClick  ( wxMouseEvent& event );
+       void OnLButtonUp  ( wxMouseEvent& event );
+       void OnRButtonDown( wxMouseEvent& event );
+       void OnRButtonUp  ( wxMouseEvent& event );
+       void OnMouseMove  ( wxMouseEvent& event );
+
+       /*** plugin-related methods ***/
+
+       // should be used, instead of passing the event to ProcessEvent(..) method
+       // of the top-plugin directly. This method checks if events are currently 
+       // captured and ensures that plugin-event is routed correctly.
+
+       virtual void FirePluginEvent( cbPluginEvent& event );
+       
+       // captures/releases user-input event's for the given plugin
+       // Input events are: mouse movement, mouse clicks, keyboard input
+
+       virtual void CaptureEventsForPlugin ( cbPluginBase* pPlugin );
+       virtual void ReleaseEventsFromPlugin( cbPluginBase* pPlugin );
+
+       // called by plugins ( also captures/releases mouse in parent frame)
+       void CaptureEventsForPane( cbDockPane* toPane );
+       void ReleaseEventsFromPane( cbDockPane* fromPane );
+
+       // returns current top-level plugin (the one which receives events first,
+       // with an exception if input-events are currently captured by some other plugin)
+       
+       virtual cbPluginBase& GetTopPlugin();
+
+       // hooking custom plugins to frame layout
+       //
+       // NOTE:: when hooking one plugin on top of the other -
+       //        use SetNextHandler(..) or similar methods
+       //                of wxEvtHandler class to compose the chain of plugins,
+       //        than pass the left-most handler in this chain to
+       //        the above methods (assuming that events are delegated
+       //        from left-most towards right-most handler)
+       //
+       //        NOTE2:: this secenario is very inconvenient and "low-level",
+       //                use Add/Push/PopPlugin methods instead
+
+       virtual void SetTopPlugin( cbPluginBase* pPlugin );
+
+       // similar to wxWindow's "push/pop-event-handler" methods, execept
+       // that plugin is *deleted* upon "popping"
+
+       virtual void PushPlugin( cbPluginBase* pPugin );
+       virtual void PopPlugin();
+
+       virtual void PopAllPlugins();
+
+       // default plugins are : cbPaneDrawPlugin, cbRowLayoutPlugin, cbBarDragPlugin,
+       //                                               cbAntiflickerPlugin, cbSimpleCustomizePlugin
+       //
+       // this method is automatically invoked, if no plugins were found upon 
+       // fireing of the first plugin-event, i.e. wxFrameLayout *CONFIGURES* itself
+
+       virtual void PushDefaultPlugins();
+
+       /* "Advanced" methods for plugin-configuration  using their */
+       /* dynamic class information (e.g. CLASSINFO(pluginClass) ) */
+
+       // first checks if plugin of the given class is already "hooked up", 
+       // if not, adds it to the top of plugins chain
+
+       virtual void AddPlugin( wxClassInfo* pPlInfo, int paneMask = wxALL_PANES );
+
+       // first checks if plugin of the givne class already hooked,
+       // if so, removes it, and then inserts it to the chain
+       // before plugin of the class given by "pNextPlInfo"
+       //
+       // NOTE:: this method is "handy" in some cases, where the order
+       //        of plugin-chain could be important, e.g. one plugin overrides
+       //        some functionallity of the other already hooked plugin,
+       //        thefore the former should be hooked before the one
+       //        who's functionality is being overriden
+
+       virtual void AddPluginBefore( wxClassInfo* pNextPlInfo, wxClassInfo* pPlInfo, 
+                                                                 int paneMask = wxALL_PANES );
+
+       // checks if plugin of the given class is hooked, removes
+       // it if found
+       //
+       // @param pPlInfo class information structure for the plugin
+       // @note  
+       // @see wxFrameLayout::Method
+
+
+       virtual void RemovePlugin( wxClassInfo* pPlInfo );
+
+       // returns NULL, if plugin of the given class is not hooked
+
+       virtual cbPluginBase* FindPlugin( wxClassInfo* pPlInfo );
+
+       bool HasTopPlugin();
+
+       DECLARE_EVENT_TABLE();
+};
+
+/* structure, which is present in each item of layout,
+ * it used by any specific updates-manager to store
+ * auxilary information to be used by it's specific 
+ * updating algorithm 
+ */
+
+class cbUpdateMgrData : public wxObject
+{
+       DECLARE_DYNAMIC_CLASS( cbUpdateMgrData )
+public:
+       wxRect mPrevBounds;      // previous state of layout item (in parent frame's coordinates)
+
+       bool   mIsDirty;         // overrides result of current-against-previouse bounds comparison,
+                                // i.e. requires item to be updated, regardless of it's current area
+       
+       wxObject*  mpCustomData; // any custom data stored by specific updates mgr.
+
+       cbUpdateMgrData();   // is-dirty flag is set TRUE initially
+
+       void StoreItemState( const wxRect& boundsInParent );
+
+       void SetDirty( bool isDirty = TRUE );
+
+       void SetCustomData( wxObject* pCustomData );
+
+       inline bool IsDirty() { return mIsDirty; }
+};
+
+/* Abstract inteface for bar-size handler classes.
+ * These objects receive notifications, whenever the docking 
+ * state of the bar is changed, thus they have a possibility 
+ * to adjust the values in cbDimInfo::mSizes accordingly.
+ * Specific handlers can be hooked to specific types of bars.
+ */
+
+class cbBarDimHandlerBase : public wxObject
+{
+       DECLARE_ABSTRACT_CLASS( cbBarDimHandlerBase )
+
+public:
+       int mRefCount; // since one dim-handler can be asigned
+                      // to multiple bars, it's instance is
+                                  // refernce-counted
+public:
+
+       // inital refernce count is 0, since handler is not used, until the
+       // first invocation of AddRef()
+
+       cbBarDimHandlerBase();
+
+       void AddRef();
+       void RemoveRef();
+
+       // "bar-state-changes" notification
+       virtual void OnChangeBarState(cbBarInfo* pBar, int newState ) = 0;
+       virtual void OnResizeBar( cbBarInfo* pBar, const wxSize& given, wxSize& preferred ) = 0;
+};
+
+/* helper classes (used internally by wxFrameLayout class) */
+
+// holds and manages information about bar demensions
+
+class cbDimInfo : public wxObject
+{
+       DECLARE_DYNAMIC_CLASS( cbDimInfo )
+public:
+       wxSize mSizes[MAX_BAR_STATES];  // preferred sizes for each possible bar state
+
+       wxRect mBounds[MAX_BAR_STATES]; // saved positions and sizes for each
+                                                                       // possible state, values contain (-1)s if
+                                                                   // not initialized yet
+
+       int    mLRUPane; // pane to which this bar was docked before it was floated
+                        // (wxTOP,wxBOTTOM,..)
+
+       // top/bottom gap, separates decorations
+       // from the bar's actual window, filled
+       // with frame's beckground color, default: 0
+
+       int    mVertGap;        
+
+       // left/right gap, separates decorations
+       // from the bar's actual window, filled
+       // with frame's beckground colour, default: 0
+
+       int    mHorizGap;       // NOTE:: gaps are given in frame's coord. orientation
+
+       // TRUE, if vertical/horizotal dimensions cannot be mannualy adjusted
+       //       by user using resizing handles. If FALSE, the frame-layout
+       //       *automatically* places resizing handles among not-fixed bars
+
+       bool   mIsFixed;
+
+       cbBarDimHandlerBase* mpHandler; // NULL, if no handler present 
+
+public:
+
+       cbDimInfo(void);
+
+       cbDimInfo( cbBarDimHandlerBase* pDimHandler,
+                          bool                 isFixed          // (see comments on mIsFixed member)
+                        );
+
+       cbDimInfo( int dh_x, int dh_y, // dims when docked horizontally
+                          int dv_x, int dv_y, // dims when docked vertically
+                          int f_x,  int f_y,  // dims when floating
+
+                          bool isFixed  = TRUE,// (see comments on mIsFixed member)
+                          int  horizGap = 6,   // (see comments on mHorizGap member)
+                          int  vertGap  = 6,   // -/-
+
+                          cbBarDimHandlerBase* pDimHandler = NULL
+                        );
+
+       const cbDimInfo& operator=( cbDimInfo& other );
+
+       // destroys handler automatically, if present
+       ~cbDimInfo();
+
+       inline cbBarDimHandlerBase* GetDimHandler() { return mpHandler; } 
+};
+
+WX_DEFINE_ARRAY(float, cbArrayFloat);
+
+class cbRowInfo : public wxObject
+{
+       DECLARE_DYNAMIC_CLASS( cbRowInfo )
+public:
+
+       BarArrayT  mBars;  // row content
+
+       // row flags (set up according to row-relations)
+
+       bool    mHasUpperHandle;
+       bool    mHasLowerHandle;
+       bool    mHasOnlyFixedBars;
+       int     mNotFixedBarsCnt;
+
+       int             mRowWidth;
+       int             mRowHeight;
+       int             mRowY;
+
+       // stores precalculated row's bounds in parent frame's coordinates
+       wxRect mBoundsInParent;
+
+       // info stored for updates-manager
+       cbUpdateMgrData mUMgrData;
+
+       cbRowInfo*    mpNext;
+       cbRowInfo*    mpPrev;
+
+       cbBarInfo*    mpExpandedBar; // NULL, if non of the bars is currently expanded
+
+       cbArrayFloat  mSavedRatios;  // length-ratios bofore some of the bars was expanded
+
+public:
+       cbRowInfo(void);
+
+       ~cbRowInfo();
+
+       // convenience method
+
+       inline cbBarInfo* GetFirstBar() 
+
+               { return mBars.GetCount() ? mBars[0] : NULL; }
+};
+
+class cbBarInfo : public wxObject
+{
+       DECLARE_DYNAMIC_CLASS( cbBarInfo )
+public:
+       // textual name, by which this bar is refered in layout-costumization dialogs
+       wxString      mName;
+
+       // stores bar's bounds in pane's coordinates
+       wxRect        mBounds;             
+
+       // stores precalculated bar's bounds in parent frame's coordinates
+       wxRect        mBoundsInParent;     
+
+       // back-ref to the row, which contains this bar
+       cbRowInfo*    mpRow;               
+
+       // are set up according to the types of the surrounding bars in the row
+       bool          mHasLeftHandle;
+       bool          mHasRightHandle;
+
+       cbDimInfo     mDimInfo;       // preferred sizes for each, control bar state
+                                                                 
+       int           mState;         // (see definition of controlbar states)
+
+       int           mAlignment;     // alignment of the pane to which this
+                                     // bar is currently placed
+
+       int           mRowNo;         // row, into which this bar would be placed,
+                                     // when in the docking state
+
+       wxWindow*     mpBarWnd;           // the actual window object, NULL if no window
+                                     // is attached to the control bar (possible!)
+
+       double        mLenRatio;      // length ratio among not-fixed-size bars
+
+       wxPoint       mPosIfFloated;  // stored last position when bar was in "floated" state
+                                                                 // poistion is stored in parent-window's coordinates
+       
+       cbUpdateMgrData mUMgrData;    // info stored for updates-manager
+
+       cbBarInfo*    mpNext;         // next. bar in the row
+       cbBarInfo*    mpPrev;         // prev. bar in the row
+
+public:
+       cbBarInfo(void);
+
+       ~cbBarInfo();
+
+       inline bool IsFixed() const { return mDimInfo.mIsFixed; }
+
+       inline bool IsExpanded() const { return this == mpRow->mpExpandedBar; }
+};
+
+// used for storing original bar's postions in the row, when the "non-destructive-friction"
+// option is turned ON
+
+class cbBarShapeData : public wxObject
+{
+public:
+       wxRect mBounds;
+       double mLenRatio;
+};
+
+// used for traversing through all bars of all rows in the pane
+
+class wxBarIterator
+{
+       RowArrayT*  mpRows;
+       cbRowInfo*  mpRow;
+       cbBarInfo*  mpBar;
+
+public:
+       wxBarIterator( RowArrayT& rows );
+
+       void Reset();
+       bool Next(); // TRUE, if next bar is available
+       
+       cbBarInfo& BarInfo();
+
+       // returns reference to currently traversed row
+       cbRowInfo& RowInfo();
+};
+
+/* structure holds configuration options, 
+ * which are usually the same for all panes in
+ * frame layout
+ */
+
+class cbCommonPaneProperties : public wxObject
+{
+       DECLARE_DYNAMIC_CLASS( cbCommonPaneProperties )
+
+       // look-and-feel configuration
+
+       bool mRealTimeUpdatesOn;     // default: ON
+       bool mOutOfPaneDragOn;       // default: ON
+       bool mExactDockPredictionOn; // default: OFF
+       bool mNonDestructFirctionOn; // default: OFF
+
+       bool mShow3DPaneBorderOn;    // default: ON
+
+       // FOR NOW:: the below properties are reserved for the "future"
+
+       bool mBarFloatingOn;         // default: OFF
+       bool mRowProportionsOn;      // default: OFF
+       bool mColProportionsOn;      // default: ON
+       bool mBarCollapseIconsOn;    // default: OFF
+       bool mBarDragHintsOn;        // default: OFF
+
+       // minimal dimensions for not-fixed bars in this pane (16x16 default)
+
+       wxSize mMinCBarDim; 
+
+       // width/height of resizing sash
+       
+       int    mResizeHandleSize;
+
+       cbCommonPaneProperties(void);
+};
+
+/* class manages containment and control of control-bars 
+ * along one of the four edges of the parent frame
+ */
+
+class cbDockPane : public wxObject
+{
+public:
+       DECLARE_DYNAMIC_CLASS( cbDockPane )
+
+       // look-and-feel configuration for this pane
+       cbCommonPaneProperties mProps;
+
+       // pane margins (in frame's coordinate-syst. orientation)
+
+       int             mLeftMargin;     // default: 2 pixels
+       int             mRightMargin;    // default: 2 pixels
+       int             mTopMargin;              // default: 2 pixels
+       int             mBottomMargin;   // default: 2 pixels
+                                  
+public:
+       // position of the pane in frame's coordinates
+       wxRect          mBoundsInParent; 
+
+       // pane width and height in pane's coordinates
+       int             mPaneWidth;
+       int             mPaneHeight;
+
+       int                             mAlignment;
+
+       // info stored for updates-manager
+       cbUpdateMgrData mUMgrData;
+
+public: /* protected really */
+
+       RowArrayT           mRows;
+       wxFrameLayout*  mpLayout;                // back-ref
+
+       // transient properties
+
+       wxList          mRowShapeData;   // shapes of bars of recently modified row, 
+                                                                    // stored when in "non-destructive-firction" mode
+       cbRowInfo*      mpStoredRow;     // row-info for which the shapes are stored
+
+       friend class wxFrameLayout;
+
+public: /* protected really (accessed only by plugins) */
+
+       cbRowInfo* GetRow( int row );
+
+       int GetRowIndex( cbRowInfo* pRow );
+
+       // return -1, if row is not present at given vertical position
+       int     GetRowAt( int paneY );
+       int     GetRowAt( int upperY, int lowerY );
+
+       // re-setups flags in the row-information structure, so that 
+       // the would match the changed state of row-items correctly 
+       void SyncRowFlags( cbRowInfo* pRow );
+
+       // layout "AI" helpers:
+
+       bool IsFixedSize( cbBarInfo* pInfo );
+       int  GetNotFixedBarsCount( cbRowInfo* pRow );
+
+       int GetRowWidth( wxList* pRow );
+
+       int GetRowY( cbRowInfo* pRow );
+
+       bool HasNotFixedRowsAbove( cbRowInfo* pRow );
+       bool HasNotFixedRowsBelow( cbRowInfo* pRow );
+       bool HasNotFixedBarsLeft ( cbBarInfo* pBar );
+       bool HasNotFixedBarsRight( cbBarInfo* pBar );
+
+       virtual void CalcLenghtRatios( cbRowInfo* pInRow );
+       virtual void RecalcRowLayout( cbRowInfo* pRow );
+
+       virtual void ExpandBar( cbBarInfo* pBar );
+       virtual void ContractBar( cbBarInfo* pBar );
+
+       void InitLinksForRow( cbRowInfo* pRow );
+       void InitLinksForRows();
+
+       // coordinate translation between parent's frame and this pane 
+
+       void FrameToPane( long* x, long* y );
+       void PaneToFrame( long* x, long* y );
+       void FrameToPane( wxRect* pRect );
+       void PaneToFrame( wxRect* pRect );
+
+       inline bool HasPoint( const wxPoint& pos, int x, int y, int width, int height );
+
+       int GetMinimalRowHeight( cbRowInfo* pRow );
+
+       // given row height includes height of row handles, if present
+       void SetRowHeight( cbRowInfo* pRow, int newHeight );
+
+       void DoInsertBar( cbBarInfo* pBar, int rowNo );
+
+public: /* protected really (accessed only by plugins) */
+
+       // methods for incramental on-screen refreshing of the pane 
+       // (simply, they are wrappers around corresponding plugin-events)
+
+       virtual void PaintBarDecorations( cbBarInfo* pBar, wxDC& dc );
+       virtual void PaintBarHandles( cbBarInfo* pBar, wxDC& dc );
+       virtual void PaintBar( cbBarInfo* pBar, wxDC& dc );
+       virtual void PaintRowHandles( cbRowInfo* pRow, wxDC& dc );
+       virtual void PaintRowBackground ( cbRowInfo* pRow, wxDC& dc );
+       virtual void PaintRowDecorations( cbRowInfo* pRow, wxDC& dc );
+       virtual void PaintRow( cbRowInfo* pRow, wxDC& dc );
+       virtual void PaintPaneBackground( wxDC& dc );
+       virtual void PaintPaneDecorations( wxDC& dc );
+       virtual void PaintPane( wxDC& dc );
+       virtual void SizeBar( cbBarInfo* pBar );
+       virtual void SizeRowObjects( cbRowInfo* pRow );
+       virtual void SizePaneObjects();
+
+       virtual wxDC* StartDrawInArea ( const wxRect& area );
+       virtual void  FinishDrawInArea( const wxRect& area );
+
+public: /* public members */
+
+       cbDockPane(void);
+
+       cbDockPane( int alignment, wxFrameLayout* pPanel );
+
+       // sets pane's margins in frame's coordinate orientations
+       void SetMargins( int top, int bottom, int left, int right );
+
+       virtual ~cbDockPane();
+
+       // does not destroys the info bar , only removes it's reference
+       // from this pane
+
+       virtual void RemoveBar( cbBarInfo* pBar );
+
+       // rect given in the parent frame's coordinates
+       
+       virtual void InsertBar( cbBarInfo* pBar, const wxRect& atRect );
+
+       // inserts bar into the given row, with dimensions and position
+       // stored in pBarInfo->mBounds. Returns the node of inserted bar
+
+       virtual void InsertBar( cbBarInfo* pBar, cbRowInfo* pIntoRow );
+
+       // inserts bar, sets its position according to the preferred settings 
+       // given in (*pBarInfo) structure
+
+       virtual void InsertBar( cbBarInfo* pBarInfo );
+
+       // does not destroy the row object, only removes the corresponding
+       // node from this pane
+       virtual void RemoveRow( cbRowInfo* pRow );
+       
+       // does not refresh the inserted row immediatelly,
+       // if pBeforeRowNode arg. is NULL, row is appended to the end of pane's row list
+       virtual void InsertRow( cbRowInfo* pRow, cbRowInfo* pBeforeRow );
+
+       // sets pane's width in pane's coordinates (including margins)
+       void SetPaneWidth(int width);
+
+       // set the position and dims. of the pane in parent frame's coordinates
+       void SetBoundsInParent( const wxRect& rect );
+
+       inline wxRect& GetRealRect() { return mBoundsInParent; }
+
+       // used by upadates-managers
+       inline RowArrayT& GetRowList() { return mRows; }
+
+       // convenience method
+
+       inline cbRowInfo* GetFirstRow() 
+       
+               { return mRows.GetCount() ? mRows[0] : NULL; }
+
+       // TRUE, if the given bar node presents in this pane
+
+       bool BarPresent( cbBarInfo* pBar );
+
+       // retuns height, in pane's coordinates
+       int GetPaneHeight();
+
+       int GetAlignment();
+
+       bool MatchesMask( int paneMask );
+
+       inline bool IsHorizontal()
+       {
+               return (mAlignment == wxTOP ||
+                           mAlignment == wxBOTTOM );
+       }
+
+       virtual void RecalcLayout();
+
+       virtual int GetDockingState();
+
+       // returns result of hit-testing items in the pane,
+       // see CB_HITTEST_RESULTS enumeration
+
+       virtual int HitTestPaneItems( const wxPoint& pos,   // position in pane's coorinates
+                                                                 cbRowInfo**    ppRow,
+                                                                 cbBarInfo**    ppBar
+                                                               );
+
+       void GetBarResizeRange( cbBarInfo* pBar, int* from, int *till, bool forLeftHandle );
+       void GetRowResizeRange( cbRowInfo* pRow, int* from, int* till, bool forUpperHandle );
+
+       cbBarInfo* GetBarInfoByWindow( wxWindow* pBarWnd );
+
+public: /* protected really (accessed only by plugins) */
+
+       // row/bar resizing related helper-methods
+
+       void DrawVertHandle ( wxDC& dc, int x, int y, int height );
+       void DrawHorizHandle( wxDC& dc, int x, int y, int width  );
+
+       void ResizeRow( cbRowInfo* pRow, int ofs, bool forUpperHandle );
+       void ResizeBar( cbBarInfo* pBar, int ofs, bool forLeftHandle );
+
+       // cbBarShapeData objects will be placed to given pLst (see comments on cbBarShapeData)
+
+       void GetRowShapeData( cbRowInfo* pRow, wxList* pLst );
+
+       // sets the shape to the given row, using the data provided in pLst
+       void SetRowShapeData( cbRowInfo* pRowNode, wxList* pLst );
+};
+
+/*
+ * class declares abstract interface for optimized logic, which should refresh
+ * areas of frame layout - that actually need to be updated. Should be extanded,
+ * to implemnet custom updating strategy
+ */
+
+class cbUpdatesManagerBase : public wxObject
+{
+       DECLARE_ABSTRACT_CLASS( cbUpdatesManagerBase )
+
+public: /* protected really, accessed by serializer (if any) */
+
+       wxFrameLayout* mpLayout;
+
+public:
+       cbUpdatesManagerBase(void)
+               : mpLayout( 0 ) {}
+
+       cbUpdatesManagerBase( wxFrameLayout* pPanel )
+               : mpLayout( pPanel ) {}
+
+       void SetLayout( wxFrameLayout* pLayout ) { mpLayout = pLayout; }
+
+       // notificiactions received from frame-layout (in the order, in which
+       // they usually would be invoked). Custom updates-managers may utilize
+       // these notifications to implement more "fine-grained" updating strategy
+
+       virtual void OnStartChanges() = 0;
+
+       virtual void OnRowWillChange( cbRowInfo* pRow, cbDockPane* pInPane ) {}
+       virtual void OnBarWillChange( cbBarInfo* pBar, cbRowInfo* pInRow, cbDockPane* pInPane ) {}
+       virtual void OnPaneMarginsWillChange( cbDockPane* pPane ) {}
+       virtual void OnPaneWillChange( cbDockPane* pPane ) {}
+
+       virtual void OnFinishChanges() {}
+
+       // refreshes parts of the frame layout, which need an update
+       virtual void UpdateNow() = 0;
+};
+
+/*------------------------------------------------------------
+ * "API" for developing custom plugins of Frame Layout Engine
+ * TODO:: documentation
+ *------------------------------------------------------------
+ */
+
+// base class for all control-bar plugin events
+
+class cbPluginEvent : public wxEvent
+{
+       // NOTE:: plugin-event does not need to be a dynamic class
+
+public:
+       cbDockPane* mpPane; // NULL, if event is not addressed to any specific pane
+
+       /* OLD STUFF::
+       // FOR NOW FOR NOW:: all-in-on plugin event structure 
+       wxNode* mpObjNode;
+       wxNode* mpObjNodeAux;
+       wxPoint mPos;
+       wxSize  mSize;
+       wxDC*   mpDC;
+       bool    mAuxBoolVal;
+       */
+
+       cbPluginEvent( int eventType, cbDockPane* pPane )
+               : mpPane( pPane )
+                 
+               { m_eventType = eventType; }
+};
+
+// event types handled by plugins
+
+#define cbEVT_PL_LEFT_DOWN           0
+#define cbEVT_PL_LEFT_UP                1
+#define cbEVT_PL_RIGHT_DOWN          2
+#define cbEVT_PL_RIGHT_UP               3
+#define cbEVT_PL_MOTION                     4
+
+#define cbEVT_PL_LEFT_DCLICK         5
+
+#define cbEVT_PL_LAYOUT_ROW          6 
+#define cbEVT_PL_RESIZE_ROW          7
+#define cbEVT_PL_LAYOUT_ROWS         8
+#define cbEVT_PL_INSERT_BAR          9
+#define cbEVT_PL_RESIZE_BAR          10
+#define cbEVT_PL_REMOVE_BAR          11
+#define cbEVT_PL_SIZE_BAR_WND        12
+
+#define cbEVT_PL_DRAW_BAR_DECOR      13
+#define cbEVT_PL_DRAW_ROW_DECOR      14
+#define cbEVT_PL_DRAW_PANE_DECOR     15
+#define cbEVT_PL_DRAW_BAR_HANDLES    16
+#define cbEVT_PL_DRAW_ROW_HANDLES    17
+#define cbEVT_PL_DRAW_ROW_BKGROUND   18
+#define cbEVT_PL_DRAW_PANE_BKGROUND  19
+
+#define cbEVT_PL_START_BAR_DRAGGING  20
+#define cbEVT_PL_DRAW_HINT_RECT      21
+
+#define cbEVT_PL_START_DRAW_IN_AREA  22
+#define cbEVT_PL_FINISH_DRAW_IN_AREA 23
+
+#define cbEVT_PL_CUSTOMIZE_BAR       24
+#define cbEVT_PL_CUSTOMIZE_LAYOUT    25
+
+#define wxCUSTOM_CB_PLUGIN_EVENTS_START_AT 100
+
+// forward decls, separated by categories
+
+class cbLeftDownEvent;
+class cbLeftUpEvent;
+class cbRightDownEvent;
+class cbRightUpEvent;
+class cbMotionEvent;
+class cbLeftDClickEvent;
+
+class cbLayoutRowEvent;
+class cbResizeRowEvent;
+class cbLayoutRowsEvent;
+class cbInsertBarEvent;
+class cbResizeBarEvent;
+class cbRemoveBarEvent;
+class cbSizeBarWndEvent;
+
+class cbDrawBarDecorEvent;
+class cbDrawRowDecorEvent;
+class cbDrawPaneDecorEvent;
+class cbDrawBarHandlesEvent;
+class cbDrawRowHandlesEvent;
+class cbDrawRowBkGroundEvent;
+class cbDrawPaneBkGroundEvent;
+
+class cbStartBarDraggingEvent;
+class cbDrawHintRectEvent;
+
+class cbStartDrawInAreaEvent;
+class cbFinishDrawInAreaEvent;
+
+class cbCustomizeBarEvent;
+class cbCustomizeLayoutEvent;
+
+// defs. for handler-methods
+typedef void (wxEvtHandler::*cbLeftDownHandler        )(cbLeftDownEvent&);
+typedef void (wxEvtHandler::*cbLeftUpHandler          )(cbLeftUpEvent&);
+typedef void (wxEvtHandler::*cbRightDownHandler       )(cbRightDownEvent&);
+typedef void (wxEvtHandler::*cbRightUpHandler         )(cbRightUpEvent&);
+typedef void (wxEvtHandler::*cbMotionHandler          )(cbMotionEvent&);
+typedef void (wxEvtHandler::*cbLeftDClickHandler      )(cbLeftDClickEvent&);
+
+typedef void (wxEvtHandler::*cbLayoutRowHandler       )(cbLayoutRowEvent&);
+typedef void (wxEvtHandler::*cbResizeRowHandler       )(cbResizeRowEvent&);
+typedef void (wxEvtHandler::*cbLayoutRowsHandler      )(cbLayoutRowsEvent&);
+typedef void (wxEvtHandler::*cbInsertBarHandler       )(cbInsertBarEvent&);
+typedef void (wxEvtHandler::*cbResizeBarHandler       )(cbResizeBarEvent&);
+typedef void (wxEvtHandler::*cbRemoveBarHandler       )(cbRemoveBarEvent&);
+typedef void (wxEvtHandler::*cbSizeBarWndHandler      )(cbSizeBarWndEvent&);
+
+typedef void (wxEvtHandler::*cbDrawBarDecorHandler    )(cbDrawBarDecorEvent&);
+typedef void (wxEvtHandler::*cbDrawRowDecorHandler    )(cbDrawRowDecorEvent&);
+typedef void (wxEvtHandler::*cbDrawPaneDecorHandler   )(cbDrawPaneDecorEvent&);
+typedef void (wxEvtHandler::*cbDrawBarHandlesHandler  )(cbDrawBarHandlesEvent&);
+typedef void (wxEvtHandler::*cbDrawRowHandlesHandler  )(cbDrawRowHandlesEvent&);
+typedef void (wxEvtHandler::*cbDrawRowBkGroundHandler )(cbDrawRowBkGroundEvent&);
+typedef void (wxEvtHandler::*cbDrawPaneBkGroundHandler)(cbDrawPaneBkGroundEvent&);
+
+typedef void (wxEvtHandler::*cbStartBarDraggingHandler )(cbStartBarDraggingEvent&);
+typedef void (wxEvtHandler::*cbDrawHintRectHandler     )(cbDrawHintRectEvent&);
+
+typedef void (wxEvtHandler::*cbStartDrawInAreaHandler )(cbStartDrawInAreaEvent&);
+typedef void (wxEvtHandler::*cbFinishDrawInAreaHandler)(cbFinishDrawInAreaEvent&);
+
+typedef void (wxEvtHandler::*cbCustomizeBarHandler    )(cbCustomizeBarEvent&);
+typedef void (wxEvtHandler::*cbCustomizeLayoutHandler )(cbCustomizeLayoutEvent&);
+
+// macros for creating event table entries for plugin-events
+
+#define EVT_PL_LEFT_DOWN(func)              { cbEVT_PL_LEFT_DOWN,                   -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbLeftDownHandler        ) & func },
+#define EVT_PL_LEFT_UP(func)                { cbEVT_PL_LEFT_UP,             -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbLeftUpHandler          ) & func },
+#define EVT_PL_RIGHT_DOWN(func)                     { cbEVT_PL_RIGHT_DOWN,              -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbRightDownHandler       ) & func },
+#define EVT_PL_RIGHT_UP(func)               { cbEVT_PL_RIGHT_UP,                    -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbRightUpHandler         ) & func },
+#define EVT_PL_MOTION(func)                         { cbEVT_PL_MOTION,                  -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbMotionHandler          ) & func },
+#define EVT_PL_LEFT_DCLICK(func)            { cbEVT_PL_LEFT_DCLICK,             -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbLeftDClickHandler      ) & func },
+                                                                                                                                                                                                                                                                                
+#define EVT_PL_LAYOUT_ROW(func)                     { cbEVT_PL_LAYOUT_ROW,              -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbLayoutRowHandler       ) & func },
+#define EVT_PL_RESIZE_ROW(func)                     { cbEVT_PL_RESIZE_ROW,              -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbResizeRowHandler       ) & func },
+#define EVT_PL_LAYOUT_ROWS(func)            { cbEVT_PL_LAYOUT_ROWS,         -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbLayoutRowsHandler      ) & func },
+#define EVT_PL_INSERT_BAR(func)                     { cbEVT_PL_INSERT_BAR,              -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbInsertBarHandler       ) & func },
+#define EVT_PL_RESIZE_BAR(func)                     { cbEVT_PL_RESIZE_BAR,              -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbResizeBarHandler       ) & func },
+#define EVT_PL_REMOVE_BAR(func)                     { cbEVT_PL_REMOVE_BAR,              -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbRemoveBarHandler       ) & func },
+#define EVT_PL_SIZE_BAR_WND(func)           { cbEVT_PL_SIZE_BAR_WND,        -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbSizeBarWndHandler      ) & func },
+                                                                                                                                                                                                                                                                                
+#define EVT_PL_DRAW_BAR_DECOR(func)      { cbEVT_PL_DRAW_BAR_DECOR,      -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbDrawBarDecorHandler    ) & func },
+#define EVT_PL_DRAW_ROW_DECOR(func)      { cbEVT_PL_DRAW_ROW_DECOR,      -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbDrawRowDecorHandler    ) & func },
+#define EVT_PL_DRAW_PANE_DECOR(func)     { cbEVT_PL_DRAW_PANE_DECOR,     -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbDrawPaneDecorHandler   ) & func },
+#define EVT_PL_DRAW_BAR_HANDLES(func)    { cbEVT_PL_DRAW_BAR_HANDLES,    -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbDrawBarHandlesHandler  ) & func },
+#define EVT_PL_DRAW_ROW_HANDLES(func)    { cbEVT_PL_DRAW_ROW_HANDLES,    -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbDrawRowHandlesHandler  ) & func },
+#define EVT_PL_DRAW_ROW_BKGROUND(func)   { cbEVT_PL_DRAW_ROW_BKGROUND,   -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbDrawRowBkGroundHandler ) & func },
+#define EVT_PL_DRAW_PANE_BKGROUND(func)  { cbEVT_PL_DRAW_PANE_BKGROUND,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbDrawPaneBkGroundHandler) & func },
+                                                                                                                                                                                                                                                                                
+#define EVT_PL_START_BAR_DRAGGING(func)  { cbEVT_PL_START_BAR_DRAGGING,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbStartBarDraggingHandler) & func },
+#define EVT_PL_DRAW_HINT_RECT(func)      { cbEVT_PL_DRAW_HINT_RECT,      -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbDrawHintRectHandler    ) & func },
+
+#define EVT_PL_START_DRAW_IN_AREA(func)  { cbEVT_PL_START_DRAW_IN_AREA,  -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbStartDrawInAreaHandler)  & func },
+#define EVT_PL_FINISH_DRAW_IN_AREA(func) { cbEVT_PL_FINISH_DRAW_IN_AREA, -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbFinishDrawInAreaHandler) & func },
+
+#define EVT_PL_CUSTOMIZE_BAR(func)       { cbEVT_PL_CUSTOMIZE_BAR,       -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbCustomizeBarHandler)     & func },
+#define EVT_PL_CUSTOMIZE_LAYOUT(func)    { cbEVT_PL_CUSTOMIZE_LAYOUT,    -1, -1, (wxObjectEventFunction) (wxEventFunction) (cbCustomizeLayoutHandler)  & func },
+
+/* 
+ * abstract base class for all control-bar related plugins 
+ */
+
+class cbPluginBase : public wxEvtHandler
+{
+       DECLARE_ABSTRACT_CLASS( cbPluginBase )
+public:
+
+       wxFrameLayout* mpLayout; // back-reference to the frame layout 
+
+       // specifies panes, for which this plugin receives events
+       // (see pane masks definitions)
+       int            mPaneMask; 
+
+       bool           mIsReady; // is TRUE, when plugin is ready to handle events
+
+public:
+       cbPluginBase(void) 
+
+               : mpLayout  ( 0 ),
+                 mPaneMask( wxALL_PANES ),
+                 mIsReady ( FALSE )
+       {}
+
+       cbPluginBase( wxFrameLayout* pPanel, int paneMask = wxALL_PANES ) 
+
+               : mpLayout  ( pPanel ),
+                 mPaneMask( paneMask ),
+                 mIsReady ( FALSE )
+       {}
+
+       inline int GetPaneMask() { return mPaneMask; }
+
+       // NOTE:: pointer positions of mouse-events sent to plugins
+       //        are always in pane's coordinates (pane's to which
+       //        this plugin is hooked)
+
+       // destroys the whole plugin chain of connected plagins
+       virtual ~cbPluginBase();
+
+       // override this method to do plugin-specific initialization
+       // (at this point plugin is already attached to the frame layout,
+       //  and pane masks are set)
+       virtual void OnInitPlugin() { mIsReady = TRUE; }
+
+       bool IsReady() { return mIsReady; }
+
+       // overriden, to determine whether the target pane specified in the
+       // event, matches the pane mask of this plugin (specific plugins
+       // do not override this method)
+
+       virtual bool ProcessEvent(wxEvent& event);
+};
+
+/*** event classes, for each corresponding event type (24 currnetly...uhh) ***/
+
+// mouse-events category
+
+class cbLeftDownEvent : public cbPluginEvent
+{
+public:
+       wxPoint mPos;
+
+       cbLeftDownEvent( const wxPoint& pos, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_LEFT_DOWN, pPane ),
+                 mPos( pos )
+       {}
+};
+
+class cbLeftUpEvent : public cbPluginEvent
+{
+public:
+       wxPoint mPos;
+
+       cbLeftUpEvent( const wxPoint& pos, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_LEFT_UP, pPane ),
+                 mPos( pos )
+       {}
+};
+
+class cbRightDownEvent : public cbPluginEvent
+{
+public:
+       wxPoint mPos;
+
+       cbRightDownEvent( const wxPoint& pos, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_RIGHT_DOWN, pPane ),
+                 mPos( pos )
+       {}
+};
+
+class cbRightUpEvent : public cbPluginEvent
+{
+public:
+       wxPoint mPos;
+
+       cbRightUpEvent( const wxPoint& pos, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_RIGHT_UP, pPane ),
+                 mPos( pos )
+       {}
+};
+
+class cbMotionEvent : public cbPluginEvent
+{
+public:
+       wxPoint mPos;
+
+       cbMotionEvent( const wxPoint& pos, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_MOTION, pPane ),
+                 mPos( pos )
+       {}
+};
+
+class cbLeftDClickEvent : public cbPluginEvent
+{
+public:
+       wxPoint mPos;
+
+       cbLeftDClickEvent( const wxPoint& pos, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_LEFT_DCLICK, pPane ),
+                 mPos( pos )
+       {}
+};
+
+// bar/row events category
+
+class cbLayoutRowEvent : public cbPluginEvent
+{
+public:
+       cbRowInfo* mpRow;
+
+       cbLayoutRowEvent( cbRowInfo* pRow, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_LAYOUT_ROW, pPane ),
+                 mpRow( pRow )
+       {}
+};
+
+class cbResizeRowEvent : public cbPluginEvent
+{
+public:
+       cbRowInfo* mpRow;
+       int        mHandleOfs;
+       bool       mForUpperHandle;
+
+       cbResizeRowEvent( cbRowInfo* pRow, int handleOfs, bool forUpperHandle, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_RESIZE_ROW, pPane ),
+                 mpRow( pRow ),
+                 mHandleOfs( handleOfs ),
+                 mForUpperHandle( forUpperHandle )
+       {}
+};
+
+class cbLayoutRowsEvent : public cbPluginEvent
+{
+public:
+
+       cbLayoutRowsEvent( cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_LAYOUT_ROWS, pPane )
+       {}
+};
+
+class cbInsertBarEvent : public cbPluginEvent
+{
+public:
+       cbBarInfo*  mpBar;
+       cbRowInfo*  mpRow;
+
+       cbInsertBarEvent( cbBarInfo* pBar, cbRowInfo* pIntoRow, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_INSERT_BAR, pPane ),
+
+                 mpBar( pBar     ),
+                 mpRow( pIntoRow )
+       {}
+};
+
+class cbResizeBarEvent : public cbPluginEvent
+{
+public:
+       cbBarInfo* mpBar;
+       cbRowInfo* mpRow;
+
+       cbResizeBarEvent( cbBarInfo* pBar, cbRowInfo* pRow, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_RESIZE_BAR, pPane ),
+                 mpBar( pBar ),
+                 mpRow( pRow )
+       {}
+};
+
+class cbRemoveBarEvent : public cbPluginEvent
+{
+public:
+       cbBarInfo* mpBar;
+
+       cbRemoveBarEvent( cbBarInfo* pBar, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_REMOVE_BAR, pPane ),
+                 mpBar( pBar )
+       {}
+};
+
+class cbSizeBarWndEvent : public cbPluginEvent
+{
+public:
+       cbBarInfo* mpBar;
+       wxRect     mBoundsInParent;
+
+       cbSizeBarWndEvent( cbBarInfo* pBar, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_SIZE_BAR_WND, pPane ),
+                 mpBar( pBar ),
+                 mBoundsInParent( pBar->mBoundsInParent )
+       {}
+};
+
+class cbDrawBarDecorEvent : public cbPluginEvent
+{
+public:
+       cbBarInfo* mpBar;
+       wxDC*      mpDc;
+       wxRect     mBoundsInParent;
+
+       cbDrawBarDecorEvent( cbBarInfo* pBar, wxDC& dc, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_DRAW_BAR_DECOR, pPane ),
+                 mpBar( pBar ),
+                 mpDc( &dc ),
+                 mBoundsInParent( pBar->mBoundsInParent )
+       {}
+};
+
+class cbDrawRowDecorEvent : public cbPluginEvent
+{
+public:
+       cbRowInfo* mpRow;
+       wxDC*      mpDc;
+
+       cbDrawRowDecorEvent( cbRowInfo* pRow, wxDC& dc, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_DRAW_ROW_DECOR, pPane ),
+                 mpRow( pRow ),
+                 mpDc( &dc )
+       {}
+};
+
+class cbDrawPaneDecorEvent : public cbPluginEvent
+{
+public:
+       wxDC* mpDc;
+
+       cbDrawPaneDecorEvent( wxDC& dc, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_DRAW_PANE_DECOR, pPane ),
+                 mpDc( &dc )
+       {}
+};
+
+class cbDrawBarHandlesEvent : public cbPluginEvent
+{
+public:
+       cbBarInfo* mpBar;
+       wxDC*   mpDc;
+
+       cbDrawBarHandlesEvent( cbBarInfo* pBar, wxDC& dc, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_DRAW_BAR_HANDLES, pPane ),
+                 mpBar( pBar ),
+                 mpDc( &dc )
+       {}
+};
+
+class cbDrawRowHandlesEvent : public cbPluginEvent
+{
+public:
+       cbRowInfo* mpRow;
+       wxDC*      mpDc;
+
+       cbDrawRowHandlesEvent( cbRowInfo* pRow, wxDC& dc, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_DRAW_ROW_HANDLES, pPane ),
+                 mpRow( pRow ),
+                 mpDc( &dc )
+       {}
+};
+
+class cbDrawRowBkGroundEvent : public cbPluginEvent
+{
+public:
+       cbRowInfo* mpRow;
+       wxDC*   mpDc;
+
+       cbDrawRowBkGroundEvent( cbRowInfo* pRow, wxDC& dc, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_DRAW_ROW_BKGROUND, pPane ),
+                 mpRow( pRow ),
+                 mpDc( &dc )
+       {}
+};
+
+class cbDrawPaneBkGroundEvent : public cbPluginEvent
+{
+public:
+       wxDC* mpDc;
+
+       cbDrawPaneBkGroundEvent( wxDC& dc, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_DRAW_PANE_BKGROUND, pPane ),
+                 mpDc( &dc )
+       {}
+};
+
+class cbStartBarDraggingEvent : public cbPluginEvent
+{
+public:
+       cbBarInfo* mpBar;
+       wxPoint    mPos;  // is given in frame's coordinates
+
+       cbStartBarDraggingEvent( cbBarInfo* pBar, const wxPoint& pos, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_START_BAR_DRAGGING, pPane ),
+                 mpBar( pBar ),
+                 mPos( pos )
+       {}
+};
+
+class cbDrawHintRectEvent : public cbPluginEvent
+{
+public:
+       wxRect mRect;      // is given in frame's coordinates
+
+
+       bool   mLastTime;  // indicates that this event finishes "session" of on-screen drawing,
+                                          // thus associated resources can be freed now
+       bool   mEraseRect; // does not have any impact, if recangle is drawn using XOR-mask
+
+       bool   mIsInClient;// in cleint area hint could be drawn differently,
+                          // e.g. with fat/hatched border
+
+
+       cbDrawHintRectEvent( const wxRect& rect, bool isInClient, bool eraseRect, bool lastTime )
+
+               : cbPluginEvent( cbEVT_PL_DRAW_HINT_RECT, 0 ),
+                 mRect      ( rect       ),
+                 mLastTime  ( lastTime   ),
+                 mEraseRect ( eraseRect  ),
+                 mIsInClient( isInClient )
+       {}
+};
+
+class cbStartDrawInAreaEvent : public cbPluginEvent
+{
+public:
+       wxRect mArea;
+       wxDC** mppDc; // points to pointer, where the reference
+                     // to the obtained buffer-context should be placed
+
+       cbStartDrawInAreaEvent( const wxRect& area, wxDC** ppDCForArea, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_START_DRAW_IN_AREA, pPane ),
+                 mArea( area ),
+                 mppDc( ppDCForArea )
+       {}
+};
+
+class cbFinishDrawInAreaEvent : public cbPluginEvent
+{
+public:
+       wxRect mArea;
+
+       cbFinishDrawInAreaEvent( const wxRect& area, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_FINISH_DRAW_IN_AREA, pPane ),
+                 mArea( area )
+       {}
+};
+
+class cbCustomizeBarEvent : public cbPluginEvent
+{
+public:
+       wxPoint    mClickPos; // in parent frame's coordinates
+       cbBarInfo* mpBar;
+
+       cbCustomizeBarEvent( cbBarInfo* pBar, const wxPoint& clickPos, cbDockPane* pPane )
+
+               : cbPluginEvent( cbEVT_PL_CUSTOMIZE_BAR, pPane ),
+                 mClickPos( clickPos ),
+                 mpBar( pBar )
+       {}
+};
+
+class cbCustomizeLayoutEvent : public cbPluginEvent
+{
+public:
+       wxPoint mClickPos; // in parent frame's coordinates
+
+       cbCustomizeLayoutEvent( const wxPoint& clickPos )
+
+               : cbPluginEvent( cbEVT_PL_CUSTOMIZE_LAYOUT, 0 ),
+                 mClickPos( clickPos )
+       {}
+};
+
+
+#endif