lcl: Patch for docking: InsertControl (from Hans-Peter Diettrich, mantis #0012909)

git-svn-id: trunk@18094 -
This commit is contained in:
paul 2009-01-04 08:30:53 +00:00
parent 968747c675
commit c92465fa27
4 changed files with 117 additions and 90 deletions

View File

@ -1916,6 +1916,7 @@ type
function GetNextVisibleZone: TDockZone;
function NextVisible: TDockZone;
function PrevVisible: TDockZone;
procedure AddSibling(NewZone: TDockZone; InsertAt: TAlign);
procedure AddAsFirstChild(NewChildZone: TDockZone);
procedure AddAsLastChild(NewChildZone: TDockZone);
procedure ReplaceChild(OldChild, NewChild: TDockZone);
@ -2050,7 +2051,6 @@ type
procedure DeleteZone(Zone: TDockZone);
procedure SetDockSite(const AValue: TWinControl);
protected
procedure AdjustDockRect(AControl: TControl; var ARect: TRect); virtual;
function HitTest(const MousePos: TPoint; var HTFlag: Integer): TControl; virtual;
procedure PaintDockFrame(ACanvas: TCanvas; AControl: TControl;
const ARect: TRect); virtual;
@ -2061,6 +2061,7 @@ type
destructor Destroy; override;
procedure BeginUpdate; override;
procedure EndUpdate; override;
procedure AdjustDockRect(AControl: TControl; var ARect: TRect); virtual;
procedure GetControlBounds(AControl: TControl;
out ControlBounds: TRect); override;
procedure InsertControl(AControl: TControl; InsertAt: TAlign;

View File

@ -118,14 +118,19 @@ var
begin
//determine drop zone
if DropCtl = nil then
DropZone := RootZone
begin
DropZone := RootZone;
R := DockSite.ClientRect;
end
else
begin
DropZone := RootZone.FindZone(DropCtl);
if DropZone = nil then
DropZone := RootZone;
//get the zone extent.
//r := dzone.FBounds; //todo: doesn't work
with DropZone do
R := Rect(Left, Top, Width, Height);
end;
// if there are no zones then use the whole rect
// else split drop zone

View File

@ -290,6 +290,29 @@ begin
inc(FChildCount);
end;
procedure TDockZone.AddSibling(NewZone: TDockZone; InsertAt: TAlign);
var
LinkAfter: TDockZone;
begin
case InsertAt of
alLeft, alTop: LinkAfter := FPrevSibling;
alRight, alBottom: LinkAfter := Self;
else
raise Exception.Create('TDockZone.AddSibling: unhandled insertion');
end;
if LinkAfter = nil then
Parent.AddAsFirstChild(NewZone)
else
begin
NewZone.FPrevSibling := LinkAfter;
NewZone.FNextSibling := LinkAfter.NextSibling;
NewZone.FParentZone := Parent;
if LinkAfter.NextSibling <> nil then
LinkAfter.NextSibling.FPrevSibling := NewZone;
LinkAfter.FNextSibling := NewZone;
end;
end;
procedure TDockZone.ReplaceChild(OldChild, NewChild: TDockZone);
begin
NewChild.FParentZone := Self;

View File

@ -1318,10 +1318,8 @@ begin
RaiseGDBException('TLazDockTree.InsertControl Inconsistency DropZone.Orientation<>NewOrientation');
// insert new node
if InsertAt in [alLeft, alTop] then
DropZone.Parent.AddAsFirstChild(NewZone)
else
DropZone.Parent.AddAsLastChild(NewZone);
//DoDi: should insert relative to dropzone, not at begin/end of the parent zone
DropZone.AddSibling(NewZone, InsertAt);
// add AControl to DockSite
PrepareControlForResize(AControl);