📄 jvdockcontrolform.pas
字号:
{-----------------------------------------------------------------------------
The contents of this file are subject to the Mozilla Public License
Version 1.1 (the "License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/MPL-1.1.html
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either expressed or implied. See the License for
the specific language governing rights and limitations under the License.
The Original Code is: JvDockControlForm.pas, released on 2003-12-31.
The Initial Developer of the Original Code is luxiaoban.
Portions created by luxiaoban are Copyright (C) 2002,2003 luxiaoban.
All Rights Reserved.
Contributor(s):
2005-02-08 - Warren Postma - TJvDockServer.CustomPanel.
Last Modified: 2005-02-08
You may retrieve the latest version of this file at the Project JEDI's JVCL home page,
located at http://jvcl.sourceforge.net
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvDockControlForm.pas,v 1.64 2005/03/08 14:10:40 ahuser Exp $
{ Changes:
2005-02-08 WP: Added TJvDockServer.CustomDock panel (new property),
and new event TJvDockServer.OnCustomPanel to get
a custom parent control (such as the form's center area) for the
CustomPanel. Previously you could only dock at the edges. Created a
splitter object (to avoid possible access violations) but the splitter
control is hidden and never used for this custom panel. Several
changes were made to the VID dock style also to make this custom
panel more useful,allowing an "tabbed MDI" style application.
}
unit JvDockControlForm;
{$I jvcl.inc}
interface
uses
{$IFDEF USEJVCL}
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
{$ENDIF USEJVCL}
Windows, Messages, Classes, Graphics, Controls, Forms, Menus,
ExtCtrls, ComCtrls,
{$IFDEF USEJVCL}
JvComponent, JvAppStorage,
{$ENDIF USEJVCL}
JvDockTree, JvDockSupportClass, JvDockSupportControl, JvDockAdvTree;
const
JvDockPositionCount = 5;
JvDockState_Unknown = 0;
JvDockState_Docking = 1;
JvDockState_Floating = 2;
type
TJvDockSplitterSize = 0..32767;
TJvDockBaseControl = class;
TJvDockServer = class;
TJvDockClient = class;
TJvDockConjoinPanel = class;
TJvDockTabPageControl = class;
TJvDockConjoinHostForm = class;
TJvDockTabHostForm = class;
TJvDockSplitter = class(TJvDockCustomPanelSplitter)
private
FDockServer: TJvDockServer;
function GetSplitterIndex: Integer;
protected
function FindControl: TControl; override;
property DockServer: TJvDockServer read FDockServer write FDockServer;
public
constructor Create(AOwner: TComponent); override;
property SplitterIndex: Integer read GetSplitterIndex;
end;
TJvDockSetDockPanelSizeFrom = (sdfDockPanel, sdfClient);
TJvDockPanel = class(TJvDockCustomPanel)
private
FDockServer: TJvDockServer;
FCustomFlag: Boolean; // Set only if custom area! {NEW}
function GetPanelIndex: Integer;
procedure SetDockServer(ADockServer: TJvDockServer);
protected
procedure AddDockServer(ADockServer: TJvDockServer); virtual;
procedure RemoveDockServer(ADockServer: TJvDockServer); virtual;
procedure ReloadDockedControl(const AControlName: string;
var AControl: TControl); override;
procedure CustomStartDock(var Source: TJvDockDragDockObject); override;
procedure CustomGetSiteInfo(Source: TJvDockDragDockObject; Client: TControl; var InfluenceRect: TRect;
MousePos: TPoint; var CanDock: Boolean); override;
procedure CustomDockOver(Source: TJvDockDragDockObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); override;
procedure CustomPositionDockRect(Source: TJvDockDragDockObject; X, Y: Integer); override;
procedure CustomDockDrop(Source: TJvDockDragDockObject; X, Y: Integer); override;
procedure CustomEndDock(Target: TObject; X, Y: Integer); override;
function CustomUnDock(Source: TJvDockDragDockObject; NewTarget: TWinControl; Client: TControl): Boolean; override;
function DoUnDock(NewTarget: TWinControl; Client: TControl): Boolean; override;
procedure Resize; override;
public
constructor Create(AOwner: TComponent); override;
procedure DockDrop(Source: TDragDockObject; X, Y: Integer); override;
procedure ShowDockPanel(MakeVisible: Boolean; Client: TControl;
PanelSizeFrom: TJvDockSetDockPanelSizeFrom = sdfClient); virtual;
procedure ResetPosition;
// GetDockedControls: NEW! -WPostma.
// base class doesn't have this capability.
// see TJvDockAdvPanel for override that implements this!
procedure GetDockedControls(WinControls: TList); virtual;
property PanelIndex: Integer read GetPanelIndex;
property DockServer: TJvDockServer read FDockServer write SetDockServer;
property CustomFlag: Boolean read FCustomFlag write FCustomFlag; // Set only if custom area! {NEW}
end;
TJvDockAdvPanel = class(TJvDockPanel)
private
procedure CMUnDockClient(var Msg: TCMUnDockClient); message CM_UNDOCKCLIENT;
protected
FADVTree: TJvDockAdvTree; // NEW! Link to the entire TJvDockAdvTree. Required for GetDockedControls to work!
procedure CustomDockDrop(Source: TJvDockDragDockObject; X, Y: Integer); override;
function CustomUnDock(Source: TJvDockDragDockObject; NewTarget: TWinControl; Client: TControl): Boolean; override;
function DoUnDock(NewTarget: TWinControl; Client: TControl): Boolean; override;
public
procedure GetDockedControls(WinControls: TList); override;
procedure DockDrop(Source: TDragDockObject; X, Y: Integer); override;
property ADVTree: TJvDockAdvTree read FADVTree write FADVTree;
// NEW! Link allows AdvPanel to scan this tree to enumerate items currently docked to it. It also contains items docked to other places, so be careful!
end;
TJvDockPanelClass = class of TJvDockPanel;
TJvDockSplitterClass = class of TJvDockSplitter;
TJvDockConjoinPanelClass = class of TJvDockConjoinPanel;
TJvDockTabClass = class of TJvDockTabPageControl;
{ Maintained by a TJvDockServer; TJvDockServer ensures that FDockServer is
assigned. FSplitter may be nil }
TJvDockSplitterStyle = class(TPersistent)
private
FSplitter: TJvDockSplitter;
FDockServer: TJvDockServer;
FColor: TColor;
FCursor: TCursor;
FParentColor: Boolean;
FResizeStyle: TResizeStyle;
FSize: TJvDockSplitterSize;
FMinSize: TJvDockSplitterSize;
procedure SetColor(const Value: TColor);
procedure SetCursor(const Value: TCursor);
procedure SetParentColor(const Value: Boolean);
procedure SetResizeStyle(const Value: TResizeStyle);
procedure SetSize(const Value: TJvDockSplitterSize);
procedure SetMinSize(const Value: TJvDockSplitterSize);
protected
procedure AssignTo(Dest: TPersistent); override;
procedure AssignToSplitter(Dest: TJvDockSplitter);
procedure SetSplitterStyle;
property Splitter: TJvDockSplitter read FSplitter write FSplitter;
public
constructor Create(ASplitter: TJvDockSplitter; ACursor: TCursor); virtual;
procedure Assign(Source: TPersistent); override;
published
property Color: TColor read FColor write SetColor default clBtnFace;
property Cursor: TCursor read FCursor write SetCursor;
property ParentColor: Boolean read FParentColor write SetParentColor default True;
property ResizeStyle: TResizeStyle read FResizeStyle write SetResizeStyle default rsPattern;
property Size: TJvDockSplitterSize read FSize write SetSize default 3;
property MinSize: TJvDockSplitterSize read FMinSize write SetMinSize default 30;
end;
TJvDockBasicStyle = class;
{ Maintained by a TJvDockBasicStyle ancestor. That ancestor ensures that
FDockStyle is set (to itself) }
TJvDockBasicServerOption = class(TPersistent)
private
FDockStyle: TJvDockBasicStyle;
protected
procedure ResetDockControlOption; virtual; abstract;
procedure ResetDockServerOption(ADockServer: TJvDockServer); virtual;
procedure ResetDockClientOption(ADockClient: TJvDockClient); virtual;
property DockStyle: TJvDockBasicStyle read FDockStyle;
public
constructor Create(ADockStyle: TJvDockBasicStyle); virtual;
procedure Assign(Source: TPersistent); override;
end;
TJvDockGrabbersSize = 1..MaxInt;
TJvDockSplitterWidth = 1..MaxInt;
TJvDockBasicConjoinServerOption = class(TJvDockBasicServerOption)
private
FGrabbersSize: TJvDockGrabbersSize;
FSplitterWidth: TJvDockSplitterWidth;
protected
procedure SetGrabbersSize(const Value: TJvDockGrabbersSize); virtual;
procedure SetDockSplitterWidth(const Value: TJvDockSplitterWidth); virtual;
procedure ResetDockControlOption; override;
procedure ResetDockServerOption(ADockServer: TJvDockServer); override;
procedure ResetDockClientOption(ADockClient: TJvDockClient); override;
procedure ResetDockPanel(APanel: TJvDockPanel); virtual;
procedure ResetConjoinPanel(APanel: TJvDockConjoinPanel); virtual;
public
constructor Create(ADockStyle: TJvDockBasicStyle); override;
procedure Assign(Source: TPersistent); override;
procedure SetDockGrabbersSize_WithoutChangeSystemInfo(const Value: TJvDockGrabbersSize);
procedure SetDockSplitterWidth_WithoutChangeSystemInfo(const Value: TJvDockSplitterWidth);
published
property GrabbersSize: TJvDockGrabbersSize read FGrabbersSize write SetGrabbersSize;
property SplitterWidth: TJvDockSplitterWidth read FSplitterWidth write SetDockSplitterWidth;
end;
TJvDockBasicTabServerOption = class(TJvDockBasicServerOption)
private
FTabPosition: TTabPosition;
FHotTrack: Boolean;
protected
procedure SetTabPosition(const Value: TTabPosition); virtual;
procedure SetHotTrack(const Value: Boolean); virtual;
procedure ResetDockControlOption; override;
procedure ResetDockServerOption(ADockServer: TJvDockServer); override;
procedure ResetDockClientOption(ADockClient: TJvDockClient); override;
procedure ResetTabPageControl(APage: TJvDockTabPageControl); virtual;
public
constructor Create(ADockStyle: TJvDockBasicStyle); override;
procedure Assign(Source: TPersistent); override;
published
property HotTrack: Boolean read FHotTrack write SetHotTrack default False;
property TabPosition: TTabPosition read FTabPosition write SetTabPosition default tpTop;
end;
TJvDockBasicConjoinServerOptionClass = class of TJvDockBasicConjoinServerOption;
TJvDockBasicTabServerOptionClass = class of TJvDockBasicTabServerOption;
{$IFDEF USEJVCL}
TJvDockBasicStyle = class(TJvComponent)
{$ELSE}
TJvDockBasicStyle = class(TComponent)
{$ENDIF USEJVCL}
private
{$IFDEF JVCL_DOCKING_NOTIFYLISTENERS}
FNotifyListeners: TList; // List of TJvDockTree listeners. Future feature in development. -WPostma
{$ENDIF JVCL_DOCKING_NOTIFYLISTENERS}
FDockPanelClass: TJvDockPanelClass;
FDockSplitterClass: TJvDockSplitterClass;
FConjoinPanelClass: TJvDockConjoinPanelClass;
FTabDockClass: TJvDockTabClass;
FDockPanelTreeClass: TJvDockTreeClass;
FDockPanelZoneClass: TJvDockZoneClass;
FConjoinPanelTreeClass: TJvDockTreeClass;
FConjoinPanelZoneClass: TJvDockZoneClass;
FConjoinServerOptionClass: TJvDockBasicConjoinServerOptionClass;
FTabServerOptionClass: TJvDockBasicTabServerOptionClass;
FConjoinServerOption: TJvDockBasicConjoinServerOption;
FTabServerOption: TJvDockBasicTabServerOption;
FParentForm: TForm;
FOldWindowProc: TWndMethod;
FDockBaseControlList: TList;
function GetCount: Integer;
function GetDockBaseControlLists(Index: Integer): TJvDockBaseControl;
protected
procedure FormStartDock(DockClient: TJvDockClient; var Source: TJvDockDragDockObject); virtual;
procedure FormGetSiteInfo(Source: TJvDockDragDockObject; DockClient: TJvDockClient; Client: TControl;
var InfluenceRect: TRect; MousePos: TPoint; var CanDock: Boolean); virtual;
procedure FormDockOver(DockClient: TJvDockClient; Source: TJvDockDragDockObject; X, Y: Integer;
State: TDragState; var Accept: Boolean); virtual;
procedure FormPositionDockRect(DockClient: TJvDockClient; Source: TJvDockDragDockObject); virtual;
procedure FormDockDrop(DockClient: TJvDockClient; Source: TJvDockDragDockObject; X, Y: Integer); virtual;
procedure FormEndDock(DockClient: TJvDockClient; Target: TObject; X, Y: Integer); virtual;
function FormUnDock(DockClient: TJvDockClient; NewTarget: TWinControl; Client: TControl): Boolean; virtual;
procedure FormGetDockEdge(DockClient: TJvDockClient; Source: TJvDockDragDockObject;
MousePos: TPoint; var DropAlign: TAlign); virtual;
{ (rb) not used? }
procedure CreateConjoinServerOption(var Option: TJvDockBasicConjoinServerOption); virtual;
{ (rb) not used? }
procedure CreateTabServerOption(var Option: TJvDockBasicTabServerOption); virtual;
procedure CreateServerOption; virtual;
procedure FreeServerOption; virtual;
procedure SetDockBaseControl(IsCreate: Boolean; DockBaseControl: TJvDockBaseControl); virtual;
function DockServerWindowProc(DockServer: TJvDockServer; var Msg: TMessage): Boolean; virtual;
function DockClientWindowProc(DockClient: TJvDockClient; var Msg: TMessage): Boolean; virtual;
procedure ParentFormWindowProc(var Msg: TMessage); virtual;
procedure AddDockBaseControl(ADockBaseControl: TJvDockBaseControl); virtual;
procedure RemoveDockBaseControl(ADockBaseControl: TJvDockBaseControl); virtual;
procedure SetConjoinServerOption(Value: TJvDockBasicConjoinServerOption); virtual;
procedure SetTabServerOption(Value: TJvDockBasicTabServerOption); virtual;
function GetConjoinServerOption: TJvDockBasicConjoinServerOption; virtual;
function GetTabServerOption: TJvDockBasicTabServerOption; virtual;
procedure AssignConjoinServerOption(APanel: TJvDockCustomPanel); virtual;
procedure AssignTabServerOption(APage: TJvDockTabPageControl); virtual;
{$IFDEF JVCL_DOCKING_NOTIFYLISTENERS}
procedure NotifyDockTree;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -