Difference between revisions of "Anchor Docking"

From Lazarus wiki
Jump to navigationJump to search
Line 1: Line 1:
 
About docking in general see [[Docking]].
 
About docking in general see [[Docking]].
  
==Anchor Docking with TLazDockingManager==
+
=Anchor Docking with TLazDockingManager=
  
 
The TLazDockingManager is part of the LCL and can be found unit LDockCtrl. It is not yet complete and therefore not yet part of the IDE component palette. An example can be found in  
 
The TLazDockingManager is part of the LCL and can be found unit LDockCtrl. It is not yet complete and therefore not yet part of the IDE component palette. An example can be found in  
 
lazarus/examples/anchordocking/docking1.lpi.
 
lazarus/examples/anchordocking/docking1.lpi.
  
===Features===
+
==Features==
  
 
*By using the LCL's anchors almost any layout is possible. It is for example not limited to the strict top/bottom/left/right order of the Align property.
 
*By using the LCL's anchors almost any layout is possible. It is for example not limited to the strict top/bottom/left/right order of the Align property.
Line 20: Line 20:
 
*Dynamic and automatic restore layout algorithm. The layout is restored when a control is shown. That means no matter when or how a form is shown, the docking manager will automatically dock it according to the last known layout of this form. It will automatically resize the neighborhood. (already works for many layouts, needs some improvements for complex cases).
 
*Dynamic and automatic restore layout algorithm. The layout is restored when a control is shown. That means no matter when or how a form is shown, the docking manager will automatically dock it according to the last known layout of this form. It will automatically resize the neighborhood. (already works for many layouts, needs some improvements for complex cases).
  
===ToDos===
+
==ToDos==
  
 
*Improve and harden the restore algorithm until it is good enough for the IDE.
 
*Improve and harden the restore algorithm until it is good enough for the IDE.
Line 29: Line 29:
 
*Implement drag and drop docking.
 
*Implement drag and drop docking.
  
==Usage==
+
=Usage=
  
===Create a TLazDockingManager===
+
==Create a TLazDockingManager==
 
<DELPHI>
 
<DELPHI>
 
   DockingManager:=TLazDockingManager.Create(Self);
 
   DockingManager:=TLazDockingManager.Create(Self);
Line 37: Line 37:
 
The Self as parameter is only used as Owner. That means, when the mainform is freed, the DockingManager is freed too. You can use ''nil'' and free the DockingManager yourself.
 
The Self as parameter is only used as Owner. That means, when the mainform is freed, the DockingManager is freed too. You can use ''nil'' and free the DockingManager yourself.
 
   
 
   
===Optional: Loading a configuration===
+
==Optional: Loading a configuration==
 
You can load the user configuration from disk.
 
You can load the user configuration from disk.
 
<DELPHI>
 
<DELPHI>
Line 46: Line 46:
 
This loads the file ''config.xml''. The config can be created by the SaveToConfig function. See below.
 
This loads the file ''config.xml''. The config can be created by the SaveToConfig function. See below.
  
===Create a TLazControlDocker for each form/control that should be dockable===
+
==Make a form/control dockable==
 +
Create a TLazControlDocker for each form/control that should be dockable
 
<DELPHI>
 
<DELPHI>
 
   ControlDocker1:=TLazControlDocker.Create(Self);
 
   ControlDocker1:=TLazControlDocker.Create(Self);
Line 53: Line 54:
 
</DELPHI>
 
</DELPHI>
  
===Optional: Saving the user configuration to disk===
+
==Optional: Saving the user configuration to disk==
 
When the program is closed you can save the user configuration to disk
 
When the program is closed you can save the user configuration to disk
 
<DELPHI>
 
<DELPHI>
Line 61: Line 62:
 
   Config.Free;
 
   Config.Free;
 
</DELPHI>
 
</DELPHI>
 +
 +
=Why use Anchors instead of Align?=
 +
Align can only create the following layouts:
 +
  +------------------------------------------+
 +
  |      alTop                              |
 +
  +------------------------------------------+
 +
  +------------------------------------------+
 +
  |      alTop                              |
 +
  +------------------------------------------+
 +
  +------++------++--------++-------++-------+
 +
  |alLeft||alLeft||alClient||alRight||alRight|
 +
  +------++------++--------++-------++-------+
 +
  +------------------------------------------+
 +
  |      alBottom                            |
 +
  +------------------------------------------+
 +
  +------------------------------------------+
 +
  |      alBottom                            |
 +
  +------------------------------------------+
 +
The alTop controls are always at the top, filling the whole horizontal width. That's because the LCL first aligns all controls with alTop, then all alBottom, then alLeft, then alRight and finally alClient.
 +
 +
It is possible to nest Align layouts by using hidden panels. Then any layout that can be recursively splitted in halves can be created. Then you can create for example:
 +
 +
  +-++-++---++-++-+
 +
  | || ||  || || |
 +
  | || |+---+| || |
 +
  | || |+---+| || |
 +
  | || ||  || || |
 +
  | || |+---+| || |
 +
  | || |+---+| || |
 +
  | || ||  || || |
 +
  +-++-++---++-++-+

Revision as of 16:27, 4 January 2008

About docking in general see Docking.

Anchor Docking with TLazDockingManager

The TLazDockingManager is part of the LCL and can be found unit LDockCtrl. It is not yet complete and therefore not yet part of the IDE component palette. An example can be found in lazarus/examples/anchordocking/docking1.lpi.

Features

  • By using the LCL's anchors almost any layout is possible. It is for example not limited to the strict top/bottom/left/right order of the Align property.
  • It does not use hidden panels. What you see is how it is structured.
  • TSplitter are automatically inserted between docked forms
  • Page docking. Forms can be docked not only left/right/above/below, but in pages too. A TPageControl is automatically created. A page can contain arbitrary docked forms too, including paged docked forms, allowing nested pages.
  • Easy use: Just drop a TLazControlDocker onto the form that should be dockable, give it an unique name and connect it to the TLazDockingManager.
  • Not only forms, but any TWinControl can be made dockable. (needs testing)
  • Popup menu: User interface via platform independent popup menu. TLazControlDocker adds by default a popup menu 'Docking' to the PopupMenu of the form. This menu item opens a dialog where the user can setup the docking.
  • Easy docking via code. For example dock Form2 left of Form1:
 DockingManager.Manager.InsertControl(Form2,alLeft,Form1);
  • Can save/load layouts from/to xml config files. The layout information is stored for each dockable control and if the application gets more or less dockable controls the old layout will still work.
  • Dynamic and automatic restore layout algorithm. The layout is restored when a control is shown. That means no matter when or how a form is shown, the docking manager will automatically dock it according to the last known layout of this form. It will automatically resize the neighborhood. (already works for many layouts, needs some improvements for complex cases).

ToDos

  • Improve and harden the restore algorithm until it is good enough for the IDE.
  • Implement automatic menu merging in the LCL.
  • Fix the winapi widgetset for docked forms.
  • Write examples and docs
  • Add it to the IDE component palette
  • Implement drag and drop docking.

Usage

Create a TLazDockingManager

<DELPHI>

 DockingManager:=TLazDockingManager.Create(Self);

</DELPHI> The Self as parameter is only used as Owner. That means, when the mainform is freed, the DockingManager is freed too. You can use nil and free the DockingManager yourself.

Optional: Loading a configuration

You can load the user configuration from disk. <DELPHI>

 Config:=TXMLConfigStorage.Create('config.xml',true);
 DockingManager.LoadFromConfig(Config);
 Config.Free;

</DELPHI> This loads the file config.xml. The config can be created by the SaveToConfig function. See below.

Make a form/control dockable

Create a TLazControlDocker for each form/control that should be dockable <DELPHI>

 ControlDocker1:=TLazControlDocker.Create(Self);
 ControlDocker1.Name:='DockerForm1';
 ControlDocker1.Manager:=DockingManager;

</DELPHI>

Optional: Saving the user configuration to disk

When the program is closed you can save the user configuration to disk <DELPHI>

 Config:=TXMLConfigStorage.Create('config.xml',true);
 DockingManager.SaveToConfig(Config);
 Config.WriteToDisk;
 Config.Free;

</DELPHI>

Why use Anchors instead of Align?

Align can only create the following layouts:

 +------------------------------------------+
 |      alTop                               |
 +------------------------------------------+
 +------------------------------------------+
 |      alTop                               |
 +------------------------------------------+
 +------++------++--------++-------++-------+
 |alLeft||alLeft||alClient||alRight||alRight|
 +------++------++--------++-------++-------+
 +------------------------------------------+
 |      alBottom                            |
 +------------------------------------------+
 +------------------------------------------+
 |      alBottom                            |
 +------------------------------------------+

The alTop controls are always at the top, filling the whole horizontal width. That's because the LCL first aligns all controls with alTop, then all alBottom, then alLeft, then alRight and finally alClient.

It is possible to nest Align layouts by using hidden panels. Then any layout that can be recursively splitted in halves can be created. Then you can create for example:

 +-++-++---++-++-+
 | || ||   || || |
 | || |+---+| || |
 | || |+---+| || |
 | || ||   || || |
 | || |+---+| || |
 | || |+---+| || |
 | || ||   || || |
 +-++-++---++-++-+