Introduction
In the previous article, I introduced SplitPane
class that manages client view windows with splitters and tab panes and provides an interaction interface with the owner class. In this article, I would like to represent Frame
class that extends SplitPane
functionality with dockable and floating features. Also, I am going to consider that you know what dockable and floating windows are. Sure, the best example of those is Visual Studio .NET IDE. I guess you are also aware of an excellent job that has been done by Sergey Klimov and the further improvement by Daniel Bowen. This article is just an attempt to provide a simpler interface for the particular case, with a little bit different paradigm. I hope I have succeeded in it.
What it does
Briefly: Frame
class provides dockable and floating environment for client views. There are three parts to this environment, the main pane, dock panes and float frames. All of them are owners of SplitPane
, so you can split and tab all client views. Also, the client views are separated in two different groups, dockable views and document views. The difference is simple. The dockable views cannot be attached in the main pane but can be docked in one of the docked sides. The document views are unlike them, they can be attached in the main pane but cannot be docked. Both of them are able to become floating. That's the difference with Visual Studio .NET IDE. To prevent a floating window to get docked to any place, keep CTRL key pressed while dragging it.
Using the code
The use of Frame
class can be as simple as the use of SplitPane class. It's also designed for SDI applications. I won't repeat all steps but a few points. With all include files mentioned in that, you will want to use DockTabFrame.h with the Frame
class implementation. This is also in DockSplitTab
namespace. There is a ClientView
class that has all necessary properties for the client view windows. Frame
class provides a communication interface for the interface with the owner or parent class. This is the FrameListener
abstract class. clientDetached
is the only function provided for this interface so far. Frame
class calls it when a user closes a dock pane, a float frame or a tab. In other words, when he pushes a close button. There is a detachClientView
function for Frame
class that does the similar action but does not raise clientDetached
event. Frame
sends WM_CONTEXTMENU
Windows message to the client views in appropriate cases. For instance, when you click a right mouse button on the tab.
Frame class
Public methods:
HWND create( parentWnd, rect);
bool setFocusTo( clientViewWnd) {
HWND focusedClientView();
bool toggleClientViewState( clientViewWnd, ClientView::State);
ClientView* getClientView( clientViewWnd);
bool addClientView( clientView);
bool dockClientView( dockSide, clientView);
bool showDockPane( dockSide, show);
bool dockPaneVisible( dockSide);
bool dockPaneExists( dockSide);
POSITION floatFrameStart()
HWND floatFrameNext( &position);
HWND floatClientView( rect, clientView);
bool showFloatFrame( floatFrameWnd, show);
bool floatFrameVisible( floatFrameWnd)
bool checkFloatFrame( floatFrameWnd);
void attachClientView( clientView);
ClientView* detachClientView( clientViewWnd);
bool clientViewVisible( clientViewWnd);
bool clientViewAttached( clientViewWnd);
void setImageList( imgList);
HIMAGELIST getImageList();
Inside of Frame class
There are implementations of two very important classes for Frame
class. These are DockPane
class and FloatFrame
class. Each of them has its own SplitPane
member. So you can split and tab client views inside of each DockPane
or FloatFrame
instance. Frame
class itself also owns SplitPane
instance. An objective of this instance is to keep document views. Frame
class communicates with the float frames, dock panes and main pane via FloatDockFrameListener
interface class that extends CallBackListener
interface.
class DockPane |
- contains docked client views. |
class FloatFrame |
- contains floating client views. |
class FloatDockFrameListener |
- communication interface between float frames, dock panes and their owner. (Frame class) |
class SplitPaneWrapper |
- encapsulates common data and methods for split pane containers.
Used by FloatFrame class and DockPane class. |
class FloatFrameDragContext |
- stores drag and drop context. Inherited from RectTracker class. |
class DropParcel |
-the result of drag and drop operations. |
class LayoutManager |
- layout implementation for Frame class. |
What's the next
Two things are left to do: Serialization and Auto hide panes.
References