📄 jvdockvidstyle.pas
字号:
Result.UndockHeight := TempCtl.UndockHeight;
Result.LRDockWidth := TempCtl.LRDockWidth;
Result.TBDockHeight := TempCtl.TBDockHeight + GrabberSize;
Result.Visible := True;
end;
end;
begin
{$IFDEF JVDOCK_DEBUG}
OutputDebugString('TJvDockVIDTree.InsertControl');
{$ENDIF JVDOCK_DEBUG}
if not JvGlobalDockIsLoading then
JvDockLockWindow(nil);
try
VIDSource := nil;
if Control is TJvDockableForm then
begin
if InsertAt in [alClient] then
begin
if DropCtl is TJvDockTabHostForm then
begin
try
VIDSource := TJvDockVIDDragDockObject.Create(Control);
DoFloatForm(Control);
FreeAllDockableForm;
for I := VIDSource.SourceDockClientCount - 1 downto 0 do
begin
TempControl := VIDSource.SourceDockClients[I];
TempControl.ManualDock(TJvDockTabHostForm(DropCtl).PageControl);
if TempControl is TForm then
begin
TForm(TempControl).ActiveControl := nil;
SetDockSite(TForm(TempControl), False);
end;
end;
finally
VIDSource.Free;
JvGlobalDockManager.DragObject.Control := nil;
end;
end
else
begin
if (DockSite is TJvDockCustomPanel) and (DockSite.VisibleDockClientCount > 1) and (DropCtl <> nil) then
begin
try
VIDSource := TJvDockVIDDragDockObject.Create(Control);
DoFloatForm(Control);
FreeAllDockableForm;
Host := CreateDockPageControl(VIDSource.SourceDockClients[0]);
if Host <> nil then
begin
for I := VIDSource.SourceDockClientCount - 1 downto 1 do
begin
TempControl := VIDSource.SourceDockClients[I];
TempControl.ManualDock(Host.PageControl);
if TempControl is TForm then
begin
TForm(TempControl).ActiveControl := nil;
SetDockSite(TForm(TempControl), False);
end;
end;
Host.ManualDock(DockSite, nil, InsertAt);
end;
finally
VIDSource.Free;
JvGlobalDockManager.DragObject.Control := nil;
end;
end
else
inherited InsertControl(Control, InsertAt, DropCtl);
end;
end
else
if Control is TJvDockConjoinHostForm then
begin
TJvTempWinControl(TJvDockableForm(Control).DockableControl).DockManager.ResetBounds(True);
InsertControlFromConjoinHost(Control, InsertAt, DropCtl);
end
else
inherited InsertControl(Control, InsertAt, DropCtl);
end
else
begin
if InsertAt in [alLeft, alTop] then
DropDockSize := DropDockSize + SplitterWidth div 2;
if InsertAt in [alClient] then
begin
if DropCtl is TJvDockTabHostForm then
Control.ManualDock(TJvDockTabHostForm(DropCtl).PageControl, nil, alClient)
else
if TopZone.ChildZones <> nil then
begin
ChildCount := TopZone.ChildCount;
if DropCtl <> nil then
begin
ARect := DropCtl.BoundsRect;
AZone := FindControlZone(DropCtl);
if DropCtl.DockOrientation = doHorizontal then
begin
if ((AZone <> nil) and (AZone.ZoneLimit <> DockSite.Height)) then
ARect.Bottom := ARect.Bottom + SplitterWidth;
end
else
begin
if ((AZone <> nil) and (AZone.ZoneLimit <> DockSite.Width)) then
ARect.Right := ARect.Right + SplitterWidth;
end;
DockRect := ARect;
end
else
DockRect := Rect(0, 0, TopZone.Width, TopZone.Height);
Host := CreateDockPageControl(Control);
if Host <> nil then
if (ChildCount >= 2) or (DockSite is TJvDockPanel) then
begin
if InsertAt in [alLeft, alRight] then
DropDockSize := DockRect.Right - DockRect.Left
else
DropDockSize := DockRect.Bottom - DockRect.Top + GrabberSize;
LockDropDockSize;
Host.ManualDock(DockSite, DropCtl, InsertAt);
UnlockDropDockSize;
end
else
Host.BoundsRect := DockSite.Parent.BoundsRect;
end
else
inherited InsertControl(Control, InsertAt, DropCtl);
end
else
inherited InsertControl(Control, InsertAt, DropCtl);
DockRect := gi_DockRect;
end;
ForEachAt(nil, UpdateZone);
finally
if not JvGlobalDockIsLoading then
JvDockUnLockWindow;
end;
end;
procedure TJvDockVIDTree.InsertControlFromConjoinHost(Control: TControl;
InsertAt: TAlign; DropCtl: TControl);
const
{$IFDEF COMPILER6_UP}
OrientArray: array [TAlign] of TDockOrientation =
(doNoOrient, doHorizontal, doHorizontal, doVertical, doVertical, doNoOrient, doNoOrient);
MakeLast: array [TAlign] of Boolean =
(False, False, True, False, True, False, False);
ReverseAt: array [TAlign] of TAlign =
(alClient, alBottom, alTop, alRight, alLeft, alNone, alCustom);
{$ELSE}
OrientArray: array [TAlign] of TDockOrientation =
(doNoOrient, doHorizontal, doHorizontal, doVertical, doVertical, doNoOrient);
MakeLast: array [TAlign] of Boolean =
(False, False, True, False, True, False);
ReverseAt: array [TAlign] of TAlign =
(alClient, alBottom, alTop, alRight, alLeft, alNone);
{$ENDIF COMPILER6_UP}
var
Stream: TMemoryStream;
TopOrientation: TDockOrientation;
InsertOrientation: TDockOrientation;
CurrentOrientation: TDockOrientation;
ZoneLimit: Integer;
Level, LastLevel, I: Integer;
Zone, NextZone: TJvDockZone;
DropCtlZone, LastZone: TJvDockZone;
OffsetXYLimitArr: array [TDockOrientation] of Integer;
ControlXYLimitArr: array [TDockOrientation] of Integer;
procedure ReadZone(SetZone: Boolean);
var
I: Integer;
begin
with Stream do
begin
Read(Level, SizeOf(Level));
if Level = TreeStreamEndFlag then
Exit;
Zone := DockZoneClass.Create(Self);
CustomLoadZone(Stream, Zone);
ZoneLimit := Zone.ZoneLimit;
end;
if SetZone then
begin
if Level = LastLevel then
begin
Zone.NextSibling := LastZone.NextSibling;
if LastZone.NextSibling <> nil then
LastZone.NextSibling.PrevSibling := Zone;
LastZone.NextSibling := Zone;
Zone.PrevSibling := LastZone;
Zone.ParentZone := LastZone.ParentZone;
end
else
if Level > LastLevel then
begin
LastZone.ChildZones := Zone;
Zone.ParentZone := LastZone;
InsertOrientation := LastZone.Orientation;
end
else
if Level < LastLevel then
begin
NextZone := LastZone;
for I := 1 to LastLevel - Level do
NextZone := NextZone.ParentZone;
Zone.NextSibling := NextZone.NextSibling;
if NextZone.NextSibling <> nil then
NextZone.NextSibling.PrevSibling := Zone;
NextZone.NextSibling := Zone;
Zone.PrevSibling := NextZone;
Zone.ParentZone := NextZone.ParentZone;
InsertOrientation := Zone.ParentZone.Orientation;
end;
Zone.ZoneLimit := OffsetXYLimitArr[InsertOrientation] + ZoneLimit;
end;
LastLevel := Level;
LastZone := Zone;
end;
begin
ControlXYLimitArr[doNoOrient] := 0;
ControlXYLimitArr[doHorizontal] := DockRect.Bottom - DockRect.Top;
ControlXYLimitArr[doVertical] := DockRect.Right - DockRect.Left;
Stream := TMemoryStream.Create;
if Control is TJvDockConjoinHostForm then
TJvDockConjoinHostForm(Control).Panel.JvDockManager.SaveToStream(Stream);
Stream.Position := 0;
BeginUpdate;
try
Stream.Read(I, SizeOf(I));
Stream.Position := Stream.Position + 8;
Stream.Read(TopOrientation, SizeOf(TopOrientation));
Stream.Read(ZoneLimit, SizeOf(ZoneLimit));
IgnoreZoneInfor(Stream);
if (DropCtl = nil) and (TopZone.ChildCount = 1) then
DropCtl := TopZone.ChildZones.ChildControl;
DropCtlZone := FindControlZone(DropCtl);
if InsertAt in [alClient, alNone] then
InsertAt := alRight;
InsertOrientation := OrientArray[InsertAt];
if TopZone.ChildCount = 0 then
begin
TopZone.Orientation := TopOrientation;
InsertOrientation := TopOrientation;
end
else
if TopZone.ChildCount = 1 then
begin
TopZone.Orientation := InsertOrientation;
case InsertOrientation of
doHorizontal:
begin
TopZone.ZoneLimit := TopZone.ChildZones.Width;
TopXYLimit := TopZone.ChildZones.Height;
end;
doVertical:
begin
TopZone.ZoneLimit := TopZone.ChildZones.Height;
TopXYLimit := TopZone.ChildZones.Width;
end;
end;
end;
if DropCtlZone <> nil then
CurrentOrientation := DropCtlZone.ParentZone.Orientation
else
CurrentOrientation := TopZone.Orientation;
if InsertOrientation = doHorizontal then
DropDockSize := DockRect.Bottom - DockRect.Top
else
if InsertOrientation = doVertical then
DropDockSize := DockRect.Right - DockRect.Left
else
DropDockSize := 0;
OffsetXYLimitArr[doNoOrient] := 0;
if DropCtlZone <> nil then
begin
OffsetXYLimitArr[doHorizontal] := DropCtlZone.TopLeft[doHorizontal] +
Integer(MakeLast[InsertAt]) * (DropCtlZone.HeightWidth[doHorizontal] - ControlXYLimitArr[doHorizontal]);
if (FDropOnZone <> nil) and (InsertOrientation = doHorizontal) then
OffsetXYLimitArr[doHorizontal] := FDropOnZone.ZoneLimit - Round((FDropOnZone.ZoneLimit -
FDropOnZone.ParentZone.ChildZones.LimitBegin) * (DropDockSize + BorderWidth) /
(FDropOnZone.ParentZone.Height));
OffsetXYLimitArr[doVertical] := DropCtlZone.TopLeft[doVertical] +
Integer(MakeLast[InsertAt]) * (DropCtlZone.HeightWidth[doVertical] - ControlXYLimitArr[doVertical]);
if (FDropOnZone <> nil) and (InsertOrientation = doVertical) then
OffsetXYLimitArr[doVertical] := FDropOnZone.ZoneLimit - Round((FDropOnZone.ZoneLimit -
FDropOnZone.ParentZone.ChildZones.LimitBegin) * (DropDockSize + BorderWidth) /
(FDropOnZone.ParentZone.Width));
end
else
begin
if TopZone.VisibleChildCount = 0 then
begin
OffsetXYLimitArr[doHorizontal] := 0;
OffsetXYLimitArr[doVertical] := 0;
end
else
begin
OffsetXYLimitArr[doHorizontal] := Integer(MakeLast[InsertAt]) * ControlXYLimitArr[doHorizontal];
OffsetXYLimitArr[doVertical] := Integer(MakeLast[InsertAt]) * ControlXYLimitArr[doVertical];
end;
end;
if TopOrientation <> InsertOrientation then
begin
LastZone := DockZoneClass.Create(Self);
if InsertOrientation <> CurrentOrientation then
InsertNewParent(LastZone, DropCtlZone, InsertOrientation, MakeLast[InsertAt], True)
else
InsertSibling(LastZone, DropCtlZone, MakeLast[InsertAt], True);
LastZone.Orientation := TopOrientation;
LastLevel := 0;
end
else
begin
LastLevel := 1;
if TopZone.ChildCount > 0 then
begin
ReadZone(False);
if InsertOrientation <> CurrentOrientation then
InsertNewParent(LastZone, DropCtlZone, InsertOrientation, MakeLast[InsertAt], True)
else
InsertSibling(LastZone, DropCtlZone, MakeLast[InsertAt], True);
LastZone.ZoneLimit := ZoneLimit + OffsetXYLimitArr[InsertOrientation];
end
else
begin
LastLevel := 0;
LastZone := TopZone;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -