Graeme Geldenhuys schrieb:

probably know Java has solved this problem nicely with layout managers. If layout managers were implemented in Lazarus the IDE


I fully agree, layout managers (or even only one layout manager) would
solve this problem. LCL has Anchors (a lot more advanced compared to say
Delphi 7's anchors), which goes some way to solve the problem, but it is
still a hit and miss case - as Lazarus proves. Constantly Lazarus
dialogs are broken, due to components overlapping, text being clipped
etc... This gives the application a very unpolished look. A layout
manager normally solves layout problems, preferred sizes, including
handling size changes due to language selections etc..

I am working on a solution though, but unfortunately the work in
progress is very slow at the moment due to day job (work) related
deadlines. I started implementing the Java MiG Layout Manager - first to
be used with fpGUI Toolkit. But the original design of MiG Layout allows
for other GUI toolkits to plug in very easily with minimal code needed.
I will try and duplicate that design, so that MiG Layout Manager can
work with fpGUI and LCL.

In my development of an docking manager I came across the idea to separate the docking related methods from the layout of the dock site. Using that separation, a GUI designer could work like a DockManager, with added features for rearranging the layout, while the layout manager part would handle the layout at runtime. Every container component in a layout (currently all TWinControls, later every DockZone) could have its own layout manager, not restricted to one single (tree) layout for an entire site (form, panel...). This approach would allow to implement the traditional (Java...) layout managers without additional cost, and most probably also would fit the MiG layout.

The "dock" zones (here better: layout zones) could be used for an additional structure of a GUI, invisible at runtime, establishing points of reference for the control placement (similar to anchor docking). The anchor docking approach looks to me too unsystematic, with too many degrees of freedom that make it hard to implement and use; otherwise it's just another layout management system, that can be used in any layout zone.


The technical implementation could look like this:

The TWinControl.DockManager is used as a layout manager (when assigned), in the following referred to as LayoutManager. When no special manager is installed, a reference to an default manager object could be returned, so that all docking and layout related functionality can be moved out of TControl and TWinControl, into the default manager class.

The layout and docking control methods of TControl and TWinControl simply defer to the new LayoutManager. This allows to replace the Delphi docking model by any other one, that is more appropriate to non-Windows platforms and widgetsets, without breaking Delphi compatibility.

TWinControl.DockSite only activates the docking related methods of the LayoutManager.

TWinControl.UseDockManager is quite obsolete then. It could indicate that a special LayoutManager has been installed, otherwise the default manager (doing almost nothing) is used.

The anchor docking related fields are removed from TWinControl and become part of the LayoutManager. Persistence and property editing must be handled somehow, just like for every other docking/layout manager.

Splitters can be removed as standalone components, and can become part of the layout management of every layout zone (kind of combination of a TPanel with an TSplitter, where the splitter position and visibility is determined from a single property of the combined component).

The form designers cooperate with the installed layout managers, using their virtual methods. The managers can use the inherited designtime methods, implemented in their base class, in csDesigning state. The designers can use the existing docking capabilities of the managers, no need to reinvent the wheel.

DoDi


--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to