Componentes.Terceros.DevExp.../official/x.26/ExpressNavBar/Sources/dxNavBarBaseViews.pas
2007-09-09 11:27:27 +00:00

235 lines
8.7 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressNavBar }
{ }
{ Copyright (c) 2002-2007 Developer Express Inc. }
{ ALL RIGHTS RESERVED }
{ }
{ The entire contents of this file is protected by U.S. and }
{ International Copyright Laws. Unauthorized reproduction, }
{ reverse-engineering, and distribution of all or any portion of }
{ the code contained in this file is strictly prohibited and may }
{ result in severe civil and criminal penalties and will be }
{ prosecuted to the maximum extent possible under the law. }
{ }
{ RESTRICTIONS }
{ }
{ THIS SOURCE CODE AND ALL RESULTING INTERMEDIATE FILES }
{ (DCU, OBJ, DLL, ETC.) ARE CONFIDENTIAL AND PROPRIETARY TRADE }
{ SECRETS OF DEVELOPER EXPRESS INC. THE REGISTERED DEVELOPER IS }
{ LICENSED TO DISTRIBUTE THE EXPRESSNAVBAR AND ALL ACCOMPANYING }
{ VCL CONTROLS AS PART OF AN EXECUTABLE PROGRAM ONLY. }
{ }
{ THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED }
{ FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE }
{ COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE }
{ AVAILABLE TO OTHER INDIVIDUALS WITHOUT EXPRESS WRITTEN CONSENT }
{ AND PERMISSION FROM DEVELOPER EXPRESS INC. }
{ }
{ CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON }
{ ADDITIONAL RESTRICTIONS. }
{ }
{*******************************************************************}
unit dxNavBarBaseViews;
{$I cxVer.inc}
interface
uses
Windows, Graphics, dxNavBar, dxNavBarBase, dxNavBarCollns, dxNavBarStyles;
type
TdxNavBarBaseViewInfo = class(TdxNavBarViewInfo)
protected
function GetActiveGroupMinHeight: Integer; virtual;
public
procedure CalculateBounds; override;
procedure CorrectBounds; virtual;
procedure DoGroupActivate(AGroup: TdxNavBarGroup); override;
procedure DoGroupDeactivate(AGroup: TdxNavBarGroup); override;
function IsGroupActive(AGroup: TdxNavBarGroup): Boolean; override;
procedure MakeLinkVisible(ALink: TdxNavBarItemLink); override;
procedure MakeGroupVisible(AGroup: TdxNavBarGroup); override;
end;
TdxNavBarBasePainter = class(TdxNavBarPainter)
protected
function CreateViewInfo: TdxNavBarViewInfo; override;
class function BackgroundPainterClass: TdxBaseBackgroundPainterClass; override;
class function ButtonPainterClass: TdxBaseButtonPainterClass; override;
class function DropTargetGroupPainterClass: TdxBaseDropTargetGroupPainterClass; override;
class function DropTargetLinkPainterClass: TdxBaseDropTargetLinkPainterClass; override;
class function GroupBackgroundPainterClass: TdxBaseGroupBackgroundPainterClass; override;
class function ImagePainterClass: TdxBaseImagePainterClass; override;
class function ScrollButtonsPainterClass: TdxBaseScrollButtonsPainterClass; override;
class function SelectionPainterClass: TdxBaseSelectionPainterClass; override;
end;
TdxNavBarFlatPainter = class(TdxNavBarBasePainter)
protected
class function ButtonPainterClass: TdxBaseButtonPainterClass; override;
end;
implementation
uses
CommCtrl, ImgList,
dxNavBarViewsFact, dxNavBarGraphics, dxNavBarConsts;
{ TdxNavBarBaseViewInfo }
procedure TdxNavBarBaseViewInfo.CalculateBounds;
begin
inherited;
CorrectBounds;
AdjustControlsBounds;
end;
procedure TdxNavBarBaseViewInfo.CorrectBounds;
var
I, ActiveGroupViewInfoIndex: Integer;
OffsetY, MinHeight: Integer;
begin
if (GroupCount = 0) or (ActiveGroupViewInfo = nil) then exit;
ActiveGroupViewInfoIndex := IndexOfGroupViewInfo(ActiveGroupViewInfo);
OffsetY := ClientHeight - Groups[GroupCount - 1].Rect.Bottom;
MinHeight := GetActiveGroupMinHeight;
if (ActiveGroupViewInfo.ItemsRect.Bottom + OffsetY < ActiveGroupViewInfo.ItemsRect.Top + MinHeight) then
OffsetY := ActiveGroupViewInfo.ItemsRect.Top + MinHeight - ActiveGroupViewInfo.ItemsRect.Bottom;
ActiveGroupViewInfo.CorrectActiveGroupBounds(0, OffsetY);
for I := ActiveGroupViewInfoIndex + 1 to GroupCount - 1 do
Groups[I].CorrectBounds(0, OffsetY);
CalculateScrollButtonsBounds;
end;
function TdxNavBarBaseViewInfo.GetActiveGroupMinHeight: Integer;
var
ATopVisibleLinkViewInfo: TdxNavBarLinkViewInfo;
begin
if ActiveGroupViewInfo <> nil then
begin
Result := 2 * GetScrollButtonVerticalSize + 3 * GetScrollButtonVerticalEdge;
if ActiveGroupViewInfo.ItemCount > ActiveGroupViewInfo.Group.TopVisibleLinkIndex then
begin
ATopVisibleLinkViewInfo := ActiveGroupViewInfo.Items[ActiveGroupViewInfo.Group.TopVisibleLinkIndex];
if Result < ATopVisibleLinkViewInfo.Rect.Bottom - ATopVisibleLinkViewInfo.Rect.Top + GetGroupCaptionSeparatorWidth then
Result := ATopVisibleLinkViewInfo.Rect.Bottom - ATopVisibleLinkViewInfo.Rect.Top + GetGroupCaptionSeparatorWidth;
end;
end
else Result := 0;
end;
procedure TdxNavBarBaseViewInfo.DoGroupActivate(AGroup: TdxNavBarGroup);
begin
if NavBar.ActiveGroupIndex <> AGroup.Index then
NavBar.ActiveGroup := AGroup;
end;
procedure TdxNavBarBaseViewInfo.DoGroupDeactivate(AGroup: TdxNavBarGroup);
begin
end;
function TdxNavBarBaseViewInfo.IsGroupActive(AGroup: TdxNavBarGroup): Boolean;
begin
Result := AGroup = NavBar.ActiveGroup;
end;
procedure TdxNavBarBaseViewInfo.MakeLinkVisible(ALink: TdxNavBarItemLink);
var
AGroupViewInfo: TdxNavBarGroupViewInfo;
ALinkViewInfo: TdxNavBarLinkViewInfo;
begin
if NavBar.ActiveGroup <> ALink.Group then
begin
NavBar.ActiveGroup := ALink.Group;
CreateInfo;
CalculateBounds;
end;
AGroupViewInfo := GetGroupViewInfoByGroup(ALink.Group);
if AGroupViewInfo <> nil then
begin
ALinkViewInfo := AGroupViewInfo.GetLinkViewInfoByLink(ALink);
if ALinkViewInfo <> nil then
begin
ALink.Group.TopVisibleLinkIndex := AGroupViewInfo.IndexOfLinkViewInfo(ALinkViewInfo);
NavBar.InvalidateAll(doRecreate);
end;
end;
end;
procedure TdxNavBarBaseViewInfo.MakeGroupVisible(AGroup: TdxNavBarGroup);
begin
NavBar.ActiveGroup := AGroup;
end;
{ TdxNavBarBasePainter }
function TdxNavBarBasePainter.CreateViewInfo: TdxNavBarViewInfo;
begin
Result := TdxNavBarBaseViewInfo.Create(Self);
end;
class function TdxNavBarBasePainter.BackgroundPainterClass: TdxBaseBackgroundPainterClass;
begin
Result := TdxNavBarBackgroundPainter;
end;
class function TdxNavBarBasePainter.ButtonPainterClass: TdxBaseButtonPainterClass;
begin
Result := TdxNavBarButtonPainter;
end;
class function TdxNavBarBasePainter.DropTargetGroupPainterClass: TdxBaseDropTargetGroupPainterClass;
begin
Result := TdxNavBarDropTargetGroupPainter;
end;
class function TdxNavBarBasePainter.DropTargetLinkPainterClass: TdxBaseDropTargetLinkPainterClass;
begin
Result := TdxNavBarDropTargetLinkPainter;
end;
class function TdxNavBarBasePainter.GroupBackgroundPainterClass: TdxBaseGroupBackgroundPainterClass;
begin
Result := TdxNavBarGroupBackgroundPainter;
end;
class function TdxNavBarBasePainter.ScrollButtonsPainterClass: TdxBaseScrollButtonsPainterClass;
begin
Result := TdxNavBarScrollButtonsPainter;
end;
class function TdxNavBarBasePainter.ImagePainterClass: TdxBaseImagePainterClass;
begin
Result := TdxNavBarImagePainter;
end;
class function TdxNavBarBasePainter.SelectionPainterClass: TdxBaseSelectionPainterClass;
begin
Result := TdxNavBarSelectionPainter;
end;
{ TdxNavBarFlatPainter }
class function TdxNavBarFlatPainter.ButtonPainterClass: TdxBaseButtonPainterClass;
begin
Result := TdxNavBarFlatButtonPainter;
end;
initialization
dxNavBarViewsFactory.RegisterView(dxNavBarBaseView, 'BaseView', TdxNavBarBasePainter);
dxNavBarViewsFactory.RegisterView(dxNavBarFlatView, 'FlatView', TdxNavBarFlatPainter);
finalization
dxNavBarViewsFactory.UnRegisterView(dxNavBarBaseView);
dxNavBarViewsFactory.UnRegisterView(dxNavBarFlatView);
end.