📄 jvdockcontrolform.pas
字号:
Result := nil;
end;
function FindDockServer(Client: TControl): TJvDockServer;
var
ADockControl: TJvDockBaseControl;
begin
{ (rb) Weird routine }
ADockControl := FindDockBaseControl(Client);
if ADockControl is TJvDockServer then
Result := TJvDockServer(ADockControl)
else
Result := nil;
end;
procedure FreeAllDockableForm;
var
I: Integer;
begin
Assert(JvGlobalDockManager <> nil);
for I := JvGlobalDockManager.DockableFormList.Count - 1 downto 0 do
if TJvDockableForm(JvGlobalDockManager.DockableFormList[I]).DockableControl.DockClientCount = 0 then
TJvDockableForm(JvGlobalDockManager.DockableFormList[I]).Free;
end;
function GetClientAlignControlArea(AControl: TWinControl; Align: TAlign; Exclude: TControl): Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to AControl.ControlCount - 1 do
if (AControl.Controls[I].Align = Align) and AControl.Controls[I].Visible and
(AControl.Controls[I] <> Exclude) and
not ((AControl.Controls[I] is TJvDockSplitter) or (AControl.Controls[I] is TJvDockPanel)) then
if Align in [alLeft, alRight] then
Inc(Result, AControl.Controls[I].Width)
else
Inc(Result, AControl.Controls[I].Height);
end;
function GetFormVisible(DockWindow: TWinControl): Boolean;
var
ADockClient: TJvDockClient;
begin
Result := True;
ADockClient := FindDockClient(DockWindow);
if ADockClient <> nil then
Result := ADockClient.DockStyle.GetDockFormVisible(ADockClient);
end;
procedure HideDockForm(DockWindow: TWinControl);
var
TmpDockWindow: TWinControl;
procedure HideDockChild(DockWindow: TWinControl);
var
I: Integer;
DockClient: TJvDockClient;
begin
if DockWindow = nil then
Exit;
if (DockWindow is TJvDockableForm) and (DockWindow.Visible) then
with TJvDockableForm(DockWindow).DockableControl do
for I := 0 to DockClientCount - 1 do
HideDockChild(TWinControl(DockClients[I]));
DockClient := FindDockClient(DockWindow);
if (DockWindow is TForm) and (TForm(DockWindow).FormStyle <> fsMDIChild) and
(DockClient.DockStyle <> nil) then
DockClient.DockStyle.HideDockForm(DockClient);
end;
procedure HideDockParent(DockWindow: TWinControl);
var
Host: TWinControl;
DockClient: TJvDockClient;
begin
if (DockWindow <> nil) and (DockWindow.HostDockSite <> nil) then
begin
Host := DockWindow.HostDockSite;
if Host.VisibleDockClientCount = 0 then
if Host is TJvDockPanel then
TJvDockPanel(Host).ShowDockPanel(False, nil)
else
begin
if Host.Parent <> nil then
begin
DockClient := FindDockClient(Host.Parent);
if (DockClient <> nil) and (DockClient.DockStyle <> nil) then
DockClient.DockStyle.HideDockForm(DockClient);
HideDockParent(Host.Parent);
end;
end;
end;
end;
procedure HidePopupPanel(Client: TWinControl);
begin
if Client.HostDockSite is TJvDockVSPopupPanel then
TJvDockVSPopupPanel(Client.HostDockSite).VSChannel.HidePopupPanel(Client)
else
if (Client.HostDockSite <> nil) and (Client.HostDockSite.Parent <> nil) then
begin
if (Client.HostDockSite.Parent.HostDockSite is TJvDockVSPopupPanel) then
TJvDockVSPopupPanel(Client.HostDockSite.Parent.HostDockSite).VSChannel.HidePopupPanel(Client)
else
if (Client.HostDockSite.Parent.HostDockSite is TJvDockPanel) then
Client.HostDockSite.Parent.HostDockSite.Invalidate
end;
end;
begin
TmpDockWindow := TWinControl(DockWindow);
HideDockChild(DockWindow);
HideDockParent(DockWindow);
if (DockWindow.HostDockSite is TJvDockCustomControl) then
TJvDockCustomControl(DockWindow.HostDockSite).UpdateCaption(DockWindow);
HidePopupPanel(TmpDockWindow);
end;
function IsDockable(Sender: TWinControl; Client: TControl; DropCtl: TControl = nil;
DockAlign: TAlign = alNone): Boolean;
var
I: Integer;
ADockClient: TJvDockClient;
SenderDockStyle, ClientDockStyle: TJvDockBasicStyle;
SenderStyleName, ClientStyleName: string;
SenderDocPanel: TJvDockPanel;
//s:String;
// (rom) disabled unused
//label
// JudgeRelation;
begin
ADockClient := FindDockClient(Client);
Result := False;
if (ADockClient <> nil) and (ADockClient.EnableDock) then
begin
if Sender is TJvDockPanel then
begin
SenderDocPanel := TJvDockPanel(Sender);
with SenderDocPanel do
begin
{$IFDEF JVDOCK_DEBUG}
if CustomFlag and (not ADockClient.CustomDock) then
begin
OutputDebugString('IsDockable() - Debugging Dock-to-custom-panel problem.');
ADockClient.CustomDock := True; // BUG WORKAROUND. WPostma.
end;
{$ENDIF JVDOCK_DEBUG}
Result := DockServer.EnableDock and
(((Align = alLeft) and DockServer.LeftDock and (ADockClient.LeftDock)) or
((Align = alTop) and DockServer.TopDock and (ADockClient.TopDock)) or
((Align = alRight) and DockServer.RightDock and (ADockClient.RightDock)) or
((Align = alBottom) and DockServer.BottomDock and (ADockClient.BottomDock)) or
((CustomFlag) and Assigned(DockServer.CustomDockPanel) and (ADockClient.CustomDock))
);
//{$IFDEF JVDOCK_DEBUG}
// XXXXXX very noisy during drag operations:
//if Result then begin
// if Assigned(DropCtl) then
// s := DropCtl.Name
// else
// s := 'nil';
// OutputDebugString(PChar( 'JvDockControlForm.pas IsDockable: '+Sender.Name+ ': Dockable. DropCtl='+s ));
//end;
//{$ENDIF JVDOCK_DEBUG}
SenderDockStyle := DockServer.DockStyle;
end;
end
else
begin
if (Sender <> nil) and (Sender.Parent is TJvDockableForm) then
with TJvDockableForm(Sender.Parent).DockableControl do
for I := 0 to DockClientCount - 1 do
if DockClients[I] = Client then
Exit;
Result := ADockClient.EachOtherDock;
if Sender <> nil then
ADockClient := FindDockClient(Sender.Parent);
if ADockClient <> nil then
Result := Result and ADockClient.EachOtherDock;
if ADockClient <> nil then
SenderDockStyle := ADockClient.DockStyle
else
Exit;
end;
ADockClient := FindDockClient(Client);
if ADockClient <> nil then
ClientDockStyle := ADockClient.DockStyle
else
Exit;
if SenderDockStyle = nil then
SenderStyleName := ''
else
SenderStyleName := SenderDockStyle.ClassName;
if ClientDockStyle = nil then
ClientStyleName := ''
else
ClientStyleName := ClientDockStyle.ClassName;
Result := Result and (SenderStyleName = ClientStyleName);
//JudgeRelation:
end;
end;
{$IFDEF USEJVCL}
procedure LoadDockTreeFromAppStorage(AppStorage: TJvCustomAppStorage; AppStoragePath: string = '');
var
JvDockInfoTree: TJvDockInfoTree;
Form: TForm;
begin
AppStorage.BeginUpdate;
try
HideAllPopupPanel(nil);
Form := TForm.CreateNew(nil);
// What does this form do, and why is it created only during the loading of the app storage?
Form.BorderStyle := bsNone;
Form.BoundsRect := Rect(0, 0, 0, 0);
Form.Visible := True;
Form.Name := {NOTRANSLATE} 'LoadDockTreeFromAppStorage_Form';
JvDockInfoTree := TJvDockInfoTree.Create(TJvDockInfoZone);
JvDockLockWindow(nil);
try
JvDockInfoTree.AppStorage := AppStorage;
if AppStoragePath <> '' then
JvDockInfoTree.AppStoragePath := AppStoragePath
else
JvDockInfoTree.AppStoragePath := AppStorage.Path;
try
JvGlobalDockIsLoading := True;
JvDockInfoTree.ReadInfoFromAppStorage;
finally
JvGlobalDockIsLoading := False;
end;
finally
Form.Release;
JvDockUnLockWindow;
JvDockInfoTree.Free;
end;
ReshowAllVisibleWindow;
finally
AppStorage.EndUpdate;
end;
end;
procedure LoadDockTreeFromFile(FileName: string);
var
JvAppStorage: TJvAppIniFileStorage;
begin
JvAppStorage := TJvAppIniFileStorage.Create(nil);
try
JvAppStorage.Location := flCustom;
JvAppStorage.FileName := FileName;
JvAppStorage.Reload;
LoadDockTreeFromAppStorage(JvAppStorage);
finally
JvAppStorage.Free;
end;
end;
procedure LoadDockTreeFromReg(ARootKey: DWORD; RegPatch: string);
var
JvAppStorage: TJvAppRegistryStorage;
begin
JvAppStorage := TJvAppRegistryStorage.Create(nil);
try
// (p3) this seems dangerous but it's the same method as used by TJvAppRegistryStorage
JvAppStorage.RegRoot := TJvRegKey(HKEY_CLASSES_ROOT + ARootKey);
JvAppStorage.Path := RegPatch;
LoadDockTreeFromAppStorage(JvAppStorage);
finally
JvAppStorage.Free;
end;
end;
{$ELSE}
procedure LoadDockTreeFromFile(FileName: string);
var
JvDockInfoTree: TJvDockInfoTree;
Form: TForm;
MemFile: TMemIniFile;
begin
HideAllPopupPanel(nil);
Form := TForm.CreateNew(nil);
Form.BorderStyle := bsNone;
Form.BoundsRect := Rect(0, 0, 0, 0);
Form.Visible := True;
Form.Name := cDefaultFormName;
JvDockInfoTree := TJvDockInfoTree.Create(TJvDockInfoZone);
MemFile := TMemIniFile.Create(FileName);
JvDockLockWindow(nil);
try
JvDockInfoTree
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -