Componentes.Terceros.DevExp.../official/x.48/ExpressNavBar/Sources/dxNavBar.pas
2010-01-18 18:33:24 +00:00

6641 lines
233 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressNavBar }
{ }
{ Copyright (c) 2002-2009 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 dxNavBar;
{$I cxVer.inc}
interface
uses
{$IFDEF DELPHI6}
Types,
{$ENDIF}
Classes, IniFiles, Registry, Windows, Messages, Graphics, Controls, Forms, ImgList, StdCtrls, ExtCtrls,
cxScrollBar, cxClasses, cxControls, dxThemeManager, cxLookAndFeels, cxLibraryConsts,
dxNavBarBase, dxNavBarCollns, dxNavBarStyles;
type
TdxCustomNavBar = class;
TdxNavBarViewInfo = class;
TdxNavBarGroupViewInfo = class;
TdxNavBarPainter = class;
TdxNavBarObjectState = (sActive, sDisabled, sExpanded, sHotTracked, sPressed, sSelected, sSpecial);
TdxNavBarObjectStates = set of TdxNavBarObjectState;
TdxNavBarLinkViewInfo = class
private
FGroupViewInfo: TdxNavBarGroupViewInfo;
FNavBar: TdxCustomNavBar;
FPainter: TdxNavBarPainter;
FViewInfo: TdxNavBarViewInfo;
FLink: TdxNavBarItemLink;
FItem: TdxNavBarItem;
FFont: TFont;
function GetState: TdxNavBarObjectStates;
protected
FRect: TRect;
FImageRect: TRect;
FImageVisible: Boolean;
FCaptionRect: TRect;
FCaptionVisible: Boolean;
public
constructor Create(AGroupViewInfo: TdxNavBarGroupViewInfo; ALink: TdxNavBarItemLink; ACaptionVisible, AImageVisisble: Boolean);
destructor Destroy; override;
procedure CalculateBounds(X, Y: Integer); virtual;
procedure CorrectBounds(dX, dY: Integer); virtual;
function GetCaptionHeight: Integer; virtual;
function GetDrawEdgeFlag: Integer; virtual;
function GetImageHeight: Integer; virtual;
function GetImageWidth: Integer; virtual;
function IsCaptionVisible: Boolean;
function IsImageVisible: Boolean;
// Style attributes
function StyleItem: TdxNavBarStyleItem; virtual;
function Style: TdxBaseNavBarStyle; virtual;
function Font: TFont; virtual;
function FontColor: TColor; virtual;
function ImageIndex: Integer; virtual;
function ImageList: TCustomImageList; virtual;
// Rectangles
function IsWholeVisible: Boolean;
function SelectionRect: TRect; virtual;
property Rect: TRect read FRect;
property CaptionRect: TRect read FCaptionRect;
property ImageRect: TRect read FImageRect;
property Link: TdxNavBarItemLink read FLink;
property Item: TdxNavBarItem read FItem;
property GroupViewInfo: TdxNavBarGroupViewInfo read FGroupViewInfo;
property NavBar: TdxCustomNavBar read FNavBar;
property Painter: TdxNavBarPainter read FPainter;
property State: TdxNavBarObjectStates read GetState;
property ViewInfo: TdxNavBarViewInfo read FViewInfo;
end;
TdxNavBarLinkViewInfoClass = class of TdxNavBarLinkViewInfo;
TdxNavBarGroupViewInfo = class
private
FViewInfo: TdxNavBarViewInfo;
FItems: TList;
FGroup: TdxNavBarGroup;
FNavBar: TdxCustomNavBar;
FPainter: TdxNavBarPainter;
FCaptionVisible: Boolean;
FItemsVisible: Boolean;
function GetControl: TdxNavBarGroupControl;
function GetControlBackColor: TColor;
function GetControlBackColor2: TColor;
function GetControlRect: TRect;
function GetItemCount: Integer;
function GetItem(Index: Integer): TdxNavBarLinkViewInfo;
function GetState: TdxNavBarObjectStates;
function IsDefaultControlStyle: Boolean;
protected
FCaptionFont: TFont;
FCaptionRect: TRect;
FCaptionImageRect: TRect;
FCaptionSignRect: TRect;
FCaptionTextRect: TRect;
FItemsRect: TRect;
FRect: TRect;
procedure AddLink(AViewInfo: TdxNavBarViewInfo; ALink: TdxNavBarItemLink; ACaptionVisible, AImageVisisble: Boolean);
procedure ClearItems;
procedure AdjustControlBounds; virtual;
public
constructor Create(AViewInfo: TdxNavBarViewInfo; AGroup: TdxNavBarGroup; ACaptionVisible, AItemsVisible: Boolean);
destructor Destroy; override;
// Calculation
procedure CreateInfo; virtual;
procedure CalculateBounds(X, Y: Integer); virtual;
procedure CorrectBounds(dX, dY: Integer); virtual;
procedure CorrectActiveGroupBounds(dX, dY: Integer); virtual;
function GetLinkViewInfoByLink(ALink: TdxNavBarItemLink): TdxNavBarLinkViewInfo;
function IndexOfLinkViewInfo(AViewInfo: TdxNavBarLinkViewInfo): Integer;
function GetCaptionHeight: Integer; virtual;
function GetDrawEdgeFlag: Integer; virtual;
function GetImageHeight: Integer; virtual;
function GetImageWidth: Integer; virtual;
function IsCaptionVisible: Boolean;
function IsCaptionImageVisible: Boolean;
function IsCaptionSignVisible: Boolean;
function IsCaptionUseSmallImages: Boolean;
function IsItemsVisible: Boolean;
function IsLinksUseSmallImages: Boolean;
function IsViewAsIconView: Boolean;
// Styles attributes
function BorderColor: TColor; virtual;
function BgImage: TPicture; virtual;
function BgBackColor: TColor; virtual;
function BgBackColor2: TColor; virtual;
function BgAlphaBlend: Byte; virtual;
function BgAlphaBlend2: Byte; virtual;
function BgGradientMode: TdxBarStyleGradientMode; virtual;
function CaptionStyleItem: TdxNavBarStyleItem; virtual;
function CaptionStyle: TdxBaseNavBarStyle; virtual;
function CaptionImage: TPicture; virtual;
function CaptionBorderColor: TColor; virtual;
function CaptionBackColor: TColor; virtual;
function CaptionBackColor2: TColor; virtual;
function CaptionAlphaBlend: Byte; virtual;
function CaptionAlphaBlend2: Byte; virtual;
function CaptionGradientMode: TdxBarStyleGradientMode; virtual;
function CaptionFont: TFont; virtual;
function CaptionFontColor: TColor; virtual;
function CaptionSignColor: TColor; virtual;
function CaptionHAlignment: TdxBarStyleHAlignment; virtual;
function CaptionVAlignment: TdxBarStyleVAlignment; virtual;
function ControlImage: TPicture; virtual;
function ControlBackColor: TColor; virtual;
function ControlBackColor2: TColor; virtual;
function ControlAlphaBlend: Byte; virtual;
function ControlAlphaBlend2: Byte; virtual;
function ControlGradientMode: TdxBarStyleGradientMode; virtual;
function ImageIndex: Integer; virtual;
function ImageList: TCustomImageList; virtual;
// Rectangles
property CaptionRect: TRect read FCaptionRect;
property CaptionImageRect: TRect read FCaptionImageRect;
property CaptionSignRect: TRect read FCaptionSignRect;
property CaptionTextRect: TRect read FCaptionTextRect;
property ControlRect: TRect read GetControlRect;
property ItemsRect: TRect read FItemsRect;
property Rect: TRect read FRect;
property Control: TdxNavBarGroupControl read GetControl;
property ItemCount: Integer read GetItemCount;
property Items[Index: Integer]: TdxNavBarLinkViewInfo read GetItem;
property Group: TdxNavBarGroup read FGroup;
property NavBar: TdxCustomNavBar read FNavBar;
property Painter: TdxNavBarPainter read FPainter;
property State: TdxNavBarObjectStates read GetState;
property ViewInfo: TdxNavBarViewInfo read FViewInfo;
end;
TdxNavBarGroupViewInfoClass = class of TdxNavBarGroupViewInfo;
TdxNavBarViewInfo = class
private
FPainter: TdxNavBarPainter;
FNavBar: TdxCustomNavBar;
FGroups: TList;
FHeaderFont: TFont;
FTopScrollButtonRect: TRect;
FBottomScrollButtonRect: TRect;
FHintRect: TRect;
FHintText: string;
function GetGroupCount: Integer;
function GetGroup(Index: Integer): TdxNavBarGroupViewInfo;
function GetBottomScrollButtonState: TdxNavBarObjectStates;
function GetTopScrollButtonState: TdxNavBarObjectStates;
protected
// Colors
procedure CreateColors; virtual;
procedure RefreshColors; virtual;
procedure ReleaseColors; virtual;
function ClientHeight: Integer;
function ClientWidth: Integer;
function GetSpaceBetweenGroups: Integer;
function GetLargeImageHeight: Integer;
function GetLargeImageWidth: Integer;
function GetSmallImageHeight: Integer;
function GetSmallImageWidth: Integer;
class function GetGroupBorderWidth: Integer; virtual;
class function GetGroupCaptionHeightAddon: Integer; virtual;
class function GetGroupCaptionTextIndent: Integer; virtual;
class function GetGroupCaptionImageIndent: Integer; virtual;
class function GetGroupSeparatorWidth: Integer; virtual;
class function GetGroupCaptionSignSize: Integer; virtual;
class function GetGroupHorizontalEdge: Integer; virtual;
class function GetGroupCaptionSeparatorWidth: Integer; virtual;
class function GetLinksLargeSeparatorWidth: Integer; virtual;
class function GetLinksSmallSeparatorWidth: Integer; virtual;
class function GetLinksIconViewSeparatorWidth: Integer; virtual;
class function GetLinksImageVerticalEdge: Integer; virtual;
class function GetLinksImageHorizontalEdge: Integer; virtual;
class function GetDragArrowHeight: Integer; virtual;
class function GetDragArrowWidth: Integer; virtual;
class function GetHeaderHeightAddon: Integer; virtual;
class function GetScrollButtonVerticalEdge: Integer; virtual;
class function GetScrollButtonHorizontalEdge: Integer; virtual;
class function GetScrollButtonVerticalSize: Integer; virtual;
class function GetScrollButtonHorizontalSize: Integer; virtual;
function CanHasActiveGroup: Boolean; virtual;
function CanHasSpecialGroup: Boolean; virtual;
function CanHasScrollButtonInGroupCaption: Boolean; virtual;
function CanHasImageInGroupCaption: Boolean; virtual;
function CanHasSignInGroupCaption: Boolean; virtual;
function CanHasGroupViewAsIconView: Boolean; virtual;
function CanHasGroupWithNoCaption: Boolean; virtual;
function CanHasVisibleItemsInGroup(AGroup: TdxNavBarGroup): Boolean; virtual;
function CanGroupCaptionBoundsByImage: Boolean; virtual;
function CanGroupsUseLargeImages: Boolean; virtual;
function CanLinksUseLargeImages: Boolean; virtual;
function CanSelectLinkByRect: Boolean; virtual;
procedure AddGroup(AViewInfo: TdxNavBarViewInfo; AGroup: TdxNavBarGroup; ACaptionVisible, AItemsVisible: Boolean);
procedure RemoveGroup(AGroupViewInfo: TdxNavBarGroupViewInfo);
procedure ClearGroups;
procedure AdjustControlsBounds; virtual;
function GetBoundsUpdateType: TdxNavBarChangeType; virtual;
function GetTopScrollButtonRect: TRect; virtual;
function GetBottomScrollButtonRect: TRect; virtual;
procedure RecalculateHint; virtual;
function GetHintRect: TRect; virtual;
function GetHintText: string; virtual;
function GetGroupHintRect(AGroup: TdxNavBarGroup): TRect; virtual;
function GetGroupHintText(AGroup: TdxNavBarGroup): string; virtual;
function GetLinkHintRect(ALink: TdxNavBarItemLink): TRect; virtual;
function GetLinkHintText(ALink: TdxNavBarItemLink): string; virtual;
function IsGroupActive(AGroup: TdxNavBarGroup): Boolean; virtual;
procedure DoGroupActiveToggle(AGroup: TdxNavBarGroup); virtual;
procedure DoGroupActivate(AGroup: TdxNavBarGroup); virtual;
procedure DoGroupDeactivate(AGroup: TdxNavBarGroup); virtual;
procedure DoShowPopupMenu(X, Y: Integer); virtual;
procedure MakeLinkVisible(ALink: TdxNavBarItemLink); virtual;
procedure MakeGroupVisible(AGroup: TdxNavBarGroup); virtual;
public
constructor Create(APainter: TdxNavBarPainter); virtual;
destructor Destroy; override;
// Calculation
procedure CreateInfo; virtual;
procedure CalculateBounds; virtual;
procedure CalculateScrollButtonsBounds; virtual;
procedure ClearRects; virtual;
// Styles attributes
function BgImage: TPicture; virtual;
function BgBackColor: TColor; virtual;
function BgBackColor2: TColor; virtual;
function BgAlphaBlend: Byte; virtual;
function BgAlphaBlend2: Byte; virtual;
function BgGradientMode: TdxBarStyleGradientMode; virtual;
function BorderColor: TColor; virtual;
function BottomScrollButtonStyleItem: TdxNavBarStyleItem; virtual;
function BottomScrollButtonStyle: TdxBaseNavBarStyle; virtual;
function BottomScrollButtonImage: TPicture; virtual;
function BottomScrollButtonBackColor: TColor; virtual;
function BottomScrollButtonBackColor2: TColor; virtual;
function BottomScrollButtonAlphaBlend: Byte; virtual;
function BottomScrollButtonAlphaBlend2: Byte; virtual;
function BottomScrollButtonGradientMode: TdxBarStyleGradientMode; virtual;
function TopScrollButtonStyleItem: TdxNavBarStyleItem; virtual;
function TopScrollButtonStyle: TdxBaseNavBarStyle; virtual;
function TopScrollButtonImage: TPicture; virtual;
function TopScrollButtonBackColor: TColor; virtual;
function TopScrollButtonBackColor2: TColor; virtual;
function TopScrollButtonAlphaBlend: Byte; virtual;
function TopScrollButtonAlphaBlend2: Byte; virtual;
function TopScrollButtonGradientMode: TdxBarStyleGradientMode; virtual;
function HintImage: TPicture; virtual;
function HintBackColor: TColor; virtual;
function HintBackColor2: TColor; virtual;
function HintAlphaBlend: Byte; virtual;
function HintAlphaBlend2: Byte; virtual;
function HintGradientMode: TdxBarStyleGradientMode; virtual;
function HintFont: TFont; virtual;
function DragDropItemTargetBackColor: TColor; virtual;
function DragDropGroupTargetBackColor: TColor; virtual;
function DragDropGroupTargetBackColor2: TColor; virtual;
function DragDropGroupTargetAlphaBlend: Byte; virtual;
function DragDropGroupTargetAlphaBlend2: Byte; virtual;
function DragDropGroupTargetGradient: TdxBarStyleGradientMode; virtual;
function HeaderImage: TPicture; virtual;
function HeaderBackColor: TColor; virtual;
function HeaderBackColor2: TColor; virtual;
function HeaderAlphaBlend: Byte; virtual;
function HeaderAlphaBlend2: Byte; virtual;
function HeaderGradientMode: TdxBarStyleGradientMode; virtual;
function HeaderFont: TFont; virtual;
function HeaderFontColor: TColor; virtual;
function HeaderHAlignment: TdxBarStyleHAlignment; virtual;
function HeaderVAlignment: TdxBarStyleVAlignment; virtual;
function HeaderDrawEdgeFlag: Integer;
function OverflowPanelImage: TPicture; virtual;
function OverflowPanelBackColor: TColor; virtual;
function OverflowPanelBackColor2: TColor; virtual;
function OverflowPanelAlphaBlend: Byte; virtual;
function OverflowPanelAlphaBlend2: Byte; virtual;
function OverflowPanelGradientMode: TdxBarStyleGradientMode; virtual;
function OverflowPanelFont: TFont; virtual;
function OverflowPanelFontColor: TColor; virtual;
function SplitterBackColor: TColor; virtual;
function SplitterBackColor2: TColor; virtual;
function SplitterAlphaBlend: Byte; virtual;
function SplitterAlphaBlend2: Byte; virtual;
function SplitterGradientMode: TdxBarStyleGradientMode; virtual;
// Default styles
procedure AssignDefaultBackgroundStyle; virtual;
procedure AssignDefaultButtonStyle; virtual;
procedure AssignDefaultButtonPressedStyle; virtual;
procedure AssignDefaultButtonHotTrackedStyle; virtual;
procedure AssignDefaultGroupControlStyle; virtual;
procedure AssignDefaultGroupBackgroundStyle; virtual;
procedure AssignDefaultGroupHeaderStyle; virtual;
procedure AssignDefaultGroupHeaderActiveStyle; virtual;
procedure AssignDefaultGroupHeaderActiveHotTrackedStyle; virtual;
procedure AssignDefaultGroupHeaderActivePressedStyle; virtual;
procedure AssignDefaultGroupHeaderHotTrackedStyle; virtual;
procedure AssignDefaultGroupHeaderPressedStyle; virtual;
procedure AssignDefaultHintStyle; virtual;
procedure AssignDefaultItemStyle; virtual;
procedure AssignDefaultItemDisabledStyle; virtual;
procedure AssignDefaultItemHotTrackedStyle; virtual;
procedure AssignDefaultItemPressedStyle; virtual;
procedure AssignDefaultDropTargetGroupStyle; virtual;
procedure AssignDefaultDropTargetLinkStyle; virtual;
procedure AssignDefaultNavigationPaneHeaderStyle; virtual;
// Groups
function ActiveGroupViewInfo: TdxNavBarGroupViewInfo;
function GetGroupViewInfoByGroup(AGroup: TdxNavBarGroup): TdxNavBarGroupViewInfo;
function GetLinkViewInfoByLink(ALink: TdxNavBarItemLink): TdxNavBarLinkViewInfo;
function IndexOfGroupViewInfo(AViewInfo: TdxNavBarGroupViewInfo): Integer;
// Hit tests
function GetGroupViewInfoAtCaptionPos(pt: TPoint): TdxNavBarGroupViewInfo; virtual;
function GetGroupAtCaptionPos(pt: TPoint): TdxNavBarGroup;
function GetGroupViewInfoAtItemsPos(pt: TPoint): TdxNavBarGroupViewInfo; virtual;
function GetGroupAtItemsPos(pt: TPoint): TdxNavBarGroup;
function GetLinkViewInfoAtPos(pt: TPoint): TdxNavBarLinkViewInfo; virtual;
function GetLinkAtPos(pt: TPoint): TdxNavBarItemLink;
function GetLinkViewInfoAtSelectedPos(pt: TPoint): TdxNavBarLinkViewInfo; virtual;
function GetLinkAtSelectedPos(pt: TPoint): TdxNavBarItemLink;
function GetViewInfoAtDragPosition(pt: TPoint; var ItemGroup: TdxNavBarGroupViewInfo;
var Item1, Item2: TdxNavBarLinkViewInfo): Integer; virtual;
function GetViewInfoAtDragPositionWhenIconView(pt: TPoint; var ItemGroup: TdxNavBarGroupViewInfo;
var Item1, Item2: TdxNavBarLinkViewInfo): Integer; virtual;
function GetLinksAtDragPosition(pt: TPoint; var ItemGroup: TdxNavBarGroup;
var Item1, Item2: TdxNavBarItemLink): Integer;
function IsPtNavigationPaneHeader(pt: TPoint): Boolean; virtual;
function IsPtNavigationPaneSplitter(pt: TPoint): Boolean; virtual;
function IsPtNavigationPaneOverflowPanel(pt: TPoint): Boolean; virtual;
function IsPtIncNavigationPaneOverflowPanelItemCount(pt: TPoint): Boolean; virtual;
function IsPtDecNavigationPaneOverflowPanelItemCount(pt: TPoint): Boolean; virtual;
function IsPtNavigationPaneOverflowPanelSign(pt: TPoint): Boolean; virtual;
function GetNavigationPaneOverflowPanelItemIndexAtPos(pt: TPoint): Integer; virtual;
function GetNavigationPaneOverflowPanelGroupAtPos(pt: TPoint): TdxNavBarGroup; virtual;
// Scroll buttons
function IsTopScrollButtonVisible: Boolean;
function IsBottomScrollButtonVisible: Boolean;
function IsPtTopScrollButton(pt: TPoint): Boolean;
function IsPtBottomScrollButton(pt: TPoint): Boolean;
property TopScrollButtonRect: TRect read FTopScrollButtonRect;
property BottomScrollButtonRect: TRect read FBottomScrollButtonRect;
property TopScrollButtonState: TdxNavBarObjectStates read GetTopScrollButtonState;
property BottomScrollButtonState: TdxNavBarObjectStates read GetBottomScrollButtonState;
// Hint
function HintDelay: Integer; virtual;
property HintRect: TRect read FHintRect;
property HintText: string read FHintText;
property GroupCount: Integer read GetGroupCount;
property Groups[Index: Integer]: TdxNavBarGroupViewInfo read GetGroup;
property NavBar: TdxCustomNavBar read FNavBar;
property Painter: TdxNavBarPainter read FPainter;
end;
TdxNavBarViewInfoClass = class of TdxNavBarViewInfo;
TdxBaseImagePainter = class
protected
class procedure InternalDrawImage(ACanvas: TCanvas; AImageList: TCustomImageList;
AImageIndex: Integer; ARect: TRect; AEnabled: Boolean); virtual;
public
class procedure DrawImage(ACanvas: TCanvas; AImageList: TCustomImageList;
AImageIndex: Integer; ARect: TRect; AEnabled: Boolean = True);
class function IsValidImage(AImageList: TCustomImageList;AImageIndex: Integer): Boolean;
end;
TdxBaseImagePainterClass = class of TdxBaseImagePainter;
TdxBaseSelectionPainter = class
protected
class procedure InternalDrawSelection(ACanvas: TCanvas; ARect: TRect;
ABackColor: TColor; AState: TdxNavBarObjectStates); virtual;
public
class procedure DrawSelection(ACanvas: TCanvas; ARect: TRect;
ABackColor: TColor; AState: TdxNavBarObjectStates);
end;
TdxBaseSelectionPainterClass = class of TdxBaseSelectionPainter;
TdxBaseBackgroundPainter = class
protected
class procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode); virtual;
public
class procedure DrawBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
end;
TdxBaseBackgroundPainterClass = class of TdxBaseBackgroundPainter;
TdxBaseGroupBackgroundPainter = class
protected
class procedure InternalDrawBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode); virtual;
public
class procedure DrawBackground(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
end;
TdxBaseGroupBackgroundPainterClass = class of TdxBaseGroupBackgroundPainter;
TdxBaseGroupBorderPainter = class
protected
class procedure InternalDrawBorder(ACanvas: TCanvas; ARect: TRect; AColor: TColor; AWithCaption: Boolean); virtual;
public
class procedure DrawBorder(ACanvas: TCanvas; ARect: TRect; AColor: TColor; AWithCaption: Boolean);
end;
TdxBaseGroupBorderPainterClass = class of TdxBaseGroupBorderPainter;
TdxBaseSignPainter = class
protected
class procedure InternalDrawSign(ACanvas: TCanvas; ARect: TRect;
AForeColor, ABackColor1, ABackColor2: TColor; AState: TdxNavBarObjectStates); virtual;
public
class procedure DrawSign(ACanvas: TCanvas; ARect: TRect;
AForeColor, ABackColor1, ABackColor2: TColor; AState: TdxNavBarObjectStates);
end;
TdxBaseSignPainterClass = class of TdxBaseSignPainter;
TdxBaseHintPainter = class
protected
class procedure InternalDrawHint(ACanvas: TCanvas; ARect: TRect; AHint: string;
APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; AFont: TFont); virtual;
public
class procedure DrawHint(ACanvas: TCanvas; ARect: TRect; AHint: string;
APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; AFont: TFont);
end;
TdxBaseHintPainterClass = class of TdxBaseHintPainter;
TdxBaseButtonPainter = class
protected
class procedure InternalDrawButton(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; ABorderColor: TColor;
AState: TdxNavBarObjectStates); virtual;
public
class procedure DrawButton(ACanvas: TCanvas; ARect: TRect; APicture: TPicture;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; ABorderColor: TColor;
AState: TdxNavBarObjectStates);
end;
TdxBaseButtonPainterClass = class of TdxBaseButtonPainter;
TdxBaseScrollButtonsPainter = class
protected
class procedure InternalDrawBottomButton(ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxBaseButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates); virtual;
class procedure InternalDrawTopButton(ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxBaseButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates); virtual;
public
class procedure DrawBottomButton(ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxBaseButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
class procedure DrawTopButton(ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxBaseButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
end;
TdxBaseScrollButtonsPainterClass = class of TdxBaseScrollButtonsPainter;
TdxBaseDropTargetLinkPainter = class
protected
class procedure InternalDrawTargetLink(ACanvas: TCanvas;
pt1, pt2, pt3, pt4, pt5, pt6: TPoint; AColor: TColor); virtual;
public
class procedure DrawTargetLink(ACanvas: TCanvas;
pt1, pt2, pt3, pt4, pt5, pt6: TPoint; AColor: TColor);
end;
TdxBaseDropTargetLinkPainterClass = class of TdxBaseDropTargetLinkPainter;
TdxBaseDropTargetGroupPainter = class
protected
class procedure InternalDrawTargetGroup(ACanvas: TCanvas; ARect: TRect;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode); virtual;
public
class procedure DrawTargetGroup(ACanvas: TCanvas; ARect: TRect;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
end;
TdxBaseDropTargetGroupPainterClass = class of TdxBaseDropTargetGroupPainter;
TdxNavBarPainter = class(TPersistent)
private
FNeedRecreateViewInfo: Boolean;
FNeedRecalculateViewInfo: Boolean;
FNeedRedrawCanvas: Boolean;
FNavBar: TdxCustomNavBar;
FViewInfo: TdxNavBarViewInfo;
protected
function GetMasterLookAndFeel: TcxLookAndFeel; virtual;
procedure CheckDrawParamChanges;
// View infos
function CreateViewInfo: TdxNavBarViewInfo; virtual;
function CreateGroupViewInfo(AViewInfo: TdxNavBarViewInfo; AGroup:
TdxNavBarGroup; ACaptionVisible, AItemsVisible: Boolean): TdxNavBarGroupViewInfo; virtual;
function CreateLinkViewInfo(AViewInfo: TdxNavBarGroupViewInfo; ALink: TdxNavBarItemLink;
ACaptionVisible, AImageVisisble: Boolean): TdxNavBarLinkViewInfo; virtual;
function GetOwner: TPersistent; override;
function IsViewInfoValid: Boolean;
// Painters
class function BackgroundPainterClass: TdxBaseBackgroundPainterClass; virtual;
class function ButtonPainterClass: TdxBaseButtonPainterClass; virtual;
class function DropTargetGroupPainterClass: TdxBaseDropTargetGroupPainterClass; virtual;
class function DropTargetLinkPainterClass: TdxBaseDropTargetLinkPainterClass; virtual;
class function GroupBackgroundPainterClass: TdxBaseGroupBackgroundPainterClass; virtual;
class function GroupBorderPainterClass: TdxBaseGroupBorderPainterClass; virtual;
class function ImagePainterClass: TdxBaseImagePainterClass; virtual;
class function ScrollButtonsPainterClass: TdxBaseScrollButtonsPainterClass; virtual;
class function SelectionPainterClass: TdxBaseSelectionPainterClass; virtual;
class function SignPainterClass: TdxBaseSignPainterClass; virtual;
public
constructor Create(ANavBar: TdxCustomNavBar); virtual;
destructor Destroy; override;
function Canvas: TCanvas;
function DC: HDC;
function HintWindowCanvas: TCanvas;
function HintWindowDC: HDC;
// Drawing
procedure DrawNavBarControl; virtual;
procedure DrawBackground; virtual;
procedure DrawGroup(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupBackground(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupCaption(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupCaptionButton(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupCaptionText(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupCaptionImage(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupCaptionSign(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupControl(ACanvas: TCanvas; ARect: TRect; AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawGroupItems(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawItem(ALinkViewInfo: TdxNavBarLinkViewInfo); virtual;
procedure DrawItemCaption(ALinkViewInfo: TdxNavBarLinkViewInfo); virtual;
procedure DrawItemImage(ALinkViewInfo: TdxNavBarLinkViewInfo); virtual;
procedure DrawItemSelection(ALinkViewInfo: TdxNavBarLinkViewInfo); virtual;
procedure DrawItemsRect(AGroupViewInfo: TdxNavBarGroupViewInfo); virtual;
procedure DrawScrollButtons; virtual;
procedure DrawBottomScrollButton; virtual;
procedure DrawTopScrollButton; virtual;
procedure DrawDropTargetGroupSelection; virtual;
procedure DrawDropTargetLinkSelection; virtual;
procedure DrawHintWindow; virtual;
procedure DrawGroupHintWindow; virtual;
procedure DrawLinkHintWindow; virtual;
procedure InvalidateViewInfo(AType: TdxNavBarChangeType);
procedure InvalidateScrollButtons;
procedure Paint;
property NavBar: TdxCustomNavBar read FNavBar;
property ViewInfo: TdxNavBarViewInfo read FViewInfo;
end;
TdxNavBarPainterClass = class of TdxNavBarPainter;
TdxNavBarDragDropFlag = (fAllowDragLink, fAllowDropLink, fAllowDragGroup, fAllowDropGroup);
TdxNavBarDragDropFlags = set of TdxNavBarDragDropFlag;
TdxNavBarGroupEvent = procedure(Sender: TObject; AGroup: TdxNavBarGroup) of object;
TdxNavBarGroupChangingEvent = procedure(Sender: TObject; ANewGroup: TdxNavBarGroup; var AAllowChange: Boolean) of object;
TdxNavBarLinkEvent = procedure(Sender: TObject; ALink: TdxNavBarItemLink) of object;
TdxNavBarCustomDrawEvent = procedure(Sender: TObject; ACanvas: TCanvas;
AViewInfo: TdxNavBarViewInfo; var AHandled: Boolean) of object;
TdxNavBarCustomDrawGroupEvent = procedure(Sender: TObject; ACanvas: TCanvas;
AViewInfo: TdxNavBarGroupViewInfo; var AHandled: Boolean) of object;
TdxNavBarCustomDrawGroupHintEvent = procedure(Sender: TObject; ACanvas: TCanvas;
AGroup: TdxNavBarGroup; AHint: string; R: TRect; var AHandled: Boolean) of object;
TdxNavBarCustomDrawLinkEvent = procedure(Sender: TObject; ACanvas: TCanvas;
AViewInfo: TdxNavBarLinkViewInfo; var AHandled: Boolean) of object;
TdxNavBarCustomDrawLinkHintEvent = procedure(Sender: TObject; ACanvas: TCanvas;
ALink: TdxNavBarItemLink; AHint: string; R: TRect; var AHandled: Boolean) of object;
TdxNavBarCalcGroupHintRectEvent = procedure(Sender: TObject; AGroup: TdxNavBarGroup;
AViewInfo: TdxNavBarViewInfo; var R: TRect) of object;
TdxNavBarCalcLinkHintRectEvent = procedure(Sender: TObject; ALink: TdxNavBarItemLink;
AViewInfo: TdxNavBarViewInfo; var R: TRect) of object;
TdxNavBarCalcGroupClientHeightEvent = procedure(Sender: TObject; AViewInfo: TdxNavBarGroupViewInfo;
var AHeight: Integer) of object;
TdxNavBarGetGroupHintEvent = procedure(Sender: TObject; AGroup: TdxNavBarGroup;
var AHint: string) of object;
TdxNavBarGetLinkHintEvent = procedure(Sender: TObject; ALink: TdxNavBarItemLink;
var AHint: string) of object;
TAbstractcxNavBarDesigner = class;
TdxNavBarHintWindow = class;
TdxNavBarScrollBar = class;
TdxCustomNavBar = class(TCustomPanel)
private
FActiveGroup: TdxNavBarGroup;
FActiveGroupIndex: Integer;
FAllowSelectLinks: Boolean;
FCanvasBitmap: TBitmap;
FDefaultStyles: TdxNavBarDefaultStyles;
FDesigner: TAbstractcxNavBarDesigner;
FDragCopyCursor: TCursor;
FDragDropFlags: TdxNavBarDragDropFlags;
FDragObject: TDragControlObject;
FEachGroupHasSelectedLink: Boolean;
FHintWindow: TdxNavBarHintWindow;
FHintWindowShowing: Boolean;
FHotTrackedGroupCursor: TCursor;
FHotTrackedLinkCursor: TCursor;
FGroups: TdxNavBarGroups;
FItems: TdxNavBarItems;
FLargeChangeLink: TChangeLink;
FLargeImages: TCustomImageList;
FNavigationPaneOverflowPanelUseSmallImages: Boolean;
FNavigationPaneMaxVisibleGroups: Integer;
FPainter: TdxNavBarPainter;
FScrollBar: TdxNavBarScrollBar;
FShowGroupCaptions: Boolean;
FShowGroupsHint: Boolean;
FShowNavigationPaneOverflowPanelHints: Boolean;
FShowLinksHint: Boolean;
FShowSpecialGroup: Boolean;
FSmallChangeLink: TChangeLink;
FSmallImages: TCustomImageList;
FSpaceBetweenGroups: Integer;
FStyleBackground: TdxNavBarStyleItem;
FStyleHint: TdxNavBarStyleItem;
FStyleDropTargetGroup: TdxNavBarStyleItem;
FStyleDropTargetLink: TdxNavBarStyleItem;
FStyleButton: TdxNavBarStyleItem;
FStyleButtonHotTracked: TdxNavBarStyleItem;
FStyleButtonPressed: TdxNavBarStyleItem;
FStyleNavigationPaneHeader: TdxNavBarStyleItem;
FStyles: TdxNavBarStyles;
FThemeNotificator: TdxThemeChangedNotificator;
FUpdateLock: Integer;
FView: Integer;
FOnActiveGroupChanged: TNotifyEvent;
FOnActiveGroupChanging: TdxNavBarGroupChangingEvent;
FOnCalcGroupHintRect: TdxNavBarCalcGroupHintRectEvent;
FOnCalcGroupClientHeight: TdxNavBarCalcGroupClientHeightEvent;
FOnCalcLinkHintRect: TdxNavBarCalcLinkHintRectEvent;
FOnCalcNavigationPaneOverflowPanelHintRect: TdxNavBarCalcGroupHintRectEvent;
FOnCustomDrawBackground: TdxNavBarCustomDrawEvent;
FOnCustomDrawGroupCaption: TdxNavBarCustomDrawGroupEvent;
FOnCustomDrawGroupClientBackground: TdxNavBarCustomDrawGroupEvent;
FOnCustomDrawGroupClientForeground: TdxNavBarCustomDrawGroupEvent;
FOnCustomDrawGroupHint: TdxNavBarCustomDrawGroupHintEvent;
FOnCustomDrawLink: TdxNavBarCustomDrawLinkEvent;
FOnCustomDrawLinkHint: TdxNavBarCustomDrawLinkHintEvent;
FOnCustomDrawBottomScrollButton: TdxNavBarCustomDrawEvent;
FOnCustomDrawTopScrollButton: TdxNavBarCustomDrawEvent;
FOnCustomDrawNavigationPaneHeader: TdxNavBarCustomDrawEvent;
FOnCustomDrawNavigationPaneSplitter: TdxNavBarCustomDrawEvent;
FOnCustomDrawNavigationPaneOverflowPanel: TdxNavBarCustomDrawEvent;
FOnCustomDrawNavigationPaneOverflowPanelHint: TdxNavBarCustomDrawGroupHintEvent;
FOnGetGroupHint: TdxNavBarGetGroupHintEvent;
FOnGetLinkHint: TdxNavBarGetLinkHintEvent;
FOnGroupClick: TdxNavBarGroupEvent;
FOnGroupHotTrack: TdxNavBarGroupEvent;
FOnGroupPress: TdxNavBarGroupEvent;
FOnLinkClick: TdxNavBarLinkEvent;
FOnLinkHotTrack: TdxNavBarLinkEvent;
FOnLinkPress: TdxNavBarLinkEvent;
FOnMouseEnter: TNotifyEvent;
FOnMouseLeave: TNotifyEvent;
FActivateGroupTimer: TcxTimer;
FHintTimer: TcxTimer;
FScrollTimer: TcxTimer;
FActiveGroupCandidate: TdxNavBarGroup;
FEnableDragging: Boolean;
FEnableSplitterDragging: Boolean;
FSourcePoint: TPoint;
FSourceShift: TShiftState;
FSourceGroup: TdxNavBarGroup;
FSourceLink: TdxNavBarItemLink;
FTargetPoint: TPoint;
FHotTrackedGroup: TdxNavBarGroup;
FHotTrackedLink: TdxNavBarItemLink;
FPressedGroup: TdxNavBarGroup;
FPressedLink: TdxNavBarItemLink;
FNavigationPaneOverflowPanelHotTrackedIndex: Integer;
FNavigationPaneOverflowPanelPressedIndex: Integer;
FNavigationPaneOverflowPanelSignHotTracked: Boolean;
FNavigationPaneOverflowPanelSignPressed: Boolean;
FScrollButtonDownIsDown: Boolean;
FScrollButtonUpIsDown: Boolean;
function GetActiveGroup: TdxNavBarGroup;
function GetActiveGroupIndex: Integer;
function GetNavigationPaneOverflowPanelItemCount: Integer;
function GetEnableDragging: Boolean;
function GetPainter: TdxNavBarPainter;
function GetScrollPosition: Integer;
function GetSourceGroup: TdxNavBarGroup;
function GetSourceLink: TdxNavBarItemLink;
function GetSourceItem: TdxNavBarItem;
function GetTargetGroup: TdxNavBarGroup;
function GetTargetLink1: TdxNavBarItemLink;
function GetTargetLink2: TdxNavBarItemLink;
function GetTargetLinkIndex: Integer;
function GetViewInfo: TdxNavBarViewInfo;
function GetViewStyle: TdxNavBarPainter;
function GetVisibleGroupCount: Integer;
procedure SetActiveGroup(Value: TdxNavBarGroup);
procedure SetActiveGroupIndex(Value: Integer);
procedure SetAllowSelectLinks(const Value: Boolean);
procedure SetDefaultStyles(const Value: TdxNavBarDefaultStyles);
procedure SetEachGroupHasSelectedLink(const Value: Boolean);
procedure SetLargeImages(const Value: TCustomImageList);
procedure SetNavigationPaneOverflowPanelUseSmallImages(const Value: Boolean);
procedure SetNavigationPaneMaxVisibleGroups(Value: Integer);
procedure SetShowGroupCaptions(const Value: Boolean);
procedure SetShowSpecialGroup(const Value: Boolean);
procedure SetSmallImages(const Value: TCustomImageList);
procedure SetSpaceBetweenGroups(Value: Integer);
procedure SetStyleBackground(const Value: TdxNavBarStyleItem);
procedure SetStyleHint(const Value: TdxNavBarStyleItem);
procedure SetStyleDropTargetGroup(const Value: TdxNavBarStyleItem);
procedure SetStyleDropTargetLink(const Value: TdxNavBarStyleItem);
procedure SetStyleButton(const Value: TdxNavBarStyleItem);
procedure SetStyleButtonHotTracked(const Value: TdxNavBarStyleItem);
procedure SetStyleButtonPressed(const Value: TdxNavBarStyleItem);
procedure SetStyleNavigationPaneHeader(const Value: TdxNavBarStyleItem);
procedure SetView(Value: Integer);
procedure SetViewStyle(Value: TdxNavBarPainter);
procedure DragDone;
function IsAllowDragLink: Boolean;
function IsAllowDropLink: Boolean;
function IsAllowDragGroup: Boolean;
function IsAllowDropGroup: Boolean;
// Notifications
procedure OnGroupsChanged(Sender: TObject; AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification);
procedure OnItemsChanged(Sender: TObject; AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification);
procedure OnStylesChanged(Sender: TObject; AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification);
procedure OnDefaultStylesChanged(Sender: TObject; AType: TdxNavBarChangeType);
procedure OnImagesChanged(Sender: TObject);
procedure OnLinksChanged(Sender: TObject; ALink: TdxNavBarItemLink);
procedure OnThemeChanged;
// Timers
procedure DoActivateGroupTimer(Sender: TObject);
procedure DoScrollTimer(Sender: TObject);
procedure DoHintTimer(Sender: TObject);
// Messages
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
procedure CMSysColorChange(var Message: TMessage); message CM_SYSCOLORCHANGE;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
procedure WMSetCursor(var Msg: TWMSetCursor); message WM_SETCURSOR;
procedure WMCreate(var Msg: TWMCreate); message WM_CREATE;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure CreateWindowHandle(const Params: TCreateParams); override;
procedure Loaded; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure SetName(const NewName: TComponentName); override;
procedure WndProc(var Message: TMessage); override;
function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
MousePos: TPoint): Boolean; override;
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseEnter; dynamic;
procedure MouseLeave; dynamic;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override;
procedure DoEndDrag(Target: TObject; X, Y: Integer); override;
procedure DoStartDrag(var DragObject: TDragObject); override;
procedure DoActiveGroupChanged; virtual;
procedure DoActiveGroupChanging(ANewGroup: TdxNavBarGroup; var AAllowChange: Boolean);
procedure DoGroupDragDrop(Group: TdxNavBarGroup); virtual;
procedure DoGroupDragOver(Group: TdxNavBarGroup; var Accept: Boolean); virtual;
procedure DoGroupHotTrack(Group: TdxNavBarGroup); virtual;
procedure DoGroupMouseDown(Group: TdxNavBarGroup); virtual;
procedure DoGroupMouseUp(Group: TdxNavBarGroup); virtual;
procedure DoLinkDragDrop(Link: TdxNavBarItemLink); virtual;
procedure DoLinkDragOver(Link: TdxNavBarItemLink; var Accept: Boolean); virtual;
procedure DoLinkHotTrack(Link: TdxNavBarItemLink); virtual;
procedure DoLinkMouseDown(Link: TdxNavBarItemLink); virtual;
procedure DoLinkMouseUp(Link: TdxNavBarItemLink); virtual;
procedure DoItemDragDrop(Item: TdxNavBarItem); virtual;
procedure DoItemDragOver(Item: TdxNavBarItem; var Accept: Boolean); virtual;
procedure DoBottomScrollButtonDown; virtual;
procedure DoBottomScrollButtonUp; virtual;
procedure DoTopScrollButtonDown; virtual;
procedure DoTopScrollButtonUp; virtual;
procedure DoNavigationPaneOverflowPanelHintsActivate; virtual;
procedure DoGroupHintActivate; virtual;
procedure DoLinkHintActivate; virtual;
procedure DoHintActivate;
procedure DoHintDeactivate; virtual;
procedure DoOverflowPanelMouseDown; virtual;
procedure DoOverflowPanelMouseMove; virtual;
procedure DoOverflowPanelMouseUp; virtual;
procedure DoSplitterMouseDown; virtual;
procedure DoSplitterDrag; virtual;
procedure DoSplitterMouseUp; virtual;
procedure DoUpdateScrollBarStyle; virtual;
function GetClientRect: TRect; override;
procedure Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer);
// Painting
procedure Paint; override;
procedure InvalidateScrollButtons;
// Load/Save layout
procedure LoadFromRegIni(AStorage: TCustomIniFile; LoadStyles: Boolean); virtual;
procedure SaveToRegIni(AStorage: TCustomIniFile; SaveStyles: Boolean); virtual;
function CreatePainter: TdxNavBarPainter; virtual;
function GetGroupClass: TdxNavBarGroupClass; virtual;
function GetItemClass: TdxNavBarItemClass; virtual;
property CanvasBitmap: TBitmap read FCanvasBitmap;
property UpdateLock: Integer read FUpdateLock;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure DeSelectLinks;
procedure DragDrop(Source: TObject; X, Y: Integer); override;
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
procedure InitiateAction; override;
procedure Invalidate; override;
procedure InvalidateAll(AType: TdxNavBarChangeType); overload;
procedure InvalidateAll(AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification); overload;
procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
// Layout store/restore
procedure AssignDefaultStyles;
procedure LoadFromIniFile(AFileName: string; LoadStyles: Boolean = True);
procedure LoadFromRegistry(ARegistryPath: string; LoadStyles: Boolean = True);
procedure LoadFromStream(AStream: TStream; LoadStyles: Boolean = True);
procedure SaveToIniFile(AFileName: string; SaveStyles: Boolean = True);
procedure SaveToRegistry(ARegistryPath: string; SaveStyles: Boolean = True);
procedure SaveToStream(AStream: TStream; SaveStyles: Boolean = True);
// ViewInfo
function GetGroupAtCaptionPos(pt: TPoint): TdxNavBarGroup;
function GetGroupAtItemsPos(pt: TPoint): TdxNavBarGroup;
function GetLinkAtPos(pt: TPoint): TdxNavBarItemLink;
function GetLinkAtSelectedPos(pt: TPoint): TdxNavBarItemLink;
function IsPtTopScrollButton(pt: TPoint): Boolean;
function IsPtBottomScrollButton(pt: TPoint): Boolean;
function IsTopScrollButtonVisible: Boolean;
function IsBottomScrollButtonVisible: Boolean;
function IsPtNavigationPaneHeader(pt: TPoint): Boolean;
function IsPtNavigationPaneSplitter(pt: TPoint): Boolean;
function IsPtNavigationPaneOverflowPanel(pt: TPoint): Boolean;
// Groups and links visibility
procedure MakeLinkVisible(ALink: TdxNavBarItemLink);
procedure MakeGroupVisible(AGroup: TdxNavBarGroup);
// Updates lock
procedure BeginUpdate;
procedure EndUpdate;
// NavigationPane
function CanDecNavigationPaneOverflowPanelItemCount: Boolean;
function CanIncNavigationPaneOverflowPanelItemCount: Boolean;
procedure DoDecNavigationPaneOverflowPanelItemCount;
procedure DoIncNavigationPaneOverflowPanelItemCount;
// Designer
procedure DesignerModified;
procedure DesignerUpdate(AItem: TComponent);
property Painter: TdxNavBarPainter read GetPainter;
property ViewInfo: TdxNavBarViewInfo read GetViewInfo;
property EnableDragging: Boolean read GetEnableDragging;
property EnableSplitterDragging: Boolean read FEnableSplitterDragging;
property ScrollBar: TdxNavBarScrollBar read FScrollBar;
property SourcePoint: TPoint read FSourcePoint;
property SourceGroup: TdxNavBarGroup read GetSourceGroup;
property SourceLink: TdxNavBarItemLink read GetSourceLink;
property SourceItem: TdxNavBarItem read GetSourceItem;
property TargetPoint: TPoint read FTargetPoint;
property TargetGroup: TdxNavBarGroup read GetTargetGroup;
property TargetLink1: TdxNavBarItemLink read GetTargetLink1;
property TargetLink2: TdxNavBarItemLink read GetTargetLink2;
property TargetLinkIndex: Integer read GetTargetLinkIndex;
property HintWindow: TdxNavBarHintWindow read FHintWindow;
property HintWindowShowing: Boolean read FHintWindowShowing;
property HotTrackedGroup: TdxNavBarGroup read FHotTrackedGroup;
property HotTrackedLink: TdxNavBarItemLink read FHotTrackedLink;
property PressedGroup: TdxNavBarGroup read FPressedGroup;
property PressedLink: TdxNavBarItemLink read FPressedLink;
property NavigationPaneOverflowPanelItemCount: Integer read GetNavigationPaneOverflowPanelItemCount;
property NavigationPaneOverflowPanelHotTrackedIndex: Integer read FNavigationPaneOverflowPanelHotTrackedIndex;
property NavigationPaneOverflowPanelPressedIndex: Integer read FNavigationPaneOverflowPanelPressedIndex;
property NavigationPaneOverflowPanelNavigationPaneSignHotTracked: Boolean read FNavigationPaneOverflowPanelSignHotTracked;
property NavigationPaneOverflowPanelSignPressed: Boolean read FNavigationPaneOverflowPanelSignPressed;
property NavigationPaneOverflowPanelSignHotTracked: Boolean read FNavigationPaneOverflowPanelSignHotTracked;
property ScrollButtonDownIsDown: Boolean read FScrollButtonDownIsDown;
property ScrollButtonUpIsDown: Boolean read FScrollButtonUpIsDown;
property ScrollPosition: Integer read GetScrollPosition;
property ActiveGroupIndex: Integer read GetActiveGroupIndex write SetActiveGroupIndex;
property ActiveGroup: TdxNavBarGroup read GetActiveGroup write SetActiveGroup;
property AllowSelectLinks: Boolean read FAllowSelectLinks write SetAllowSelectLinks default False;
property DefaultStyles: TdxNavBarDefaultStyles read FDefaultStyles write SetDefaultStyles;
property Designer: TAbstractcxNavBarDesigner read FDesigner;
property DragCopyCursor: TCursor read FDragCopyCursor write FDragCopyCursor;
property DragDropFlags: TdxNavBarDragDropFlags read FDragDropFlags write FDragDropFlags;
property EachGroupHasSelectedLink: Boolean read FEachGroupHasSelectedLink write SetEachGroupHasSelectedLink default False;
property HotTrackedGroupCursor: TCursor read FHotTrackedGroupCursor write FHotTrackedGroupCursor;
property HotTrackedLinkCursor: TCursor read FHotTrackedLinkCursor write FHotTrackedLinkCursor;
property Groups: TdxNavBarGroups read FGroups;
property Items: TdxNavBarItems read FItems;
property LargeImages: TCustomImageList read FLargeImages write SetLargeImages;
property NavigationPaneMaxVisibleGroups: Integer read FNavigationPaneMaxVisibleGroups write SetNavigationPaneMaxVisibleGroups default -1;
property NavigationPaneOverflowPanelUseSmallImages: Boolean read FNavigationPaneOverflowPanelUseSmallImages write SetNavigationPaneOverflowPanelUseSmallImages default True;
property ShowGroupCaptions: Boolean read FShowGroupCaptions write SetShowGroupCaptions default True;
property ShowGroupsHint: Boolean read FShowGroupsHint write FShowGroupsHint default False;
property ShowLinksHint: Boolean read FShowLinksHint write FShowLinksHint default False;
property ShowNavigationPaneOverflowPanelHints: Boolean read FShowNavigationPaneOverflowPanelHints write FShowNavigationPaneOverflowPanelHints default True;
property ShowSpecialGroup: Boolean read FShowSpecialGroup write SetShowSpecialGroup default False;
property SmallImages: TCustomImageList read FSmallImages write SetSmallImages;
property SpaceBetweenGroups: Integer read FSpaceBetweenGroups write SetSpaceBetweenGroups default 0;
property StyleBackground: TdxNavBarStyleItem read FStyleBackground write SetStyleBackground;
property StyleHint: TdxNavBarStyleItem read FStyleHint write SetStyleHint;
property StyleDropTargetGroup: TdxNavBarStyleItem read FStyleDropTargetGroup write SetStyleDropTargetGroup;
property StyleDropTargetLink: TdxNavBarStyleItem read FStyleDropTargetLink write SetStyleDropTargetLink;
property StyleButton: TdxNavBarStyleItem read FStyleButton write SetStyleButton;
property StyleButtonHotTracked: TdxNavBarStyleItem read FStyleButtonHotTracked write SetStyleButtonHotTracked;
property StyleButtonPressed: TdxNavBarStyleItem read FStyleButtonPressed write SetStyleButtonPressed;
property StyleNavigationPaneHeader: TdxNavBarStyleItem read FStyleNavigationPaneHeader write SetStyleNavigationPaneHeader;
property Styles: TdxNavBarStyles read FStyles;
property View: Integer read FView write SetView;
property ViewStyle: TdxNavBarPainter read GetViewStyle write SetViewStyle;
property VisibleGroupCount: Integer read GetVisibleGroupCount;
property OnActiveGroupChanged: TNotifyEvent read FOnActiveGroupChanged write FOnActiveGroupChanged;
property OnActiveGroupChanging: TdxNavBarGroupChangingEvent read FOnActiveGroupChanging write FOnActiveGroupChanging;
property OnCalcGroupClientHeight: TdxNavBarCalcGroupClientHeightEvent read FOnCalcGroupClientHeight write FOnCalcGroupClientHeight;
property OnCalcGroupHintRect: TdxNavBarCalcGroupHintRectEvent read FOnCalcGroupHintRect write FOnCalcGroupHintRect;
property OnCalcLinkHintRect: TdxNavBarCalcLinkHintRectEvent read FOnCalcLinkHintRect write FOnCalcLinkHintRect;
property OnCalcNavigationPaneOverflowPanelHintRect: TdxNavBarCalcGroupHintRectEvent read FOnCalcNavigationPaneOverflowPanelHintRect write FOnCalcNavigationPaneOverflowPanelHintRect;
property OnCustomDrawBackground: TdxNavBarCustomDrawEvent read FOnCustomDrawBackground write FOnCustomDrawBackground;
property OnCustomDrawGroupCaption: TdxNavBarCustomDrawGroupEvent read FOnCustomDrawGroupCaption write FOnCustomDrawGroupCaption;
property OnCustomDrawGroupClientBackground: TdxNavBarCustomDrawGroupEvent read FOnCustomDrawGroupClientBackground write FOnCustomDrawGroupClientBackground;
property OnCustomDrawGroupClientForeground: TdxNavBarCustomDrawGroupEvent read FOnCustomDrawGroupClientForeground write FOnCustomDrawGroupClientForeground;
property OnCustomDrawGroupHint: TdxNavBarCustomDrawGroupHintEvent read FOnCustomDrawGroupHint write FOnCustomDrawGroupHint;
property OnCustomDrawLink: TdxNavBarCustomDrawLinkEvent read FOnCustomDrawLink write FOnCustomDrawLink;
property OnCustomDrawLinkHint: TdxNavBarCustomDrawLinkHintEvent read FOnCustomDrawLinkHint write FOnCustomDrawLinkHint;
property OnCustomDrawBottomScrollButton: TdxNavBarCustomDrawEvent read FOnCustomDrawBottomScrollButton write FOnCustomDrawBottomScrollButton;
property OnCustomDrawTopScrollButton: TdxNavBarCustomDrawEvent read FOnCustomDrawTopScrollButton write FOnCustomDrawTopScrollButton;
property OnCustomDrawNavigationPaneHeader: TdxNavBarCustomDrawEvent read FOnCustomDrawNavigationPaneHeader write FOnCustomDrawNavigationPaneHeader;
property OnCustomDrawNavigationPaneSplitter: TdxNavBarCustomDrawEvent read FOnCustomDrawNavigationPaneSplitter write FOnCustomDrawNavigationPaneSplitter;
property OnCustomDrawNavigationPaneOverflowPanel: TdxNavBarCustomDrawEvent read FOnCustomDrawNavigationPaneOverflowPanel write FOnCustomDrawNavigationPaneOverflowPanel;
property OnCustomDrawNavigationPaneOverflowPanelHint: TdxNavBarCustomDrawGroupHintEvent read FOnCustomDrawNavigationPaneOverflowPanelHint write FOnCustomDrawNavigationPaneOverflowPanelHint;
property OnGetGroupHint: TdxNavBarGetGroupHintEvent read FOnGetGroupHint write FOnGetGroupHint;
property OnGetLinkHint: TdxNavBarGetLinkHintEvent read FOnGetLinkHint write FOnGetLinkHint;
property OnGroupClick: TdxNavBarGroupEvent read FOnGroupClick write FOnGroupClick;
property OnGroupHotTrack: TdxNavBarGroupEvent read FOnGroupHotTrack write FOnGroupHotTrack;
property OnGroupPress: TdxNavBarGroupEvent read FOnGroupPress write FOnGroupPress;
property OnLinkClick: TdxNavBarLinkEvent read FOnLinkClick write FOnLinkClick;
property OnLinkHotTrack: TdxNavBarLinkEvent read FOnLinkHotTrack write FOnLinkHotTrack;
property OnLinkPress: TdxNavBarLinkEvent read FOnLinkPress write FOnLinkPress;
property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
property DragCursor;
published
property Align;
property Anchors;
property BorderStyle;
property Color;
property Constraints;
property Ctl3D;
property Enabled;
property Font;
property Locked;
property PopupMenu;
property Visible;
property OnContextPopup;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
TdxNavBarDragObject = class
private
FNavBar: TdxCustomNavBar;
FSourceGroup: TdxNavBarGroup;
FSourceLink: TdxNavBarItemLink;
FSourceItem: TdxNavBarItem;
FTargetGroup: TdxNavBarGroup;
FTargetLink1: TdxNavBarItemLink;
FTargetLink2: TdxNavBarItemLink;
FTargetLinkIndex: Integer;
function GetSourceItem: TdxNavBarItem;
protected
procedure UpdateTargets; virtual;
public
constructor Create(ANavBar: TdxCustomNavBar;
var DragObject: TDragObject {deprecated}; ASourceGroup: TdxNavBarGroup;
ASourceLink: TdxNavBarItemLink; ASourceItem: TdxNavBarItem);
property NavBar: TdxCustomNavBar read FNavBar;
property SourceGroup: TdxNavBarGroup read FSourceGroup;
property SourceLink: TdxNavBarItemLink read FSourceLink;
property SourceItem: TdxNavBarItem read GetSourceItem;
property TargetGroup: TdxNavBarGroup read FTargetGroup;
property TargetLink1: TdxNavBarItemLink read FTargetLink1;
property TargetLink2: TdxNavBarItemLink read FTargetLink2;
property TargetLinkIndex: Integer read FTargetLinkIndex;
end;
TdxNavBarScrollBar = class
private
FKind: TScrollBarKind;
FParent: TWinControl;
FScrollBar: TcxScrollBar;
FScrollInfo: TScrollInfo;
FVisible: Boolean;
FLargeChange: Integer;
FSmallChange: Integer;
FOnScroll: TScrollEvent;
procedure CorrectPos(var APos: Integer; AMin, AMax, APageSize: Integer);
function GetHandle: THandle;
function GetHeight: Integer;
function GetMax: Integer;
function GetMin: Integer;
function GetPageSize: Integer;
function GetPosition: Integer;
function GetWidth: Integer;
procedure SetMax(const Value: Integer);
procedure SetMin(const Value: Integer);
procedure SetPageSize(const Value: Integer);
procedure SetPosition(const Value: Integer);
procedure SetVisible(const Value: Boolean);
protected
procedure Reset;
procedure Scroll(Sender: TObject; AScrollCode: TScrollCode; var AScrollPos: Integer);
property Handle: THandle read GetHandle;
property ScrollBar: TcxScrollBar read FScrollBar;
public
constructor Create(AParent: TWinControl; AKind: TScrollBarKind);
destructor Destroy; override;
procedure SetScrollParams(AMin, AMax, APosition, APageSize: Integer; ARedraw: Boolean = True);
property Height: Integer read GetHeight;
property Max: Integer read GetMax write SetMax;
property Min: Integer read GetMin write SetMin;
property PageSize: Integer read GetPageSize write SetPageSize;
property Position: Integer read GetPosition write SetPosition;
property Visible: Boolean read FVisible write SetVisible;
property Width: Integer read GetWidth;
property LargeChange: Integer read FLargeChange write FLargeChange;
property SmallChange: Integer read FSmallChange write FSmallChange;
property OnScroll: TScrollEvent read FOnScroll write FOnScroll;
end;
TdxNavBarHintWindow = class(TCustomControl)
private
procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
procedure WMEraseBkgnd(var Message: TWmEraseBkgnd); message WM_ERASEBKGND;
protected
procedure CreateParams(var Params: TCreateParams); override;
procedure Paint; override;
public
procedure ActivateHint(Rect: TRect; const AHint: string);
function NavBar: TdxCustomNavBar;
end;
TAbstractcxNavBarDesigner = class
private
FNavBar: TdxCustomNavBar;
protected
procedure Modified; virtual; abstract;
procedure Update(AItem: TComponent); virtual; abstract;
public
constructor Create(ANavBar: TdxCustomNavBar);
destructor Destroy; override;
procedure BeginUpdate; virtual; abstract;
procedure CancelUpdate; virtual; abstract;
procedure EndUpdate; virtual; abstract;
property NavBar: TdxCustomNavBar read FNavBar;
end;
TdxNavBar = class(TdxCustomNavBar)
published
property ActiveGroupIndex;
property AllowSelectLinks;
property DefaultStyles;
property DragCopyCursor;
property DragCursor;
property DragDropFlags;
property EachGroupHasSelectedLink;
property HotTrackedGroupCursor;
property HotTrackedLinkCursor;
property LargeImages;
property NavigationPaneMaxVisibleGroups;
property NavigationPaneOverflowPanelUseSmallImages;
property ShowGroupCaptions;
property ShowGroupsHint;
property ShowLinksHint;
property ShowNavigationPaneOverflowPanelHints;
property ShowSpecialGroup;
property SmallImages;
property SpaceBetweenGroups;
property StyleBackground;
property StyleHint;
property StyleDropTargetGroup;
property StyleDropTargetLink;
property StyleButton;
property StyleButtonHotTracked;
property StyleButtonPressed;
property StyleNavigationPaneHeader;
property View;
property ViewStyle;
property OnActiveGroupChanged;
property OnActiveGroupChanging;
property OnCalcGroupClientHeight;
property OnCalcGroupHintRect;
property OnCalcNavigationPaneOverflowPanelHintRect;
property OnCalcLinkHintRect;
property OnCustomDrawBackground;
property OnCustomDrawGroupCaption;
property OnCustomDrawGroupClientBackground;
property OnCustomDrawGroupClientForeground;
property OnCustomDrawGroupHint;
property OnCustomDrawLink;
property OnCustomDrawLinkHint;
property OnCustomDrawBottomScrollButton;
property OnCustomDrawTopScrollButton;
property OnCustomDrawNavigationPaneHeader;
property OnCustomDrawNavigationPaneSplitter;
property OnCustomDrawNavigationPaneOverflowPanel;
property OnCustomDrawNavigationPaneOverflowPanelHint;
property OnDragDrop;
property OnDragOver;
property OnEndDrag;
property OnGetGroupHint;
property OnGetLinkHint;
property OnGroupClick;
property OnGroupHotTrack;
property OnGroupPress;
property OnLinkClick;
property OnLinkHotTrack;
property OnLinkPress;
property OnMouseEnter;
property OnMouseLeave;
property OnStartDrag;
end;
var
dxNavBarDragObject: TdxNavBarDragObject;
DrawIconsAsEnabled: Boolean;
implementation
{$R *.res}
uses
Consts, Math, SysUtils,
dxCore, dxUxTheme, cxGraphics, cxGeometry,
dxNavBarConsts, dxNavBarGraphics,
dxNavBarViewsFact, dxNavBarBaseViews, dxNavBarXPViews,
dxNavBarOfficeViews, dxNavBarOffice11Views,
dxNavBarVSToolBoxViews, dxNavBarExplorerViews;
{ TdxNavBarLinkViewInfo }
constructor TdxNavBarLinkViewInfo.Create(AGroupViewInfo: TdxNavBarGroupViewInfo; ALink: TdxNavBarItemLink;
ACaptionVisible, AImageVisisble: Boolean);
begin
inherited Create;
FGroupViewInfo := AGroupViewInfo;
FViewInfo := FGroupViewInfo.ViewInfo;
FPainter := FViewInfo.Painter;
FNavBar := FViewInfo.NavBar;
FLink := ALink;
FItem := FLink.Item;
FCaptionVisible := ACaptionVisible;
FImageVisible := AImageVisisble;
FFont := TFont.Create;
end;
destructor TdxNavBarLinkViewInfo.Destroy;
begin
FFont.Free;
inherited;
end;
function TdxNavBarLinkViewInfo.ImageIndex: Integer;
begin
if GroupViewInfo.IsLinksUseSmallImages then
Result := Item.SmallImageIndex
else Result := Item.LargeImageIndex;
end;
function TdxNavBarLinkViewInfo.ImageList: TCustomImageList;
begin
if GroupViewInfo.IsLinksUseSmallImages then
Result := NavBar.SmallImages
else Result := NavBar.LargeImages;
end;
function TdxNavBarLinkViewInfo.IsWholeVisible: Boolean;
begin
Result := PtInRect(GroupViewInfo.ItemsRect, Rect.TopLeft) and
PtInRect(GroupViewInfo.ItemsRect, Rect.BottomRight);
end;
function TdxNavBarLinkViewInfo.SelectionRect: TRect;
begin
Result := ImageRect;
InflateRect(Result, 2, 2)
end;
function TdxNavBarLinkViewInfo.GetCaptionHeight: Integer;
begin
Result := 4;
Inc(Result, GetFontHeight(Font));
end;
function TdxNavBarLinkViewInfo.GetDrawEdgeFlag: Integer;
begin
if GroupViewInfo.IsLinksUseSmallImages then
Result := DT_LEFT or DT_VCENTER or DT_SINGLELINE
else Result := DT_CENTER or DT_WORDBREAK;
end;
function TdxNavBarLinkViewInfo.GetImageHeight: Integer;
begin
if GroupViewInfo.IsLinksUseSmallImages then
Result := ViewInfo.GetSmallImageHeight
else Result := ViewInfo.GetLargeImageHeight;
end;
function TdxNavBarLinkViewInfo.GetImageWidth: Integer;
begin
if GroupViewInfo.IsLinksUseSmallImages then
Result := ViewInfo.GetSmallImageWidth
else Result := ViewInfo.GetLargeImageWidth;
end;
function TdxNavBarLinkViewInfo.IsCaptionVisible: Boolean;
begin
Result := FCaptionVisible and (FCaptionRect.Left > FRect.Left) and (FCaptionRect.Right < FRect.Right);
end;
function TdxNavBarLinkViewInfo.IsImageVisible: Boolean;
begin
Result := FImageVisible and (FImageRect.Left > FRect.Left) and (FImageRect.Right < FRect.Right);
end;
function TdxNavBarLinkViewInfo.StyleItem: TdxNavBarStyleItem;
begin
if sDisabled in State then
Result := Item.StyleDisabled
else if sPressed in State then
Result := Item.StylePressed
else if sHotTracked in State then
Result := Item.StyleHotTracked
else Result := Item.Style;
end;
function TdxNavBarLinkViewInfo.Style: TdxBaseNavBarStyle;
begin
if sDisabled in State then
Result := NavBar.DefaultStyles.ItemDisabled
else if sPressed in State then
Result := NavBar.DefaultStyles.ItemPressed
else if sHotTracked in State then
Result := NavBar.DefaultStyles.ItemHotTracked
else Result := NavBar.DefaultStyles.Item;
end;
function TdxNavBarLinkViewInfo.Font: TFont;
begin
Result := FFont;
if (StyleItem <> nil) and (savFont in StyleItem.Style.AssignedValues) then
Result.Assign(StyleItem.Style.Font)
else Result.Assign(Style.Font);
end;
function TdxNavBarLinkViewInfo.FontColor: TColor;
begin
Result := Font.Color;
end;
procedure TdxNavBarLinkViewInfo.CalculateBounds(X, Y: Integer);
var
AHeight: Integer;
begin
if GroupViewInfo.IsViewAsIconView then
begin
FImageRect.Top := Y + ViewInfo.GetLinksImageHorizontalEdge;
FImageRect.Left := X + ViewInfo.GetLinksImageVerticalEdge;
FImageRect.Bottom := FImageRect.Top + GetImageHeight;
FImageRect.Right := FImageRect.Left + GetImageWidth;
FRect.Left := X;
FRect.Top := Y;
FRect.Bottom := FImageRect.Bottom + ViewInfo.GetLinksImageVerticalEdge;
FRect.Right := FImageRect.Right + ViewInfo.GetLinksImageHorizontalEdge;
SetRectEmpty(FCaptionRect);
end
else if GroupViewInfo.IsLinksUseSmallImages then
begin
FImageRect.Top := Y + ViewInfo.GetLinksSmallSeparatorWidth div 2;
FImageRect.Left := X + ViewInfo.GetLinksImageVerticalEdge;
FImageRect.Bottom := FImageRect.Top + GetImageHeight;
FImageRect.Right := FImageRect.Left + GetImageWidth;
FCaptionRect.Top := FImageRect.Top + (FImageRect.Bottom - FImageRect.Top) div 2 - GetCaptionHeight div 2;
FCaptionRect.Left := FImageRect.Right + ViewInfo.GetLinksImageVerticalEdge;
FCaptionRect.Bottom := FCaptionRect.Top + GetCaptionHeight;
FCaptionRect.Right := ViewInfo.ClientWidth - 1 - X;
NavBar.Painter.Canvas.Font := Font;
cxDrawText(NavBar.Painter.DC, Item.Caption, FCaptionRect, GetDrawEdgeFlag or DT_CALCRECT);
if FCaptionRect.Right > ViewInfo.ClientWidth - 1 - X then
FCaptionRect.Right := ViewInfo.ClientWidth - 1 - X;
FRect.Left := X;
FRect.Top := Y;
FRect.Right := ViewInfo.ClientWidth - 1 - X;
if FImageRect.Bottom > FCaptionRect.Bottom then
FRect.Bottom := FImageRect.Bottom + ViewInfo.GetLinksSmallSeparatorWidth div 2
else FRect.Bottom := FCaptionRect.Bottom + ViewInfo.GetLinksSmallSeparatorWidth div 2;
end
else
begin
FImageRect.Top := Y + ViewInfo.GetLinksLargeSeparatorWidth div 2;
FImageRect.Left := (ViewInfo.ClientWidth div 2) - (ViewInfo.GetLargeImageWidth div 2);
FImageRect.Bottom := FImageRect.Top + GetImageHeight;
FImageRect.Right := FImageRect.Left + GetImageWidth;
FCaptionRect.Top := FImageRect.Bottom + ViewInfo.GetLinksImageHorizontalEdge;
FCaptionRect.Left := X;
FCaptionRect.Bottom := FCaptionRect.Top + GetCaptionHeight;
FCaptionRect.Right := ViewInfo.ClientWidth - 1 - X;
NavBar.Painter.Canvas.Font := Font;
AHeight := cxDrawText(NavBar.Painter.DC, Item.Caption, FCaptionRect, GetDrawEdgeFlag or DT_CALCRECT);
OffSetRect(FCaptionRect, (ViewInfo.ClientWidth - 2 * X - (FCaptionRect.Right - FCaptionRect.Left)) div 2, 0);
FCaptionRect.Bottom := FCaptionRect.Top + AHeight;
FRect.Left := X;
FRect.Top := Y;
FRect.Right := ViewInfo.ClientWidth - 1 - X;
FRect.Bottom := FCaptionRect.Bottom + ViewInfo.GetLinksLargeSeparatorWidth div 2;
end;
end;
procedure TdxNavBarLinkViewInfo.CorrectBounds(dX, dY: Integer);
begin
OffsetRect(FRect, dX, dY);
OffsetRect(FImageRect, dX, dY);
OffsetRect(FCaptionRect, dX, dY);
end;
function TdxNavBarLinkViewInfo.GetState: TdxNavBarObjectStates;
begin
Result := [];
if not Item.Enabled then
Result := Result + [sDisabled];
if NavBar.PressedLink = Link then
Result := Result + [sPressed];
if Link.IsSelected then
Result := Result + [sSelected];
if NavBar.HotTrackedLink = Link then
Result := Result + [sHotTracked];
end;
{ TdxNavBarGroupViewInfo }
constructor TdxNavBarGroupViewInfo.Create(AViewInfo: TdxNavBarViewInfo; AGroup: TdxNavBarGroup;
ACaptionVisible, AItemsVisible: Boolean);
begin
inherited Create;
FViewInfo := AViewInfo;
FPainter := FViewInfo.Painter;
FNavBar := FViewInfo.NavBar;
FGroup := AGroup;
FCaptionVisible := ACaptionVisible;
FItemsVisible := AItemsVisible;
FCaptionFont := TFont.Create;
FItems := TList.Create;
CreateInfo;
end;
destructor TdxNavBarGroupViewInfo.Destroy;
begin
FCaptionFont.Free;
ClearItems;
FItems.Free;
inherited Destroy;
end;
function TdxNavBarGroupViewInfo.GetLinkViewInfoByLink(ALink: TdxNavBarItemLink): TdxNavBarLinkViewInfo;
var
I: Integer;
begin
Result := nil;
for I := 0 to ItemCount - 1 do
if Items[I].Link = ALink then
begin
Result := Items[I];
break;
end;
end;
function TdxNavBarGroupViewInfo.IndexOfLinkViewInfo(AViewInfo: TdxNavBarLinkViewInfo): Integer;
begin
Result := FItems.IndexOf(AViewInfo);
end;
function TdxNavBarGroupViewInfo.BorderColor: TColor;
begin
Result := CaptionBackColor2;
end;
function TdxNavBarGroupViewInfo.BgImage: TPicture;
begin
if (Group.StyleBackground <> nil) and (savImage in Group.StyleBackground.Style.AssignedValues) then
Result := Group.StyleBackground.Style.Image
else Result := NavBar.DefaultStyles.GroupBackground.Image;
end;
function TdxNavBarGroupViewInfo.BgBackColor: TColor;
begin
if (Group.StyleBackground <> nil) and (savBackColor in Group.StyleBackground.Style.AssignedValues) then
Result := Group.StyleBackground.Style.BackColor
else Result := NavBar.DefaultStyles.GroupBackground.BackColor;
end;
function TdxNavBarGroupViewInfo.BgBackColor2: TColor;
begin
if (Group.StyleBackground <> nil) and (savBackColor2 in Group.StyleBackground.Style.AssignedValues) then
Result := Group.StyleBackground.Style.BackColor2
else Result := NavBar.DefaultStyles.GroupBackground.BackColor2;
end;
function TdxNavBarGroupViewInfo.BgAlphaBlend: Byte;
begin
if (Group.StyleBackground <> nil) and (savAlphaBlending in Group.StyleBackground.Style.AssignedValues) then
Result := Group.StyleBackground.Style.AlphaBlending
else Result := NavBar.DefaultStyles.GroupBackground.AlphaBlending;
end;
function TdxNavBarGroupViewInfo.BgAlphaBlend2: Byte;
begin
if (Group.StyleBackground <> nil) and (savAlphaBlending2 in Group.StyleBackground.Style.AssignedValues) then
Result := Group.StyleBackground.Style.AlphaBlending2
else Result := NavBar.DefaultStyles.GroupBackground.AlphaBlending2;
end;
function TdxNavBarGroupViewInfo.BgGradientMode: TdxBarStyleGradientMode;
begin
if (Group.StyleBackground <> nil) and (savGradientMode in Group.StyleBackground.Style.AssignedValues) then
Result := Group.StyleBackground.Style.GradientMode
else Result := NavBar.DefaultStyles.GroupBackground.GradientMode;
end;
function TdxNavBarGroupViewInfo.CaptionStyleItem: TdxNavBarStyleItem;
begin
if (sActive in State) or (sSpecial in State) then
begin
if sPressed in State then
Result := Group.StyleHeaderActivePressed
else if sHotTracked in State then
Result := Group.StyleHeaderActiveHotTracked
else Result := Group.StyleHeaderActive;
end
else if sPressed in State then
Result := Group.StyleHeaderPressed
else if sHotTracked in State then
Result := Group.StyleHeaderHotTracked
else Result := Group.StyleHeader;
end;
function TdxNavBarGroupViewInfo.CaptionStyle: TdxBaseNavBarStyle;
begin
if (sActive in State) or (sSpecial in State) then
begin
if sPressed in State then
Result := NavBar.DefaultStyles.GroupHeaderActivePressed
else if sHotTracked in State then
Result := NavBar.DefaultStyles.GroupHeaderActiveHotTracked
else Result := NavBar.DefaultStyles.GroupHeaderActive;
end
else if sPressed in State then
Result := NavBar.DefaultStyles.GroupHeaderPressed
else if sHotTracked in State then
Result := NavBar.DefaultStyles.GroupHeaderHotTracked
else Result := NavBar.DefaultStyles.GroupHeader;
end;
function TdxNavBarGroupViewInfo.CaptionImage: TPicture;
begin
if (CaptionStyleItem <> nil) and (savImage in CaptionStyleItem.Style.AssignedValues) then
Result := CaptionStyleItem.Style.Image
else Result := CaptionStyle.Image;
end;
function TdxNavBarGroupViewInfo.CaptionBorderColor: TColor;
begin
Result := clNone;
end;
function TdxNavBarGroupViewInfo.CaptionBackColor: TColor;
begin
if (CaptionStyleItem <> nil) and (savBackColor in CaptionStyleItem.Style.AssignedValues) then
Result := CaptionStyleItem.Style.BackColor
else Result := CaptionStyle.BackColor;
end;
function TdxNavBarGroupViewInfo.CaptionBackColor2: TColor;
begin
if (CaptionStyleItem <> nil) and (savBackColor2 in CaptionStyleItem.Style.AssignedValues) then
Result := CaptionStyleItem.Style.BackColor2
else Result := CaptionStyle.BackColor2;
end;
function TdxNavBarGroupViewInfo.CaptionAlphaBlend: Byte;
begin
if (CaptionStyleItem <> nil) and (savAlphaBlending in CaptionStyleItem.Style.AssignedValues) then
Result := CaptionStyleItem.Style.AlphaBlending
else Result := CaptionStyle.AlphaBlending;
end;
function TdxNavBarGroupViewInfo.CaptionAlphaBlend2: Byte;
begin
if (CaptionStyleItem <> nil) and (savAlphaBlending2 in CaptionStyleItem.Style.AssignedValues) then
Result := CaptionStyleItem.Style.AlphaBlending2
else Result := CaptionStyle.AlphaBlending2;
end;
function TdxNavBarGroupViewInfo.CaptionGradientMode: TdxBarStyleGradientMode;
begin
if (CaptionStyleItem <> nil) and (savGradientMode in CaptionStyleItem.Style.AssignedValues) then
Result := CaptionStyleItem.Style.GradientMode
else Result := CaptionStyle.GradientMode;
end;
function TdxNavBarGroupViewInfo.CaptionFont: TFont;
begin
Result := FCaptionFont;
if (CaptionStyleItem <> nil) and (savFont in CaptionStyleItem.Style.AssignedValues) then
Result.Assign(CaptionStyleItem.Style.Font)
else Result.Assign(CaptionStyle.Font);
end;
function TdxNavBarGroupViewInfo.CaptionFontColor: TColor;
begin
Result := CaptionFont.Color;
end;
function TdxNavBarGroupViewInfo.CaptionSignColor: TColor;
begin
Result := CaptionFontColor;
end;
function TdxNavBarGroupViewInfo.CaptionHAlignment: TdxBarStyleHAlignment;
begin
if (CaptionStyleItem <> nil) and (savHAlignment in CaptionStyleItem.Style.AssignedValues) then
Result := CaptionStyleItem.Style.HAlignment
else Result := CaptionStyle.HAlignment;
end;
function TdxNavBarGroupViewInfo.CaptionVAlignment: TdxBarStyleVAlignment;
begin
if (CaptionStyleItem <> nil) and (savVAlignment in CaptionStyleItem.Style.AssignedValues) then
Result := CaptionStyleItem.Style.VAlignment
else Result := CaptionStyle.VAlignment;
end;
function TdxNavBarGroupViewInfo.ControlImage: TPicture;
begin
if (Group.StyleControl <> nil) and (savImage in Group.StyleControl.Style.AssignedValues) then
Result := Group.StyleControl.Style.Image
else Result := NavBar.DefaultStyles.GroupControl.Image;
end;
function TdxNavBarGroupViewInfo.ControlBackColor: TColor;
begin
if IsDefaultControlStyle then
Result := BgBackColor
else Result := GetControlBackColor;
end;
function TdxNavBarGroupViewInfo.ControlBackColor2: TColor;
begin
if IsDefaultControlStyle then
Result := BgBackColor2
else Result := GetControlBackColor2;
end;
function TdxNavBarGroupViewInfo.ControlAlphaBlend: Byte;
begin
if IsDefaultControlStyle then
Result := BgAlphaBlend
else if (Group.StyleControl <> nil) and (savAlphaBlending in Group.StyleControl.Style.AssignedValues) then
Result := Group.StyleControl.Style.AlphaBlending
else Result := NavBar.DefaultStyles.GroupControl.AlphaBlending;
end;
function TdxNavBarGroupViewInfo.ControlAlphaBlend2: Byte;
begin
if IsDefaultControlStyle then
Result := BgAlphaBlend2
else if (Group.StyleControl <> nil) and (savAlphaBlending2 in Group.StyleControl.Style.AssignedValues) then
Result := Group.StyleControl.Style.AlphaBlending2
else Result := NavBar.DefaultStyles.GroupControl.AlphaBlending2;
end;
function TdxNavBarGroupViewInfo.ControlGradientMode: TdxBarStyleGradientMode;
begin
if IsDefaultControlStyle then
Result := BgGradientMode
else if (Group.StyleControl <> nil) and (savGradientMode in Group.StyleControl.Style.AssignedValues) then
Result := Group.StyleControl.Style.GradientMode
else Result := NavBar.DefaultStyles.GroupControl.GradientMode;
end;
function TdxNavBarGroupViewInfo.ImageIndex: Integer;
begin
if IsCaptionUseSmallImages then
Result := Group.SmallImageIndex
else Result := Group.LargeImageIndex;
end;
function TdxNavBarGroupViewInfo.ImageList: TCustomImageList;
begin
if IsCaptionUseSmallImages then
Result := NavBar.SmallImages
else Result := NavBar.LargeImages;
end;
function TdxNavBarGroupViewInfo.GetCaptionHeight: Integer;
begin
Result := ViewInfo.GetGroupCaptionHeightAddon;
Inc(Result, GetFontHeight(CaptionFont));
end;
function TdxNavBarGroupViewInfo.GetDrawEdgeFlag: Integer;
const
dxHAlignment: array[TdxBarStyleHAlignment] of Integer = (DT_LEFT, DT_CENTER, DT_RIGHT);
dxVAlignment: array[TdxBarStyleVAlignment] of Integer = (DT_TOP, DT_VCENTER, DT_BOTTOM);
begin
Result := dxHAlignment[CaptionHAlignment] or dxVAlignment[CaptionVAlignment] or
DT_SINGLELINE or DT_END_ELLIPSIS;
end;
function TdxNavBarGroupViewInfo.GetImageHeight: Integer;
begin
if IsCaptionUseSmallImages then
Result := ViewInfo.GetSmallImageHeight
else Result := ViewInfo.GetLargeImageHeight;
end;
function TdxNavBarGroupViewInfo.GetImageWidth: Integer;
begin
if IsCaptionUseSmallImages then
Result := ViewInfo.GetSmallImageWidth
else Result := ViewInfo.GetLargeImageWidth;
end;
function TdxNavBarGroupViewInfo.IsCaptionVisible: Boolean;
begin
Result := FCaptionVisible and NavBar.ShowGroupCaptions and
(Group.ShowCaption or not ViewInfo.CanHasGroupWithNoCaption);
end;
function TdxNavBarGroupViewInfo.IsCaptionImageVisible: Boolean;
begin
Result := ViewInfo.CanHasImageInGroupCaption and
(FCaptionImageRect.Left >= FCaptionRect.Left) and
(FCaptionImageRect.Right <= FCaptionRect.Right) and
(not ViewInfo.CanHasSignInGroupCaption or
(FCaptionImageRect.Right < FCaptionSignRect.Left));
end;
function TdxNavBarGroupViewInfo.IsCaptionSignVisible: Boolean;
begin
Result := ViewInfo.CanHasSignInGroupCaption and
(FCaptionSignRect.Left >= FCaptionRect.Left) and
(FCaptionSignRect.Right <= FCaptionRect.Right)
end;
function TdxNavBarGroupViewInfo.IsCaptionUseSmallImages: Boolean;
begin
Result := not ViewInfo.CanGroupsUseLargeImages or Group.UseSmallImages;
end;
function TdxNavBarGroupViewInfo.IsItemsVisible: Boolean;
begin
Result := FItemsVisible and ViewInfo.CanHasVisibleItemsInGroup(Group);
end;
function TdxNavBarGroupViewInfo.IsLinksUseSmallImages: Boolean;
begin
Result := not ViewInfo.CanLinksUseLargeImages or Group.LinksUseSmallImages;
end;
function TdxNavBarGroupViewInfo.IsViewAsIconView: Boolean;
begin
Result := ViewInfo.CanHasGroupViewAsIconView and Group.ShowAsIconView;
end;
procedure TdxNavBarGroupViewInfo.AdjustControlBounds;
begin
if Group.Control = nil then exit;
if IsItemsVisible and Group.ShowControl then
Group.Control.AdjustControl(ControlRect, True)
else Group.Control.AdjustControl(CaptionRect, False);
end;
procedure TdxNavBarGroupViewInfo.CreateInfo;
var
I: Integer;
begin
ClearItems;
if IsItemsVisible and (Control = nil) then
for I := 0 to Group.LinkCount - 1 do
if (Group.Links[I].Item <> nil) and Group.Links[I].Item.Visible then
AddLink(ViewInfo, Group.Links[I], True, True);
end;
procedure TdxNavBarGroupViewInfo.CalculateBounds(X, Y: Integer);
function HasScrollButtonInGroupCaption: Boolean;
var
AActiveIndex, AIndex: Integer;
begin
AIndex := ViewInfo.IndexOfGroupViewInfo(Self);
AActiveIndex := ViewInfo.IndexOfGroupViewInfo(ViewInfo.ActiveGroupViewInfo);
Result := ViewInfo.CanHasScrollButtonInGroupCaption and
((AIndex = AActiveIndex) or (AIndex = AActiveIndex + 1));
end;
procedure CalcImageRect;
var
ADelta, AHeightAddon: Integer;
begin
if ViewInfo.CanHasImageInGroupCaption then
begin
FCaptionImageRect.Left := FCaptionRect.Left + ViewInfo.GetGroupCaptionImageIndent;
FCaptionImageRect.Bottom := FCaptionRect.Bottom;
FCaptionImageRect.Right := FCaptionImageRect.Left + GetImageWidth;
FCaptionImageRect.Top := FCaptionImageRect.Bottom - GetImageHeight;
if ViewInfo.CanGroupCaptionBoundsByImage then
AHeightAddon := ViewInfo.GetGroupCaptionHeightAddon
else
AHeightAddon := 0;
if FCaptionImageRect.Top - 2 * AHeightAddon < FCaptionRect.Top then
begin
ADelta := FCaptionRect.Top + 2 * AHeightAddon - FCaptionImageRect.Top;
Inc(FCaptionRect.Bottom, ADelta);
Inc(FCaptionTextRect.Bottom, ADelta);
if not ViewInfo.CanGroupCaptionBoundsByImage then
begin
Inc(FCaptionRect.Top, ADelta);
Inc(FCaptionTextRect.Top, ADelta);
end;
OffsetRect(FCaptionImageRect, 0, ADelta - AHeightAddon);
end
else
begin
ADelta := cxRectHeight(FCaptionRect) div 2 - GetImageWidth div 2;
OffsetRect(FCaptionImageRect, 0, -ADelta);
end;
FCaptionTextRect.Left := FCaptionImageRect.Right + ViewInfo.GetGroupCaptionTextIndent;
end
else
FCaptionImageRect := cxNullRect;
end;
procedure CalcSignRect;
var
ADelta: Integer;
begin
if ViewInfo.CanHasSignInGroupCaption then
begin
ADelta := (cxRectHeight(FCaptionRect) - ViewInfo.GetGroupCaptionSignSize) div 2;
FCaptionSignRect.Top := FCaptionRect.Top + ADelta + 1;
FCaptionSignRect.Bottom := FCaptionSignRect.Top + ViewInfo.GetGroupCaptionSignSize;
FCaptionSignRect.Right := FCaptionRect.Right - ADelta;
FCaptionSignRect.Left := FCaptionSignRect.Right - ViewInfo.GetGroupCaptionSignSize;
FCaptionTextRect.Right := FCaptionSignRect.Left - ADelta;//TODO
end
else
FCaptionSignRect := cxNullRect;
end;
procedure CalcCaptionRect;
begin
FCaptionRect.Left := X;
FCaptionRect.Top := Y;
FCaptionRect.Right := ViewInfo.ClientWidth - X;
if HasScrollButtonInGroupCaption then
FCaptionRect.Right := FCaptionRect.Right - GetCaptionHeight - 2;
if IsCaptionVisible then
begin
FCaptionRect.Bottom := Y + GetCaptionHeight;
FCaptionTextRect := FCaptionRect;
InflateRect(FCaptionTextRect, -2, -1);
CalcImageRect;
CalcSignRect;
end
else
FCaptionRect.Bottom := FCaptionRect.Top;
end;
procedure CalcClientRect;
var
I: Integer;
ItemStartX, ItemStartY, AItemsRectBottom, AClientHeight: Integer;
begin
FRect.TopLeft := FCaptionRect.TopLeft;
FRect.Right := ViewInfo.ClientWidth - X;
if IsItemsVisible then
begin
if Control <> nil then
begin
FRect.Bottom := FCaptionRect.Bottom + Control.OriginalHeight;
Inc(FRect.Bottom, 2 * ViewInfo.GetGroupBorderWidth);
end
else
begin
AItemsRectBottom := FCaptionRect.Bottom + ViewInfo.GetGroupCaptionSeparatorWidth;
ItemStartX := X;
ItemStartY := AItemsRectBottom;
for I := 0 to ItemCount - 1 do
begin
Items[I].CalculateBounds(ItemStartX, ItemStartY);
if IsViewAsIconView then
begin
if (Items[I].Rect.Right > FCaptionRect.Right) and (I > 0) then
begin
ItemStartX := X;
ItemStartY := Items[I].Rect.Bottom;
Items[I].CalculateBounds(ItemStartX, ItemStartY);
end;
ItemStartX := Items[I].Rect.Right;
end
else
ItemStartY := Items[I].Rect.Bottom;
AItemsRectBottom := Items[I].Rect.Bottom;
end;
FRect.Bottom := AItemsRectBottom + ViewInfo.GetGroupCaptionSeparatorWidth;
end;
end
else
FRect.Bottom := FCaptionRect.Bottom;
if Group.Expanded and Assigned(NavBar.OnCalcGroupClientHeight) then
begin
AClientHeight := cxRectHeight(FRect) - cxRectHeight(FCaptionRect);
NavBar.OnCalcGroupClientHeight(NavBar, Self, AClientHeight);
FRect.Bottom := FRect.Top + AClientHeight + cxRectHeight(FCaptionRect);
end;
end;
procedure CalcItemsRect;
begin
FItemsRect.Left := FCaptionRect.Left;
FItemsRect.Top := FCaptionRect.Bottom;
FItemsRect.BottomRight := FRect.BottomRight;
end;
begin
CalcCaptionRect;
CalcClientRect;
CalcItemsRect;
end;
procedure TdxNavBarGroupViewInfo.CorrectBounds(dX, dY: Integer);
var
I: Integer;
begin
OffsetRect(FCaptionRect, dX, dY);
OffsetRect(FRect, dX, dY);
OffsetRect(FItemsRect, dX, dY);
OffsetRect(FCaptionTextRect, dX, dY);
OffsetRect(FCaptionImageRect, dX, dY);
OffsetRect(FCaptionSignRect, dX, dY);
for I := 0 to ItemCount - 1 do
Items[I].CorrectBounds(dX, dY);
end;
procedure TdxNavBarGroupViewInfo.CorrectActiveGroupBounds(dX, dY: Integer);
var
I, OffsetY: Integer;
ALinkViewInfo: TdxNavBarLinkViewInfo;
begin
FRect.Right := FRect.Right + dX;
FRect.Bottom := FRect.Bottom + dY;
FItemsRect.Right := FItemsRect.Right + dX;
FItemsRect.Bottom := FItemsRect.Bottom + dY;
OffsetY := 0;
for I := 0 to Group.TopVisibleLinkIndex - 1 do
begin
ALinkViewInfo := ViewInfo.GetLinkViewInfoByLink(Group.Links[I]);
if ALinkViewInfo <> nil then
Inc(OffsetY, ALinkViewInfo.Rect.Bottom - ALinkViewInfo.Rect.Top);
end;
for I := 0 to ItemCount - 1 do
Items[I].CorrectBounds(0, - OffsetY);
end;
function TdxNavBarGroupViewInfo.GetControl: TdxNavBarGroupControl;
begin
if Group.ShowControl then
Result := Group.Control
else Result := nil;
end;
function TdxNavBarGroupViewInfo.GetControlBackColor: TColor;
begin
if (Group.StyleControl <> nil) and (savBackColor in Group.StyleControl.Style.AssignedValues) then
Result := Group.StyleControl.Style.BackColor
else Result := NavBar.DefaultStyles.GroupControl.BackColor;
end;
function TdxNavBarGroupViewInfo.GetControlBackColor2: TColor;
begin
if (Group.StyleControl <> nil) and (savBackColor2 in Group.StyleControl.Style.AssignedValues) then
Result := Group.StyleControl.Style.BackColor2
else Result := NavBar.DefaultStyles.GroupControl.BackColor2;
end;
function TdxNavBarGroupViewInfo.GetControlRect: TRect;
begin
Result := ItemsRect;
InflateRect(Result, -ViewInfo.GetGroupBorderWidth, -ViewInfo.GetGroupBorderWidth);
if IsCaptionVisible then Result.Top := CaptionRect.Bottom;
end;
function TdxNavBarGroupViewInfo.GetItemCount: Integer;
begin
Result := FItems.Count;
end;
function TdxNavBarGroupViewInfo.GetItem(Index: Integer): TdxNavBarLinkViewInfo;
begin
Result := TdxNavBarLinkViewInfo(FItems.Items[Index]);
end;
function TdxNavBarGroupViewInfo.GetState: TdxNavBarObjectStates;
begin
Result := [];
if Group = NavBar.PressedGroup then
Result := Result + [sPressed];
if Group = NavBar.HotTrackedGroup then
Result := Result + [sHotTracked];
if Group.Expanded then
Result := Result + [sExpanded];
if (Group = NavBar.ActiveGroup) and ViewInfo.CanHasActiveGroup then
Result := Result + [sActive];
if (Group = NavBar.ActiveGroup) and ViewInfo.CanHasSpecialGroup and NavBar.ShowSpecialGroup then
Result := Result + [sSpecial];
end;
function TdxNavBarGroupViewInfo.IsDefaultControlStyle: Boolean;
begin
Result := (GetControlBackColor = clNone) or (GetControlBackColor2 = clNone);
end;
procedure TdxNavBarGroupViewInfo.AddLink(AViewInfo: TdxNavBarViewInfo; ALink: TdxNavBarItemLink; ACaptionVisible, AImageVisisble: Boolean);
begin
FItems.Add(Painter.CreateLinkViewInfo(self, ALink, ACaptionVisible, AImageVisisble));
end;
procedure TdxNavBarGroupViewInfo.ClearItems;
var
I: Integer;
begin
for I := 0 to ItemCount - 1 do Items[I].Free;
FItems.Clear;
end;
{ TdxNavBarViewInfo }
constructor TdxNavBarViewInfo.Create(APainter: TdxNavBarPainter);
begin
inherited Create;
FPainter := APainter;
FNavBar := FPainter.NavBar;
FGroups := TList.Create;
FHeaderFont := TFont.Create;
CreateColors;
end;
destructor TdxNavBarViewInfo.Destroy;
begin
ReleaseColors;
FHeaderFont.Free;
ClearGroups;
FGroups.Free;
inherited Destroy;
end;
function TdxNavBarViewInfo.ActiveGroupViewInfo: TdxNavBarGroupViewInfo;
begin
if (NavBar.ActiveGroup <> nil) then
Result := GetGroupViewInfoByGroup(NavBar.ActiveGroup)
else Result := nil;
end;
function TdxNavBarViewInfo.GetGroupViewInfoByGroup(AGroup: TdxNavBarGroup): TdxNavBarGroupViewInfo;
var
I: Integer;
begin
Result := nil;
for I := 0 to GroupCount - 1 do
if Groups[I].Group = AGroup then
begin
Result := Groups[I];
break;
end;
end;
function TdxNavBarViewInfo.GetLinkViewInfoByLink(ALink: TdxNavBarItemLink): TdxNavBarLinkViewInfo;
var
I: Integer;
begin
Result := nil;
for I := 0 to GroupCount - 1 do
begin
Result := Groups[I].GetLinkViewInfoByLink(ALink);
if Result <> nil then break;
end;
end;
function TdxNavBarViewInfo.IndexOfGroupViewInfo(AViewInfo: TdxNavBarGroupViewInfo): Integer;
begin
Result := FGroups.IndexOf(AViewInfo);
end;
function TdxNavBarViewInfo.GetGroupViewInfoAtCaptionPos(pt: TPoint): TdxNavBarGroupViewInfo;
var
I: Integer;
begin
Result := nil;
for I := 0 to GroupCount - 1 do
if ptInRect(Groups[I].CaptionRect, pt) then
begin
Result := Groups[I];
break;
end;
end;
function TdxNavBarViewInfo.GetGroupAtCaptionPos(pt: TPoint): TdxNavBarGroup;
var
AViewInfo: TdxNavBarGroupViewInfo;
begin
AViewInfo := GetGroupViewInfoAtCaptionPos(pt);
if (AViewInfo <> nil) and (AViewInfo.Group <> nil) and
not (csDestroying in AViewInfo.Group.ComponentState) then
Result := AViewInfo.Group
else Result := nil;
end;
function TdxNavBarViewInfo.GetGroupViewInfoAtItemsPos(pt: TPoint): TdxNavBarGroupViewInfo;
var
I: Integer;
begin
Result := nil;
for I := 0 to GroupCount - 1 do
if ptInRect(Groups[I].Rect, pt) and not ptInRect(Groups[I].CaptionRect, pt) then
begin
Result := Groups[I];
break;
end;
end;
function TdxNavBarViewInfo.GetGroupAtItemsPos(pt: TPoint): TdxNavBarGroup;
var
AViewInfo: TdxNavBarGroupViewInfo;
begin
AViewInfo := GetGroupViewInfoAtItemsPos(pt);
if (AViewInfo <> nil) and (AViewInfo.Group <> nil) and
not (csDestroying in AViewInfo.Group.ComponentState) then
Result := AViewInfo.Group
else Result := nil;
end;
function TdxNavBarViewInfo.GetLinkViewInfoAtPos(pt: TPoint): TdxNavBarLinkViewInfo;
var
I: Integer;
AGroupViewInfo: TdxNavBarGroupViewInfo;
begin
Result := nil;
AGroupViewInfo := GetGroupViewInfoAtItemsPos(pt);
if AGroupViewInfo <> nil then
for I := 0 to AGroupViewInfo.ItemCount - 1 do
if ptInRect(AGroupViewInfo.Items[I].Rect, pt) then
begin
Result := AGroupViewInfo.Items[I];
break;
end;
end;
function TdxNavBarViewInfo.GetLinkAtPos(pt: TPoint): TdxNavBarItemLink;
var
AViewInfo: TdxNavBarLinkViewInfo;
begin
AViewInfo := GetLinkViewInfoAtPos(pt);
if (AViewInfo <> nil) and (AViewInfo.Link <> nil) and
(AViewInfo.Link.Group <> nil) and (AViewInfo.Link.Item <> nil) then
Result := AViewInfo.Link
else Result := nil;
end;
function TdxNavBarViewInfo.GetLinkViewInfoAtSelectedPos(pt: TPoint): TdxNavBarLinkViewInfo;
var
I: Integer;
R: TRect;
AGroupViewInfo: TdxNavBarGroupViewInfo;
begin
Result := nil;
if not (IsPtBottomScrollButton(pt) or IsPtTopScrollButton(pt)) then
begin
AGroupViewInfo := GetGroupViewInfoAtItemsPos(pt);
if AGroupViewInfo <> nil then
for I := 0 to AGroupViewInfo.ItemCount - 1 do
begin
if CanSelectLinkByRect then
begin
if ptInRect(AGroupViewInfo.Items[I].Rect, pt) then
begin
Result := AGroupViewInfo.Items[I];
break;
end;
end
else
begin
R := AGroupViewInfo.Items[I].CaptionRect;
if AGroupViewInfo.IsLinksUseSmallImages then
R.Left := AGroupViewInfo.Items[I].ImageRect.Right
else R.Top := AGroupViewInfo.Items[I].ImageRect.Bottom;
if ptInRect(AGroupViewInfo.Items[I].ImageRect, pt) or ptInRect(R, pt) then
begin
Result := AGroupViewInfo.Items[I];
break;
end;
end;
end;
end;
end;
function TdxNavBarViewInfo.GetLinkAtSelectedPos(pt: TPoint): TdxNavBarItemLink;
var
AViewInfo: TdxNavBarLinkViewInfo;
begin
AViewInfo := GetLinkViewInfoAtSelectedPos(pt);
if (AViewInfo <> nil) and (AViewInfo.Link <> nil) and
(AViewInfo.Link.Group <> nil) and (AViewInfo.Link.Item <> nil) then
Result := AViewInfo.Link
else Result := nil;
end;
function TdxNavBarViewInfo.GetViewInfoAtDragPosition(pt: TPoint; var ItemGroup: TdxNavBarGroupViewInfo;
var Item1, Item2: TdxNavBarLinkViewInfo): Integer;
var
Index: Integer;
ALinkViewInfo: TdxNavBarLinkViewInfo;
begin
ItemGroup := nil;
Item1 := nil;
Item2 := nil;
ItemGroup := GetGroupViewInfoAtItemsPos(pt);
if ItemGroup <> nil then
begin
if ItemGroup.IsViewAsIconView then
Result := GetViewInfoAtDragPositionWhenIconView(pt, ItemGroup, Item1, Item2)
else
begin
ALinkViewInfo := GetLinkViewInfoAtPos(pt);
if ALinkViewInfo <> nil then
begin
Index := ItemGroup.IndexOfLinkViewInfo(ALinkViewInfo);
if (ALinkViewInfo.Rect.Top + (ALinkViewInfo.Rect.Bottom - ALinkViewInfo.Rect.Top) div 2) > pt.y then
begin
if Index > 0 then
Item1 := ItemGroup.Items[Index - 1];
Item2 := ALinkViewInfo
end
else
begin
Item1 := ALinkViewInfo;
if Index < ItemGroup.ItemCount - 1 then
Item2 := ItemGroup.Items[Index + 1];
end;
end
else
begin
if ItemGroup.ItemCount > 0 then
begin
if pt.Y < ItemGroup.Items[0].Rect.Top then
Item2 := ItemGroup.Items[0]
else Item1 := ItemGroup.Items[ItemGroup.ItemCount - 1];
end;
end;
if (Item1 <> nil) and (Item2 <> nil) then
Result := Item2.Link.Index
else if Item1 <> nil then
Result := ItemGroup.Group.LinkCount
else Result := 0;
end;
end
else
begin
ItemGroup := GetGroupViewInfoAtCaptionPos(pt);
if ItemGroup <> nil then
begin
if ItemGroup.ItemCount > 0 then
Item2 := ItemGroup.Items[0];
Result := 0;
end
else Result := -1;
end;
end;
function TdxNavBarViewInfo.GetViewInfoAtDragPositionWhenIconView(pt: TPoint; var ItemGroup: TdxNavBarGroupViewInfo;
var Item1, Item2: TdxNavBarLinkViewInfo): Integer;
var
I, Index: Integer;
ALinkViewInfo: TdxNavBarLinkViewInfo;
begin
ItemGroup := nil;
Item1 := nil;
Item2 := nil;
ItemGroup := GetGroupViewInfoAtItemsPos(pt);
if ItemGroup <> nil then
begin
ALinkViewInfo := GetLinkViewInfoAtPos(pt);
if ALinkViewInfo <> nil then
begin
Index := ItemGroup.IndexOfLinkViewInfo(ALinkViewInfo);
if (ALinkViewInfo.Rect.Left + (ALinkViewInfo.Rect.Right - ALinkViewInfo.Rect.Left) div 2) > pt.x then
begin
if Index > 0 then
Item1 := ItemGroup.Items[Index - 1];
Item2 := ALinkViewInfo
end
else
begin
Item1 := ALinkViewInfo;
if Index < ItemGroup.ItemCount - 1 then
Item2 := ItemGroup.Items[Index + 1];
end;
end
else
begin
if ItemGroup.ItemCount > 0 then
begin
if pt.Y < ItemGroup.Items[0].Rect.Top then
Item2 := ItemGroup.Items[0]
else if pt.Y > ItemGroup.Items[ItemGroup.ItemCount - 1].Rect.Top then
Item1 := ItemGroup.Items[ItemGroup.ItemCount - 1]
else for I := 0 to ItemGroup.ItemCount - 1 do
if (pt.y > ItemGroup.Items[I].Rect.Top) and (pt.y < ItemGroup.Items[I].Rect.Bottom) then
begin
if pt.x > ItemGroup.Items[I].Rect.Right then
begin
Item1 := ItemGroup.Items[I];
if I < ItemGroup.ItemCount - 1 then
Item2 := ItemGroup.Items[I + 1];
end
else if pt.x < ItemGroup.Items[I].Rect.Right then
begin
Item2 := ItemGroup.Items[I];
if I > 0 then
Item1 := ItemGroup.Items[I - 1];
end
end;
end;
end;
if (Item1 <> nil) and (Item2 <> nil) then
Result := Item2.Link.Index
else if Item1 <> nil then
Result := ItemGroup.Group.LinkCount
else Result := 0;
end
else Result := -1;
end;
function TdxNavBarViewInfo.GetLinksAtDragPosition(pt: TPoint; var ItemGroup: TdxNavBarGroup;
var Item1, Item2: TdxNavBarItemLink): Integer;
var
AGroupViewInfo: TdxNavBarGroupViewInfo;
ALinkViewInfo1, ALinkViewInfo2: TdxNavBarLinkViewInfo;
begin
Result := GetViewInfoAtDragPosition(pt, AGroupViewInfo, ALinkViewInfo1, ALinkViewInfo2);
if (AGroupViewInfo <> nil) and (AGroupViewInfo.Group <> nil) and
not (csDestroying in AGroupViewInfo.Group.ComponentState) then
ItemGroup := AGroupViewInfo.Group
else ItemGroup := nil;
if (ALinkViewInfo1 <> nil) and (ALinkViewInfo1.Link <> nil) and
(ALinkViewInfo1.Link.Group <> nil) and ((ALinkViewInfo1.Link.Item <> nil)) then
Item1 := ALinkViewInfo1.Link
else Item1 := nil;
if (ALinkViewInfo2 <> nil) and (ALinkViewInfo2.Link <> nil) and
(ALinkViewInfo2.Link.Group <> nil) and ((ALinkViewInfo2.Link.Item <> nil)) then
Item2 := ALinkViewInfo2.Link
else Item2 := nil;
end;
function TdxNavBarViewInfo.IsPtIncNavigationPaneOverflowPanelItemCount(pt: TPoint): Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.IsPtDecNavigationPaneOverflowPanelItemCount(pt: TPoint): Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.IsPtNavigationPaneOverflowPanelSign(pt: TPoint): Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.GetNavigationPaneOverflowPanelItemIndexAtPos(pt: TPoint): Integer;
begin
Result := -1;
end;
function TdxNavBarViewInfo.GetNavigationPaneOverflowPanelGroupAtPos(pt: TPoint): TdxNavBarGroup;
begin
Result := nil;
end;
function TdxNavBarViewInfo.IsTopScrollButtonVisible: Boolean;
begin
Result := (FTopScrollButtonRect.Top <> FTopScrollButtonRect.Bottom) and
(FTopScrollButtonRect.Left <> FTopScrollButtonRect.Right);
end;
function TdxNavBarViewInfo.IsBottomScrollButtonVisible: Boolean;
begin
Result := (FBottomScrollButtonRect.Top <> FBottomScrollButtonRect.Bottom) and
(FBottomScrollButtonRect.Left <> FBottomScrollButtonRect.Right);
end;
function TdxNavBarViewInfo.IsPtTopScrollButton(pt: TPoint): Boolean;
begin
Result := PtInRect(FTopScrollButtonRect, pt);
end;
function TdxNavBarViewInfo.IsPtBottomScrollButton(pt: TPoint): Boolean;
begin
Result := PtInRect(FBottomScrollButtonRect, pt);
end;
function TdxNavBarViewInfo.IsPtNavigationPaneHeader(pt: TPoint): Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.IsPtNavigationPaneSplitter(pt: TPoint): Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.IsPtNavigationPaneOverflowPanel(pt: TPoint): Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.BgImage: TPicture;
begin
if (NavBar.StyleBackground <> nil) and (savImage in NavBar.StyleBackground.Style.AssignedValues) then
Result := NavBar.StyleBackground.Style.Image
else Result := NavBar.DefaultStyles.Background.Image;
end;
function TdxNavBarViewInfo.BgBackColor: TColor;
begin
if (NavBar.StyleBackground <> nil) and (savBackColor in NavBar.StyleBackground.Style.AssignedValues) then
Result := NavBar.StyleBackground.Style.BackColor
else Result := NavBar.DefaultStyles.Background.BackColor;
end;
function TdxNavBarViewInfo.BgBackColor2: TColor;
begin
if (NavBar.StyleBackground <> nil) and (savBackColor2 in NavBar.StyleBackground.Style.AssignedValues) then
Result := NavBar.StyleBackground.Style.BackColor2
else Result := NavBar.DefaultStyles.Background.BackColor2;
end;
function TdxNavBarViewInfo.BgAlphaBlend: Byte;
begin
if (NavBar.StyleBackground <> nil) and (savAlphaBlending in NavBar.StyleBackground.Style.AssignedValues) then
Result := NavBar.StyleBackground.Style.AlphaBlending
else Result := NavBar.DefaultStyles.Background.AlphaBlending;
end;
function TdxNavBarViewInfo.BgAlphaBlend2: Byte;
begin
if (NavBar.StyleBackground <> nil) and (savAlphaBlending2 in NavBar.StyleBackground.Style.AssignedValues) then
Result := NavBar.StyleBackground.Style.AlphaBlending2
else Result := NavBar.DefaultStyles.Background.AlphaBlending2;
end;
function TdxNavBarViewInfo.BgGradientMode: TdxBarStyleGradientMode;
begin
if (NavBar.StyleBackground <> nil) and (savGradientMode in NavBar.StyleBackground.Style.AssignedValues) then
Result := NavBar.StyleBackground.Style.GradientMode
else Result := NavBar.DefaultStyles.Background.GradientMode;
end;
function TdxNavBarViewInfo.BorderColor: TColor;
begin
Result := clNone;
end;
function TdxNavBarViewInfo.BottomScrollButtonStyleItem: TdxNavBarStyleItem;
begin
if NavBar.ScrollButtonUpIsDown then
Result := NavBar.StyleButtonPressed
else if IsPtBottomScrollButton(NavBar.TargetPoint) then
Result := NavBar.StyleButtonHotTracked
else Result := NavBar.StyleButton;
end;
function TdxNavBarViewInfo.BottomScrollButtonStyle: TdxBaseNavBarStyle;
begin
if NavBar.ScrollButtonUpIsDown then
Result := NavBar.DefaultStyles.ButtonPressed
else if IsPtBottomScrollButton(NavBar.TargetPoint) then
Result := NavBar.DefaultStyles.ButtonHotTracked
else Result := NavBar.DefaultStyles.Button;
end;
function TdxNavBarViewInfo.BottomScrollButtonImage: TPicture;
begin
if (BottomScrollButtonStyleItem <> nil) and (savImage in BottomScrollButtonStyleItem.Style.AssignedValues) then
Result := BottomScrollButtonStyleItem.Style.Image
else Result := BottomScrollButtonStyle.Image;
end;
function TdxNavBarViewInfo.BottomScrollButtonBackColor: TColor;
begin
if (BottomScrollButtonStyleItem <> nil) and (savBackColor in BottomScrollButtonStyleItem.Style.AssignedValues) then
Result := BottomScrollButtonStyleItem.Style.BackColor
else Result := BottomScrollButtonStyle.BackColor;
end;
function TdxNavBarViewInfo.BottomScrollButtonBackColor2: TColor;
begin
if (BottomScrollButtonStyleItem <> nil) and (savBackColor2 in BottomScrollButtonStyleItem.Style.AssignedValues) then
Result := BottomScrollButtonStyleItem.Style.BackColor2
else Result := BottomScrollButtonStyle.BackColor2;
end;
function TdxNavBarViewInfo.BottomScrollButtonAlphaBlend: Byte;
begin
if (BottomScrollButtonStyleItem <> nil) and (savAlphaBlending in BottomScrollButtonStyleItem.Style.AssignedValues) then
Result := BottomScrollButtonStyleItem.Style.AlphaBlending
else Result := BottomScrollButtonStyle.AlphaBlending;
end;
function TdxNavBarViewInfo.BottomScrollButtonAlphaBlend2: Byte;
begin
if (BottomScrollButtonStyleItem <> nil) and (savAlphaBlending2 in BottomScrollButtonStyleItem.Style.AssignedValues) then
Result := BottomScrollButtonStyleItem.Style.AlphaBlending2
else Result := BottomScrollButtonStyle.AlphaBlending2;
end;
function TdxNavBarViewInfo.BottomScrollButtonGradientMode: TdxBarStyleGradientMode;
begin
if (BottomScrollButtonStyleItem <> nil) and (savGradientMode in BottomScrollButtonStyleItem.Style.AssignedValues) then
Result := BottomScrollButtonStyleItem.Style.GradientMode
else Result := BottomScrollButtonStyle.GradientMode;
end;
function TdxNavBarViewInfo.TopScrollButtonStyleItem: TdxNavBarStyleItem;
begin
if NavBar.ScrollButtonUpIsDown then
Result := NavBar.StyleButtonPressed
else if IsPtTopScrollButton(NavBar.TargetPoint) then
Result := NavBar.StyleButtonHotTracked
else Result := NavBar.StyleButton;
end;
function TdxNavBarViewInfo.TopScrollButtonStyle: TdxBaseNavBarStyle;
begin
if NavBar.ScrollButtonUpIsDown then
Result := NavBar.DefaultStyles.ButtonPressed
else if IsPtTopScrollButton(NavBar.TargetPoint) then
Result := NavBar.DefaultStyles.ButtonHotTracked
else Result := NavBar.DefaultStyles.Button;
end;
function TdxNavBarViewInfo.TopScrollButtonImage: TPicture;
begin
if (TopScrollButtonStyleItem <> nil) and (savImage in TopScrollButtonStyleItem.Style.AssignedValues) then
Result := TopScrollButtonStyleItem.Style.Image
else Result := TopScrollButtonStyle.Image;
end;
function TdxNavBarViewInfo.TopScrollButtonBackColor: TColor;
begin
if (TopScrollButtonStyleItem <> nil) and (savBackColor in TopScrollButtonStyleItem.Style.AssignedValues) then
Result := TopScrollButtonStyleItem.Style.BackColor
else Result := TopScrollButtonStyle.BackColor;
end;
function TdxNavBarViewInfo.TopScrollButtonBackColor2: TColor;
begin
if (TopScrollButtonStyleItem <> nil) and (savBackColor2 in TopScrollButtonStyleItem.Style.AssignedValues) then
Result := TopScrollButtonStyleItem.Style.BackColor2
else Result := TopScrollButtonStyle.BackColor2;
end;
function TdxNavBarViewInfo.TopScrollButtonAlphaBlend: Byte;
begin
if (TopScrollButtonStyleItem <> nil) and (savAlphaBlending in TopScrollButtonStyleItem.Style.AssignedValues) then
Result := TopScrollButtonStyleItem.Style.AlphaBlending
else Result := TopScrollButtonStyle.AlphaBlending;
end;
function TdxNavBarViewInfo.TopScrollButtonAlphaBlend2: Byte;
begin
if (TopScrollButtonStyleItem <> nil) and (savAlphaBlending2 in TopScrollButtonStyleItem.Style.AssignedValues) then
Result := TopScrollButtonStyleItem.Style.AlphaBlending2
else Result := TopScrollButtonStyle.AlphaBlending2;
end;
function TdxNavBarViewInfo.TopScrollButtonGradientMode: TdxBarStyleGradientMode;
begin
if (TopScrollButtonStyleItem <> nil) and (savGradientMode in TopScrollButtonStyleItem.Style.AssignedValues) then
Result := TopScrollButtonStyleItem.Style.GradientMode
else Result := TopScrollButtonStyle.GradientMode;
end;
function TdxNavBarViewInfo.HintImage: TPicture;
begin
if (NavBar.StyleHint <> nil) and (savImage in NavBar.StyleHint.Style.AssignedValues) then
Result := NavBar.StyleHint.Style.Image
else Result := NavBar.DefaultStyles.Hint.Image
end;
function TdxNavBarViewInfo.HintBackColor: TColor;
begin
if (NavBar.StyleHint <> nil) and (savBackColor in NavBar.StyleHint.Style.AssignedValues) then
Result := NavBar.StyleHint.Style.BackColor
else Result := NavBar.DefaultStyles.Hint.BackColor;
end;
function TdxNavBarViewInfo.HintBackColor2: TColor;
begin
if (NavBar.StyleHint <> nil) and (savBackColor2 in NavBar.StyleHint.Style.AssignedValues) then
Result := NavBar.StyleHint.Style.BackColor2
else Result := NavBar.DefaultStyles.Hint.BackColor2;
end;
function TdxNavBarViewInfo.HintAlphaBlend: Byte;
begin
if (NavBar.StyleHint <> nil) and (savAlphaBlending in NavBar.StyleHint.Style.AssignedValues) then
Result := NavBar.StyleHint.Style.AlphaBlending
else Result := NavBar.DefaultStyles.Hint.AlphaBlending;
end;
function TdxNavBarViewInfo.HintAlphaBlend2: Byte;
begin
if (NavBar.StyleHint <> nil) and (savAlphaBlending2 in NavBar.StyleHint.Style.AssignedValues) then
Result := NavBar.StyleHint.Style.AlphaBlending2
else Result := NavBar.DefaultStyles.Hint.AlphaBlending2;
end;
function TdxNavBarViewInfo.HintGradientMode: TdxBarStyleGradientMode;
begin
if (NavBar.StyleHint <> nil) and (savGradientMode in NavBar.StyleHint.Style.AssignedValues) then
Result := NavBar.StyleHint.Style.GradientMode
else Result := NavBar.DefaultStyles.Hint.GradientMode;
end;
function TdxNavBarViewInfo.HintFont: TFont;
begin
if (NavBar.StyleHint <> nil) and (savFont in NavBar.StyleHint.Style.AssignedValues) then
Result := NavBar.StyleHint.Style.Font
else Result := NavBar.DefaultStyles.Hint.Font;
end;
function TdxNavBarViewInfo.DragDropItemTargetBackColor: TColor;
begin
if (NavBar.StyleDropTargetLink <> nil) and (savBackColor in NavBar.StyleDropTargetLink.Style.AssignedValues) then
Result := NavBar.StyleDropTargetLink.Style.BackColor
else Result := NavBar.DefaultStyles.DropTargetLink.BackColor;
end;
function TdxNavBarViewInfo.DragDropGroupTargetBackColor: TColor;
begin
if (NavBar.StyleDropTargetGroup <> nil) and (savBackColor in NavBar.StyleDropTargetGroup.Style.AssignedValues) then
Result := NavBar.StyleDropTargetGroup.Style.BackColor
else Result := NavBar.DefaultStyles.DropTargetGroup.BackColor;
end;
function TdxNavBarViewInfo.DragDropGroupTargetBackColor2: TColor;
begin
if (NavBar.StyleDropTargetGroup <> nil) and (savBackColor2 in NavBar.StyleDropTargetGroup.Style.AssignedValues) then
Result := NavBar.StyleDropTargetGroup.Style.BackColor2
else Result := NavBar.DefaultStyles.DropTargetGroup.BackColor2;
end;
function TdxNavBarViewInfo.DragDropGroupTargetAlphaBlend: Byte;
begin
if (NavBar.StyleDropTargetGroup <> nil) and (savAlphaBlending in NavBar.StyleDropTargetGroup.Style.AssignedValues) then
Result := NavBar.StyleDropTargetGroup.Style.AlphaBlending
else Result := NavBar.DefaultStyles.DropTargetGroup.AlphaBlending;
end;
function TdxNavBarViewInfo.DragDropGroupTargetAlphaBlend2: Byte;
begin
if (NavBar.StyleDropTargetGroup <> nil) and (savAlphaBlending2 in NavBar.StyleDropTargetGroup.Style.AssignedValues) then
Result := NavBar.StyleDropTargetGroup.Style.AlphaBlending2
else Result := NavBar.DefaultStyles.DropTargetGroup.AlphaBlending2;
end;
function TdxNavBarViewInfo.DragDropGroupTargetGradient: TdxBarStyleGradientMode;
begin
if (NavBar.StyleDropTargetGroup <> nil) and (savGradientMode in NavBar.StyleDropTargetGroup.Style.AssignedValues) then
Result := NavBar.StyleDropTargetGroup.Style.GradientMode
else Result := NavBar.DefaultStyles.DropTargetGroup.GradientMode;
end;
function TdxNavBarViewInfo.HeaderImage: TPicture;
begin
if (NavBar.StyleNavigationPaneHeader <> nil) and (savImage in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result := NavBar.StyleNavigationPaneHeader.Style.Image
else Result := NavBar.DefaultStyles.NavigationPaneHeader.Image
end;
function TdxNavBarViewInfo.HeaderBackColor: TColor;
begin
if (NavBar.StyleNavigationPaneHeader <> nil) and (savBackColor in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result := NavBar.StyleNavigationPaneHeader.Style.BackColor
else Result := NavBar.DefaultStyles.NavigationPaneHeader.BackColor;
end;
function TdxNavBarViewInfo.HeaderBackColor2: TColor;
begin
if (NavBar.StyleNavigationPaneHeader <> nil) and (savBackColor2 in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result := NavBar.StyleNavigationPaneHeader.Style.BackColor2
else Result := NavBar.DefaultStyles.NavigationPaneHeader.BackColor2;
end;
function TdxNavBarViewInfo.HeaderAlphaBlend: Byte;
begin
if (NavBar.StyleNavigationPaneHeader <> nil) and (savAlphaBlending in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result := NavBar.StyleNavigationPaneHeader.Style.AlphaBlending
else Result := NavBar.DefaultStyles.NavigationPaneHeader.AlphaBlending;
end;
function TdxNavBarViewInfo.HeaderAlphaBlend2: Byte;
begin
if (NavBar.StyleNavigationPaneHeader <> nil) and (savAlphaBlending2 in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result := NavBar.StyleNavigationPaneHeader.Style.AlphaBlending2
else Result := NavBar.DefaultStyles.NavigationPaneHeader.AlphaBlending2;
end;
function TdxNavBarViewInfo.HeaderGradientMode: TdxBarStyleGradientMode;
begin
if (NavBar.StyleNavigationPaneHeader <> nil) and (savGradientMode in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result := NavBar.StyleNavigationPaneHeader.Style.GradientMode
else Result := NavBar.DefaultStyles.NavigationPaneHeader.GradientMode;
end;
function TdxNavBarViewInfo.HeaderFont: TFont;
begin
Result := FHeaderFont;
if (NavBar.StyleNavigationPaneHeader <> nil) and (savFont in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result.Assign(NavBar.StyleNavigationPaneHeader.Style.Font)
else
Result.Assign(NavBar.DefaultStyles.NavigationPaneHeader.Font);
end;
function TdxNavBarViewInfo.HeaderFontColor: TColor;
begin
Result := HeaderFont.Color;
end;
function TdxNavBarViewInfo.HeaderHAlignment: TdxBarStyleHAlignment;
begin
if (NavBar.StyleNavigationPaneHeader <> nil) and (savHAlignment in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result := NavBar.StyleNavigationPaneHeader.Style.HAlignment
else Result := NavBar.DefaultStyles.NavigationPaneHeader.HAlignment;
end;
function TdxNavBarViewInfo.HeaderVAlignment: TdxBarStyleVAlignment;
begin
if (NavBar.StyleNavigationPaneHeader <> nil) and (savVAlignment in NavBar.StyleNavigationPaneHeader.Style.AssignedValues) then
Result := NavBar.StyleNavigationPaneHeader.Style.VAlignment
else Result := NavBar.DefaultStyles.NavigationPaneHeader.VAlignment;
end;
function TdxNavBarViewInfo.HeaderDrawEdgeFlag: Integer;
const
dxHAlignment: array[TdxBarStyleHAlignment] of Integer = (DT_LEFT, DT_CENTER, DT_RIGHT);
dxVAlignment: array[TdxBarStyleVAlignment] of Integer = (DT_TOP, DT_VCENTER, DT_BOTTOM);
begin
Result := dxHAlignment[HeaderHAlignment] or dxVAlignment[HeaderVAlignment] or
DT_SINGLELINE or DT_END_ELLIPSIS;
end;
function TdxNavBarViewInfo.OverflowPanelImage: TPicture;
begin
Result := NavBar.DefaultStyles.GroupHeader.Image;
end;
function TdxNavBarViewInfo.OverflowPanelBackColor: TColor;
begin
Result := NavBar.DefaultStyles.GroupHeader.BackColor;
end;
function TdxNavBarViewInfo.OverflowPanelBackColor2: TColor;
begin
Result := NavBar.DefaultStyles.GroupHeader.BackColor2;
end;
function TdxNavBarViewInfo.OverflowPanelAlphaBlend: Byte;
begin
Result := NavBar.DefaultStyles.GroupHeader.AlphaBlending;
end;
function TdxNavBarViewInfo.OverflowPanelAlphaBlend2: Byte;
begin
Result := NavBar.DefaultStyles.GroupHeader.AlphaBlending2;
end;
function TdxNavBarViewInfo.OverflowPanelGradientMode: TdxBarStyleGradientMode;
begin
Result := NavBar.DefaultStyles.GroupHeader.GradientMode;
end;
function TdxNavBarViewInfo.OverflowPanelFont: TFont;
begin
Result := NavBar.DefaultStyles.GroupHeader.Font;
end;
function TdxNavBarViewInfo.OverflowPanelFontColor: TColor;
begin
Result := NavBar.DefaultStyles.GroupHeader.Font.Color;
end;
function TdxNavBarViewInfo.SplitterBackColor: TColor;
begin
Result := HeaderBackColor;
end;
function TdxNavBarViewInfo.SplitterBackColor2: TColor;
begin
Result := HeaderBackColor2;
end;
function TdxNavBarViewInfo.SplitterAlphaBlend: Byte;
begin
Result := HeaderAlphaBlend;
end;
function TdxNavBarViewInfo.SplitterAlphaBlend2: Byte;
begin
Result := HeaderAlphaBlend2;
end;
function TdxNavBarViewInfo.SplitterGradientMode: TdxBarStyleGradientMode;
begin
Result := HeaderGradientMode;
end;
procedure TdxNavBarViewInfo.AssignDefaultBackgroundStyle;
begin
NavBar.DefaultStyles.Background.ResetValues;
NavBar.DefaultStyles.Background.BackColor := clAppWorkSpace;
NavBar.DefaultStyles.Background.BackColor2 := clAppWorkSpace;
end;
procedure TdxNavBarViewInfo.AssignDefaultButtonStyle;
begin
NavBar.DefaultStyles.Button.ResetValues;
NavBar.DefaultStyles.Button.BackColor := clBtnFace;
NavBar.DefaultStyles.Button.BackColor2 := clBtnFace;
end;
procedure TdxNavBarViewInfo.AssignDefaultButtonPressedStyle;
begin
NavBar.DefaultStyles.ButtonPressed.Assign(NavBar.DefaultStyles.Button);
end;
procedure TdxNavBarViewInfo.AssignDefaultButtonHotTrackedStyle;
begin
NavBar.DefaultStyles.ButtonHotTracked.Assign(NavBar.DefaultStyles.Button);
end;
procedure TdxNavBarViewInfo.AssignDefaultGroupControlStyle;
begin
NavBar.DefaultStyles.GroupControl.ResetValues;
NavBar.DefaultStyles.GroupControl.BackColor := clNone;
NavBar.DefaultStyles.GroupControl.BackColor2 := clNone;
end;
procedure TdxNavBarViewInfo.AssignDefaultGroupBackgroundStyle;
begin
NavBar.DefaultStyles.GroupBackground.ResetValues;
NavBar.DefaultStyles.GroupBackground.BackColor := clAppWorkSpace;
NavBar.DefaultStyles.GroupBackground.BackColor2 := clAppWorkSpace;
end;
procedure TdxNavBarViewInfo.AssignDefaultGroupHeaderStyle;
begin
NavBar.DefaultStyles.GroupHeader.ResetValues;
NavBar.DefaultStyles.GroupHeader.BackColor := clBtnFace;
NavBar.DefaultStyles.GroupHeader.BackColor2 := clBtnFace;
NavBar.DefaultStyles.GroupHeader.Font.Color := clBtnText;
NavBar.DefaultStyles.GroupHeader.HAlignment := haCenter;
end;
procedure TdxNavBarViewInfo.AssignDefaultGroupHeaderActiveStyle;
begin
NavBar.DefaultStyles.GroupHeaderActive.Assign(NavBar.DefaultStyles.GroupHeader);
end;
procedure TdxNavBarViewInfo.AssignDefaultGroupHeaderActiveHotTrackedStyle;
begin
NavBar.DefaultStyles.GroupHeaderActiveHotTracked.Assign(NavBar.DefaultStyles.GroupHeaderActive);
end;
procedure TdxNavBarViewInfo.AssignDefaultGroupHeaderActivePressedStyle;
begin
NavBar.DefaultStyles.GroupHeaderActivePressed.Assign(NavBar.DefaultStyles.GroupHeaderActive);
end;
procedure TdxNavBarViewInfo.AssignDefaultGroupHeaderHotTrackedStyle;
begin
NavBar.DefaultStyles.GroupHeaderHotTracked.Assign(NavBar.DefaultStyles.GroupHeader);
end;
procedure TdxNavBarViewInfo.AssignDefaultGroupHeaderPressedStyle;
begin
NavBar.DefaultStyles.GroupHeaderPressed.Assign(NavBar.DefaultStyles.GroupHeader);
end;
procedure TdxNavBarViewInfo.AssignDefaultHintStyle;
begin
NavBar.DefaultStyles.Hint.ResetValues;
NavBar.DefaultStyles.Hint.BackColor := clInfoBk;
NavBar.DefaultStyles.Hint.BackColor2 := clInfoBk;
NavBar.DefaultStyles.Hint.Font.Color := clInfoText;
NavBar.DefaultStyles.Hint.HAlignment := haCenter;
end;
procedure TdxNavBarViewInfo.AssignDefaultItemStyle;
begin
NavBar.DefaultStyles.Item.ResetValues;
NavBar.DefaultStyles.Item.Font.Color := clBtnHighlight;
NavBar.DefaultStyles.Item.HAlignment := haCenter;
end;
procedure TdxNavBarViewInfo.AssignDefaultItemDisabledStyle;
begin
NavBar.DefaultStyles.ItemDisabled.Assign(NavBar.DefaultStyles.Item);
NavBar.DefaultStyles.ItemDisabled.Font.Color := clBtnText;
end;
procedure TdxNavBarViewInfo.AssignDefaultItemHotTrackedStyle;
begin
NavBar.DefaultStyles.ItemHotTracked.Assign(NavBar.DefaultStyles.Item);
end;
procedure TdxNavBarViewInfo.AssignDefaultItemPressedStyle;
begin
NavBar.DefaultStyles.ItemPressed.Assign(NavBar.DefaultStyles.Item);
end;
procedure TdxNavBarViewInfo.AssignDefaultDropTargetGroupStyle;
begin
NavBar.DefaultStyles.DropTargetGroup.ResetValues;
NavBar.DefaultStyles.DropTargetGroup.BackColor := clHighlight;
NavBar.DefaultStyles.DropTargetGroup.BackColor2 := clHighlight;
NavBar.DefaultStyles.DropTargetGroup.AlphaBlending := 60;
NavBar.DefaultStyles.DropTargetGroup.AlphaBlending2 := 60;
end;
procedure TdxNavBarViewInfo.AssignDefaultDropTargetLinkStyle;
begin
NavBar.DefaultStyles.DropTargetLink.ResetValues;
NavBar.DefaultStyles.DropTargetLink.BackColor := clBlack;
end;
procedure TdxNavBarViewInfo.AssignDefaultNavigationPaneHeaderStyle;
begin
NavBar.DefaultStyles.NavigationPaneHeader.ResetValues;
end;
function TdxNavBarViewInfo.GetLargeImageHeight: Integer;
begin
if (NavBar.LargeImages <> nil) then
Result := NavBar.LargeImages.Height
else Result := dxNavBarDefaultLargeImageHeight;
end;
function TdxNavBarViewInfo.GetLargeImageWidth: Integer;
begin
if (NavBar.LargeImages <> nil) then
Result := NavBar.LargeImages.Width
else Result := dxNavBarDefaultLargeImageWidth;
end;
function TdxNavBarViewInfo.GetSmallImageHeight: Integer;
begin
if (NavBar.SmallImages <> nil) then
Result := NavBar.SmallImages.Height
else Result := dxNavBarDefaultSmallImageHeight;
end;
function TdxNavBarViewInfo.GetSmallImageWidth: Integer;
begin
if (NavBar.SmallImages <> nil) then
Result := NavBar.SmallImages.Width
else Result := dxNavBarDefaultSmallImageWidth;
end;
procedure TdxNavBarViewInfo.CreateColors;
begin
end;
procedure TdxNavBarViewInfo.RefreshColors;
begin
end;
procedure TdxNavBarViewInfo.ReleaseColors;
begin
end;
function TdxNavBarViewInfo.ClientHeight: Integer;
begin
Result := NavBar.ClientHeight;
end;
function TdxNavBarViewInfo.ClientWidth: Integer;
begin
Result := NavBar.ClientWidth;
end;
function TdxNavBarViewInfo.GetSpaceBetweenGroups: Integer;
begin
if NavBar.SpaceBetweenGroups > 0 then
Result := NavBar.SpaceBetweenGroups
else Result := GetGroupSeparatorWidth;
end;
class function TdxNavBarViewInfo.GetGroupBorderWidth: Integer;
begin
Result := 0;
end;
class function TdxNavBarViewInfo.GetGroupCaptionHeightAddon: Integer;
begin
Result := 6;
end;
class function TdxNavBarViewInfo.GetGroupCaptionTextIndent: Integer;
begin
Result := 4;
end;
class function TdxNavBarViewInfo.GetGroupCaptionImageIndent: Integer;
begin
Result := 0;
end;
class function TdxNavBarViewInfo.GetGroupSeparatorWidth: Integer;
begin
Result := 0;
end;
class function TdxNavBarViewInfo.GetGroupCaptionSignSize: Integer;
begin
Result := 16;
end;
class function TdxNavBarViewInfo.GetGroupHorizontalEdge: Integer;
begin
Result := 0;
end;
class function TdxNavBarViewInfo.GetGroupCaptionSeparatorWidth: Integer;
begin
Result := 8;
end;
class function TdxNavBarViewInfo.GetLinksLargeSeparatorWidth: Integer;
begin
Result := 6;
end;
class function TdxNavBarViewInfo.GetLinksSmallSeparatorWidth: Integer;
begin
Result := 6;
end;
class function TdxNavBarViewInfo.GetLinksIconViewSeparatorWidth: Integer;
begin
Result := 4;
end;
class function TdxNavBarViewInfo.GetLinksImageVerticalEdge: Integer;
begin
Result := 4;
end;
class function TdxNavBarViewInfo.GetLinksImageHorizontalEdge: Integer;
begin
Result := 4;
end;
class function TdxNavBarViewInfo.GetDragArrowHeight: Integer;
begin
Result := 8;
end;
class function TdxNavBarViewInfo.GetDragArrowWidth: Integer;
begin
Result := 6;
end;
class function TdxNavBarViewInfo.GetHeaderHeightAddon: Integer;
begin
Result := 8;
end;
class function TdxNavBarViewInfo.GetScrollButtonVerticalEdge: Integer;
begin
Result := 6;
end;
class function TdxNavBarViewInfo.GetScrollButtonHorizontalEdge: Integer;
begin
Result := 6;
end;
class function TdxNavBarViewInfo.GetScrollButtonVerticalSize: Integer;
begin
Result := 16;
end;
class function TdxNavBarViewInfo.GetScrollButtonHorizontalSize: Integer;
begin
Result := 16;
end;
function TdxNavBarViewInfo.CanHasActiveGroup: Boolean;
begin
Result := True;
end;
function TdxNavBarViewInfo.CanHasSpecialGroup: Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.CanHasScrollButtonInGroupCaption: Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.CanHasImageInGroupCaption: Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.CanHasSignInGroupCaption: Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.CanHasGroupViewAsIconView: Boolean;
begin
Result := True;
end;
function TdxNavBarViewInfo.CanHasGroupWithNoCaption: Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.CanHasVisibleItemsInGroup(AGroup: TdxNavBarGroup): Boolean;
begin
Result := AGroup = NavBar.ActiveGroup;
end;
function TdxNavBarViewInfo.CanGroupCaptionBoundsByImage: Boolean;
begin
Result := False;
end;
function TdxNavBarViewInfo.CanGroupsUseLargeImages: Boolean;
begin
Result := True;
end;
function TdxNavBarViewInfo.CanLinksUseLargeImages: Boolean;
begin
Result := True;
end;
function TdxNavBarViewInfo.CanSelectLinkByRect: Boolean;
begin
Result := False;
end;
procedure TdxNavBarViewInfo.RecalculateHint;
begin
FHintText := '';
SetRectEmpty(FHintRect);
FHintText := GetHintText;
FHintRect := GetHintRect;
end;
function TdxNavBarViewInfo.GetHintRect: TRect;
var
AGroup: TdxNavBarGroup;
ALink: TdxNavBarItemLink;
begin
SetRectEmpty(Result);
AGroup := GetGroupAtCaptionPos(NavBar.TargetPoint);
if AGroup <> nil then
Result := GetGroupHintRect(AGroup)
else
begin
ALink := GetLinkAtSelectedPos(NavBar.TargetPoint);
if ALink <> nil then
Result := GetLinkHintRect(ALink);
end;
end;
function TdxNavBarViewInfo.GetHintText: string;
var
AGroup: TdxNavBarGroup;
ALink: TdxNavBarItemLink;
begin
Result := '';
AGroup := GetGroupAtCaptionPos(NavBar.TargetPoint);
if AGroup <> nil then
Result := GetGroupHintText(AGroup)
else
begin
ALink := GetLinkAtSelectedPos(NavBar.TargetPoint);
if ALink <> nil then
Result := GetLinkHintText(ALink);
end;
end;
function TdxNavBarViewInfo.GetGroupHintRect(AGroup: TdxNavBarGroup): TRect;
var
pt: TPoint;
begin
Painter.HintWindowCanvas.Font := HintFont;
Result := Rect(0, 0, ClientWidth, 0);
cxDrawText(Painter.HintWindowDC, HintText, Result, DT_CALCRECT or DT_LEFT or
DT_WORDBREAK or DT_NOPREFIX);
Inc(Result.Right, dxNavBarHintWindowSizeCorrection);
Inc(Result.Bottom, dxNavBarHintWindowSizeCorrection);
if Assigned(NavBar.OnCalcGroupHintRect) then
NavBar.OnCalcGroupHintRect(NavBar, AGroup, Self, Result);
pt := NavBar.ClientToScreen(NavBar.TargetPoint);
OffsetRect(Result, pt.X + 20, pt.Y);
end;
function TdxNavBarViewInfo.GetLinkHintRect(ALink: TdxNavBarItemLink): TRect;
var
pt: TPoint;
begin
Painter.HintWindowCanvas.Font := HintFont;
Result := Rect(0, 0, ClientWidth, 0);
cxDrawText(Painter.HintWindowDC, HintText, Result, DT_CALCRECT or DT_LEFT or
DT_WORDBREAK or DT_NOPREFIX);
Inc(Result.Right, dxNavBarHintWindowSizeCorrection);
Inc(Result.Bottom, dxNavBarHintWindowSizeCorrection);
if Assigned(NavBar.OnCalcLinkHintRect) then
NavBar.OnCalcLinkHintRect(NavBar, ALink, Self, Result);
pt := NavBar.ClientToScreen(NavBar.TargetPoint);
OffsetRect(Result, pt.X + 20, pt.Y);
end;
function TdxNavBarViewInfo.GetGroupHintText(AGroup: TdxNavBarGroup): string;
begin
Result := AGroup.Hint;
if Assigned(NavBar.OnGetGroupHint) then
NavBar.OnGetGroupHint(NavBar, AGroup, Result);
Result := GetShortHint(Result);
end;
function TdxNavBarViewInfo.GetLinkHintText(ALink: TdxNavBarItemLink): string;
begin
Result := ALink.Item.Hint;
if Assigned(NavBar.OnGetLinkHint) then
NavBar.OnGetLinkHint(NavBar, ALink, Result);
Result := GetShortHint(Result);
end;
function TdxNavBarViewInfo.HintDelay: Integer;
begin
Result := dxNavBarHintShowingInterval;
end;
procedure TdxNavBarViewInfo.DoGroupActiveToggle(AGroup: TdxNavBarGroup);
begin
if IsGroupActive(AGroup) then
DoGroupDeactivate(AGroup)
else DoGroupActivate(AGroup);
end;
procedure TdxNavBarViewInfo.DoGroupActivate(AGroup: TdxNavBarGroup);
begin
end;
procedure TdxNavBarViewInfo.DoGroupDeactivate(AGroup: TdxNavBarGroup);
begin
end;
procedure TdxNavBarViewInfo.DoShowPopupMenu(X, Y: Integer);
begin
end;
function TdxNavBarViewInfo.IsGroupActive(AGroup: TdxNavBarGroup): Boolean;
begin
Result := False;
end;
procedure TdxNavBarViewInfo.MakeLinkVisible(ALink: TdxNavBarItemLink);
begin
end;
procedure TdxNavBarViewInfo.MakeGroupVisible(AGroup: TdxNavBarGroup);
begin
end;
procedure TdxNavBarViewInfo.AdjustControlsBounds;
var
I: Integer;
AGroup: TdxNavBarGroup;
AViewInfo: TdxNavBarGroupViewInfo;
R: TRect;
begin
for I := 0 to NavBar.Groups.Count - 1 do
begin
AGroup := NavBar.Groups[I];
AViewInfo := GetGroupViewInfoByGroup(AGroup);
if AViewInfo <> nil then
AViewInfo.AdjustControlBounds
else if AGroup.Control <> nil then
begin
R := NavBar.BoundsRect;
OffsetRect(R, -R.Left, -R.Top);
AGroup.Control.AdjustControl(R, False);
end;
end;
end;
function TdxNavBarViewInfo.GetBoundsUpdateType: TdxNavBarChangeType;
begin
Result := doRecalc;
end;
procedure TdxNavBarViewInfo.CreateInfo;
var
I: Integer;
begin
ClearGroups;
if NavBar.ShowGroupCaptions then
begin
for I := 0 to NavBar.Groups.Count - 1 do
if NavBar.Groups[I].Visible then
AddGroup(Self, NavBar.Groups[I], True, True);
end
else if NavBar.ActiveGroup <> nil then
AddGroup(Self, NavBar.ActiveGroup, True, True);
end;
procedure TdxNavBarViewInfo.CalculateBounds;
var
I, Y: Integer;
begin
ClearRects;
Y := GetSpaceBetweenGroups;
for I := 0 to GroupCount - 1 do
begin
Groups[I].CalculateBounds(GetGroupHorizontalEdge, Y);
Y := Groups[I].Rect.Bottom + GetSpaceBetweenGroups;
end;
end;
procedure TdxNavBarViewInfo.CalculateScrollButtonsBounds;
begin
if ActiveGroupViewInfo = nil then exit;
FTopScrollButtonRect := GetTopScrollButtonRect;
FBottomScrollButtonRect := GetBottomScrollButtonRect;
end;
procedure TdxNavBarViewInfo.ClearRects;
begin
SetRectEmpty(FTopScrollButtonRect);
SetRectEmpty(FBottomScrollButtonRect);
SetRectEmpty(FHintRect);
end;
function TdxNavBarViewInfo.GetTopScrollButtonRect: TRect;
begin
SetRectEmpty(Result);
if not (sDisabled in TopScrollButtonState) then
begin
Result := ActiveGroupViewInfo.ItemsRect;
Result.Left := Result.Right - GetScrollButtonHorizontalSize;
Result.Bottom := Result.Top + GetScrollButtonVerticalSize;
OffSetRect(Result, - GetScrollButtonHorizontalEdge, GetScrollButtonVerticalEdge);
end;
end;
function TdxNavBarViewInfo.GetBottomScrollButtonRect: TRect;
begin
SetRectEmpty(Result);
if not (sDisabled in BottomScrollButtonState) then
begin
Result := ActiveGroupViewInfo.ItemsRect;
Result.Left := Result.Right - GetScrollButtonHorizontalSize;
Result.Bottom := Result.Top + GetScrollButtonVerticalSize;
OffSetRect(Result, - GetScrollButtonHorizontalEdge, - GetScrollButtonVerticalEdge);
OffSetRect(Result, 0, ActiveGroupViewInfo.ItemsRect.Bottom -
ActiveGroupViewInfo.ItemsRect.Top - GetScrollButtonVerticalSize);
end;
end;
function TdxNavBarViewInfo.GetGroupCount: Integer;
begin
Result := FGroups.Count;
end;
function TdxNavBarViewInfo.GetGroup(Index: Integer): TdxNavBarGroupViewInfo;
begin
Result := TdxNavBarGroupViewInfo(FGroups.Items[Index]);
end;
procedure TdxNavBarViewInfo.AddGroup(AViewInfo: TdxNavBarViewInfo; AGroup: TdxNavBarGroup; ACaptionVisible, AItemsVisible: Boolean);
begin
FGroups.Add(Painter.CreateGroupViewInfo(AViewInfo, AGroup, ACaptionVisible, AItemsVisible));
end;
procedure TdxNavBarViewInfo.RemoveGroup(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
FGroups.Remove(AGroupViewInfo);
end;
procedure TdxNavBarViewInfo.ClearGroups;
var
I: Integer;
begin
for I := 0 to GroupCount - 1 do Groups[I].Free;
FGroups.Clear;
end;
function TdxNavBarViewInfo.GetBottomScrollButtonState: TdxNavBarObjectStates;
begin
Result := [];
if NavBar.ScrollButtonDownIsDown then
Result := Result + [sPressed];
if not ((ActiveGroupViewInfo <> nil) and (ActiveGroupViewInfo.ItemCount > 0) and
(ActiveGroupViewInfo.Items[ActiveGroupViewInfo.ItemCount - 1].Rect.Bottom >
ActiveGroupViewInfo.Rect.Bottom) and
(ActiveGroupViewInfo.Group.TopVisibleLinkIndex < ActiveGroupViewInfo.ItemCount - 1)) then
Result := Result + [sDisabled];
if IsPtBottomScrollButton(NavBar.TargetPoint) then
Result := Result + [sHotTracked];
end;
function TdxNavBarViewInfo.GetTopScrollButtonState: TdxNavBarObjectStates;
begin
Result := [];
if NavBar.ScrollButtonUpIsDown then
Result := Result + [sPressed];
if not ((ActiveGroupViewInfo <> nil) and (ActiveGroupViewInfo.ItemCount > 0) and
(ActiveGroupViewInfo.Group.TopVisibleLinkIndex > 0)) then
Result := Result + [sDisabled];
if IsPtTopScrollButton(NavBar.TargetPoint) then
Result := Result + [sHotTracked];
end;
{ TdxBaseImagePainter }
class procedure TdxBaseImagePainter.DrawImage(ACanvas: TCanvas;
AImageList: TCustomImageList; AImageIndex: Integer; ARect: TRect; AEnabled: Boolean);
begin
InternalDrawImage(ACanvas, AImageList, AImageIndex, ARect, AEnabled);
end;
class function TdxBaseImagePainter.IsValidImage(AImageList: TCustomImageList;AImageIndex: Integer): Boolean;
begin
Result := (AImageList <> nil) and (0 <= AImageIndex) and (AImageIndex < AImageList.Count);
end;
class procedure TdxBaseImagePainter.InternalDrawImage(ACanvas: TCanvas;
AImageList: TCustomImageList; AImageIndex: Integer; ARect: TRect; AEnabled: Boolean);
begin
end;
{ TdxBaseSelectionPainter }
class procedure TdxBaseSelectionPainter.DrawSelection(ACanvas: TCanvas;
ARect: TRect; ABackColor: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawSelection(ACanvas, ARect, ABackColor, AState);
end;
class procedure TdxBaseSelectionPainter.InternalDrawSelection(
ACanvas: TCanvas; ARect: TRect; ABackColor: TColor;
AState: TdxNavBarObjectStates);
begin
end;
{ TdxBaseBackgroundPainter }
class procedure TdxBaseBackgroundPainter.DrawBackground(ACanvas: TCanvas; ARect: TRect;
APicture: TPicture; AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
begin
InternalDrawBackground(ACanvas, ARect, APicture, AEraseBackground, ABackgroundColor,
AColor1, AColor2, AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
class procedure TdxBaseBackgroundPainter.InternalDrawBackground(ACanvas: TCanvas; ARect: TRect;
APicture: TPicture; AEraseBackground: Boolean; ABackgroundColor: TColor;
AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
begin
end;
{ TdxBaseGroupBackgroundPainter }
class procedure TdxBaseGroupBackgroundPainter.InternalDrawBackground(ACanvas: TCanvas; ARect:
TRect; APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
begin
end;
class procedure TdxBaseGroupBackgroundPainter.DrawBackground(ACanvas: TCanvas;
ARect: TRect; APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
begin
InternalDrawBackground(ACanvas, ARect, APicture, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
{ TdxBaseGroupBorderPainter }
class procedure TdxBaseGroupBorderPainter.InternalDrawBorder(ACanvas: TCanvas;
ARect: TRect; AColor: TColor; AWithCaption: Boolean);
begin
end;
class procedure TdxBaseGroupBorderPainter.DrawBorder(ACanvas: TCanvas;
ARect: TRect; AColor: TColor; AWithCaption: Boolean);
begin
InternalDrawBorder(ACanvas, ARect, AColor, AWithCaption);
end;
{ TdxBaseSignPainter }
class procedure TdxBaseSignPainter.DrawSign(ACanvas: TCanvas; ARect: TRect;
AForeColor, ABackColor1, ABackColor2: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawSign(ACanvas, ARect, AForeColor, ABackColor1, ABackColor2, AState);
end;
class procedure TdxBaseSignPainter.InternalDrawSign(ACanvas: TCanvas; ARect: TRect;
AForeColor, ABackColor1, ABackColor2: TColor; AState: TdxNavBarObjectStates);
begin
end;
{ TdxBaseHintPainter }
class procedure TdxBaseHintPainter.DrawHint(ACanvas: TCanvas; ARect: TRect;
AHint: string; APicture: TPicture; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
AFont: TFont);
begin
InternalDrawHint(ACanvas, ARect, AHint, APicture, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode, AFont);
end;
class procedure TdxBaseHintPainter.InternalDrawHint(ACanvas: TCanvas;
ARect: TRect; AHint: string; APicture: TPicture; AColor1,
AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode; AFont: TFont);
begin
end;
{ TdxBaseButtonPainter }
class procedure TdxBaseButtonPainter.DrawButton(ACanvas: TCanvas;
ARect: TRect; APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1,
AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawButton(ACanvas, ARect, APicture, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode, ABorderColor, AState);
end;
class procedure TdxBaseButtonPainter.InternalDrawButton(ACanvas: TCanvas;
ARect: TRect; APicture: TPicture; AColor1, AColor2: TColor; AAlphaBlend1,
AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
end;
{ TdxBaseScrollButtonsPainter }
class procedure TdxBaseScrollButtonsPainter.DrawBottomButton(
ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxBaseButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawBottomButton(ACanvas, ARect, AButtonPainterClass, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode, ABorderColor, AState);
end;
class procedure TdxBaseScrollButtonsPainter.DrawTopButton(ACanvas: TCanvas;
ARect: TRect; AButtonPainterClass: TdxBaseButtonPainterClass; AColor1,
AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
InternalDrawTopButton(ACanvas, ARect, AButtonPainterClass, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode, ABorderColor, AState);
end;
class procedure TdxBaseScrollButtonsPainter.InternalDrawBottomButton(
ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxBaseButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
end;
class procedure TdxBaseScrollButtonsPainter.InternalDrawTopButton(
ACanvas: TCanvas; ARect: TRect;
AButtonPainterClass: TdxBaseButtonPainterClass; AColor1, AColor2: TColor;
AAlphaBlend1, AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode;
ABorderColor: TColor; AState: TdxNavBarObjectStates);
begin
end;
{ TdxBaseDropTargetLinkPainter }
class procedure TdxBaseDropTargetLinkPainter.DrawTargetLink(
ACanvas: TCanvas; pt1, pt2, pt3, pt4, pt5, pt6: TPoint; AColor: TColor);
begin
InternalDrawTargetLink(ACanvas, pt1, pt2, pt3, pt4, pt5, pt6, AColor);
end;
class procedure TdxBaseDropTargetLinkPainter.InternalDrawTargetLink(
ACanvas: TCanvas; pt1, pt2, pt3, pt4, pt5, pt6: TPoint; AColor: TColor);
begin
end;
{ TdxBaseDropTargetGroupPainter }
class procedure TdxBaseDropTargetGroupPainter.DrawTargetGroup(ACanvas: TCanvas;
ARect: TRect; AColor1, AColor2: TColor; AAlphaBlend1, AAlphaBlend2: Byte;
AGradientMode: TdxBarStyleGradientMode);
begin
InternalDrawTargetGroup(ACanvas, ARect, AColor1, AColor2,
AAlphaBlend1, AAlphaBlend2, AGradientMode);
end;
class procedure TdxBaseDropTargetGroupPainter.InternalDrawTargetGroup(
ACanvas: TCanvas; ARect: TRect; AColor1, AColor2: TColor; AAlphaBlend1,
AAlphaBlend2: Byte; AGradientMode: TdxBarStyleGradientMode);
begin
end;
{ TdxNavBarPainter }
constructor TdxNavBarPainter.Create(ANavBar: TdxCustomNavBar);
begin
inherited Create;
FNavBar := ANavBar;
FViewInfo := CreateViewInfo;
FNeedRecreateViewInfo := True;
FNeedRecalculateViewInfo := True;
FNeedRedrawCanvas := True;
end;
destructor TdxNavBarPainter.Destroy;
begin
FViewInfo.Free;
inherited;
end;
function TdxNavBarPainter.Canvas: TCanvas;
begin
Result := NavBar.CanvasBitmap.Canvas;
end;
function TdxNavBarPainter.DC: HDC;
begin
Result := Canvas.Handle;
end;
function TdxNavBarPainter.HintWindowCanvas: TCanvas;
begin
Result := NavBar.HintWindow.Canvas;
end;
function TdxNavBarPainter.HintWindowDC: HDC;
begin
Result := HintWindowCanvas.Handle;
end;
procedure TdxNavBarPainter.InvalidateViewInfo(AType: TdxNavBarChangeType);
begin
if AType = doRecreate then
begin
FNeedRecreateViewInfo := True;
FNeedRecalculateViewInfo := True;
end
else if AType = doRecalc then
FNeedRecalculateViewInfo := True;
FNeedRedrawCanvas := True;
end;
procedure TdxNavBarPainter.Paint;
{var
I: Integer;}
begin
CheckDrawParamChanges;
{ for I := 0 to ViewInfo.GroupCount - 1 do
if (ViewInfo.Groups[I].Control <> nil) and ViewInfo.Groups[I].Control.Visible and
(ViewInfo.Groups[I].ControlRect.Bottom > ViewInfo.Groups[I].ControlRect.Top) then
with ViewInfo.Groups[I].ControlRect do
ExcludeClipRect(NavBar.Canvas.Handle, Left, Top, Right, Bottom);}
BitBlt(NavBar.Canvas.Handle, 0, 0, ViewInfo.ClientWidth, ViewInfo.ClientHeight, DC, 0, 0, SRCCOPY);
SelectClipRgn(DC, 0);
end;
procedure TdxNavBarPainter.InvalidateScrollButtons;
begin
if ViewInfo.IsTopScrollButtonVisible then
Windows.InvalidateRect(NavBar.Handle, @ViewInfo.TopScrollButtonRect, True);
if ViewInfo.IsBottomScrollButtonVisible then
Windows.InvalidateRect(NavBar.Handle, @ViewInfo.BottomScrollButtonRect, True);
end;
function TdxNavBarPainter.CreateViewInfo: TdxNavBarViewInfo;
begin
Result := TdxNavBarViewInfo.Create(Self);
end;
function TdxNavBarPainter.CreateGroupViewInfo(AViewInfo: TdxNavBarViewInfo; AGroup: TdxNavBarGroup;
ACaptionVisible, AItemsVisible: Boolean): TdxNavBarGroupViewInfo;
begin
Result := TdxNavBarGroupViewInfo.Create(AViewInfo, AGroup, ACaptionVisible, AItemsVisible);
end;
function TdxNavBarPainter.CreateLinkViewInfo(AViewInfo: TdxNavBarGroupViewInfo; ALink: TdxNavBarItemLink;
ACaptionVisible, AImageVisisble: Boolean): TdxNavBarLinkViewInfo;
begin
Result := TdxNavBarLinkViewInfo.Create(AViewInfo, ALink, ACaptionVisible, AImageVisisble);
end;
function TdxNavBarPainter.GetMasterLookAndFeel: TcxLookAndFeel;
begin
Result := nil;
end;
procedure TdxNavBarPainter.CheckDrawParamChanges;
begin
if NavBar.UpdateLock = 0 then
begin
if NavBar.CanvasBitmap.Width = 0 then
NavBar.CanvasBitmap.Width := NavBar.ClientWidth;
if NavBar.CanvasBitmap.Height = 0 then
NavBar.CanvasBitmap.Height := NavBar.ClientHeight;
if FNeedRecreateViewInfo then ViewInfo.CreateInfo;
if FNeedRecalculateViewInfo then ViewInfo.CalculateBounds;
if FNeedRedrawCanvas then DrawNavBarControl;
end;
FNeedRecreateViewInfo := False;
FNeedRecalculateViewInfo := False;
FNeedRedrawCanvas := False;
end;
function TdxNavBarPainter.GetOwner: TPersistent;
begin
Result := FNavBar;
end;
function TdxNavBarPainter.IsViewInfoValid: Boolean;
begin
Result := not FNeedRecalculateViewInfo;
end;
class function TdxNavBarPainter.BackgroundPainterClass: TdxBaseBackgroundPainterClass;
begin
Result := TdxBaseBackgroundPainter;
end;
class function TdxNavBarPainter.GroupBackgroundPainterClass: TdxBaseGroupBackgroundPainterClass;
begin
Result := TdxBaseGroupBackgroundPainter;
end;
class function TdxNavBarPainter.GroupBorderPainterClass: TdxBaseGroupBorderPainterClass;
begin
Result := TdxBaseGroupBorderPainter;
end;
class function TdxNavBarPainter.ButtonPainterClass: TdxBaseButtonPainterClass;
begin
Result := TdxBaseButtonPainter;
end;
class function TdxNavBarPainter.DropTargetGroupPainterClass: TdxBaseDropTargetGroupPainterClass;
begin
Result := TdxBaseDropTargetGroupPainter;
end;
class function TdxNavBarPainter.DropTargetLinkPainterClass: TdxBaseDropTargetLinkPainterClass;
begin
Result := TdxBaseDropTargetLinkPainter;
end;
class function TdxNavBarPainter.ScrollButtonsPainterClass: TdxBaseScrollButtonsPainterClass;
begin
Result := TdxBaseScrollButtonsPainter;
end;
class function TdxNavBarPainter.ImagePainterClass: TdxBaseImagePainterClass;
begin
Result := TdxBaseImagePainter;
end;
class function TdxNavBarPainter.SelectionPainterClass: TdxBaseSelectionPainterClass;
begin
Result := TdxBaseSelectionPainter;
end;
class function TdxNavBarPainter.SignPainterClass: TdxBaseSignPainterClass;
begin
Result := TdxBaseSignPainter;
end;
procedure TdxNavBarPainter.DrawNavBarControl;
var
I: Integer;
AHandled: Boolean;
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawBackground) then
NavBar.OnCustomDrawBackground(NavBar, Canvas, ViewInfo, AHandled);
if not AHandled then DrawBackground;
for I := 0 to ViewInfo.GroupCount - 1 do
if RectVisible(Canvas.Handle, ViewInfo.Groups[I].Rect) then
DrawGroup(ViewInfo.Groups[I]);
DrawScrollButtons;
DrawDropTargetGroupSelection;
DrawDropTargetLinkSelection;
end;
procedure TdxNavBarPainter.DrawBackground;
begin
with ViewInfo do
BackgroundPainterClass.DrawBackground(Canvas, NavBar.ClientRect, BgImage, True, NavBar.Color,
BgBackColor, BgBackColor2, BgAlphaBlend, BgAlphaBlend2,
BgGradientMode);
end;
procedure TdxNavBarPainter.DrawDropTargetGroupSelection;
var
AGroupViewInfo: TdxNavBarGroupViewInfo;
begin
if not NavBar.EnableDragging or (NavBar.SourceGroup = nil) or
not (fAllowDropGroup in NavBar.DragDropFlags) then exit;
AGroupViewInfo := ViewInfo.GetGroupViewInfoAtCaptionPos(NavBar.TargetPoint);
if AGroupViewInfo = nil then
AGroupViewInfo := ViewInfo.GetGroupViewInfoAtItemsPos(NavBar.TargetPoint);
if (AGroupViewInfo <> nil) and (AGroupViewInfo.Group <> NavBar.SourceGroup) then
with ViewInfo do
DropTargetGroupPainterClass.DrawTargetGroup(Canvas, AGroupViewInfo.CaptionRect,
DragDropGroupTargetBackColor, DragDropGroupTargetBackColor2,
DragDropGroupTargetAlphaBlend, DragDropGroupTargetAlphaBlend2,
DragDropGroupTargetGradient);
end;
procedure TdxNavBarPainter.DrawDropTargetLinkSelection;
var
lpt1, lpt2, lapt1, lapt2, lapt3, rapt1, rapt2, rapt3: TPoint;
Item1, Item2: TdxNavBarLinkViewInfo;
ItemGroup: TdxNavBarGroupViewInfo;
begin
if not NavBar.EnableDragging or ((NavBar.SourceLink = nil) and (NavBar.SourceItem = nil)) or
not (fAllowDropLink in NavBar.DragDropFlags) then exit;
ViewInfo.GetViewInfoAtDragPosition(NavBar.TargetPoint, ItemGroup, Item1, Item2);
if (Item1 <> nil) and (NavBar.SourceItem = nil) and (Item1.Link = NavBar.SourceLink) then exit;
if (Item2 <> nil) and (NavBar.SourceItem = nil) and (Item2.Link = NavBar.SourceLink) then exit;
if (Item1 <> nil) or (Item2 <> nil) then
begin
if Item1 <> nil then
begin
if not ItemGroup.IsViewAsIconView then
begin
lpt1.x := Item1.Rect.Left;
lpt1.y := Item1.Rect.Bottom;
end
else
begin
lpt1.x := Item1.Rect.Right;
lpt1.y := Item1.Rect.Top;
end;
lpt2 := Item1.Rect.BottomRight;
end
else
begin
lpt1 := Item2.Rect.TopLeft;
if not ItemGroup.IsViewAsIconView then
begin
lpt2.x := Item2.Rect.Right;
lpt2.y := Item2.Rect.Top;
end
else
begin
lpt2.x := Item2.Rect.Left;
lpt2.y := Item2.Rect.Bottom;
end;
end;
if PtInRect(ItemGroup.ItemsRect, lpt1) and PtInRect(ItemGroup.ItemsRect, lpt2) then
begin
if not ItemGroup.IsViewAsIconView then
begin
lapt1.x := lpt1.x + ViewInfo.GetDragArrowWidth;
lapt1.y := lpt1.y;
lapt2.x := lpt1.x;
if Item1 <> nil then
lapt2.y := lpt1.y - ViewInfo.GetDragArrowHeight div 2
else lapt2.y := lpt1.y;
lapt3.x := lpt1.x;
if Item2 <> nil then
lapt3.y := lpt1.y + ViewInfo.GetDragArrowHeight div 2
else lapt3.y := lpt1.y;
rapt1.x := lapt1.x + (ItemGroup.Rect.Right - ItemGroup.Rect.Left) - 1 - 2 * ViewInfo.GetDragArrowWidth;
rapt1.y := lapt1.y;
rapt2.x := lapt2.x + (ItemGroup.Rect.Right - ItemGroup.Rect.Left) - 1;
rapt2.y := lapt2.y;
rapt3.x := lapt3.x + (ItemGroup.Rect.Right - ItemGroup.Rect.Left) - 1;
rapt3.y := lapt3.y;
DropTargetLinkPainterClass.DrawTargetLink(Canvas, lapt1, lapt2, lapt3, rapt1, rapt2, rapt3,
ViewInfo.DragDropItemTargetBackColor);
end
else DropTargetLinkPainterClass.DrawTargetLink(Canvas, lpt1, lpt1, lpt1, lpt2, lpt2, lpt2,
ViewInfo.DragDropItemTargetBackColor);
end;
end;
end;
procedure TdxNavBarPainter.DrawHintWindow;
begin
if NavBar.HotTrackedGroup <> nil then
DrawGroupHintWindow
else if NavBar.HotTrackedLink <> nil then
DrawLinkHintWindow;
end;
procedure TdxNavBarPainter.DrawGroupHintWindow;
var
AHandled: Boolean;
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawGroupHint) then
NavBar.OnCustomDrawGroupHint(NavBar, HintWindowCanvas, NavBar.HotTrackedGroup,
ViewInfo.HintText, NavBar.HintWindow.ClientRect, AHandled);
if not AHandled then
with ViewInfo do
TdxNavBarHintPainter.DrawHint(HintWindowCanvas, NavBar.HintWindow.ClientRect,
ViewInfo.HintText, HintImage, HintBackColor, HintBackColor2,
HintAlphaBlend, HintAlphaBlend2, HintGradientMode, HintFont);
end;
procedure TdxNavBarPainter.DrawLinkHintWindow;
var
AHandled: Boolean;
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawLinkHint) then
NavBar.OnCustomDrawLinkHint(NavBar, HintWindowCanvas, NavBar.HotTrackedLink,
ViewInfo.HintText, NavBar.HintWindow.ClientRect, AHandled);
if not AHandled then
with ViewInfo do
TdxNavBarHintPainter.DrawHint(HintWindowCanvas, NavBar.HintWindow.ClientRect,
ViewInfo.HintText, HintImage, HintBackColor, HintBackColor2,
HintAlphaBlend, HintAlphaBlend2, HintGradientMode, HintFont);
end;
procedure TdxNavBarPainter.DrawGroup(AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AHandled: Boolean;
begin
DrawItemsRect(AGroupViewInfo);
if AGroupViewInfo.IsCaptionVisible then
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawGroupCaption) then
NavBar.OnCustomDrawGroupCaption(NavBar, Canvas, AGroupViewInfo, AHandled);
if not AHandled then DrawGroupCaption(AGroupViewInfo);
end;
end;
procedure TdxNavBarPainter.DrawGroupBackground(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
with AGroupViewInfo do
GroupBackgroundPainterClass.DrawBackground(Canvas, ItemsRect, BgImage,
BgBackColor, BgBackColor2, BgAlphaBlend, BgAlphaBlend2, BgGradientMode);
end;
procedure TdxNavBarPainter.DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
if not ViewInfo.IsGroupActive(AGroupViewInfo.Group) then exit;
with AGroupViewInfo do
GroupBorderPainterClass.DrawBorder(Canvas, ItemsRect, BorderColor, IsCaptionVisible);
end;
procedure TdxNavBarPainter.DrawGroupCaption(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
DrawGroupCaptionButton(AGroupViewInfo);
DrawGroupCaptionText(AGroupViewInfo);
if AGroupViewInfo.IsCaptionImageVisible then
DrawGroupCaptionImage(AGroupViewInfo);
if AGroupViewInfo.IsCaptionSignVisible then
DrawGroupCaptionSign(AGroupViewInfo);
end;
procedure TdxNavBarPainter.DrawGroupCaptionButton(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
with AGroupViewInfo do
ButtonPainterClass.DrawButton(Canvas, CaptionRect, CaptionImage,
CaptionBackColor, CaptionBackColor2, CaptionAlphaBlend, CaptionAlphaBlend2,
CaptionGradientMode, CaptionBorderColor, State);
end;
procedure TdxNavBarPainter.DrawGroupCaptionText(AGroupViewInfo: TdxNavBarGroupViewInfo);
var
R: TRect;
begin
with AGroupViewInfo do
begin
R := CaptionTextRect;
Canvas.Brush.Style := bsClear;
Canvas.Font := CaptionFont;
Canvas.Font.Color := CaptionFontColor;
cxDrawText(DC, Group.Caption, R, GetDrawEdgeFlag);
end;
end;
procedure TdxNavBarPainter.DrawGroupCaptionImage(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
with AGroupViewInfo do
ImagePainterClass.DrawImage(Canvas, ImageList, ImageIndex, CaptionImageRect);
end;
procedure TdxNavBarPainter.DrawGroupCaptionSign(AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
if AGroupViewInfo.Group.ShowExpandButton then
with AGroupViewInfo do
SignPainterClass.DrawSign(Canvas, CaptionSignRect, CaptionSignColor,
CaptionBackColor, CaptionBackColor2, State);
end;
procedure TdxNavBarPainter.DrawGroupControl(ACanvas: TCanvas; ARect: TRect; AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
with AGroupViewInfo do
GroupBackgroundPainterClass.DrawBackground(ACanvas, ARect, ControlImage,
ControlBackColor, ControlBackColor2, ControlAlphaBlend, ControlAlphaBlend2,
ControlGradientMode);
end;
procedure TdxNavBarPainter.DrawGroupItems(AGroupViewInfo: TdxNavBarGroupViewInfo);
var
I: Integer;
ALinkViewInfo: TdxNavBarLinkViewInfo;
begin
for I := 0 to AGroupViewInfo.ItemCount - 1 do
begin
ALinkViewInfo := AGroupViewInfo.Items[I];
if ALinkViewInfo.Rect.Top < AGroupViewInfo.ItemsRect.Top then continue;
if ALinkViewInfo.Rect.Top > AGroupViewInfo.ItemsRect.Bottom then continue;
if ALinkViewInfo.Rect.Bottom > AGroupViewInfo.ItemsRect.Bottom then
ExcludeClipRect(DC, ALinkViewInfo.Rect.Left, AGroupViewInfo.ItemsRect.Bottom,
ALinkViewInfo.Rect.Right, ALinkViewInfo.Rect.Bottom);
DrawItem(ALinkViewInfo);
SelectClipRgn(DC, 0);
end;
end;
procedure TdxNavBarPainter.DrawItem(ALinkViewInfo: TdxNavBarLinkViewInfo);
var
AHandled: Boolean;
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawLink) then
NavBar.OnCustomDrawLink(NavBar, Canvas, ALinkViewInfo, AHandled);
if not AHandled then
begin
DrawItemSelection(ALinkViewInfo);
if (ALinkViewInfo.ImageList <> nil) and (0 <= ALinkViewInfo.ImageIndex) and
(ALinkViewInfo.ImageIndex < ALinkViewInfo.ImageList.Count) then
begin
if ALinkViewInfo.IsImageVisible then
DrawItemImage(ALinkViewInfo);
end;
DrawItemCaption(ALinkViewInfo);
end;
end;
procedure TdxNavBarPainter.DrawItemCaption(ALinkViewInfo: TdxNavBarLinkViewInfo);
var
R: TRect;
Flag: Integer;
begin
with ALinkViewInfo do
begin
R := CaptionRect;
Flag := GetDrawEdgeFlag or DT_END_ELLIPSIS;
if R.Left < Rect.Left then
R.Left := Rect.Left;
if R.Right > Rect.Right then
R.Right := Rect.Right;
Canvas.Brush.Style := bsClear;
Canvas.Font := Font;
Canvas.Font.Color := FontColor;
cxDrawText(DC, Item.Caption, R, Flag);
end;
end;
procedure TdxNavBarPainter.DrawItemImage(ALinkViewInfo: TdxNavBarLinkViewInfo);
begin
with ALinkViewInfo do
ImagePainterClass.DrawImage(Canvas, ImageList, ImageIndex, ImageRect, ALinkViewInfo.Item.Enabled);
end;
procedure TdxNavBarPainter.DrawItemSelection(ALinkViewInfo: TdxNavBarLinkViewInfo);
begin
if not ALinkViewInfo.Item.Enabled then exit;
with ALinkViewInfo do
SelectionPainterClass.DrawSelection(Canvas, SelectionRect, GroupViewInfo.BgBackColor, State);
end;
procedure TdxNavBarPainter.DrawItemsRect(AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AHandled: Boolean;
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawGroupClientBackground) then
NavBar.OnCustomDrawGroupClientBackground(NavBar, Canvas, AGroupViewInfo, AHandled);
if not AHandled then
begin
DrawGroupBackground(AGroupViewInfo);
DrawGroupBorder(AGroupViewInfo);
end;
if AGroupViewInfo.Control = nil then
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawGroupClientForeground) then
NavBar.OnCustomDrawGroupClientForeground(NavBar, Canvas, AGroupViewInfo, AHandled);
if not AHandled then DrawGroupItems(AGroupViewInfo);
end;
end;
procedure TdxNavBarPainter.DrawScrollButtons;
var
AHandled: Boolean;
begin
if ViewInfo.IsTopScrollButtonVisible then
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawTopScrollButton) then
NavBar.OnCustomDrawTopScrollButton(NavBar, Canvas, ViewInfo, AHandled);
if not AHandled then DrawTopScrollButton;
end;
if ViewInfo.IsBottomScrollButtonVisible then
begin
AHandled := False;
if Assigned(NavBar.OnCustomDrawBottomScrollButton) then
NavBar.OnCustomDrawBottomScrollButton(NavBar, Canvas, ViewInfo, AHandled);
if not AHandled then DrawBottomScrollButton;
end;
end;
procedure TdxNavBarPainter.DrawBottomScrollButton;
begin
with ViewInfo do
begin
ScrollButtonsPainterClass.DrawBottomButton(Canvas, BottomScrollButtonRect,
ButtonPainterClass, BottomScrollButtonBackColor, BottomScrollButtonBackColor2,
BottomScrollButtonAlphaBlend, BottomScrollButtonAlphaBlend2, BottomScrollButtonGradientMode,
BorderColor, BottomScrollButtonState);
with BottomScrollButtonRect do
ExcludeClipRect(Canvas.Handle, Left, Top, Right, Bottom);
end;
end;
procedure TdxNavBarPainter.DrawTopScrollButton;
begin
with ViewInfo do
begin
ScrollButtonsPainterClass.DrawTopButton(Canvas, TopScrollButtonRect,
ButtonPainterClass, TopScrollButtonBackColor, TopScrollButtonBackColor2,
TopScrollButtonAlphaBlend, TopScrollButtonAlphaBlend2, TopScrollButtonGradientMode,
BorderColor, TopScrollButtonState);
with TopScrollButtonRect do
ExcludeClipRect(Canvas.Handle, Left, Top, Right, Bottom);
end;
end;
{ TdxCustomNavBar }
constructor TdxCustomNavBar.Create(AOwner: TComponent);
function InternalCreateTimer(AInterval: Integer; AOnTimer: TNotifyEvent): TcxTimer;
begin
Result := TcxTimer.Create(Self);
Result.Enabled := False;
Result.Interval := AInterval;
Result.OnTimer := AOnTimer;
end;
begin
inherited Create(AOwner);
FCanvasBitmap := TBitmap.Create;
FScrollBar := TdxNavBarScrollBar.Create(Self, sbVertical);
FScrollBar.OnScroll := Scroll;
FActivateGroupTimer := InternalCreateTimer(dxNavBarActivateGroupInterval, DoActivateGroupTimer);
FScrollTimer := InternalCreateTimer(dxNavBarScrollInterval, DoScrollTimer);
FHintTimer := InternalCreateTimer(dxNavBarHintShowingInterval, DoHintTimer);
FGroups := TdxNavBarGroups.Create(Self, GetGroupClass);
FGroups.OnChange := OnGroupsChanged;
FGroups.OnLinksChange := OnLinksChanged;
FItems := TdxNavBarItems.Create(Self, GetItemClass);
FItems.OnChange := OnItemsChanged;
FStyles := TdxNavBarStyles.Create(Self, TdxNavBarStyleItem);
FStyles.OnChange := OnStylesChanged;
FDefaultStyles := TdxNavBarDefaultStyles.Create(Self);
FDefaultStyles.OnChange := OnDefaultStylesChanged;
FLargeChangeLink := TChangeLink.Create;
FSmallChangeLink := TChangeLink.Create;
FLargeChangeLink.OnChange := OnImagesChanged;
FSmallChangeLink.OnChange := OnImagesChanged;
FThemeNotificator := TdxThemeChangedNotificator.Create;
FThemeNotificator.OnThemeChanged := OnThemeChanged;
FHintWindow := TdxNavBarHintWindow.Create(Self);
FHintWindowShowing := False;
DragCursor := dxNavBarDragCursor;
FDragCopyCursor := dxNavBarDragCopyCursor;
FDragDropFlags := [fAllowDragLink, fAllowDropLink, fAllowDragGroup, fAllowDropGroup];
FHotTrackedGroupCursor := crDefault;
FHotTrackedLinkCursor := dxNavBarLinksCursor;
FShowGroupCaptions := True;
FShowNavigationPaneOverflowPanelHints := True;
FNavigationPaneOverflowPanelHotTrackedIndex := -1;
FNavigationPaneOverflowPanelPressedIndex := -1;
FNavigationPaneOverflowPanelUseSmallImages := True;
FNavigationPaneMaxVisibleGroups := -1;
BevelInner := bvNone;
BevelOuter := bvNone;
ControlStyle := ControlStyle - [csAcceptsControls, csSetCaption] + [csActionClient];
Height := 300;
Width := 150;
AssignDefaultStyles;
end;
destructor TdxCustomNavBar.Destroy;
begin
FreeAndNil(FActivateGroupTimer);
FreeAndNil(FScrollTimer);
FreeAndNil(FHintTimer);
FreeAndNil(FScrollBar);
FreeAndNil(FThemeNotificator);
FreeAndNil(FHintWindow);
FreeAndNil(FSmallChangeLink);
FreeAndNil(FLargeChangeLink);
FreeAndNil(FStyles);
FreeAndNil(FItems);
FreeAndNil(FGroups);
FreeAndNil(FDefaultStyles);
FreeAndNil(FDesigner);
FreeAndNil(FPainter);
FreeAndNil(FCanvasBitmap);
inherited;
end;
procedure TdxCustomNavBar.DeSelectLinks;
var
I: Integer;
begin
for I := 0 to Groups.Count - 1 do
Groups[I].SelectedLinkIndex := -1;
end;
procedure TdxCustomNavBar.DragDrop(Source: TObject; X, Y: Integer);
begin
if FPressedGroup <> nil then
begin
FPressedGroup := nil;
InvalidateAll(doRedraw);
end;
if FPressedLink <> nil then
begin
FPressedLink := nil;
InvalidateAll(doRedraw);
end;
FTargetPoint := Point(X, Y);
FHotTrackedLink := GetLinkAtSelectedPos(FTargetPoint);
FHotTrackedGroup := GetGroupAtCaptionPos(FTargetPoint);
if dxNavBarDragObject <> nil then
begin
dxNavBarDragObject.UpdateTargets;
if (SourceItem <> nil) and IsAllowDropLink then
DoItemDragDrop(SourceItem)
else if (SourceLink <> nil) and IsAllowDropLink then
DoLinkDragDrop(SourceLink)
else if (SourceGroup <> nil) and IsAllowDropGroup then
DoGroupDragDrop(SourceGroup)
end;
inherited DragDrop(Source, X, Y);
DragDone;
end;
procedure TdxCustomNavBar.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
var
ABoundsChanged: Boolean;
begin
ABoundsChanged := (ALeft <> Left) or (ATop <> Top) or (AWidth <> Width) or (AHeight <> Height);
inherited SetBounds(ALeft, ATop, AWidth, AHeight);
if ABoundsChanged and (CanvasBitmap <> nil) and HandleAllocated then
begin
if CanvasBitmap.Width <= ClientWidth then
CanvasBitmap.Width := ClientWidth + 10;
if CanvasBitmap.Height <= ClientHeight then
CanvasBitmap.Height := ClientHeight + 10;
InvalidateAll(ViewInfo.GetBoundsUpdateType);
end;
end;
procedure TdxCustomNavBar.Loaded;
begin
inherited;
if (0 <= FActiveGroupIndex) and (FActiveGroupIndex < Groups.Count) then
FActiveGroup := Groups[FActiveGroupIndex];
DefaultStyles.AssignDefaultValues(True);
InvalidateAll(doRecreate);
end;
procedure TdxCustomNavBar.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do
Style := Style or WS_CLIPCHILDREN;
end;
procedure TdxCustomNavBar.CreateWindowHandle(const Params: TCreateParams);
begin
inherited CreateWindowHandle(Params);
ScrollBar.Reset;
end;
procedure TdxCustomNavBar.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) then
begin
if AComponent = FHotTrackedGroup then FHotTrackedGroup := nil;
if AComponent = FPressedGroup then FPressedGroup := nil;
if AComponent = FActiveGroup then ActiveGroup := nil;
if (AComponent = LargeImages) then LargeImages := nil;
if (AComponent = SmallImages) then SmallImages := nil;
if (AComponent = StyleBackground) then StyleBackground := nil;
if (AComponent = StyleHint) then StyleHint := nil;
if (AComponent = StyleDropTargetGroup) then StyleDropTargetGroup := nil;
if (AComponent = StyleDropTargetLink) then StyleDropTargetLink := nil;
if (AComponent = StyleButton) then StyleButton := nil;
if (AComponent = StyleButtonHotTracked) then StyleButtonHotTracked := nil;
if (AComponent = StyleButtonPressed) then StyleButtonPressed := nil;
if (AComponent = StyleNavigationPaneHeader) then StyleNavigationPaneHeader := nil;
end;
end;
procedure TdxCustomNavBar.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
I: Integer;
begin
for I := 0 to Groups.Count - 1 do
if Groups[I].Owner = Root then
Proc(Groups[I]);
for I := 0 to Items.Count - 1 do
if Items[I].Owner = Root then
Proc(Items[I]);
for I := 0 to Styles.Count - 1 do
if Styles[I].Owner = Root then
Proc(Styles[I]);
for I := 0 to Groups.Count - 1 do
if (Groups[I].Control <> nil) and (Groups[I].Control.Owner = Root) then
Proc(Groups[I].Control);
end;
procedure TdxCustomNavBar.SetName(const NewName: TComponentName);
var
OldName, NewItemName: string;
I, L: Integer;
procedure UpdateName(AComponent: TComponent);
begin
NewItemName := AComponent.Name;
if Pos(OldName, NewItemName) = 1 then
begin
Delete(NewItemName, 1, L);
Insert(Name, NewItemName, 1);
try
AComponent.Name := NewItemName;
except
on EComponentError do ; {Ignore rename errors }
end;
end;
end;
begin
OldName := Name;
L := Length(OldName);
inherited;
if (csDesigning in ComponentState) then
begin
if Designer <> nil then Designer.BeginUpdate;
try
for I := 0 to Groups.Count - 1 do
UpdateName(Groups[I]);
for I := 0 to Items.Count - 1 do
UpdateName(Items[I]);
for I := 0 to Styles.Count - 1 do
UpdateName(Styles[I]);
finally
if Designer <> nil then Designer.EndUpdate;
end;
end;
end;
procedure TdxCustomNavBar.WndProc(var Message: TMessage);
begin
if (FHintWindowShowing) then
with Message do
if ((Msg >= WM_KEYFIRST) and (Msg <= WM_KEYLAST)) or
((Msg = CM_ACTIVATE) or (Msg = CM_DEACTIVATE)) or
(Msg = CM_APPKEYDOWN) or (Msg = CM_APPSYSCOMMAND) or
(Msg = WM_COMMAND) or ((Msg > WM_MOUSEMOVE) and
(Msg <= WM_MOUSELAST)) or (Msg = WM_NCMOUSEMOVE) then
DoHintDeactivate;
inherited WndProc(Message);
end;
function TdxCustomNavBar.DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
MousePos: TPoint): Boolean;
const
AScrollCodes: array[Boolean, Boolean] of TScrollCode = ((scLineUp, scPageUp), (scLineDown, scPageDown));
function IsScrollBarsPresent(AControl: TWinControl): Boolean;
var
AScrollInfo: TScrollInfo;
begin
ZeroMemory(@AScrollInfo, SizeOf(TScrollInfo));
AScrollInfo.fMask := SIF_ALL;
AScrollInfo.cbSize := SizeOf(TScrollInfo);
GetScrollInfo(AControl.Handle, SB_VERT, AScrollInfo);
Result := (AScrollInfo.nPage > 0) and (AScrollInfo.nMax >= Integer(AScrollInfo.nPage));
end;
var
AScrollPos: Integer;
AControl: TWinControl;
AMessage: TWMMouseWheel;
AWindowRect: TRect;
begin
Result := False;
GetWindowRect(Handle, AWindowRect);
if PtInRect(AWindowRect, Mouse.CursorPos) and ScrollBar.Visible then
begin
AControl := FindControl(WindowFromPoint(Mouse.CursorPos));
if (AControl <> nil) and (AControl <> Self) and IsScrollBarsPresent(AControl) then
begin
AMessage.Msg := WM_MOUSEWHEEL;
AMessage.Keys := ShiftStateToKeys(Shift);
AMessage.WheelDelta := WheelDelta;
AMessage.Pos := PointToSmallPoint(MousePos);
AControl.DefaultHandler(AMessage);
Result := AMessage.Result = 1;
end;
if not Result then
begin
AScrollPos := ScrollBar.Position;
ScrollBar.Scroll(ScrollBar, AScrollCodes[WheelDelta < 0, ssCtrl in Shift], AScrollPos);
Result := True;
end;
end;
end;
procedure TdxCustomNavBar.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
AGroup: TdxNavBarGroup;
ALink: TdxNavBarItemLink;
begin
DoHintDeactivate;
SetFocus;
inherited MouseDown(Button, Shift, X, Y);
FSourceShift := Shift;
if ssLeft in FSourceShift then
begin
FSourcePoint := Point(X, Y);
if IsPtTopScrollButton(FSourcePoint) then
DoTopScrollButtonDown
else if IsPtBottomScrollButton(FSourcePoint) then
DoBottomScrollButtonDown
else if IsPtNavigationPaneSplitter(FSourcePoint) then
DoSplitterMouseDown
else if IsPtNavigationPaneOverflowPanel(FSourcePoint) then
DoOverflowPanelMouseDown
else
begin
AGroup := GetGroupAtCaptionPos(FSourcePoint);
if AGroup <> nil then
DoGroupMouseDown(AGroup);
ALink := GetLinkAtSelectedPos(FSourcePoint);
if ALink <> nil then
DoLinkMouseDown(ALink);
end;
end
else if (FHotTrackedGroup <> nil) or (FHotTrackedLink <> nil) or (NavigationPaneOverflowPanelHotTrackedIndex > -1) then
begin
FNavigationPaneOverflowPanelHotTrackedIndex := -1;
FHotTrackedGroup := nil;
FHotTrackedLink := nil;
InvalidateAll(doRedraw);
end;
end;
procedure TdxCustomNavBar.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if EnableDragging then exit;
inherited MouseUp(Button, Shift, X, Y);
FSourcePoint := Point(X, Y);
if EnableSplitterDragging then
DoSplitterMouseUp
else if IsPtTopScrollButton(FSourcePoint) or ScrollButtonUpIsDown then
DoTopScrollButtonUp
else if IsPtBottomScrollButton(FSourcePoint) or ScrollButtonDownIsDown then
DoBottomScrollButtonUp
else if IsPtNavigationPaneOverflowPanel(FSourcePoint) or (NavigationPaneOverflowPanelPressedIndex > -1) or
NavigationPaneOverflowPanelSignPressed then DoOverflowPanelMouseUp
else
begin
FScrollButtonDownIsDown := False;
FScrollButtonUpIsDown := False;
if FSourceGroup <> nil then
DoGroupMouseUp(FSourceGroup);
if FSourceLink <> nil then
DoLinkMouseUp(FSourceLink);
end;
FSourceShift := [];
end;
procedure TdxCustomNavBar.MouseEnter;
begin
if Assigned(FOnMouseEnter) then
FOnMouseEnter(Self);
InvalidateAll(doRedraw);
end;
procedure TdxCustomNavBar.MouseLeave;
begin
DoHintDeactivate;
FTargetPoint := cxInvalidPoint;
FPressedGroup := nil;
FPressedLink := nil;
FHotTrackedGroup := nil;
FHotTrackedLink := nil;
FNavigationPaneOverflowPanelHotTrackedIndex := -1;
FNavigationPaneOverflowPanelSignHotTracked := False;
if dxNavBarDragObject <> nil then
dxNavBarDragObject.UpdateTargets;
if Assigned(FOnMouseLeave) then
FOnMouseLeave(Self);
InvalidateAll(doRecalc);
end;
procedure TdxCustomNavBar.MouseMove(Shift: TShiftState; X, Y: Integer);
function IsDragBegining: Boolean;
begin
Result := (Abs(FSourcePoint.X - X) > 3) or (Abs(FSourcePoint.Y - Y) > 3);
end;
function CanDrag: Boolean;
begin
Result := (IsAllowDragGroup and (FSourceGroup <> nil)) or
(IsAllowDragLink and (FSourceLink <> nil) and FSourceLink.Item.Enabled);
end;
var
ALink: TdxNavBarItemLink;
AGroup: TdxNavBarGroup;
begin
FTargetPoint := Point(X, Y);
if not Painter.IsViewInfoValid then
Exit;
if IsTopScrollButtonVisible or IsBottomScrollButtonVisible then
InvalidateScrollButtons;
if EnableSplitterDragging then
DoSplitterDrag
else if CanDrag and IsDragBegining then
begin
FSourceShift := [];
FEnableDragging := True;
DragMode := dmAutomatic;
BeginDrag(True);
end
else
begin
inherited MouseMove(Shift, X, Y);
if FSourceShift * Shift = [] then
begin
ALink := GetLinkAtSelectedPos(FTargetPoint);
if ALink <> FHotTrackedLink then
DoLinkHotTrack(ALink);
AGroup := GetGroupAtCaptionPos(FTargetPoint);
if AGroup <> FHotTrackedGroup then
DoGroupHotTrack(AGroup);
if IsPtNavigationPaneOverflowPanel(FTargetPoint) or (NavigationPaneOverflowPanelHotTrackedIndex > -1) or
NavigationPaneOverflowPanelSignHotTracked then DoOverflowPanelMouseMove;
end;
end;
end;
procedure TdxCustomNavBar.DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean);
begin
Accept := False;
FTargetPoint := Point(X, Y);
FScrollButtonDownIsDown := False;
FScrollButtonUpIsDown := False;
if FPressedGroup <> nil then
begin
FPressedGroup := nil;
InvalidateAll(doRedraw);
end;
if FPressedLink <> nil then
begin
FPressedLink := nil;
InvalidateAll(doRedraw);
end;
if IsTopScrollButtonVisible or IsBottomScrollButtonVisible then
InvalidateScrollButtons;
if dxNavBarDragObject <> nil then
begin
dxNavBarDragObject.UpdateTargets;
if (SourceItem <> nil) and IsAllowDropLink then
DoItemDragOver(SourceItem, Accept)
else if (SourceLink <> nil) and IsAllowDropLink then
DoLinkDragOver(SourceLink, Accept)
else if (SourceGroup <> nil) and IsAllowDropGroup then
DoGroupDragOver(SourceGroup, Accept);
end;
if Assigned(OnDragOver) then
OnDragOver(Self, Source, X, Y, State, Accept);
end;
procedure TdxCustomNavBar.DoEndDrag(Target: TObject; X, Y: Integer);
begin
inherited DoEndDrag(Target, X, Y);
FreeAndNil(FDragObject);
DragDone;
end;
type
TdxDragObject = class(TDragControlObject)
protected
function GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor; override;
end;
function TdxDragObject.GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor;
var
Wnd: TWinControl;
begin
Wnd := FindVCLWindow(Point(X, Y));
if Accepted and (Wnd is TdxCustomNavBar) then
begin
if dxNavBarDragObject.SourceItem <> nil then
Result := TdxCustomNavBar(Wnd).DragCopyCursor
else Result := TdxCustomNavBar(Wnd).DragCursor;
end
else Result := inherited GetDragCursor(Accepted, X, Y);
end;
procedure TdxCustomNavBar.DoStartDrag(var DragObject: TDragObject);
begin
if dxNavBarDragObject = nil then
dxNavBarDragObject := TdxNavBarDragObject.Create(Self, DragObject {deprecated}, FSourceGroup, FSourceLink, nil);
FDragObject := TdxDragObject.Create(Self);
DragObject := FDragObject;
DoLinkHotTrack(nil);
DoGroupHotTrack(nil);
inherited DoStartDrag(DragObject);
end;
procedure TdxCustomNavBar.DoActivateGroupTimer(Sender: TObject);
var
Group: TdxNavBarGroup;
begin
Group := ViewInfo.GetGroupAtCaptionPos(FTargetPoint);
if Group = FActiveGroupCandidate then
ViewInfo.DoGroupActivate(Group);
FActivateGroupTimer.Enabled := False;
end;
procedure TdxCustomNavBar.DoScrollTimer(Sender: TObject);
begin
FScrollButtonUpIsDown := IsPtTopScrollButton(TargetPoint);
FScrollButtonDownIsDown := IsPtBottomScrollButton(TargetPoint);
if ScrollButtonUpIsDown or ScrollButtonDownIsDown then
begin
if ScrollButtonUpIsDown and not (sDisabled in ViewInfo.TopScrollButtonState) then
ActiveGroup.TopVisibleLinkIndex:= ActiveGroup.TopVisibleLinkIndex - 1;
if ScrollButtonDownIsDown and not (sDisabled in ViewInfo.BottomScrollButtonState) then
ActiveGroup.TopVisibleLinkIndex := ActiveGroup.TopVisibleLinkIndex + 1;
end
else FScrollTimer.Enabled := False;
end;
procedure TdxCustomNavBar.DoHintTimer(Sender: TObject);
begin
ViewInfo.RecalculateHint;
if ViewInfo.HintText <> '' then
begin
HintWindow.ActivateHint(ViewInfo.HintRect, ViewInfo.HintText);
FHintWindowShowing := True;
end;
FHintTimer.Enabled := False;
end;
procedure TdxCustomNavBar.DoGroupDragDrop(Group: TdxNavBarGroup);
begin
if TargetGroup <> nil then
Group.Index := TargetGroup.Index;
end;
procedure TdxCustomNavBar.DoGroupDragOver(Group: TdxNavBarGroup; var Accept: Boolean);
begin
Accept := (Group <> TargetGroup) and (TargetGroup <> nil);
InvalidateAll(doRedraw);
end;
procedure TdxCustomNavBar.DoGroupHotTrack(Group: TdxNavBarGroup);
begin
DoHintDeactivate;
if FHotTrackedGroup <> nil then
InvalidateAll(doRecalc);
FHotTrackedGroup := Group;
DoGroupHintActivate;
if FHotTrackedGroup <> nil then
InvalidateAll(doRecalc);
if Assigned(FOnGroupHotTrack) then
FOnGroupHotTrack(Self, FHotTrackedGroup);
end;
procedure TdxCustomNavBar.DoGroupMouseDown(Group: TdxNavBarGroup);
begin
FSourceGroup := Group;
FPressedGroup := Group;
if Assigned(FOnGroupPress) then
FOnGroupPress(Self, FPressedGroup);
InvalidateAll(doRecalc);
end;
procedure TdxCustomNavBar.DoGroupMouseUp(Group: TdxNavBarGroup);
begin
FSourceGroup := nil;
if Assigned(Group.OnClick) then
Group.OnClick(Group)
else if Assigned(FOnGroupClick) then
FOnGroupClick(Self, Group);
ViewInfo.DoGroupActiveToggle(Group);
FPressedGroup := nil;
InvalidateAll(doRecalc);
end;
procedure TdxCustomNavBar.DoLinkDragDrop(Link: TdxNavBarItemLink);
var
AIndex: Integer;
ASourceLink: TdxNavBarItemLink;
begin
AIndex := TargetLinkIndex;
if AIndex > -1 then
begin
if (TargetGroup = Link.Group) and (AIndex > Link.Index) then Dec(AIndex);
if Link.Group <> TargetGroup then
begin
Link.Group.SelectedLinkIndex := -1;
ASourceLink := TargetGroup.CreateLink(Link.Item);
ASourceLink.Index := AIndex;
Link.Group.RemoveLink(Link.Index);
end
else ASourceLink := Link;
ASourceLink.Index := AIndex;
InvalidateAll(doRedraw);
end;
end;
procedure TdxCustomNavBar.DoLinkDragOver(Link: TdxNavBarItemLink; var Accept: Boolean);
var
Group: TdxNavBarGroup;
begin
Accept := True;
if IsPtTopScrollButton(TargetPoint) or IsPtBottomScrollButton(TargetPoint) then
FScrollTimer.Enabled := True
else
begin
Group := ViewInfo.GetGroupAtCaptionPos(FTargetPoint);
if Group <> nil then
begin
FActivateGroupTimer.Enabled := False;
FActiveGroupCandidate := Group;
FActivateGroupTimer.Enabled := True;
end;
Accept := (TargetGroup <> nil) and (TargetLink1 <> Link) and (TargetLink2 <> Link);
InvalidateAll(doRedraw);
end;
end;
procedure TdxCustomNavBar.DoLinkHotTrack(Link: TdxNavBarItemLink);
begin
DoHintDeactivate;
if FHotTrackedLink <> nil then
InvalidateAll(doRecalc);
FHotTrackedLink := Link;
DoLinkHintActivate;
if FHotTrackedLink <> nil then
InvalidateAll(doRecalc);
if Assigned(FOnLinkHotTrack) then
FOnLinkHotTrack(Self, FHotTrackedLink);
end;
procedure TdxCustomNavBar.DoLinkMouseDown(Link: TdxNavBarItemLink);
begin
FSourceLink := Link;
if (Link.Group.SelectedLinkIndex > -1) then
InvalidateAll(doRecalc);
if (Link.Item <> nil) and Link.Item.Enabled then
begin
FPressedLink := Link;
if Assigned(FOnLinkPress) then
FOnLinkPress(Self, FPressedLink);
InvalidateAll(doRecalc);
end;
end;
procedure TdxCustomNavBar.DoLinkMouseUp(Link: TdxNavBarItemLink);
begin
FSourceLink := nil;
if (Link.Item <> nil) and Link.Item.Enabled then
begin
if Assigned(Link.Item.OnClick) then
Link.Item.OnClick(Link.Item)
else
if Link.Item.Action <> nil then
Link.Item.ActionLink.Execute{$IFDEF DELPHI6}(Link.Item){$ENDIF}
else
if Assigned(OnLinkClick) then
OnLinkClick(Self, Link);
if (FPressedLink <> nil) and AllowSelectLinks then
Link.Group.SelectedLinkIndex := FPressedLink.Index;
FPressedLink := nil;
InvalidateAll(doRecalc);
end;
end;
procedure TdxCustomNavBar.DoItemDragDrop(Item: TdxNavBarItem);
begin
if TargetGroup <> nil then
begin
with TargetGroup.CreateLink(Item) do
Index := TargetLinkIndex;
end;
end;
procedure TdxCustomNavBar.DoItemDragOver(Item: TdxNavBarItem; var Accept: Boolean);
var
Group: TdxNavBarGroup;
begin
Accept := True;
if IsPtTopScrollButton(FTargetPoint) or IsPtBottomScrollButton(FTargetPoint) then
FScrollTimer.Enabled := True
else
begin
Group := GetGroupAtCaptionPos(FTargetPoint);
if Group <> nil then
begin
FActivateGroupTimer.Enabled := False;
FActiveGroupCandidate := Group;
FActivateGroupTimer.Enabled := True;
end;
Accept := TargetGroup <> nil;
InvalidateAll(doRedraw);
end;
end;
procedure TdxCustomNavBar.DoBottomScrollButtonDown;
begin
if not (sDisabled in ViewInfo.BottomScrollButtonState) then
begin
FScrollButtonUpIsDown := False;
FScrollButtonDownIsDown := True;
FScrollTimer.Enabled := True;
if ActiveGroup <> nil then
ActiveGroup.TopVisibleLinkIndex := ActiveGroup.TopVisibleLinkIndex + 1;
InvalidateScrollButtons;
end;
end;
procedure TdxCustomNavBar.DoBottomScrollButtonUp;
begin
FScrollButtonDownIsDown := False;
FScrollTimer.Enabled := False;
InvalidateScrollButtons;
end;
procedure TdxCustomNavBar.DoTopScrollButtonDown;
begin
if not (sDisabled in ViewInfo.TopScrollButtonState) then
begin
FScrollButtonDownIsDown := False;
FScrollButtonUpIsDown := True;
FScrollTimer.Enabled := True;
if ActiveGroup <> nil then
ActiveGroup.TopVisibleLinkIndex := ActiveGroup.TopVisibleLinkIndex - 1;
InvalidateScrollButtons;
end;
end;
procedure TdxCustomNavBar.DoTopScrollButtonUp;
begin
FScrollButtonUpIsDown := False;
FScrollTimer.Enabled := False;
InvalidateScrollButtons;
end;
procedure TdxCustomNavBar.DoNavigationPaneOverflowPanelHintsActivate;
begin
if not EnableDragging and ShowNavigationPaneOverflowPanelHints and (NavigationPaneOverflowPanelSignHotTracked or
(NavigationPaneOverflowPanelHotTrackedIndex > -1)) then
DoHintActivate;
end;
procedure TdxCustomNavBar.DoGroupHintActivate;
begin
if not EnableDragging and ShowGroupsHint and (HotTrackedGroup <> nil) then
DoHintActivate;
end;
procedure TdxCustomNavBar.DoLinkHintActivate;
begin
if not EnableDragging and ShowLinksHint and (HotTrackedLink <> nil) then
DoHintActivate;
end;
procedure TdxCustomNavBar.DoHintActivate;
begin
if Application.Active then
FHintTimer.Enabled := True;
end;
procedure TdxCustomNavBar.DoHintDeactivate;
begin
FHintTimer.Enabled := False;
if IsWindowVisible(FHintWindow.Handle) then
ShowWindow(FHintWindow.Handle, SW_HIDE);
FHintWindowShowing := False;
end;
procedure TdxCustomNavBar.DoOverflowPanelMouseDown;
var
AIndex: Integer;
begin
AIndex := ViewInfo.GetNavigationPaneOverflowPanelItemIndexAtPos(FSourcePoint);
if AIndex > -1 then
begin
FNavigationPaneOverflowPanelPressedIndex := AIndex;
InvalidateAll(doRedraw);
end
else if ViewInfo.IsPtNavigationPaneOverflowPanelSign(FSourcePoint) then
begin
FNavigationPaneOverflowPanelSignPressed := True;
InvalidateAll(doRedraw);
end;
end;
procedure TdxCustomNavBar.DoOverflowPanelMouseMove;
var
AIndex: Integer;
AHot: Boolean;
begin
AIndex := ViewInfo.GetNavigationPaneOverflowPanelItemIndexAtPos(FTargetPoint);
if NavigationPaneOverflowPanelHotTrackedIndex <> AIndex then
begin
DoHintDeactivate;
FNavigationPaneOverflowPanelHotTrackedIndex := AIndex;
DoNavigationPaneOverflowPanelHintsActivate;
InvalidateAll(doRedraw);
end;
AHot := ViewInfo.IsPtNavigationPaneOverflowPanelSign(FTargetPoint);
if NavigationPaneOverflowPanelSignHotTracked <> AHot then
begin
DoHintDeactivate;
FNavigationPaneOverflowPanelSignHotTracked := AHot;
DoNavigationPaneOverflowPanelHintsActivate;
InvalidateAll(doRedraw);
end;
end;
procedure TdxCustomNavBar.DoOverflowPanelMouseUp;
var
pt: TPoint;
begin
if (ViewInfo.GetNavigationPaneOverflowPanelItemIndexAtPos(FTargetPoint) = NavigationPaneOverflowPanelPressedIndex) and
(NavigationPaneOverflowPanelPressedIndex > -1) then
ActiveGroup := ViewInfo.GetNavigationPaneOverflowPanelGroupAtPos(FTargetPoint);
if ViewInfo.IsPtNavigationPaneOverflowPanelSign(FTargetPoint) and FNavigationPaneOverflowPanelSignPressed then
begin
FNavigationPaneOverflowPanelSignHotTracked := False;
pt := ClientToScreen(FTargetPoint);
FNavigationPaneOverflowPanelSignPressed := False;
FNavigationPaneOverflowPanelSignHotTracked := True;
InvalidateAll(doRedraw);
ViewInfo.DoShowPopupMenu(pt.X, pt.Y);
end;
FNavigationPaneOverflowPanelPressedIndex := -1;
FNavigationPaneOverflowPanelSignPressed := False;
FNavigationPaneOverflowPanelSignHotTracked := False;
InvalidateAll(doRedraw);
end;
procedure TdxCustomNavBar.DoSplitterMouseDown;
begin
FEnableSplitterDragging := True;
end;
procedure TdxCustomNavBar.DoSplitterDrag;
begin
if CanDecNavigationPaneOverflowPanelItemCount and
ViewInfo.IsPtDecNavigationPaneOverflowPanelItemCount(TargetPoint) then
DoDecNavigationPaneOverflowPanelItemCount
else
if CanIncNavigationPaneOverflowPanelItemCount and
ViewInfo.IsPtIncNavigationPaneOverflowPanelItemCount(TargetPoint) then
DoIncNavigationPaneOverflowPanelItemCount;
end;
procedure TdxCustomNavBar.DoSplitterMouseUp;
begin
FEnableSplitterDragging := False;
end;
procedure TdxCustomNavBar.DoUpdateScrollBarStyle;
begin
with FScrollBar.ScrollBar do
begin
if View in [dxNavBarXP1View, dxNavBarXP2View, dxNavBarXPExplorerBarView,
dxNavBarAdvExplorerBarView]
then
LookAndFeel.NativeStyle := True
else
begin
LookAndFeel.NativeStyle := False;
case View of
dxNavBarBaseView:
LookAndFeel.Kind := lfStandard;
dxNavBarOffice1View, dxNavBarOffice2View, dxNavBarOffice3View, dxNavBarFlatView:
LookAndFeel.Kind := lfFlat;
dxNavBarUltraFlatExplorerView, dxNavBarExplorerBarView:
LookAndFeel.Kind := lfUltraFlat;
dxNavBarOffice11TaskPaneView, dxNavBarOffice11NavigatorPaneView:
LookAndFeel.Kind := lfOffice11;
dxNavBarSkinExplorerBarView:
if Painter.GetMasterLookAndFeel <> nil then
LookAndFeel.MasterLookAndFeel := Painter.GetMasterLookAndFeel;
end;
end;
end;
end;
function TdxCustomNavBar.GetClientRect: TRect;
begin
Result := inherited GetClientRect;
if FScrollBar.Visible then
if FScrollBar.FKind = sbVertical then
Result.Right := Result.Right - FScrollBar.Width
else
Result.Bottom := Result.Bottom - FScrollBar.Height;
end;
procedure TdxCustomNavBar.Scroll(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer);
begin
InvalidateAll(doRecalc);
Update;
end;
procedure TdxCustomNavBar.DesignerModified;
begin
if Designer <> nil then
Designer.Modified;
end;
procedure TdxCustomNavBar.DesignerUpdate(AItem: TComponent);
begin
if Designer <> nil then
Designer.Update(AItem);
end;
procedure TdxCustomNavBar.OnGroupsChanged(Sender: TObject; AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification);
begin
if csDestroying in ComponentState then Exit;
if NavigationPaneMaxVisibleGroups <> -1 then
InvalidateAll(doRecreate)
else
InvalidateAll(AItem, AAction);
if AAction = ccnChanged then //#DG ?
DesignerModified;
end;
procedure TdxCustomNavBar.OnItemsChanged(Sender: TObject; AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification);
begin
InvalidateAll(AItem, AAction);
if AAction = ccnChanged then //#DG ?
DesignerModified;
end;
procedure TdxCustomNavBar.OnStylesChanged(Sender: TObject; AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification);
begin
InvalidateAll(doRecreate);
if AAction = ccnChanged then //#DG ?
DesignerModified;
end;
procedure TdxCustomNavBar.OnDefaultStylesChanged(Sender: TObject; AType: TdxNavBarChangeType);
begin
InvalidateAll(doRecreate);
DesignerModified;
end;
procedure TdxCustomNavBar.OnImagesChanged(Sender: TObject);
begin
InvalidateAll(doRecreate);
end;
procedure TdxCustomNavBar.OnLinksChanged(Sender: TObject; ALink: TdxNavBarItemLink);
begin
if FHotTrackedLink = ALink then
FHotTrackedLink := nil;
if FPressedLink = ALink then
FPressedLink := nil;
end;
procedure TdxCustomNavBar.OnThemeChanged;
begin
ViewInfo.RefreshColors;
InvalidateAll(doRecreate);
end;
procedure TdxCustomNavBar.DoActiveGroupChanged;
begin
if ([csDestroying, csLoading] * ComponentState = []) and Assigned(OnActiveGroupChanged) then
OnActiveGroupChanged(Self);
end;
procedure TdxCustomNavBar.DoActiveGroupChanging(ANewGroup: TdxNavBarGroup; var AAllowChange: Boolean);
begin
if ([csDestroying, csLoading] * ComponentState = []) and Assigned(OnActiveGroupChanging) then
OnActiveGroupChanging(Self, ANewGroup, AAllowChange);
end;
procedure TdxCustomNavBar.Paint;
begin
Painter.Paint;
end;
procedure TdxCustomNavBar.InitiateAction;
begin
inherited;
Groups.InitiateActions;
end;
procedure TdxCustomNavBar.Invalidate;
begin
if FPainter <> nil then
Painter.InvalidateViewInfo(doRedraw);
inherited;
end;
procedure TdxCustomNavBar.InvalidateAll(AType: TdxNavBarChangeType);
begin
if csDestroying in ComponentState then exit;
if FPainter <> nil then
Painter.InvalidateViewInfo(AType);
if HandleAllocated then
begin
if AType = doRecreate then
RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN);
Invalidate;
end;
end;
procedure TdxCustomNavBar.InvalidateAll(AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification);
function GetUpdateType(AItem: TcxComponentCollectionItem;
AAction: TcxComponentCollectionNotification): TdxNavBarChangeType;
begin
if (AItem <> nil) and (AAction = ccnChanged) then
Result := doRecalc
else
Result := doRecreate;
end;
begin
InvalidateAll(GetUpdateType(AItem, AAction));
end;
procedure TdxCustomNavBar.InvalidateScrollButtons;
begin
if csDestroying in ComponentState then exit;
Painter.InvalidateViewInfo(doRedraw);
if HandleAllocated then Painter.InvalidateScrollButtons;
end;
procedure TdxCustomNavBar.LoadFromRegIni(AStorage: TCustomIniFile; LoadStyles: Boolean);
procedure ReadStyle(AIndex: Integer);
var
ASection, ABuffer, AText: string;
AStream: TStringStream;
AGraphicClass: TGraphicClass;
AGraphic: TGraphic;
AStyleItem: TdxNavBarStyleItem;
begin
with AStorage do
begin
ASection := 'Style' + IntToStr(AIndex);
AStyleItem := Styles.Add;
with AStyleItem.Style do
begin
BackColor := ReadInteger(ASection, 'BackColor', BackColor);
BackColor2 := ReadInteger(ASection, 'BackColor2', BackColor2);
AlphaBlending := ReadInteger(ASection, 'AlphaBlending', AlphaBlending);
AlphaBlending2 := ReadInteger(ASection, 'AlphaBlending2', AlphaBlending2);
Font.Charset := ReadInteger(ASection, 'FontCharset', Font.Charset);
Font.Color := ReadInteger(ASection, 'FontColor', Font.Color);
Font.Height :=ReadInteger(ASection, 'FontHeight', Font.Height);
Font.Name := ReadString(ASection, 'FontName', Font.Name);
Font.Pitch := TFontPitch(ReadInteger(ASection, 'FontPitch', Integer(Font.Pitch)));
Font.Size := ReadInteger(ASection, 'FontSize', Font.Size);
if ReadBool(ASection, 'FontStyleBold', fsBold in Font.Style) then
Font.Style := Font.Style + [fsBold];
if ReadBool(ASection, 'FontStyleItalic', fsItalic in Font.Style) then
Font.Style := Font.Style + [fsItalic];
if ReadBool(ASection, 'FontStyleUnderline', fsUnderline in Font.Style) then
Font.Style := Font.Style + [fsUnderline];
if ReadBool(ASection, 'FontStyleStrikeOut', fsStrikeOut in Font.Style) then
Font.Style := Font.Style + [fsStrikeOut];
GradientMode := TdxBarStyleGradientMode(ReadInteger(ASection, 'GradientMode', Integer(GradientMode)));
if ValueExists(ASection, 'Image') then
begin
AText := ReadString(ASection, 'Image', '');
SetLength(ABuffer, Length(AText) div 2);
HexToBin(PChar(AText), PChar(ABuffer), Length(AText) div 2);
AStream := TStringStream.Create(ABuffer);
try
AStream.Position := 0;
AGraphicClass := TGraphicClass(GetClass(ReadString(ASection, 'ImageClass', '')));
if AGraphicClass <> nil then
begin
AGraphic := AGraphicClass.Create;
try
AGraphic.LoadFromStream(AStream);
Image.Graphic := AGraphic;
finally
AGraphic.Free;
end;
end;
finally
AStream.Free;
end;
end;
HAlignment := TdxBarStyleHAlignment(ReadInteger(ASection, 'HAlignment', Integer(HAlignment)));
VAlignment := TdxBarStyleVAlignment(ReadInteger(ASection, 'VAlignment', Integer(VAlignment)));
AStyleItem.Tag := ReadInteger(ASection, 'Tag', AStyleItem.Tag);
end;
end;
end;
function GetCustomItem(ACollection: TdxNavBarCustomItems; const ASection: string): TdxNavBarCustomItem;
var
AItemIdentifier: string;
begin
Result := nil;
AItemIdentifier := AStorage.ReadString(ASection, 'Name', '');
if AItemIdentifier <> '' then
Result := TdxNavBarCustomItem(ACollection.ItemByName(AItemIdentifier))
else
begin
AItemIdentifier := AStorage.ReadString(ASection, 'Caption', '');
if AItemIdentifier <> '' then
Result := ACollection.ItemByCaption(AItemIdentifier);
end;
if Result = nil then
Result := ACollection.Add;
end;
procedure ReadItem(AIndex: Integer);
var
AItem: TdxNavBarItem;
ASection: string;
begin
ASection := 'Item' + IntToStr(AIndex);
AItem := TdxNavBarItem(GetCustomItem(Items, ASection));
AItem.Caption := AStorage.ReadString(ASection, 'Caption', AItem.Caption);
AItem.Enabled := AStorage.ReadBool(ASection, 'Enabled', AItem.Enabled);
AItem.Hint := AStorage.ReadString(ASection, 'Hint', AItem.Hint);
AItem.LargeImageIndex := AStorage.ReadInteger(ASection, 'LargeImageIndex',
AItem.LargeImageIndex);
AItem.SmallImageIndex := AStorage.ReadInteger(ASection, 'SmallImageIndex',
AItem.SmallImageIndex);
if LoadStyles and (Styles.Count > 0) then
begin
if AStorage.ValueExists(ASection, 'StyleStyleIndex') then
AItem.Style := Styles[AStorage.ReadInteger(ASection, 'StyleStyleIndex', 0)];
if AStorage.ValueExists(ASection, 'StyleDisabledStyleIndex') then
AItem.StyleDisabled := Styles[AStorage.ReadInteger(ASection, 'StyleDisabledStyleIndex', 0)];
if AStorage.ValueExists(ASection, 'StyleHotTrackedStyleIndex') then
AItem.StyleHotTracked := Styles[AStorage.ReadInteger(ASection, 'StyleHotTrackedStyleIndex', 0)];
if AStorage.ValueExists(ASection, 'StylePressedStyleIndex') then
AItem.StylePressed := Styles[AStorage.ReadInteger(ASection, 'StylePressedStyleIndex', 0)];
end;
AItem.Tag := AStorage.ReadInteger(ASection, 'Tag', AItem.Tag);
AItem.Visible := AStorage.ReadBool(ASection, 'Visible', AItem.Visible);
end;
procedure ReadGroup(AIndex: Integer);
var
J, ALinkCount: Integer;
ASection: string;
AGroup: TdxNavBarGroup;
AUseControl: Boolean;
AControlName: string;
AControl: TCustomControl;
AItemIndex: Integer;
begin
ASection := 'Group' + IntToStr(AIndex);
AGroup := TdxNavBarGroup(GetCustomItem(Groups, ASection));
with AGroup do
begin
Caption := AStorage.ReadString(ASection, 'Caption', Caption);
Expanded := AStorage.ReadBool(ASection, 'Expanded', Expanded);
Hint := AStorage.ReadString(ASection, 'Hint', Hint);
LargeImageIndex := AStorage.ReadInteger(ASection, 'LargeImageIndex', LargeImageIndex);
LinksUseSmallImages := AStorage.ReadBool(ASection, 'LinksUseSmallImages', LinksUseSmallImages);
ClearLinks;
ALinkCount := AStorage.ReadInteger(ASection, 'LinkCount', 0);
for J := 0 to ALinkCount - 1 do
begin
AItemIndex :=
AStorage.ReadInteger(ASection, 'Link' + IntToStr(J) + 'ItemIndex', -1);
if (AItemIndex >= 0) and (AItemIndex < Items.Count) then
CreateLink(Items[AItemIndex]);
end;
SelectedLinkIndex := AStorage.ReadInteger(ASection, 'SelectedLinkIndex', SelectedLinkIndex);
ShowAsIconView := AStorage.ReadBool(ASection, 'ShowAsIconView', ShowAsIconView);
ShowExpandButton := AStorage.ReadBool(ASection, 'ShowExpandButton', ShowExpandButton);
SmallImageIndex := AStorage.ReadInteger(ASection, 'SmallImageIndex', SmallImageIndex);
if LoadStyles and (Styles.Count > 0) then
begin
if AStorage.ValueExists(ASection, 'StyleBackgroundStyleIndex') then
StyleBackground := Styles[AStorage.ReadInteger(ASection, 'StyleBackgroundStyleIndex', 0)];
if AStorage.ValueExists(ASection, 'StyleHeaderStyleIndex') then
StyleHeader := Styles[AStorage.ReadInteger(ASection, 'StyleHeaderStyleIndex', 0)];
if AStorage.ValueExists(ASection, 'StyleHeaderActiveStyleIndex') then
StyleHeaderActive := Styles[AStorage.ReadInteger(ASection, 'StyleHeaderActiveStyleIndex', 0)];
if AStorage.ValueExists(ASection, 'StyleHeaderHotTrackedStyleIndex') then
StyleHeaderHotTracked := Styles[AStorage.ReadInteger(ASection, 'StyleHeaderHotTrackedStyleIndex', 0)];
if AStorage.ValueExists(ASection, 'StyleHeaderPressedStyleIndex') then
StyleHeaderPressed := Styles[AStorage.ReadInteger(ASection, 'StyleHeaderPressedStyleIndex', 0)];
end;
Tag := AStorage.ReadInteger(ASection, 'Tag', Tag);
TopVisibleLinkIndex := AStorage.ReadInteger(ASection, 'TopVisibleLinkIndex', TopVisibleLinkIndex);
UseSmallImages := AStorage.ReadBool(ASection, 'UseSmallImages', UseSmallImages);
Visible := AStorage.ReadBool(ASection, 'Visible', Visible);
AUseControl := AStorage.ReadBool(ASection, 'UseControl', UseControl);
if AUseControl then
begin
AControlName := AStorage.ReadString(ASection, 'ControlName', '');
AControl := TCustomControl(Owner.FindComponent(AControlName));
if AControl is TdxNavBarGroupControl then
begin
AGroup.AcceptControl(AControl as TdxNavBarGroupControl);
UseControl := AUseControl;
ShowControl := AStorage.ReadBool(ASection, 'ShowControl', ShowControl);
end;
end;
end;
AGroup.Index := AIndex;
end;
var
AActiveGroupIndex, ACount, I: Integer;
AGroupControl: TdxNavBarGroupControl;
AGroupControls: TList;
begin
View := AStorage.ReadInteger('Layout', 'View', View);
if LoadStyles and AStorage.ValueExists('Layout', 'StyleCount') then
begin
Styles.Clear;
ACount := AStorage.ReadInteger('Layout', 'StyleCount', Styles.Count);
for I := 0 to ACount - 1 do
ReadStyle(I);
end;
if AStorage.ValueExists('Layout', 'ItemCount') then
begin
ACount := AStorage.ReadInteger('Layout', 'ItemCount', Items.Count);
for I := 0 to ACount - 1 do
ReadItem(I);
end;
if AStorage.ValueExists('Layout', 'GroupCount') then
begin
AGroupControls := TList.Create;
try
for I := 0 to Groups.Count - 1 do
begin
if Groups[I].UseControl and (Groups[I].Control <> nil) then
begin
AGroupControls.Add(Groups[I].Control);
Groups[I].ReleaseControl;
end;
end;
ACount := AStorage.ReadInteger('Layout', 'GroupCount', Groups.Count);
for I := 0 to ACount - 1 do
ReadGroup(I);
for I := 0 to AGroupControls.Count - 1 do
begin
AGroupControl := TdxNavBarGroupControl(AGroupControls[I]);
if AGroupControl.Group = nil then
AGroupControl.Free;
end;
finally
AGroupControls.Free;
end;
end;
AActiveGroupIndex := AStorage.ReadInteger('Layout', 'ActiveGroup', ActiveGroupIndex);
if (0 <= AActiveGroupIndex) and (AActiveGroupIndex < Groups.Count) then
ActiveGroupIndex := AActiveGroupIndex;
NavigationPaneMaxVisibleGroups := AStorage.ReadInteger('Layout',
'NavigationPaneMaxVisibleGroups', NavigationPaneMaxVisibleGroups);
if LoadStyles and (Styles.Count > 0) then
begin
if AStorage.ValueExists('Layout', 'StyleBackgroundStyleIndex') then
StyleBackground := Styles[AStorage.ReadInteger('Layout', 'StyleBackgroundStyleIndex', 0)];
if AStorage.ValueExists('Layout', 'StyleButtonStyleIndex') then
StyleButton := Styles[AStorage.ReadInteger('Layout', 'StyleButtonStyleIndex', 0)];
if AStorage.ValueExists('Layout', 'StyleButtonHotTrackedStyleIndex') then
StyleButtonHotTracked := Styles[AStorage.ReadInteger('Layout', 'StyleButtonHotTrackedStyleIndex', 0)];
if AStorage.ValueExists('Layout', 'StyleButtonPressedStyleIndex') then
StyleButtonPressed := Styles[AStorage.ReadInteger('Layout', 'StyleButtonPressedStyleIndex', 0)];
if AStorage.ValueExists('Layout', 'StyleDropTargetGroupStyleIndex') then
StyleDropTargetGroup := Styles[AStorage.ReadInteger('Layout', 'StyleDropTargetGroupStyleIndex', 0)];
if AStorage.ValueExists('Layout', 'StyleDropTargetLinkStyleIndex') then
StyleDropTargetLink := Styles[AStorage.ReadInteger('Layout', 'StyleDropTargetLinkStyleIndex', 0)];
if AStorage.ValueExists('Layout', 'StyleHintStyleIndex') then
StyleHint := Styles[AStorage.ReadInteger('Layout', 'StyleHintPressedStyleIndex', 0)];
if AStorage.ValueExists('Layout', 'StyleNavigationPaneHeaderStyleIndex') then
StyleNavigationPaneHeader := Styles[AStorage.ReadInteger('Layout', 'StyleNavigationPaneHeaderStyleIndex', 0)];
end;
end;
procedure TdxCustomNavBar.SaveToRegIni(AStorage: TCustomIniFile; SaveStyles: Boolean);
procedure WriteStyle(AStyleItem: TdxNavBarStyleItem);
var
ASection, AText: string;
AStream: TStringStream;
begin
with AStorage do
begin
ASection := 'Style' + IntToStr(AStyleItem.Index);
with AStyleItem.Style do
begin
if savBackColor in AssignedValues then
WriteInteger(ASection, 'BackColor', BackColor);
if savBackColor2 in AssignedValues then
WriteInteger(ASection, 'BackColor2', BackColor2);
if savAlphaBlending in AssignedValues then
WriteInteger(ASection, 'AlphaBlending', AlphaBlending);
if savAlphaBlending2 in AssignedValues then
WriteInteger(ASection, 'AlphaBlending2', AlphaBlending2);
if savFont in AssignedValues then
begin
WriteInteger(ASection, 'FontCharset', Integer(Font.Charset));
WriteInteger(ASection, 'FontColor', Font.Color);
WriteInteger(ASection, 'FontHeight', Font.Height);
WriteString(ASection, 'FontName', Font.Name);
WriteInteger(ASection, 'FontPitch', Integer(Font.Pitch));
WriteInteger(ASection, 'FontSize', Font.Size);
WriteBool(ASection, 'FontStyleBold', fsBold in Font.Style);
WriteBool(ASection, 'FontStyleItalic', fsItalic in Font.Style);
WriteBool(ASection, 'FontStyleUnderline', fsUnderline in Font.Style);
WriteBool(ASection, 'FontStyleStrikeOut', fsStrikeOut in Font.Style);
end;
if savGradientMode in AssignedValues then
WriteInteger(ASection, 'GradientMode', Integer(GradientMode));
if (savImage in AssignedValues) and (Image.Graphic <> nil) and
not Image.Graphic.Empty then
begin
AStream := TStringStream.Create('');
try
Image.Graphic.SaveToStream(AStream);
AStream.Position := 0;
SetLength(AText, Length(AStream.DataString) * 2);
BinToHex(PChar(AStream.DataString), PChar(AText), Length(AStream.DataString));
WriteString(ASection, 'ImageClass', Image.Graphic.ClassName);
WriteString(ASection, 'Image', AText);
finally
AStream.Free;
end;
end;
if savHAlignment in AssignedValues then
WriteInteger(ASection, 'HAlignment', Integer(HAlignment));
if savVAlignment in AssignedValues then
WriteInteger(ASection, 'VAlignment', Integer(VAlignment));
WriteInteger(ASection, 'Tag', AStyleItem.Tag);
end;
end;
end;
procedure WriteItem(AItem: TdxNavBarItem);
var
ASection: string;
begin
ASection := 'Item' + IntToStr(AItem.Index);
AStorage.WriteString(ASection, 'Caption', AItem.Caption);
AStorage.WriteBool(ASection, 'Enabled', AItem.Enabled);
AStorage.WriteString(ASection, 'Hint', AItem.Hint);
AStorage.WriteInteger(ASection, 'LargeImageIndex', AItem.LargeImageIndex);
AStorage.WriteString(ASection, 'Name', AItem.Name);
AStorage.WriteInteger(ASection, 'SmallImageIndex', AItem.SmallImageIndex);
if SaveStyles and (Styles.Count > 0) then
begin
if AItem.Style <> nil then
AStorage.WriteInteger(ASection, 'StyleStyleIndex', AItem.Style.Index);
if AItem.StyleDisabled <> nil then
AStorage.WriteInteger(ASection, 'StyleDisabledStyleIndex', AItem.StyleDisabled.Index);
if AItem.StyleHotTracked <> nil then
AStorage.WriteInteger(ASection, 'StyleHotTrackedStyleIndex', AItem.StyleHotTracked.Index);
if AItem.StylePressed <> nil then
AStorage.WriteInteger(ASection, 'StylePressedStyleIndex', AItem.StylePressed.Index);
end;
AStorage.WriteInteger(ASection, 'Tag', AItem.Tag);
AStorage.WriteBool(ASection, 'Visible', AItem.Visible);
end;
procedure WriteGroup(AGroup: TdxNavBarGroup);
var
J: Integer;
ASection: string;
begin
with AStorage do
begin
ASection := 'Group' + IntToStr(AGroup.Index);
with AGroup do
begin
WriteString(ASection, 'Caption', Caption);
WriteBool(ASection, 'Expanded', Expanded);
WriteString(ASection, 'Hint', Hint);
WriteInteger(ASection, 'LargeImageIndex', LargeImageIndex);
WriteInteger(ASection, 'LinkCount', LinkCount);
for J := 0 to LinkCount - 1 do
if Links[J].Item <> nil then
WriteInteger(ASection, 'Link' + IntToStr(J) + 'ItemIndex', Links[J].Item.Index);
WriteBool(ASection, 'LinksUseSmallImages', LinksUseSmallImages);
WriteString(ASection, 'Name', Name);
WriteInteger(ASection, 'SelectedLinkIndex', SelectedLinkIndex);
WriteBool(ASection, 'ShowControl', ShowControl);
WriteBool(ASection, 'ShowAsIconView', ShowAsIconView);
WriteBool(ASection, 'ShowExpandButton', ShowExpandButton);
WriteInteger(ASection, 'SmallImageIndex', SmallImageIndex);
if SaveStyles and (Styles.Count > 0) then
begin
if StyleBackground <> nil then
WriteInteger(ASection, 'StyleBackgroundStyleIndex', StyleBackground.Index);
if StyleHeader <> nil then
WriteInteger(ASection, 'StyleHeaderStyleIndex', StyleHeader.Index);
if StyleHeaderActive <> nil then
WriteInteger(ASection, 'StyleHeaderActiveStyleIndex', StyleHeaderActive.Index);
if StyleHeaderHotTracked <> nil then
WriteInteger(ASection, 'StyleHeaderHotTrackedStyleIndex', StyleHeaderHotTracked.Index);
if StyleHeaderPressed <> nil then
WriteInteger(ASection, 'StyleHeaderPressedStyleIndex', StyleHeaderPressed.Index);
end;
WriteInteger(ASection, 'Tag', Tag);
WriteInteger(ASection, 'TopVisibleLinkIndex', TopVisibleLinkIndex);
WriteBool(ASection, 'UseSmallImages', UseSmallImages);
WriteBool(ASection, 'Visible', Visible);
WriteBool(ASection, 'UseControl', UseControl);
if UseControl then
begin
WriteBool(ASection, 'ShowControl', ShowControl);
if Control <> nil then
WriteString(ASection, 'ControlName', Control.Name);
end;
end;
end;
end;
var
I: Integer;
ASections: TStringList;
begin
with AStorage do
begin
ASections := TStringList.Create;
try
ReadSections(ASections);
for I := 0 to ASections.Count - 1 do
if (Pos('Layout', ASections[I]) > 0) or (Pos('Group', ASections[I]) > 0) or
(Pos('Item', ASections[I]) > 0) or (Pos('Style', ASections[I]) > 0) then
EraseSection(ASections[I]);
finally
ASections.Free;
end;
WriteInteger('Layout', 'View', View);
if SaveStyles then
begin
WriteInteger('Layout', 'StyleCount', Styles.Count);
for I := 0 to Styles.Count - 1 do
WriteStyle(Styles[I]);
end;
WriteInteger('Layout', 'ItemCount', Items.Count);
for I := 0 to Items.Count - 1 do
WriteItem(Items[I]);
WriteInteger('Layout', 'GroupCount', Groups.Count);
for I := 0 to Groups.Count - 1 do
WriteGroup(Groups[I]);
if SaveStyles and (Styles.Count > 0) then
begin
if StyleBackground <> nil then
WriteInteger('Layout', 'StyleBackgroundStyleIndex', StyleBackground.Index);
if StyleButton <> nil then
WriteInteger('Layout', 'StyleButtonStyleIndex', StyleButton.Index);
if StyleButtonHotTracked <> nil then
WriteInteger('Layout', 'StyleButtonHotTrackedStyleIndex', StyleButtonHotTracked.Index);
if StyleButtonPressed <> nil then
WriteInteger('Layout', 'StyleButtonPressedStyleIndex', StyleButtonPressed.Index);
if StyleDropTargetGroup <> nil then
WriteInteger('Layout', 'StyleDropTargetGroupStyleIndex', StyleDropTargetGroup.Index);
if StyleDropTargetLink <> nil then
WriteInteger('Layout', 'StyleDropTargetLinkStyleIndex', StyleDropTargetLink.Index);
if StyleHint <> nil then
WriteInteger('Layout', 'StyleHintStyleIndex', StyleHint.Index);
if StyleNavigationPaneHeader <> nil then
WriteInteger('Layout', 'StyleNavigationPaneHeaderStyleIndex', StyleNavigationPaneHeader.Index);
end;
WriteInteger('Layout', 'ActiveGroup', ActiveGroupIndex);
WriteInteger('Layout', 'NavigationPaneMaxVisibleGroups', NavigationPaneMaxVisibleGroups);
end;
end;
function TdxCustomNavBar.CreatePainter: TdxNavBarPainter;
begin
Result := dxNavBarViewsFactory.PainterClasses[FView].Create(Self);
end;
function TdxCustomNavBar.GetGroupClass: TdxNavBarGroupClass;
begin
Result := TdxNavBarGroup;
end;
function TdxCustomNavBar.GetItemClass: TdxNavBarItemClass;
begin
Result := TdxNavBarItem;
end;
function TdxCustomNavBar.GetActiveGroup: TdxNavBarGroup;
var
I: Integer;
AGroup: TdxNavBarGroup;
begin
if (Groups = nil) or (Groups.Count = 0) then
Result := nil
else if (FActiveGroup = nil) or not FActiveGroup.Visible then
begin
AGroup := nil;
for I := 0 to Groups.Count - 1 do
if Groups[I].Visible then
begin
AGroup := Groups[I];
break;
end;
if FActiveGroup = nil then
FActiveGroup := AGroup;
Result := AGroup;
end
else Result := FActiveGroup;
end;
function TdxCustomNavBar.GetActiveGroupIndex: Integer;
begin
if ActiveGroup <> nil then
Result := ActiveGroup.Index
else Result := -1;
end;
function TdxCustomNavBar.GetNavigationPaneOverflowPanelItemCount: Integer;
begin
if csLoading in ComponentState then
Result := 0
else
if NavigationPaneMaxVisibleGroups = -1 then
Result := 0
else
Result := Max(0, VisibleGroupCount - NavigationPaneMaxVisibleGroups);
end;
function TdxCustomNavBar.GetEnableDragging: Boolean;
begin
Result := (dxNavBarDragObject <> nil) or FEnableDragging;
end;
function TdxCustomNavBar.GetPainter: TdxNavBarPainter;
begin
if FPainter = nil then
FPainter := CreatePainter;
Result := FPainter;
end;
function TdxCustomNavBar.GetScrollPosition: Integer;
begin
if (FScrollBar <> nil) and FScrollBar.Visible then
Result := FScrollBar.Position
else Result := 0;
end;
function TdxCustomNavBar.GetSourceGroup: TdxNavBarGroup;
begin
if EnableDragging and (dxNavBarDragObject <> nil) then
Result := dxNavBarDragObject.SourceGroup
else Result := FSourceGroup;
end;
function TdxCustomNavBar.GetSourceLink: TdxNavBarItemLink;
begin
if EnableDragging and (dxNavBarDragObject <> nil) then
Result := dxNavBarDragObject.SourceLink
else Result := FSourceLink;
end;
function TdxCustomNavBar.GetSourceItem: TdxNavBarItem;
begin
if EnableDragging and (dxNavBarDragObject <> nil) then
Result := dxNavBarDragObject.SourceItem
else Result := nil;
end;
function TdxCustomNavBar.GetTargetGroup: TdxNavBarGroup;
begin
if dxNavBarDragObject <> nil then
Result := dxNavBarDragObject.TargetGroup
else Result := nil;
end;
function TdxCustomNavBar.GetTargetLink1: TdxNavBarItemLink;
begin
if dxNavBarDragObject <> nil then
Result := dxNavBarDragObject.TargetLink1
else Result := nil;
end;
function TdxCustomNavBar.GetTargetLink2: TdxNavBarItemLink;
begin
if dxNavBarDragObject <> nil then
Result := dxNavBarDragObject.TargetLink2
else Result := nil;
end;
function TdxCustomNavBar.GetTargetLinkIndex: Integer;
begin
if dxNavBarDragObject <> nil then
Result := dxNavBarDragObject.TargetLinkIndex
else Result := -1;
end;
function TdxCustomNavBar.GetViewInfo: TdxNavBarViewInfo;
begin
if Painter <> nil then
Result := Painter.ViewInfo
else Result := nil;
end;
function TdxCustomNavBar.GetViewStyle: TdxNavBarPainter;
begin
Result := FPainter;
end;
function TdxCustomNavBar.GetVisibleGroupCount: Integer;
var
I: Integer;
begin
Result := 0;
for I := 0 to Groups.Count - 1 do
if Groups[I].Visible then Inc(Result);
end;
procedure TdxCustomNavBar.SetActiveGroup(Value: TdxNavBarGroup);
var
AAllowChanging: Boolean;
begin
if FActiveGroup <> Value then
begin
AAllowChanging := True;
DoActiveGroupChanging(Value, AAllowChanging);
if AAllowChanging then
begin
FActiveGroup := Value;
InvalidateAll(doRecreate);
DoActiveGroupChanged;
end;
end;
end;
procedure TdxCustomNavBar.SetActiveGroupIndex(Value: Integer);
begin
if not (csLoading in ComponentState) then
begin
if (0 <= Value) and (Value < Groups.Count) then
ActiveGroup := Groups[Value];
end
else FActiveGroupIndex := Value;
end;
procedure TdxCustomNavBar.SetAllowSelectLinks(const Value: Boolean);
begin
if FAllowSelectLinks <> Value then
begin
FAllowSelectLinks := Value;
if not FAllowSelectLinks then DeSelectLinks;
InvalidateAll(doRedraw);
end;
end;
procedure TdxCustomNavBar.SetDefaultStyles(const Value: TdxNavBarDefaultStyles);
begin
FDefaultStyles.Assign(Value);
end;
procedure TdxCustomNavBar.SetEachGroupHasSelectedLink(const Value: Boolean);
begin
if FEachGroupHasSelectedLink <> Value then
begin
FEachGroupHasSelectedLink := Value;
if not FEachGroupHasSelectedLink then DeSelectLinks;
InvalidateAll(doRedraw);
end;
end;
procedure TdxCustomNavBar.SetLargeImages(const Value: TCustomImageList);
begin
cxSetImageList(Value, FLargeImages, FLargeChangeLink, Self);
end;
procedure TdxCustomNavBar.SetNavigationPaneOverflowPanelUseSmallImages(const Value: Boolean);
begin
if FNavigationPaneOverflowPanelUseSmallImages <> Value then
begin
FNavigationPaneOverflowPanelUseSmallImages := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetNavigationPaneMaxVisibleGroups(Value: Integer);
begin
if Value < -1 then Value := -1;
if FNavigationPaneMaxVisibleGroups <> Value then
begin
FNavigationPaneMaxVisibleGroups := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetShowGroupCaptions(const Value: Boolean);
begin
if FShowGroupCaptions <> Value then
begin
FShowGroupCaptions := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetShowSpecialGroup(const Value: Boolean);
begin
if FShowSpecialGroup <> Value then
begin
FShowSpecialGroup := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetSmallImages(const Value: TCustomImageList);
begin
cxSetImageList(Value, FSmallImages, FSmallChangeLink, Self);
end;
procedure TdxCustomNavBar.SetSpaceBetweenGroups(Value: Integer);
begin
if FSpaceBetweenGroups <> Value then
begin
if Value < 0 then Value := 0;
FSpaceBetweenGroups := Value;
InvalidateAll(doRecalc);
end;
end;
procedure TdxCustomNavBar.SetStyleBackground(const Value: TdxNavBarStyleItem);
begin
if FStyleBackground <> Value then
begin
FStyleBackground := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetStyleHint(const Value: TdxNavBarStyleItem);
begin
if FStyleHint <> Value then
begin
FStyleHint := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetStyleDropTargetGroup(const Value: TdxNavBarStyleItem);
begin
if FStyleDropTargetGroup <> Value then
begin
FStyleDropTargetGroup := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetStyleDropTargetLink(const Value: TdxNavBarStyleItem);
begin
if FStyleDropTargetLink <> Value then
begin
FStyleDropTargetLink := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetStyleButton(const Value: TdxNavBarStyleItem);
begin
if FStyleButton <> Value then
begin
FStyleButton := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetStyleButtonHotTracked(const Value: TdxNavBarStyleItem);
begin
if FStyleButtonHotTracked <> Value then
begin
FStyleButtonHotTracked := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetStyleButtonPressed(const Value: TdxNavBarStyleItem);
begin
if FStyleButtonPressed <> Value then
begin
FStyleButtonPressed := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetStyleNavigationPaneHeader(const Value: TdxNavBarStyleItem);
begin
if FStyleNavigationPaneHeader <> Value then
begin
FStyleNavigationPaneHeader := Value;
InvalidateAll(doRecreate);
end;
end;
procedure TdxCustomNavBar.SetView(Value: Integer);
begin
if FView <> Value then
begin
Value := Min(Max(Value, 0), dxNavBarViewsFactory.Count - 1);
FView := Value;
FPainter.Free;
FPainter := CreatePainter;
if ScrollBar <> nil then
ScrollBar.Visible := False;
AssignDefaultStyles;
InvalidateAll(doRecreate);
DesignerUpdate(nil);
DoUpdateScrollBarStyle;
end;
end;
procedure TdxCustomNavBar.SetViewStyle(Value: TdxNavBarPainter);
begin
if Value = nil then
SetView(0)
else
begin
FreeAndNil(FPainter);
FPainter := Value;
AssignDefaultStyles;
InvalidateAll(doRecreate);
DesignerUpdate(nil);
end;
end;
procedure TdxCustomNavBar.AssignDefaultStyles;
begin
if csLoading in ComponentState then exit;
DefaultStyles.AssignDefaultValues(False);
InvalidateAll(doRecalc);
end;
procedure TdxCustomNavBar.LoadFromIniFile(AFileName: string; LoadStyles: Boolean = True);
var
AStream: TFileStream;
begin
if AFileName = '' then exit;
{$IFDEF DELPHI6}
AStream := TFileStream.Create(AFileName, fmOpenRead, fmShareDenyWrite);
{$ELSE}
AStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
{$ENDIF}
try
LoadFromStream(AStream, LoadStyles);
finally
AStream.Free;
end;
end;
procedure TdxCustomNavBar.LoadFromRegistry(ARegistryPath: string; LoadStyles: Boolean = True);
var
Storage: TRegistryIniFile;
begin
if ARegistryPath = '' then exit;
Storage := TRegistryIniFile.Create(ARegistryPath);
try
LoadFromRegIni(Storage, LoadStyles);
finally
Storage.Free;
end;
end;
procedure TdxCustomNavBar.LoadFromStream(AStream: TStream; LoadStyles: Boolean = True);
var
Storage: TMemIniFile;
AStrings: TStringList;
begin
Storage := TMemIniFile.Create('');
AStrings := TStringList.Create;
try
AStrings.LoadFromStream(AStream);
Storage.SetStrings(AStrings);
LoadFromRegIni(Storage, LoadStyles);
finally
AStrings.Free;
Storage.Free;
end;
end;
procedure TdxCustomNavBar.SaveToIniFile(AFileName: string; SaveStyles: Boolean = True);
var
AStream: TFileStream;
begin
if AFileName = '' then Exit;
{$IFDEF DELPHI6}
AStream := TFileStream.Create(AFileName, fmCreate, fmShareExclusive);
{$ELSE}
AStream := TFileStream.Create(AFileName, fmCreate or fmShareExclusive);
{$ENDIF}
try
SaveToStream(AStream, SaveStyles);
finally
AStream.Free;
end;
end;
procedure TdxCustomNavBar.SaveToRegistry(ARegistryPath: string; SaveStyles: Boolean = True);
var
Storage: TRegistryIniFile;
begin
if ARegistryPath = '' then exit;
Storage := TRegistryIniFile.Create(ARegistryPath);
try
SaveToRegIni(Storage, SaveStyles);
finally
Storage.Free;
end;
end;
procedure TdxCustomNavBar.SaveToStream(AStream: TStream; SaveStyles: Boolean = True);
var
Storage: TMemIniFile;
AStrings: TStringList;
begin
Storage := TMemIniFile.Create('');
AStrings := TStringList.Create;
try
SaveToRegIni(Storage, SaveStyles);
Storage.GetStrings(AStrings);
AStrings.SaveToStream(AStream);
finally
AStrings.Free;
Storage.Free;
end;
end;
function TdxCustomNavBar.GetGroupAtCaptionPos(pt: TPoint): TdxNavBarGroup;
begin
Result := ViewInfo.GetGroupAtCaptionPos(pt);
end;
function TdxCustomNavBar.GetGroupAtItemsPos(pt: TPoint): TdxNavBarGroup;
begin
Result := ViewInfo.GetGroupAtItemsPos(pt);
end;
function TdxCustomNavBar.GetLinkAtPos(pt: TPoint): TdxNavBarItemLink;
begin
Result := ViewInfo.GetLinkAtPos(pt);
end;
function TdxCustomNavBar.GetLinkAtSelectedPos(pt: TPoint): TdxNavBarItemLink;
begin
Result := ViewInfo.GetLinkAtSelectedPos(pt);
end;
function TdxCustomNavBar.IsPtTopScrollButton(pt: TPoint): Boolean;
begin
Result := ViewInfo.IsPtTopScrollButton(pt);
end;
function TdxCustomNavBar.IsPtBottomScrollButton(pt: TPoint): Boolean;
begin
Result := ViewInfo.IsPtBottomScrollButton(pt);
end;
function TdxCustomNavBar.IsTopScrollButtonVisible: Boolean;
begin
Result := ViewInfo.IsTopScrollButtonVisible;
end;
function TdxCustomNavBar.IsBottomScrollButtonVisible: Boolean;
begin
Result := ViewInfo.IsBottomScrollButtonVisible;
end;
function TdxCustomNavBar.IsPtNavigationPaneHeader(pt: TPoint): Boolean;
begin
Result := ViewInfo.IsPtNavigationPaneHeader(pt);
end;
function TdxCustomNavBar.IsPtNavigationPaneSplitter(pt: TPoint): Boolean;
begin
Result := ViewInfo.IsPtNavigationPaneSplitter(pt);
end;
function TdxCustomNavBar.IsPtNavigationPaneOverflowPanel(pt: TPoint): Boolean;
begin
Result := ViewInfo.IsPtNavigationPaneOverflowPanel(pt);
end;
procedure TdxCustomNavBar.MakeLinkVisible(ALink: TdxNavBarItemLink);
begin
ViewInfo.MakeLinkVisible(ALink);
end;
procedure TdxCustomNavBar.MakeGroupVisible(AGroup: TdxNavBarGroup);
begin
ViewInfo.MakeGroupVisible(AGroup);
end;
procedure TdxCustomNavBar.BeginUpdate;
begin
Inc(FUpdateLock);
end;
procedure TdxCustomNavBar.EndUpdate;
begin
Dec(FUpdateLock);
if FUpdateLock = 0 then InvalidateAll(doRecreate);
end;
function TdxCustomNavBar.CanDecNavigationPaneOverflowPanelItemCount: Boolean;
begin
Result := ShowGroupCaptions and (NavigationPaneOverflowPanelItemCount > 0);
end;
function TdxCustomNavBar.CanIncNavigationPaneOverflowPanelItemCount: Boolean;
begin
Result := ShowGroupCaptions and (NavigationPaneOverflowPanelItemCount < VisibleGroupCount);
end;
procedure TdxCustomNavBar.DoDecNavigationPaneOverflowPanelItemCount;
begin
if NavigationPaneMaxVisibleGroups = VisibleGroupCount - 1 then
NavigationPaneMaxVisibleGroups := -1
else
NavigationPaneMaxVisibleGroups := NavigationPaneMaxVisibleGroups + 1;
end;
procedure TdxCustomNavBar.DoIncNavigationPaneOverflowPanelItemCount;
begin
if (NavigationPaneMaxVisibleGroups = -1) or
(NavigationPaneMaxVisibleGroups > VisibleGroupCount) then
NavigationPaneMaxVisibleGroups := VisibleGroupCount - 1
else
NavigationPaneMaxVisibleGroups := NavigationPaneMaxVisibleGroups - 1;
end;
procedure TdxCustomNavBar.DragDone;
begin
dxNavBarDragObject.Free;
dxNavBarDragObject := nil;
FEnableDragging := False;
DragMode := dmManual;
FSourceGroup := nil;
FSourceLink := nil;
end;
function TdxCustomNavBar.IsAllowDragLink: Boolean;
begin
Result := fAllowDragLink in FDragDropFlags;
end;
function TdxCustomNavBar.IsAllowDropLink: Boolean;
begin
Result := fAllowDropLink in FDragDropFlags;
end;
function TdxCustomNavBar.IsAllowDragGroup: Boolean;
begin
Result := fAllowDragGroup in FDragDropFlags;
end;
function TdxCustomNavBar.IsAllowDropGroup: Boolean;
begin
Result := fAllowDropGroup in FDragDropFlags;
end;
procedure TdxCustomNavBar.CMMouseEnter(var Message: TMessage);
begin
MouseEnter;
end;
procedure TdxCustomNavBar.CMMouseLeave(var Message: TMessage);
begin
MouseLeave;
end;
procedure TdxCustomNavBar.CMSysColorChange(var Message: TMessage);
begin
ViewInfo.RefreshColors;
InvalidateAll(doRedraw);
end;
procedure TdxCustomNavBar.WMVScroll(var Message: TWMVScroll);
var
AScrollPos: Integer;
begin
inherited;
AScrollPos := Message.Pos;
ScrollBar.Scroll(ScrollBar, TScrollCode(Message.ScrollCode), AScrollPos);
end;
procedure TdxCustomNavBar.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
Message.Result := 1;
end;
procedure TdxCustomNavBar.WMSetCursor(var Msg: TWMSetCursor);
function IsNavPaneHot: Boolean;
begin
Result := (FNavigationPaneOverflowPanelHotTrackedIndex <> -1) or NavigationPaneOverflowPanelSignHotTracked;
end;
begin
if (EnableSplitterDragging or IsPtNavigationPaneSplitter(TargetPoint)) and ShowGroupCaptions then
SetCursor(Screen.Cursors[crSizeNS])
else if IsNavPaneHot then
SetCursor(Screen.Cursors[FHotTrackedGroupCursor])
else if FHotTrackedGroup <> nil then
SetCursor(Screen.Cursors[FHotTrackedGroupCursor])
else if (HotTrackedLink <> nil) and (HotTrackedLink.Item.Enabled) then
SetCursor(Screen.Cursors[HotTrackedLinkCursor])
else inherited;
end;
procedure TdxCustomNavBar.WMCreate(var Msg: TWMCreate);
begin
inherited;
InvalidateAll(doRecreate);
end;
{ TdxNabBarDragObject }
constructor TdxNavBarDragObject.Create(ANavBar: TdxCustomNavBar;
var DragObject: TDragObject {deprecated};
ASourceGroup: TdxNavBarGroup; ASourceLink: TdxNavBarItemLink; ASourceItem: TdxNavBarItem);
begin
inherited Create;
FNavBar := ANavBar;
FSourceLink := ASourceLink;
FSourceGroup := ASourceGroup;
FSourceItem := ASourceItem;
end;
procedure TdxNavBarDragObject.UpdateTargets;
begin
if SourceGroup <> nil then
begin
FTargetGroup := NavBar.ViewInfo.GetGroupAtCaptionPos(NavBar.TargetPoint);
if FTargetGroup = nil then
FTargetGroup := NavBar.ViewInfo.GetGroupAtItemsPos(NavBar.TargetPoint);
end
else if (SourceLink <> nil) or (SourceItem <> nil) then
FTargetLinkIndex := NavBar.ViewInfo.GetLinksAtDragPosition(NavBar.TargetPoint,
FTargetGroup, FTargetLink1, FTargetLink2);
end;
function TdxNavBarDragObject.GetSourceItem: TdxNavBarItem;
begin
if FSourceItem <> nil then
Result := FSourceItem
else if (GetKeyState(VK_CONTROL) < 0) and (FSourceLink <> nil) then
Result := FSourceLink.Item
else Result := nil;
end;
{ TdxNavBarScrollBar }
constructor TdxNavBarScrollBar.Create(AParent: TWinControl; AKind: TScrollBarKind);
begin
inherited Create;
FParent := AParent;
FScrollBar := TcxScrollBar.Create(nil);
FScrollBar.ControlStyle := FScrollBar.ControlStyle + [csNoDesignVisible];
FScrollBar.Parent := FParent;
FScrollBar.Kind := AKind;
FScrollBar.OnScroll := Scroll;
Reset;
FKind := AKind;
end;
destructor TdxNavBarScrollBar.Destroy;
begin
FreeAndNil(FScrollBar);
inherited Destroy;
end;
procedure TdxNavBarScrollBar.SetScrollParams(AMin, AMax, APosition, APageSize: Integer; ARedraw:
Boolean = True);
var
AClientRect: TRect;
begin
if (AMax < AMin) or (AMax < APageSize) then
raise EInvalidOperation.Create(SScrollBarRange);
CorrectPos(APosition, AMin, AMax, APageSize);
AClientRect := FParent.ClientRect;
with AClientRect do
if FScrollBar.Kind = sbVertical then
FScrollBar.SetBounds(Right, 0, Self.Width, Bottom - Top)
else
FScrollBar.SetBounds(Left, Bottom, Right - Left, Self.Height);
if (Min <> AMin) or (Max <> AMax) or (PageSize <> APageSize) or (Position <> APosition) then
begin
FScrollInfo.nMin := AMin;
FScrollInfo.nMax := AMax;
FScrollInfo.nPage := APageSize;
FScrollInfo.nPos := APosition;
with FScrollInfo do
FScrollBar.SetScrollParams(nMin, nMax, APosition, APageSize, ARedraw);
FLargeChange := FScrollInfo.nPage;
end;
end;
procedure TdxNavBarScrollBar.Reset;
begin
ZeroMemory(@FScrollInfo, FScrollInfo.cbSize);
FScrollInfo.cbSize := SizeOf(FScrollInfo);
FScrollInfo.fMask := SIF_ALL;
FScrollInfo.nMax := 100;
FScrollBar.Visible := False;
FVisible := False;
end;
procedure TdxNavBarScrollBar.Scroll(Sender: TObject; AScrollCode: TScrollCode; var AScrollPos: Integer);
procedure DoScroll(AScrollCode: TScrollCode; var AScrollPos: Integer);
begin
if Assigned(OnScroll) then
OnScroll(Self, AScrollCode, AScrollPos);
end;
var
ANewPos: Integer;
begin
ANewPos := Position;
case AScrollCode of
scLineUp: Dec(ANewPos, SmallChange);
scLineDown: Inc(ANewPos, SmallChange);
scPageUp: Dec(ANewPos, LargeChange);
scPageDown: Inc(ANewPos, LargeChange);
scPosition, scTrack: ANewPos := AScrollPos;
scTop: ANewPos := Min;
scBottom: ANewPos := Max;
end;
Position := ANewPos;
AScrollPos := ANewPos;
DoScroll(AScrollCode, AScrollPos);
end;
procedure TdxNavBarScrollBar.CorrectPos(var APos: Integer; AMin, AMax, APageSize: Integer);
begin
if APos < AMin then
APos := AMin;
if APos > AMax - APageSize then
APos := AMax - APageSize;
end;
function TdxNavBarScrollBar.GetHandle: THandle;
begin
if FParent.HandleAllocated then
Result := FParent.Handle
else
Result := 0;
end;
function TdxNavBarScrollBar.GetHeight: Integer;
begin
Result := FParent.ClientHeight;
end;
function TdxNavBarScrollBar.GetMax: Integer;
begin
Result := FScrollInfo.nMax;
end;
function TdxNavBarScrollBar.GetMin: Integer;
begin
Result := FScrollInfo.nMin;
end;
function TdxNavBarScrollBar.GetPageSize: Integer;
begin
Result := FScrollInfo.nPage
end;
function TdxNavBarScrollBar.GetPosition: Integer;
begin
Result := FScrollInfo.nPos;
end;
function TdxNavBarScrollBar.GetWidth: Integer;
begin
Result := GetSystemMetrics(SM_CXVSCROLL);
end;
procedure TdxNavBarScrollBar.SetMax(const Value: Integer);
begin
SetScrollParams(Min, Value, Position, PageSize);
end;
procedure TdxNavBarScrollBar.SetMin(const Value: Integer);
begin
SetScrollParams(Value, Max, Position, PageSize);
end;
procedure TdxNavBarScrollBar.SetPageSize(const Value: Integer);
begin
SetScrollParams(Min, Max, Position, Value);
end;
procedure TdxNavBarScrollBar.SetPosition(const Value: Integer);
begin
SetScrollParams(Min, Max, Value, PageSize);
end;
procedure TdxNavBarScrollBar.SetVisible(const Value: Boolean);
begin
if FVisible <> Value then
begin
FVisible := Value;
FScrollBar.Visible := Value;
end;
end;
{ TdxNavBarHintWindow }
procedure TdxNavBarHintWindow.ActivateHint(Rect: TRect; const AHint: string);
begin
Caption := AHint;
UpdateBoundsRect(Rect);
if Rect.Top + Height > Screen.DesktopHeight then
Rect.Top := Screen.DesktopHeight - Height;
if Rect.Left + Width > Screen.DesktopWidth then
Rect.Left := Screen.DesktopWidth - Width;
if Rect.Left < Screen.DesktopLeft then Rect.Left := Screen.DesktopLeft;
if Rect.Bottom < Screen.DesktopTop then Rect.Bottom := Screen.DesktopTop;
SetWindowPos(Handle, HWND_TOPMOST, Rect.Left, Rect.Top, Width, Height,
SWP_NOACTIVATE);
ShowWindow(Handle, SW_SHOWNOACTIVATE);
Invalidate;
end;
function TdxNavBarHintWindow.NavBar: TdxCustomNavBar;
begin
if Owner is TdxCustomNavBar then
Result := Owner as TdxCustomNavBar
else Result := nil;
end;
procedure TdxNavBarHintWindow.WMEraseBkgnd(var Message: TWmEraseBkgnd);
begin
Message.Result := 1;
end;
procedure TdxNavBarHintWindow.WMNCHitTest(var Message: TWMNCHitTest);
begin
Message.Result := HTTRANSPARENT;
end;
procedure TdxNavBarHintWindow.CreateParams(var Params: TCreateParams);
{$IFNDEF DELPHI7}
const
CS_DROPSHADOW = $20000;
{$ENDIF}
begin
inherited CreateParams(Params);
with Params do
begin
Style := WS_POPUP;
WindowClass.Style := WindowClass.Style or CS_SAVEBITS;
if NewStyleControls then ExStyle := WS_EX_TOOLWINDOW;
if IsWinXPOrLater then
WindowClass.Style := WindowClass.style or CS_DROPSHADOW;
AddBiDiModeExStyle(ExStyle);
end;
end;
procedure TdxNavBarHintWindow.Paint;
begin
if NavBar <> nil then
NavBar.Painter.DrawHintWindow
else inherited Paint;
end;
{ TAbstractcxNavBarDesigner }
constructor TAbstractcxNavBarDesigner.Create(ANavBar: TdxCustomNavBar);
begin
inherited Create;
FNavBar := ANavBar;
if FNavBar <> nil then
FNavBar.FDesigner := Self;
end;
destructor TAbstractcxNavBarDesigner.Destroy;
begin
if NavBar <> nil then
NavBar.FDesigner := nil;
inherited Destroy;
end;
initialization
RegisterClasses([TdxNavBar]);
dxNavBarDragObject := nil;
Screen.Cursors[dxNavBarDragCursor] := LoadCursor(HInstance, 'dxNavBarDragCursor');
Screen.Cursors[dxNavBarDragCopyCursor] := LoadCursor(HInstance, 'dxNavBarDragCopyCursor');
Screen.Cursors[dxNavBarLinksCursor] := LoadCursor(HInstance, 'dxNavBarLinksCursor');
finalization
DestroyCursor(Screen.Cursors[dxNavBarLinksCursor]);
DestroyCursor(Screen.Cursors[dxNavBarDragCopyCursor]);
DestroyCursor(Screen.Cursors[dxNavBarDragCursor]);
end.