Componentes.Terceros.jvcl/official/3.32/run/JvDockAdvTree.pas

372 lines
12 KiB
ObjectPascal

{-----------------------------------------------------------------------------
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: JvDockAdvTree.pas, released on 2005-02-14.
The Initial Developer of the Original Code is luxiaoban.
Portions created by luxiaoban are Copyright (C) 2002,2003 luxiaoban.
All Rights Reserved.
Contributor(s):
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
Description:
Code split out from JvDockTree.pas because of compiler issues - WPostma.
Known Issues:
-----------------------------------------------------------------------------}
// $Id: JvDockAdvTree.pas 10612 2006-05-19 19:04:09Z jfudickar $
unit JvDockAdvTree;
{$I jvcl.inc}
interface
uses
{$IFDEF USEJVCL}
{$IFDEF UNITVERSIONING}
JclUnitVersioning,
{$ENDIF UNITVERSIONING}
{$ENDIF USEJVCL}
Windows, Messages, Classes, Graphics, Controls, Forms,
JvDockSupportClass, JvDockTree;
type
TJvDockAdvTree = class(TJvDockTree)
private
FButtonHeight: Integer;
FButtonWidth: Integer;
FLeftOffset: Integer;
FRightOffset: Integer;
FTopOffset: Integer;
FBottomOffset: Integer;
FButtonSplitter: Integer;
FCloseButtonZone: TJvDockAdvZone;
FDropDockSize: Integer;
FDockHeightWidth: array [TDockOrientation] of Integer;
FDockRectangles: array [TDockOrientation, Boolean] of Integer;
procedure SetBottomOffset(const Value: Integer);
procedure SetButtonHeight(const Value: Integer);
procedure SetButtonSplitter(const Value: Integer);
procedure SetButtonWidth(const Value: Integer);
procedure SetLeftOffset(const Value: Integer);
procedure SetRightOffset(const Value: Integer);
procedure SetTopOffset(const Value: Integer);
function GetDockHeightWidth(Orient: TDockOrientation): Integer;
procedure SetDockHeightWidth(Orient: TDockOrientation; const Value: Integer);
function GetDockRectangles(Orient: TDockOrientation; AtLast: Boolean): Integer;
procedure SetDockRectangles(Orient: TDockOrientation; AtLast: Boolean; const Value: Integer);
procedure SetDropDockSize(const Value: Integer);
protected
function DoLButtonDown(var Msg: TWMMouse;
var Zone: TJvDockZone; out HTFlag: Integer): Boolean; override;
procedure DoLButtonUp(var Msg: TWMMouse;
var Zone: TJvDockZone; out HTFlag: Integer); override;
procedure DoMouseMove(var Msg: TWMMouse;
var Zone: TJvDockZone; out HTFlag: Integer); override;
procedure InsertSibling(NewZone, SiblingZone: TJvDockZone;
InsertLast, Update: Boolean); override;
procedure InsertNewParent(NewZone, SiblingZone: TJvDockZone;
ParentOrientation: TDockOrientation; InsertLast, Update: Boolean); override;
procedure InitDockHeightWidth(NoOrValue, HorValue, VerValue: Integer);
procedure InitDockRectangles(ARect: TRect);
procedure ScaleZone(Zone: TJvDockZone); override;
procedure ScaleChildZone(Zone: TJvDockZone); override;
procedure ScaleSiblingZone(Zone: TJvDockZone); override;
procedure ShiftZone(Zone: TJvDockZone); override;
procedure RemoveZone(Zone: TJvDockZone; Hide: Boolean); override;
public
constructor Create(DockSite: TWinControl; ADockZoneClass: TJvDockZoneClass;
ADockStyle: TJvDockObservableStyle); override;
property BottomOffset: Integer read FBottomOffset write SetBottomOffset;
property ButtonHeight: Integer read FButtonHeight write SetButtonHeight;
property ButtonSplitter: Integer read FButtonSplitter write SetButtonSplitter;
property ButtonWidth: Integer read FButtonWidth write SetButtonWidth;
property LeftOffset: Integer read FLeftOffset write SetLeftOffset;
property RightOffset: Integer read FRightOffset write SetRightOffset;
property TopOffset: Integer read FTopOffset write SetTopOffset;
property CloseButtonZone: TJvDockAdvZone read FCloseButtonZone write FCloseButtonZone;
property DockHeightWidth[Orient: TDockOrientation]: Integer read GetDockHeightWidth write SetDockHeightWidth;
property DockRectangles[Orient: TDockOrientation; AtLast: Boolean]: Integer read GetDockRectangles write
SetDockRectangles;
property DropDockSize: Integer read FDropDockSize write SetDropDockSize;
end;
{$IFDEF USEJVCL}
{$IFDEF UNITVERSIONING}
const
UnitVersioning: TUnitVersionInfo = (
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvDockAdvTree.pas $';
Revision: '$Revision: 10612 $';
Date: '$Date: 2006-05-19 21:04:09 +0200 (ven., 19 mai 2006) $';
LogPath: 'JVCL\run'
);
{$ENDIF UNITVERSIONING}
{$ENDIF USEJVCL}
implementation
uses
JvDockControlForm;
//=== { TJvDockAdvTree } =====================================================
constructor TJvDockAdvTree.Create(DockSite: TWinControl;
ADockZoneClass: TJvDockZoneClass; ADockStyle: TJvDockObservableStyle);
begin
inherited Create(DockSite, ADockZoneClass, ADockStyle);
FButtonHeight := 12;
FButtonWidth := 12;
FLeftOffset := 0;
FRightOffset := 0;
FTopOffset := 0;
FBottomOffset := 0;
FButtonSplitter := 2;
end;
function TJvDockAdvTree.DoLButtonDown(var Msg: TWMMouse;
var Zone: TJvDockZone; out HTFlag: Integer): Boolean;
var
TempZone: TJvDockAdvZone;
begin
Result := inherited DoLButtonDown(Msg, Zone, HTFlag);
if (Zone <> nil) and (HTFlag = HTCLOSE) then
begin
TempZone := TJvDockAdvZone(Zone);
TempZone.CloseBtnDown := True;
TempZone.MouseDown := True;
FCloseButtonZone := TempZone;
DockSite.Invalidate;
end;
end;
procedure TJvDockAdvTree.DoLButtonUp(var Msg: TWMMouse;
var Zone: TJvDockZone; out HTFlag: Integer);
begin
inherited DoLButtonUp(Msg, Zone, HTFlag);
if SizingZone = nil then
begin
FCloseButtonZone := nil;
if (Zone <> nil) and (HTFlag = HTCLOSE) then
TJvDockAdvZone(Zone).CloseBtnDown := False;
end;
end;
procedure TJvDockAdvTree.DoMouseMove(var Msg: TWMMouse;
var Zone: TJvDockZone; out HTFlag: Integer);
var
TempZone: TJvDockAdvZone;
begin
inherited DoMouseMove(Msg, Zone, HTFlag);
if SizingZone = nil then
begin
TempZone := TJvDockAdvZone(Zone);
if ((TempZone <> nil) and (TempZone.CloseBtnDown <> (HTFlag = HTCLOSE)) and
((FCloseButtonZone = TempZone) and FCloseButtonZone.MouseDown)) then
begin
TempZone.CloseBtnDown := (HTFlag = HTCLOSE) and FCloseButtonZone.MouseDown;
DockSite.Invalidate;
end;
end;
end;
procedure TJvDockAdvTree.InsertSibling(NewZone, SiblingZone: TJvDockZone;
InsertLast, Update: Boolean);
var
TempUpdate: Boolean;
begin
TempUpdate := Update;
Update := False;
try
inherited InsertSibling(NewZone, SiblingZone, InsertLast, Update);
if NewZone.ChildControl <> nil then
InitDockHeightWidth(0, NewZone.ChildControl.TBDockHeight + BorderWidth,
NewZone.ChildControl.LRDockWidth + BorderWidth)
else
InitDockHeightWidth(0, 0, 0);
finally
Update := TempUpdate;
end;
if Update then
begin
NewZone.Insert(FDropDockSize, False);
SetNewBounds(NewZone.ParentZone);
ForEachAt(NewZone.ParentZone, UpdateZone, tskForward);
end;
end;
procedure TJvDockAdvTree.SetBottomOffset(const Value: Integer);
begin
FBottomOffset := Value;
end;
procedure TJvDockAdvTree.SetButtonHeight(const Value: Integer);
begin
FButtonHeight := Value;
end;
procedure TJvDockAdvTree.SetButtonSplitter(const Value: Integer);
begin
FButtonSplitter := Value;
end;
procedure TJvDockAdvTree.SetButtonWidth(const Value: Integer);
begin
FButtonWidth := Value;
end;
procedure TJvDockAdvTree.SetLeftOffset(const Value: Integer);
begin
FLeftOffset := Value;
end;
procedure TJvDockAdvTree.SetRightOffset(const Value: Integer);
begin
FRightOffset := Value;
end;
procedure TJvDockAdvTree.SetTopOffset(const Value: Integer);
begin
FTopOffset := Value;
end;
function TJvDockAdvTree.GetDockHeightWidth(Orient: TDockOrientation): Integer;
begin
Result := FDockHeightWidth[Orient];
end;
procedure TJvDockAdvTree.SetDockHeightWidth(Orient: TDockOrientation;
const Value: Integer);
begin
FDockHeightWidth[Orient] := Value;
end;
function TJvDockAdvTree.GetDockRectangles(Orient: TDockOrientation;
AtLast: Boolean): Integer;
begin
Result := FDockRectangles[Orient, AtLast];
end;
procedure TJvDockAdvTree.SetDockRectangles(Orient: TDockOrientation;
AtLast: Boolean; const Value: Integer);
begin
FDockRectangles[Orient, AtLast] := Value;
end;
procedure TJvDockAdvTree.InitDockRectangles(ARect: TRect);
begin
FDockRectangles[doNoOrient, False] := 0;
FDockRectangles[doNoOrient, True] := 0;
FDockRectangles[doHorizontal, False] := ARect.Top;
FDockRectangles[doHorizontal, True] := ARect.Bottom;
FDockRectangles[doVertical, False] := ARect.Left;
FDockRectangles[doVertical, True] := ARect.Right;
end;
procedure TJvDockAdvTree.InitDockHeightWidth(NoOrValue, HorValue,
VerValue: Integer);
begin
FDockHeightWidth[doNoOrient] := NoOrValue;
FDockHeightWidth[doHorizontal] := HorValue;
FDockHeightWidth[doVertical] := VerValue;
end;
procedure TJvDockAdvTree.ScaleChildZone(Zone: TJvDockZone);
begin
if Zone = ReplacementZone then
ShiftScaleOrientation := doNoOrient;
inherited ScaleChildZone(Zone);
end;
procedure TJvDockAdvTree.ScaleSiblingZone(Zone: TJvDockZone);
begin
if Zone = ReplacementZone then
ShiftScaleOrientation := doNoOrient;
inherited ScaleSiblingZone(Zone);
end;
procedure TJvDockAdvTree.ScaleZone(Zone: TJvDockZone);
begin
if Zone = ReplacementZone then
ShiftScaleOrientation := doNoOrient;
inherited ScaleZone(Zone);
end;
procedure TJvDockAdvTree.ShiftZone(Zone: TJvDockZone);
begin
if Zone = ReplacementZone then
ShiftScaleOrientation := doNoOrient;
inherited ShiftZone(Zone);
end;
procedure TJvDockAdvTree.InsertNewParent(NewZone, SiblingZone: TJvDockZone;
ParentOrientation: TDockOrientation; InsertLast, Update: Boolean);
var
TempUpdate: Boolean;
begin
TempUpdate := Update;
Update := False;
if NewZone.ChildControl <> nil then
InitDockHeightWidth(0, NewZone.ChildControl.TBDockHeight + BorderWidth,
NewZone.ChildControl.LRDockWidth + BorderWidth)
else
InitDockHeightWidth(0, 0, 0);
if SiblingZone = nil then
if InsertLast then
ReplacementZone := TopZone
else
ReplacementZone := NewZone;
try
inherited InsertNewParent(NewZone, SiblingZone, ParentOrientation, InsertLast, Update);
finally
Update := TempUpdate;
ReplacementZone := nil;
end;
if Update then
begin
NewZone.Insert(DropDockSize, False);
ForEachAt(NewZone.ParentZone, UpdateZone, tskForward);
SetNewBounds(NewZone.ParentZone);
end;
end;
procedure TJvDockAdvTree.RemoveZone(Zone: TJvDockZone; Hide: Boolean);
begin
inherited RemoveZone(Zone, Hide);
end;
procedure TJvDockAdvTree.SetDropDockSize(const Value: Integer);
begin
FDropDockSize := Value;
end;
{$IFDEF USEJVCL}
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
{$ENDIF USEJVCL}
end.