For the Q3 2009 release, we have added a few important new features to the RadDock. The first of these features is the ability to set the tab strip alignment and/or visibility on DocumentTabStrip and ToolTabStrip instances. The second feature we have added is the ability to implement your own manual drag and drop behavior.
Tab Alignment and Visibility
When working with ToolTabStrips and DocumentTabStrips in the Q3 release, you will notice that we have added two new properties. The first of these properties, TabStripAlignment, allows you to set the alignment of tabs within their parent TabStrip. The second of these properties, TabStripVisible, allows you to specify whether or not the tabs should be visible. You can see these features in action in the RadControls for WinForms demo application under RadDock -> TabStrip Properties.
Manual Drag and Drop Behavior
Drag and drop automation is now possible with the RadDock. The DragDropService of the RadDock now contains a property, DragDropBehavior, that you can set to auto or manual. Setting this property to manual allows you to implement your own custom drag and drop behavior based on the events provided by the DragDropService object.
Using a manual implementation of this service, I've created a simple class that allows for it's users to animate the dragging of a ToolWindow through one line of code.
private
void
btnDragDrop_Click(
object
sender, EventArgs e)
{
_radDockAutomation.DoDragDrop(toolWindow1, DockPosition.Fill, toolWindow2);
}
The class, RadDockAutomation, takes a RadDock in its constructor. In calling the DoDragDrop method, you must specify a ToolWindow to drag and drop, the way in which to dock it, and the ToolWindow to dock it inside of or relative to. Upon calling this method, the DragDropBehavior of the DragDropService is set to manual, two events are subscribed to, and a timer is started.
public
void
DoDragDrop(DockWindow dragDropDockWindow, DockPosition toDockPosition, DockWindow toDockWindow)
{
// Setup the DragDropService for custom behavior
_ddService.DragDropBehavior = DragDropBehavior.Manual;
_ddService.PreviewHitTest +=
new
DragDropHitTestEventHandler(_ddService_PreviewHitTest);
_ddService.Stopped +=
new
EventHandler(_ddService_Stopped);
// Set the toPosition and DockWindow
_toDockPosition = toDockPosition;
_toDockWindow = toDockWindow;
// Set the initial position of the window being dragged
_prevPosition = dragDropDockWindow.Parent.RectangleToScreen(dragDropDockWindow.Bounds).Location;
_radDock.FloatWindow(dragDropDockWindow,
new
Rectangle(
this
._prevPosition, DragDropService.DefaultFloatingSize));
// Start the drag
_ddService.Start(dragDropDockWindow.FloatingParent,
this
._prevPosition);
_timer.Start();
}
The timer is responsible for moving the specified DockWindow within its tick event. The PerformDrag method being called calculates the next position the ToolWindow should be moved to on a point by point basis.
void
_timer_Tick(
object
sender, EventArgs e)
{
_ddService.PerformDrag(GetNextPoint(_toDockPosition, _toDockWindow));
}
The PreviewHitTest event of the DragDropService is responsible for detecting when the DockWindow being moved has reached the specified location. Once it has reached the specified location, the service is stopped and the drag drop automation is completed.
void
_ddService_PreviewHitTest(
object
sender, DragDropHitTestEventArgs e)
{
if
((e.DropTarget == _toDockWindow.DockTabStrip)
&& (e.HitTest.DockPosition !=
null
&& e.HitTest.DockPosition == _toDockPosition))
{
this
._ddService.Stop(
true
);
}
}
Click here to download the source code used in this post.