[Lazarus] Some docking theory

Hans-Peter Diettrich DrDiettrich1 at aol.com
Tue Dec 23 04:38:59 CET 2008

Paul Ishenin schrieb:

>> That's all, so far, but it took me many hours to distill all the 
>> observed woes of the current [L]DockTree implementation into these few 
>> principles.
> Will you implement this principles also?

I've just implemented TDockTree.PositionDockRect (see appended diff). 
Before testing with the docking example, remove the Form1.OnDockOver 
handler, which replaces the DockRect again.

There is one problem with getting the dock zone extent, as you can see 
in the comment on dzone.FBounds, which seems to be invalid for most 
docking zones. The workaround with dzone.Top etc. works better, but it 
excludes the zone header - behaves like DropCtl.Bounds. Using the 
workaround makes the DockRect behave almost as in Delphi.

There exist more problems with the current implementation, apart from 
the bugs in the dock zone management. One problem is inherited from the 
Delphi interface IDockManager, which allows the docking manager to 
modify the DockRect, but doesn't allow to also modify the DropAlign. It 
wouldn't break compatibility to make DropAlign an "var" parameter in 
PositionDockRect, like DockRect already is. Without this or a similar 
patch it will be impossible to obtain values other than the 
top/bottom/left/right alignment, as determined by the dragged control. 
When the zone and alignment is only determined by the dragged control, 
without a chance for adjustments by the dock manager, it will be almost 
impossible to e.g. dock a control to the top or bottom of a horizontal 
row of already docked controls.

Another problem is the determination of the DropCtl, which cannot work 
properly when the mouse is over an dock header, not over a docked 
control - then DropCtl is Nil. Then the dock manager has no idea about 
the affected dock zone. Using the current mouse position and iterating 
through the dock zones doesn't work just now, because the dock zones 
currently do not have a valid Bounds rectangle (including the zone 
header). This also may be one of the reason for further errors in the 
handling of docked controls and docking zones.

The Delphi implementation reveals further problems, e.g. undocking a 
control can result in undocking an entire dock zone with more than only 
the intended control. A bug or a feature?

Now I wish everybody a Merry Christmas or, to be more political correct, 
seasonal greetings :-)

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: PositionDockRect.diff
URL: <http://lists.lazarus-ide.org/pipermail/lazarus/attachments/20081223/7c003d13/attachment-0007.ksh>

More information about the Lazarus mailing list