{*******************************************************************} { } { 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 dxNavBarSkinBasedViews; interface uses Types, Windows, Graphics, Classes, SysUtils, ImgList, cxGraphics, cxClasses, dxNavBar, dxNavBarBase, dxNavBarCollns, dxNavBarStyles, dxNavBarExplorerViews, dxNavBarConsts, dxNavBarOffice11Views, dxNavBarOfficeViews, dxSkinsStrs, dxSkinsCore, dxSkinInfo, cxLookAndFeelPainters; type IdxNavBarColorSchemes = interface ['{C49F9017-0A09-4C8E-BF28-BA5BE0614580}'] function GetCount: Integer; function GetNames(AIndex: Integer): TdxSkinName; function GetName: TdxSkinName; procedure SetName(AValue: TdxSkinName); end; TdxNavBarSkin = class(TdxSkin) procedure LoadFromResource(hInst: THandle); override; end; TdxNavBarSkinInfo = class(TdxSkinInfo) protected procedure InitializeAdditionalNavBarElements; virtual; procedure InitializeSkinInfo; override; public NavBarDragDropItemTarget: TdxSkinElement; NavBarSeparator: TdxSkinElement; end; TdxNavBarSkinBasedPainterHelper = class(TcxIUnknownObject, IdxNavBarColorSchemes) private FCachedPainterData: TdxSkinInfo; FSkinName: TdxSkinName; FOnChanged: TNotifyEvent; protected { IdxNavBarColorSchemes } function IdxNavBarColorSchemes.GetCount = GetSkinsCount; function IdxNavBarColorSchemes.GetNames = GetSkinNames; function IdxNavBarColorSchemes.GetName = GetSkinName; procedure IdxNavBarColorSchemes.SetName = SetSkinName; procedure DoChanged; virtual; function GetFullSkinName: TdxSkinName; virtual; function GetSkinsCount: Integer; virtual; function GetSkinNames(AIndex: Integer): TdxSkinName; virtual; function GetSkinInfoClass: TdxSkinInfoClass; virtual; function GetSkinName: TdxSkinName; virtual; function GetSkinPainterData(var AData: TdxSkinInfo): Boolean; virtual; function IsSkinAvailable: Boolean; virtual; procedure SetSkinName(AValue: TdxSkinName); virtual; public constructor Create(ASkinName: TdxSkinName); virtual; destructor Destroy; override; // Skin elements and properties function NavBarBackground: TdxSkinElement; virtual; function NavBarDragDropItemTarget: TdxSkinElement; virtual; function NavBarGroupButtonCaption: TdxSkinElement; virtual; function NavBarGroupClient: TdxSkinElement; virtual; function NavBarGroupSigns (AIsClose: Boolean): TdxSkinElement; virtual; function NavBarItem: TdxSkinElement; virtual; function NavBarScrollBarElements(AIsHorizontal: Boolean; APart: TcxScrollBarPart): TdxSkinScrollInfo; virtual; function NavBarSeparator: TdxSkinElement; virtual; function NavPaneCaptionFontSize: TdxSkinIntegerProperty; virtual; function NavPaneCaptionHeight: TdxSkinIntegerProperty; virtual; function NavPaneDoesGroupCaptionButtonRequireOffset: Boolean; virtual; function NavPaneGroupButtonCaption(AIsSelected: Boolean): TdxSkinElement; virtual; function NavPaneGroupClient: TdxSkinElement; virtual; function NavPaneHeader: TdxSkinElement; virtual; function NavePaneHeaderSign(ACollapse: Boolean): TdxSkinElement; virtual; function NavPaneItem(AIsSelected: Boolean): TdxSkinElement; virtual; function NavPaneItemPanel: TdxSkinElement; virtual; function NavPaneOverflowPanel: TdxSkinElement; virtual; function NavPaneOverflowPanelSign: TdxSkinElement; virtual; function NavPaneOverflowPanelItem: TdxSkinElement; virtual; function NavPanePopupControl: TdxSkinElement; virtual; function NavPanePopupMenu: TdxSkinElement; virtual; function NavPanePopupMenuSelection: TdxSkinElement; virtual; function NavPanePopupMenuSeparator: TdxSkinElement; virtual; function NavPanePopupMenuSideStrip: TdxSkinElement; virtual; function NavPaneScrollButtons(AIsDown: Boolean): TdxSkinElement; virtual; function NavPaneSplitter: TdxSkinElement; virtual; function NavPaneSizeGrip: TdxSkinElement; virtual; property SkinName: TdxSkinName read GetSkinName write SetSkinName; property OnChanged: TNotifyEvent read FOnChanged write FOnChanged; end; TdxNavBarSkinBasedPainterHelperClass = class of TdxNavBarSkinBasedPainterHelper; { TdxNavBarSkinNavPaneLinkViewInfo } TdxNavBarSkinBasedNavPaneLinkViewInfo = class(TdxNavBarLinkViewInfo) protected function GetSkinHelper: TdxNavBarSkinBasedPainterHelper; public function FontColor: TColor; override; function SelectionRect: TRect; override; end; { TdxNavBarSkinNavPaneGroupViewInfo } TdxNavBarSkinBasedNavPaneGroupViewInfo = class(TdxNavBarNavigationPaneGroupViewInfo) protected function GetSkinHelper: TdxNavBarSkinBasedPainterHelper; public function CaptionFontColor: TColor; override; end; { TdxNavBarSkinBasedOverflowPanelViewInfo } TdxNavBarSkinBasedOverflowPanelViewInfo = class(TdxNavBarOverflowPanelViewInfo) protected function GetSkinHelper: TdxNavBarSkinBasedPainterHelper; function IsSkinAvailable: Boolean; function GetClientOffset: TRect; override; function GetSignWidth: Integer; override; end; { TdxNavBarSkinBasedNavPaneViewInfo } TdxNavBarSkinBasedNavPaneViewInfo = class(TdxNavBarNavigationPaneViewInfo) protected function GetSkinHelper: TdxNavBarSkinBasedPainterHelper; virtual; function IsSkinAvailable: Boolean; function GetDragDropItemTargetHeight: Integer; function GetGroupBorderOffsets: TRect; override; function GetGroupEdges: TPoint; override; function GetGroupHeaderTextIndent: Integer; override; function GetOverflowPanelViewInfoClass: TdxNavBarOverflowPanelViewInfoClass; override; public procedure AssignDefaultNavigationPaneHeaderStyle; override; function BorderColor: TColor; override; function CollapseBarFontColor: TColor; override; function GetHeaderHeight: Integer; override; function GetSplitterHeight: Integer; override; function HeaderFontColor: TColor; override; end; TdxNavBarSkinBasedPopupControlViewInfo = class(TdxNavBarPopupControlViewInfo) protected function GetSkinHelper: TdxNavBarSkinBasedPainterHelper; function GetBorderOffsets: TRect; override; end; { TdxNavBarSkinBasedNavPanePainter } TdxNavBarSkinBasedNavPanePainter = class(TdxNavBarNavigationPanePainter, IdxNavBarColorSchemes) private function GetGroupCaptionButtonDrawOffsets: TRect; function GetOverflowPanelViewInfo: TdxNavBarSkinBasedOverflowPanelViewInfo; function InternalDrawScrollButton(ADownButton: Boolean; const ARect: TRect; AState: TdxNavBarObjectStates): Boolean; protected FSkinBasedPainterHelper: TdxNavBarSkinBasedPainterHelper; function CreateSkinHelper: TdxNavBarSkinBasedPainterHelper; virtual; class function GetViewInfoClass: TdxNavBarViewInfoClass; override; class function GetGroupViewInfoClass: TdxNavBarGroupViewInfoClass; override; class function GetLinkViewInfoClass: TdxNavBarLinkViewInfoClass; override; class function GetSkinPainterHelperClass: TdxNavBarSkinBasedPainterHelperClass; virtual; class function GetPopupControlViewInfoClass: TdxNavBarPopupControlViewInfoClass; override; procedure ColorSchemeChanged(ASender: TObject); virtual; function GetColorSchemeHelper: IdxNavBarColorSchemes; virtual; function GetDefaultColorSchemeName: TdxSkinName; virtual; function GetColorSchemeName: TdxSkinName; virtual; function IsSkinAvailable: Boolean; virtual; procedure SetColorSchemeName(const AValue: TdxSkinName); virtual; function GetNavPaneElementState(const APart: TdxNavBarPart): TdxSkinElementState; function GetSplitterType: Integer; virtual; // Drawing procedure DoDrawDropTargetLinkSelection(AItemGroup: TdxNavBarGroupViewInfo; AItem1, AItem2: TdxNavBarLinkViewInfo); override; procedure DoDrawSplitter; override; property ColorSchemeHelper: IdxNavBarColorSchemes read GetColorSchemeHelper implements IdxNavBarColorSchemes; public constructor Create(ANavBar: TdxCustomNavBar); override; destructor Destroy; override; // Drawing procedure DrawBottomScrollButton; override; procedure DrawCollapseElementBackground(const ARect: TRect; AState: TdxNavBarNavPanePartState); override; procedure DrawGroupCaptionButton(AGroupViewInfo: TdxNavBarGroupViewInfo); override; procedure DrawHeaderBackground; override; procedure DrawHeaderSign; override; procedure DrawItemSelection(ALinkViewInfo: TdxNavBarLinkViewInfo); override; procedure DrawOverflowPanelBackground; override; procedure DrawOverflowPanelItems; override; procedure DrawOverflowPanelSign; override; procedure DrawPopupControl(ACanvas: TcxCanvas; AViewInfo: TdxNavBarPopupControlViewInfo); override; procedure DrawPopupMenuItem(ACanvas: TCanvas; ARect: TRect; AImageList: TCustomImageList; AImageIndex: Integer; AText: String; State: TdxNavBarObjectStates); override; procedure DrawSeparator(ALinkViewInfo: TdxNavBarLinkViewInfo); override; procedure DrawTopScrollButton; override; property OverflowPanelViewInfo: TdxNavBarSkinBasedOverflowPanelViewInfo read GetOverflowPanelViewInfo; property ColorSchemeName: TdxSkinName read GetColorSchemeName write SetColorSchemeName; end; { TdxNavBarSkinBasedExplorerBarViewInfo } TdxNavBarSkinBasedExplorerBarViewInfo = class(TdxNavBarOffice11ExplorerBarViewInfo) protected function GetSkinHelper: TdxNavBarSkinBasedPainterHelper; function GetDragDropItemTargetHeight: Integer; function GetGroupBorderOffsets: TRect; override; end; { TdxNavBarSkinExplorerBarPainter } TdxNavBarSkinBasedExplorerBarPainter = class(TdxNavBarOffice11ExplorerBarPainter, IdxNavBarColorSchemes) protected FSkinBasedPainterHelper: TdxNavBarSkinBasedPainterHelper; function CreateSkinHelper: TdxNavBarSkinBasedPainterHelper; virtual; class function GetViewInfoClass: TdxNavBarViewInfoClass; override; class function GetGroupViewInfoClass: TdxNavBarGroupViewInfoClass; override; class function GetLinkViewInfoClass: TdxNavBarLinkViewInfoClass; override; class function GetSkinPainterHelperClass: TdxNavBarSkinBasedPainterHelperClass; virtual; procedure ColorSchemeChanged(ASender: TObject); virtual; function GetColorSchemeName: TdxSkinName; virtual; function GetColorSchemeHelper: IdxNavBarColorSchemes; virtual; function GetDefaultColorSchemeName: TdxSkinName; virtual; function IsSkinAvailable: Boolean; virtual; procedure SetColorSchemeName(const AValue: TdxSkinName); virtual; procedure DoDrawDropTargetLinkSelection(AItemGroup: TdxNavBarGroupViewInfo; AItem1, AItem2: TdxNavBarLinkViewInfo); override; function IsGroupCaptionButtonCompositeDraw(AGroupViewInfo: TdxNavBarGroupViewInfo): Boolean; virtual; property ColorSchemeHelper: IdxNavBarColorSchemes read GetColorSchemeHelper implements IdxNavBarColorSchemes; public constructor Create(ANavBar: TdxCustomNavBar); override; destructor Destroy; override; procedure DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo); override; procedure DrawGroupCaptionButton(AGroupViewInfo: TdxNavBarGroupViewInfo); override; procedure DrawGroupCaptionSign(AGroupViewInfo: TdxNavBarGroupViewInfo); override; procedure DrawGroupControlSplitter(AGroupViewInfo: TdxNavBarExplorerBarGroupViewInfo); override; procedure DrawSeparator(ALinkViewInfo: TdxNavBarLinkViewInfo); override; property ColorSchemeName: TdxSkinName read GetColorSchemeName write SetColorSchemeName; end; { TdxNavBarSkinExplorerBarLinkViewInfo } TdxNavBarSkinBasedExplorerBarLinkViewInfo = class(TdxNavBarOffice3LinkViewInfo) public function FontColor: TColor; override; end; { TdxNavBarSkinExplorerBarGroupViewInfo } TdxNavBarSkinBasedExplorerBarGroupViewInfo = class(TdxNavBarExplorerBarGroupViewInfo) public function CaptionFontColor: TColor; override; procedure CalculateBounds(var X, Y: Integer); override; end; function GetNavBarColorSchemes(APainter: TdxNavBarPainter): IdxNavBarColorSchemes; function NavBarObjectStateToSkinState(AState: TdxNavBarObjectStates): TdxSkinElementState; function GetSkinElementOffsets(AElement: TdxSkinElement): TRect; function DrawSkinElement(AElement: TdxSkinElement; ACanvas: TCanvas; const ARect: TRect; AImageIndex: Integer = 0; AState: TdxSkinElementState = esNormal; ADrawContentOnly: Boolean = False): Boolean; implementation uses Math, cxGeometry, dxNavBarGraphics; const //Additional NavBar elements sdxNavBarDragDropItemTarget = 'DragDropItemTarget'; sdxNavBarSeparator = 'Separator'; type TdxNavBarNavigationPaneControllerAccess = class(TdxNavBarNavigationPaneController); function GetNavBarColorSchemes(APainter: TdxNavBarPainter): IdxNavBarColorSchemes; begin Supports(APainter, IdxNavBarColorSchemes, Result); end; function NavBarObjectStateToSkinState(AState: TdxNavBarObjectStates): TdxSkinElementState; begin Result := esNormal; if sPressed in AState then Result := esPressed else if sHotTracked in AState then Result := esHot else if sDisabled in AState then Result := esDisabled else if sSelected in AState then Result := esPressed; end; function GetSkinElementOffsets(AElement: TdxSkinElement): TRect; begin if AElement <> nil then begin Result := AElement.ContentOffset.Rect; if cxRectIsNull(Result) then with AElement.Borders do Result := cxRect(Left.Thin, Top.Thin, Right.Thin, Bottom.Thin); end else Result := cxNullRect; end; function DrawSkinElement(AElement: TdxSkinElement; ACanvas: TCanvas; const ARect: TRect; AImageIndex: Integer = 0; AState: TdxSkinElementState = esNormal; ADrawContentOnly: Boolean = False): Boolean; var AcxCanvas: TcxCanvas; ADrawRect: TRect; begin if AElement <> nil then begin Result := True; AcxCanvas := TcxCanvas.Create(ACanvas); AcxCanvas.SaveClipRegion; try AcxCanvas.SetClipRegion(TcxRegion.Create(ARect), roIntersect); if ADrawContentOnly then ADrawRect := cxRectContent(ARect, cxRectInvert(GetSkinElementOffsets(AElement))) else ADrawRect := ARect; AElement.Draw(AcxCanvas.Handle, ADrawRect, AImageIndex, AState); finally AcxCanvas.RestoreClipRegion; AcxCanvas.Free; end; end else Result := False; end; { TdxNavBarSkin} procedure TdxNavBarSkin.LoadFromResource(hInst: THandle); var AStream: TStream; begin AStream := TResourceStream.Create(hInst, Name, PChar(sdxNavBarResourceType)); try LoadFromStream(AStream); finally AStream.Free; end; end; { TdxNavBarSkinInfo } procedure TdxNavBarSkinInfo.InitializeAdditionalNavBarElements; begin NavBarDragDropItemTarget := GetElementByName(Group_NavBar, sdxNavBarDragDropItemTarget); NavBarSeparator := GetElementByName(Group_NavBar, sdxNavBarSeparator); end; procedure TdxNavBarSkinInfo.InitializeSkinInfo; begin inherited; InitializeAdditionalNavBarElements; end; { TdxNavBarSkinBasedPainterHelper } constructor TdxNavBarSkinBasedPainterHelper.Create(ASkinName: TdxSkinName); begin inherited Create; FSkinName := ASkinName; end; destructor TdxNavBarSkinBasedPainterHelper.Destroy; begin FreeAndNil(FCachedPainterData); inherited; end; procedure TdxNavBarSkinBasedPainterHelper.DoChanged; begin CallNotify(OnChanged, Self); end; function TdxNavBarSkinBasedPainterHelper.GetFullSkinName: TdxSkinName; begin Result := SkinName; end; function TdxNavBarSkinBasedPainterHelper.GetSkinsCount: Integer; begin Result := 0; end; function TdxNavBarSkinBasedPainterHelper.GetSkinNames(AIndex: Integer): TdxSkinName; begin Result := ''; end; function TdxNavBarSkinBasedPainterHelper.GetSkinInfoClass: TdxSkinInfoClass; begin Result := TdxNavBarSkinInfo; end; function TdxNavBarSkinBasedPainterHelper.GetSkinName: TdxSkinName; begin Result := FSkinName; end; function TdxNavBarSkinBasedPainterHelper.GetSkinPainterData(var AData: TdxSkinInfo): Boolean; begin if (FCachedPainterData = nil) and IsGdiPlusAvailable then FCachedPainterData := GetSkinInfoClass.Create( TdxNavBarSkin.Create(GetFullSkinName, True, HInstance)); AData := FCachedPainterData; Result := AData <> nil; end; function TdxNavBarSkinBasedPainterHelper.IsSkinAvailable: Boolean; var AData: TdxSkinInfo; begin Result := GetSkinPainterData(AData); end; procedure TdxNavBarSkinBasedPainterHelper.SetSkinName(AValue: TdxSkinName); begin if FSkinName <> AValue then begin FreeAndNil(FCachedPainterData); FSkinName := AValue; DoChanged; end; end; function TdxNavBarSkinBasedPainterHelper.NavBarBackground: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavBarBackgroundColor; end; function TdxNavBarSkinBasedPainterHelper.NavBarDragDropItemTarget: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := TdxNavBarSkinInfo(ASkinInfo).NavBarDragDropItemTarget; end; function TdxNavBarSkinBasedPainterHelper.NavBarGroupButtonCaption: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavBarGroupHeader; end; function TdxNavBarSkinBasedPainterHelper.NavBarGroupClient: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavBarGroupClient; end; function TdxNavBarSkinBasedPainterHelper.NavBarGroupSigns( AIsClose: Boolean): TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavBarGroupButtons[AIsClose]; end; function TdxNavBarSkinBasedPainterHelper.NavBarItem: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavBarItem; end; function TdxNavBarSkinBasedPainterHelper.NavBarScrollBarElements( AIsHorizontal: Boolean; APart: TcxScrollBarPart): TdxSkinScrollInfo; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.ScrollBar_Elements[AIsHorizontal, APart]; end; function TdxNavBarSkinBasedPainterHelper.NavBarSeparator: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := TdxNavBarSkinInfo(ASkinInfo).NavBarSeparator; end; function TdxNavBarSkinBasedPainterHelper.NavPaneCaptionFontSize: TdxSkinIntegerProperty; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneCaptionFontSize; end; function TdxNavBarSkinBasedPainterHelper.NavPaneCaptionHeight: TdxSkinIntegerProperty; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneCaptionHeight; end; function TdxNavBarSkinBasedPainterHelper.NavPaneDoesGroupCaptionButtonRequireOffset: Boolean; begin Result := True; end; function TdxNavBarSkinBasedPainterHelper.NavPaneGroupButtonCaption( AIsSelected: Boolean): TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneGroupButton[AIsSelected]; end; function TdxNavBarSkinBasedPainterHelper.NavPaneGroupClient: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneGroupClient; end; function TdxNavBarSkinBasedPainterHelper.NavPaneHeader: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneGroupCaption; end; function TdxNavBarSkinBasedPainterHelper.NavePaneHeaderSign(ACollapse: Boolean): TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then if ACollapse then Result := ASkinInfo.NavPaneCollapseButton else Result := ASkinInfo.NavPaneExpandButton; end; function TdxNavBarSkinBasedPainterHelper.NavPaneItem( AIsSelected: Boolean): TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then if AIsSelected then Result := ASkinInfo.NavPaneSelectedItem else Result := ASkinInfo.NavPaneItem; end; function TdxNavBarSkinBasedPainterHelper.NavPaneItemPanel: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneCollapsedGroupClient; end; function TdxNavBarSkinBasedPainterHelper.NavPaneOverflowPanel: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneOverflowPanel; end; function TdxNavBarSkinBasedPainterHelper.NavPaneOverflowPanelSign: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneOverflowPanelExpandedItem; end; function TdxNavBarSkinBasedPainterHelper.NavPaneOverflowPanelItem: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneOverflowPanelItem; end; function TdxNavBarSkinBasedPainterHelper.NavPanePopupControl: TdxSkinElement; begin Result := NavBarBackground; end; function TdxNavBarSkinBasedPainterHelper.NavPanePopupMenu: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.PopupMenu; end; function TdxNavBarSkinBasedPainterHelper.NavPanePopupMenuSelection: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.PopupMenuLinkSelected; end; function TdxNavBarSkinBasedPainterHelper.NavPanePopupMenuSeparator: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.PopupMenuSeparator; end; function TdxNavBarSkinBasedPainterHelper.NavPanePopupMenuSideStrip: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.PopupMenuSideStrip; end; function TdxNavBarSkinBasedPainterHelper.NavPaneScrollButtons( AIsDown: Boolean): TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneScrollButtons[AIsDown]; end; function TdxNavBarSkinBasedPainterHelper.NavPaneSplitter: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneSplitter; end; function TdxNavBarSkinBasedPainterHelper.NavPaneSizeGrip: TdxSkinElement; var ASkinInfo: TdxSkinInfo; begin Result := nil; if GetSkinPainterData(ASkinInfo) then Result := ASkinInfo.NavPaneFormSizeGrip; end; { TdxNavBarSkinBasedNavPaneGroupViewInfo } function TdxNavBarSkinBasedNavPaneGroupViewInfo.CaptionFontColor: TColor; var AElement: TdxSkinElement; begin AElement := GetSkinHelper.NavPaneGroupButtonCaption(IsSelected); if (AElement = nil) or (AElement.TextColor = clDefault) then AElement := GetSkinHelper.NavPaneGroupButtonCaption(False); if AElement <> nil then Result := AElement.TextColor else Result := inherited CaptionFontColor; end; function TdxNavBarSkinBasedNavPaneGroupViewInfo.GetSkinHelper: TdxNavBarSkinBasedPainterHelper; begin Result := TdxNavBarSkinBasedNavPanePainter(Painter).FSkinBasedPainterHelper; end; { TdxNavBarSkinBasedNavPaneLinkViewInfo } function TdxNavBarSkinBasedNavPaneLinkViewInfo.FontColor: TColor; var AElement: TdxSkinElement; begin AElement := GetSkinHelper.NavPaneItem(False); if (AElement <> nil) and (Item.Enabled) then Result := AElement.TextColor else Result := inherited FontColor; end; function TdxNavBarSkinBasedNavPaneLinkViewInfo.SelectionRect: TRect; begin Result := Rect; InflateRect(Result, -2, 0); end; function TdxNavBarSkinBasedNavPaneLinkViewInfo.GetSkinHelper: TdxNavBarSkinBasedPainterHelper; begin Result := TdxNavBarSkinBasedNavPanePainter(Painter).FSkinBasedPainterHelper; end; { TdxNavBarSkinBasedOverflowPanelViewInfo } function TdxNavBarSkinBasedOverflowPanelViewInfo.GetSkinHelper: TdxNavBarSkinBasedPainterHelper; begin Result := TdxNavBarSkinBasedNavPanePainter(Painter).FSkinBasedPainterHelper; end; function TdxNavBarSkinBasedOverflowPanelViewInfo.IsSkinAvailable: Boolean; begin Result := TdxNavBarSkinBasedNavPanePainter(Painter).IsSkinAvailable; end; function TdxNavBarSkinBasedOverflowPanelViewInfo.GetClientOffset: TRect; var AElement: TdxSkinElement; begin AElement := GetSkinHelper.NavPaneOverflowPanel; if AElement = nil then Result := inherited GetClientOffset else Result := AElement.ContentOffset.Rect; end; function TdxNavBarSkinBasedOverflowPanelViewInfo.GetSignWidth: Integer; var AElement: TdxSkinElement; begin Result := inherited GetSignWidth; if Result <> 0 then begin AElement := GetSkinHelper.NavPaneOverflowPanelSign; if AElement <> nil then Result := AElement.Size.cx; end; end; { TdxNavBarSkinBasedNavPaneViewInfo } procedure TdxNavBarSkinBasedNavPaneViewInfo.AssignDefaultNavigationPaneHeaderStyle; var AElement: TdxSkinIntegerProperty; begin inherited; AElement := GetSkinHelper.NavPaneCaptionFontSize; if AElement <> nil then NavBar.DefaultStyles.NavigationPaneHeader.Font.Size := AElement.Value; end; function TdxNavBarSkinBasedNavPaneViewInfo.BorderColor: TColor; var AElement: TdxSkinElement; begin AElement := GetSkinHelper.NavBarBackground; if AElement <> nil then Result := AElement.Borders.Left.Color else Result := inherited BorderColor; end; function TdxNavBarSkinBasedNavPaneViewInfo.CollapseBarFontColor: TColor; var AElement: TdxSkinElement; begin AElement := GetSkinHelper.NavPaneItemPanel; if AElement <> nil then Result := AElement.TextColor else Result := inherited CollapseBarFontColor; end; function TdxNavBarSkinBasedNavPaneViewInfo.HeaderFontColor: TColor; var AElement: TdxSkinElement; begin AElement := GetSkinHelper.NavPaneHeader; if AElement <> nil then Result := AElement.TextColor else Result := inherited HeaderFontColor; end; function TdxNavBarSkinBasedNavPaneViewInfo.GetHeaderHeight: Integer; var AElement: TdxSkinIntegerProperty; begin Result := inherited GetHeaderHeight; if Result <> 0 then begin AElement := GetSkinHelper.NavPaneCaptionHeight; if AElement <> nil then Result := Max(AElement.Value, Result); end; end; function TdxNavBarSkinBasedNavPaneViewInfo.GetSplitterHeight: Integer; begin Result := inherited GetSplitterHeight; if IsSkinAvailable and (Result <> 0) then Result := 8; end; function TdxNavBarSkinBasedNavPaneViewInfo.GetSkinHelper: TdxNavBarSkinBasedPainterHelper; begin Result := TdxNavBarSkinBasedNavPanePainter(Painter).FSkinBasedPainterHelper; end; function TdxNavBarSkinBasedNavPaneViewInfo.IsSkinAvailable: Boolean; begin Result := TdxNavBarSkinBasedNavPanePainter(Painter).IsSkinAvailable; end; function TdxNavBarSkinBasedNavPaneViewInfo.GetDragDropItemTargetHeight: Integer; var AElement: TdxSkinElement; begin Result := 0; AElement := GetSkinHelper.NavBarDragDropItemTarget; if AElement <> nil then Result := AElement.Size.cy; end; function TdxNavBarSkinBasedNavPaneViewInfo.GetGroupBorderOffsets: TRect; begin Result := inherited GetGroupBorderOffsets; Inc(Result.Left, BorderWidth); Inc(Result.Right, BorderWidth); end; function TdxNavBarSkinBasedNavPaneViewInfo.GetGroupEdges: TPoint; begin if IsSkinAvailable then Result := cxNullPoint else Result := inherited GetGroupEdges; end; function TdxNavBarSkinBasedNavPaneViewInfo.GetGroupHeaderTextIndent: Integer; begin if IsSkinAvailable then Result := 8 else Result := inherited GetGroupHeaderTextIndent; end; function TdxNavBarSkinBasedNavPaneViewInfo.GetOverflowPanelViewInfoClass: TdxNavBarOverflowPanelViewInfoClass; begin Result := TdxNavBarSkinBasedOverflowPanelViewInfo; end; { TdxNavBarSkinBasedPopupControlViewInfo } function TdxNavBarSkinBasedPopupControlViewInfo.GetSkinHelper: TdxNavBarSkinBasedPainterHelper; begin Result := TdxNavBarSkinBasedNavPanePainter(Painter).FSkinBasedPainterHelper; end; function TdxNavBarSkinBasedPopupControlViewInfo.GetBorderOffsets: TRect; var AElement: TdxSkinElement; begin AElement := GetSkinHelper.NavPanePopupControl; if AElement <> nil then Result := AElement.ContentOffset.Rect else Result := inherited GetBorderOffsets; end; { TdxNavBarSkinBasedNavPanePainter } constructor TdxNavBarSkinBasedNavPanePainter.Create(ANavBar: TdxCustomNavBar); begin inherited Create(ANavBar); FSkinBasedPainterHelper := CreateSkinHelper; FSkinBasedPainterHelper.OnChanged := ColorSchemeChanged; end; destructor TdxNavBarSkinBasedNavPanePainter.Destroy; begin FSkinBasedPainterHelper.OnChanged := nil; FreeAndNil(FSkinBasedPainterHelper); inherited Destroy; end; function TdxNavBarSkinBasedNavPanePainter.CreateSkinHelper: TdxNavBarSkinBasedPainterHelper; begin Result := GetSkinPainterHelperClass.Create(GetDefaultColorSchemeName); end; class function TdxNavBarSkinBasedNavPanePainter.GetViewInfoClass: TdxNavBarViewInfoClass; begin Result := TdxNavBarSkinBasedNavPaneViewInfo; end; class function TdxNavBarSkinBasedNavPanePainter.GetGroupViewInfoClass: TdxNavBarGroupViewInfoClass; begin Result := TdxNavBarSkinBasedNavPaneGroupViewInfo; end; class function TdxNavBarSkinBasedNavPanePainter.GetLinkViewInfoClass: TdxNavBarLinkViewInfoClass; begin Result := TdxNavBarSkinBasedNavPaneLinkViewInfo; end; class function TdxNavBarSkinBasedNavPanePainter.GetSkinPainterHelperClass: TdxNavBarSkinBasedPainterHelperClass; begin Result := TdxNavBarSkinBasedPainterHelper; end; class function TdxNavBarSkinBasedNavPanePainter.GetPopupControlViewInfoClass: TdxNavBarPopupControlViewInfoClass; begin Result := TdxNavBarSkinBasedPopupControlViewInfo; end; procedure TdxNavBarSkinBasedNavPanePainter.ColorSchemeChanged(ASender: TObject); begin NavBar.InvalidateAll(doRecreate); end; function TdxNavBarSkinBasedNavPanePainter.GetColorSchemeHelper: IdxNavBarColorSchemes; begin Supports(FSkinBasedPainterHelper, IdxNavBarColorSchemes, Result); end; function TdxNavBarSkinBasedNavPanePainter.GetDefaultColorSchemeName: TdxSkinName; begin Result := ''; end; function TdxNavBarSkinBasedNavPanePainter.GetColorSchemeName: TdxSkinName; begin Result := FSkinBasedPainterHelper.SkinName; end; function TdxNavBarSkinBasedNavPanePainter.IsSkinAvailable: Boolean; begin Result := FSkinBasedPainterHelper.IsSkinAvailable; end; procedure TdxNavBarSkinBasedNavPanePainter.SetColorSchemeName(const AValue: TdxSkinName); begin FSkinBasedPainterHelper.SkinName := AValue; end; function TdxNavBarSkinBasedNavPanePainter.GetNavPaneElementState(const APart: TdxNavBarPart): TdxSkinElementState; const AElementMap: array[TdxNavBarNavPanePartState] of TdxSkinElementState = (esNormal, esHot, esPressed, esChecked, esHotCheck, esDroppedDown); begin Result := AElementMap[GetNavPanePartState(APart)]; end; function TdxNavBarSkinBasedNavPanePainter.GetSplitterType: Integer; begin Result := Byte(not TdxNavBarNavigationPaneControllerAccess(Controller).Collapsed); end; procedure TdxNavBarSkinBasedNavPanePainter.DoDrawDropTargetLinkSelection(AItemGroup: TdxNavBarGroupViewInfo; AItem1, AItem2: TdxNavBarLinkViewInfo); var ARect: TRect; AHeight: Integer; begin AHeight := TdxNavBarSkinBasedNavPaneViewInfo(ViewInfo).GetDragDropItemTargetHeight; if AItem1 <> nil then ARect := cxRectSetBottom(AItem1.Rect, AItem1.Rect.Bottom, AHeight) else ARect := cxRectSetTop(AItem2.Rect, AItem2.Rect.Top, AHeight); if not DrawSkinElement(FSkinBasedPainterHelper.NavBarDragDropItemTarget, Canvas, ARect) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DoDrawSplitter; begin if not DrawSkinElement(FSkinBasedPainterHelper.NavPaneSplitter, Canvas, ViewInfo.SplitterRect, GetSplitterType) then inherited; end; function TdxNavBarSkinBasedNavPanePainter.GetGroupCaptionButtonDrawOffsets: TRect; begin Result := cxNullRect; if FSkinBasedPainterHelper.NavPaneDoesGroupCaptionButtonRequireOffset then Inc(Result.Top, 1); end; function TdxNavBarSkinBasedNavPanePainter.GetOverflowPanelViewInfo: TdxNavBarSkinBasedOverflowPanelViewInfo; begin Result := TdxNavBarSkinBasedOverflowPanelViewInfo(inherited OverflowPanelViewInfo); end; function TdxNavBarSkinBasedNavPanePainter.InternalDrawScrollButton(ADownButton: Boolean; const ARect: TRect; AState: TdxNavBarObjectStates): Boolean; begin Result := DrawSkinElement(FSkinBasedPainterHelper.NavPaneScrollButtons(ADownButton), Canvas, ARect, 0, NavBarObjectStateToSkinState(AState)); end; procedure TdxNavBarSkinBasedNavPanePainter.DrawBottomScrollButton; begin with ViewInfo do if not InternalDrawScrollButton(True, BottomScrollButtonRect, BottomScrollButtonState) then inherited DrawBottomScrollButton; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawCollapseElementBackground(const ARect: TRect; AState: TdxNavBarNavPanePartState); const AElementMap: array[TdxNavBarNavPanePartState] of TdxSkinElementState = (esNormal, esHot, esPressed, esChecked, esHotCheck, esDroppedDown); begin if not DrawSkinElement(FSkinBasedPainterHelper.NavPaneItemPanel, Canvas, ARect, 0, AElementMap[AState]) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawHeaderBackground; begin if not DrawSkinElement(FSkinBasedPainterHelper.NavPaneHeader, Canvas, ViewInfo.HeaderRect) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawHeaderSign; begin if not DrawSkinElement(FSkinBasedPainterHelper.NavePaneHeaderSign(not NavBar.OptionsBehavior.NavigationPane.Collapsed), Canvas, ViewInfo.HeaderSignRect, 0, GetNavPaneElementState(dxNavBarPart(nbHeaderSign))) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawGroupCaptionButton( AGroupViewInfo: TdxNavBarGroupViewInfo); begin if not DrawSkinElement(FSkinBasedPainterHelper.NavPaneGroupButtonCaption(sActive in AGroupViewInfo.State), Canvas, cxRectInflate(AGroupViewInfo.CaptionRect, GetGroupCaptionButtonDrawOffsets), 0, NavBarObjectStateToSkinState(AGroupViewInfo.State)) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawItemSelection( ALinkViewInfo: TdxNavBarLinkViewInfo); var AState: TdxSkinElementState; begin AState := NavBarObjectStateToSkinState(ALinkViewInfo.State); if not DrawSkinElement(FSkinBasedPainterHelper.NavPaneItem((AState = esNormal) and (sSelected in ALinkViewInfo.State)), Canvas, ALinkViewInfo.SelectionRect, 0, AState) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawOverflowPanelBackground; begin if not DrawSkinElement(FSkinBasedPainterHelper.NavPaneOverflowPanel, Canvas, ViewInfo.OverflowPanelRect) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawOverflowPanelItems; function GetOverflowPanelItemElementState(AIndex: Integer): TdxSkinElementState; begin Result := GetNavPaneElementState(dxNavBarPart(nbOverflowPanelItem, AIndex)); case Result of esChecked: Result := esNormal; esHotCheck: Result := esHot; end; end; var ASkinElement: TdxSkinElement; AElementState: TdxSkinElementState; AGroup: TdxNavBarGroup; I: Integer; R: TRect; begin ASkinElement := FSkinBasedPainterHelper.NavPaneOverflowPanelItem; if ASkinElement = nil then inherited DrawOverflowPanelItems else with ViewInfo do for I := 0 to OverflowPanelVisibleItemCount - 1 do begin R := OverflowPanelItems[I].SelectionRect; AGroup := OverflowPanelItems[I].Group; AElementState := GetOverflowPanelItemElementState(I); ASkinElement.Draw(Canvas.Handle, R, Byte(AGroup = NavBar.ActiveGroup), AElementState); R := ViewInfo.OverflowPanelItems[I].Rect; with ImagePainterClass do if IsValidImage(OverflowPanelViewInfo.GetImageList, OverflowPanelViewInfo.GetImageIndex(AGroup)) then DrawImage(Canvas, OverflowPanelViewInfo.GetImageList, OverflowPanelViewInfo.GetImageIndex(AGroup), R) else if NavBar.NavigationPaneOverflowPanelUseSmallImages then Canvas.Draw(R.Left, R.Top, dxOffice11NavPaneDefaultSmallBitmap) else Canvas.Draw(R.Left, R.Top, dxOffice11NavPaneDefaultLargeBitmap); end; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawOverflowPanelSign; begin if not DrawSkinElement(FSkinBasedPainterHelper.NavPaneOverflowPanelSign, Canvas, ViewInfo.OverflowPanelSignRect, 0, GetNavPaneElementState(dxNavBarPart(nbOverflowPanelSign))) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawPopupControl(ACanvas: TcxCanvas; AViewInfo: TdxNavBarPopupControlViewInfo); var AElement: TdxSkinElement; begin AElement := FSkinBasedPainterHelper.NavPanePopupControl; if AElement = nil then inherited DrawPopupControl(ACanvas, AViewInfo) else begin ACanvas.SaveClipRegion; try ACanvas.ExcludeClipRect(AViewInfo.ClientRect); AElement.Draw(ACanvas.Handle, AViewInfo.Rect); finally ACanvas.RestoreClipRegion; end; end; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawPopupMenuItem(ACanvas: TCanvas; ARect: TRect; AImageList: TCustomImageList; AImageIndex: Integer; AText: String; State: TdxNavBarObjectStates); var ABuf: TcxBitmap; APopupMenu: TdxSkinElement; ASelected: TdxSkinElement; ASeparator: TdxSkinElement; ASideStrip: TdxSkinElement; AImageAreaWidth: Integer; R: TRect; function InitializeElements: Boolean; begin APopupMenu := FSkinBasedPainterHelper.NavPanePopupMenu; ASelected := FSkinBasedPainterHelper.NavPanePopupMenuSelection; ASeparator := FSkinBasedPainterHelper.NavPanePopupMenuSeparator; ASideStrip := FSkinBasedPainterHelper.NavPanePopupMenuSideStrip; Result := (APopupMenu <> nil) and (ASelected <> nil) and (ASeparator <> nil) and (ASideStrip <> nil); end; procedure DrawImage(ACanvas: TCanvas; AIsActive: Boolean; AImageAreaWidth: Integer); var R: TRect; begin R := ARect; OffsetRect(R, -R.Left, -R.Top); R.Right := R.Left + AImageAreaWidth; if AIsActive then ASelected.Draw(ACanvas.Handle, R); with TdxNavBarSkinBasedNavPaneViewInfo(ViewInfo) do InflateRect(R, -OverflowPanelViewInfo.GetPopupMenuImageIndent, -OverflowPanelViewInfo.GetPopupMenuImageIndent); AImageList.Draw(ACanvas, R.Left, R.Top, AImageIndex, not (sDisabled in State)); end; procedure DrawItemText(ACanvas: TCanvas; AImageAreaWidth: Integer); var R: TRect; begin R := ARect; OffsetRect(R, -R.Left, -R.Top); with TdxNavBarSkinBasedNavPaneViewInfo(ViewInfo) do R.Left := AImageAreaWidth + OverflowPanelViewInfo.GetPopupMenuTextIndent; if sDisabled in State then ACanvas.Font.Color := clGrayText else ACanvas.Font.Color := clMenuText; dxNavBarDrawText(ACanvas, AText, R, DT_LEFT or DT_VCENTER or DT_SINGLELINE); end; procedure DrawMenuBackground(ACanvas: TCanvas; AImageAreaWidth: Integer); var R: TRect; begin R := ARect; OffsetRect(R, -R.Left, -R.Top); with APopupMenu.Borders do begin Dec(R.Left, Left.Thin); Dec(R.Top, Top.Thin); Inc(R.Right, Right.Thin); Inc(R.Bottom, Bottom.Thin); end; APopupMenu.Draw(ABuf.Canvas.Handle, R); R := ARect; OffsetRect(R, -R.Left, -R.Top); R.Right := R.Left + AImageAreaWidth + 2; ASideStrip.Draw(ABuf.Canvas.Handle, R); end; begin if not InitializeElements then inherited DrawPopupMenuItem(ACanvas, ARect, AImageList, AImageIndex, AText, State) else begin with TdxNavBarSkinBasedNavPaneViewInfo(ViewInfo) do AImageAreaWidth := 2 * OverflowPanelViewInfo.GetPopupMenuImageIndent + GetSmallImageWidth; ABuf := TcxBitmap.CreateSize(ARect, pf32bit); try ABuf.Canvas.Font := ACanvas.Font; DrawMenuBackground(ABuf.Canvas, AImageAreaWidth); if AText = '-' then ASeparator.Draw(ABuf.Canvas.Handle, Rect(AImageAreaWidth + 4, cxRectHeight(ARect) div 2, ABuf.Width, cxRectHeight(ARect) div 2 + 1)) else begin if sSelected in State then begin R := ARect; OffsetRect(R, -R.Left, -R.Top); ASelected.Draw(ABuf.Canvas.Handle, R); end; DrawImage(ABuf.Canvas, sActive in State, AImageAreaWidth); DrawItemText(ABuf.Canvas, AImageAreaWidth); end; cxBitBlt(ACanvas.Handle, ABuf.Canvas.Handle, ARect, cxNullPoint, SRCCOPY); finally ABuf.Free; end; end; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawSeparator(ALinkViewInfo: TdxNavBarLinkViewInfo); begin if not DrawSkinElement(FSkinBasedPainterHelper.NavBarSeparator, Canvas, ALinkViewInfo.Rect) then inherited; end; procedure TdxNavBarSkinBasedNavPanePainter.DrawTopScrollButton; begin with ViewInfo do if not InternalDrawScrollButton(False, TopScrollButtonRect, TopScrollButtonState) then inherited DrawTopScrollButton; end; { TdxNavBarSkinBasedExplorerBarViewInfo } function TdxNavBarSkinBasedExplorerBarViewInfo.GetSkinHelper: TdxNavBarSkinBasedPainterHelper; begin Result := TdxNavBarSkinBasedExplorerBarPainter(Painter).FSkinBasedPainterHelper; end; function TdxNavBarSkinBasedExplorerBarViewInfo.GetDragDropItemTargetHeight: Integer; var AElement: TdxSkinElement; begin Result := 0; AElement := GetSkinHelper.NavBarDragDropItemTarget; if AElement <> nil then Result := AElement.Size.cy; end; function TdxNavBarSkinBasedExplorerBarViewInfo.GetGroupBorderOffsets: TRect; begin Result := GetSkinElementOffsets(GetSkinHelper.NavBarGroupClient); end; { TdxNavBarSkinBasedExplorerBarPainter } constructor TdxNavBarSkinBasedExplorerBarPainter.Create(ANavBar: TdxCustomNavBar); begin inherited Create(ANavBar); FSkinBasedPainterHelper := CreateSkinHelper; FSkinBasedPainterHelper.OnChanged := ColorSchemeChanged; end; destructor TdxNavBarSkinBasedExplorerBarPainter.Destroy; begin FSkinBasedPainterHelper.OnChanged := nil; FreeAndNil(FSkinBasedPainterHelper); inherited Destroy; end; procedure TdxNavBarSkinBasedExplorerBarPainter.DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo); begin if not DrawSkinElement(FSkinBasedPainterHelper.NavBarGroupClient, Canvas, AGroupViewInfo.ItemsRect) then inherited; end; procedure TdxNavBarSkinBasedExplorerBarPainter.DrawGroupCaptionButton( AGroupViewInfo: TdxNavBarGroupViewInfo); begin if not DrawSkinElement(FSkinBasedPainterHelper.NavBarGroupButtonCaption, Canvas, AGroupViewInfo.CaptionRect, 0, NavBarObjectStateToSkinState(AGroupViewInfo.State), IsGroupCaptionButtonCompositeDraw(AGroupViewInfo)) then inherited; end; procedure TdxNavBarSkinBasedExplorerBarPainter.DrawGroupCaptionSign(AGroupViewInfo: TdxNavBarGroupViewInfo); var AElement: TdxSkinElement; begin AElement := FSkinBasedPainterHelper.NavBarGroupSigns(sExpanded in AGroupViewInfo.State); if AElement = nil then inherited DrawGroupCaptionSign(AGroupViewInfo) else if AGroupViewInfo.Group.ShowExpandButton then AElement.Draw(Canvas.Handle, AGroupViewInfo.CaptionSignRect, 0, NavBarObjectStateToSkinState(AGroupViewInfo.State)); end; procedure TdxNavBarSkinBasedExplorerBarPainter.DrawGroupControlSplitter(AGroupViewInfo: TdxNavBarExplorerBarGroupViewInfo); begin if not DrawSkinElement(FSkinBasedPainterHelper.NavPaneSplitter, Canvas, AGroupViewInfo.SplitterRect, 0, esNormal, True) then inherited; end; procedure TdxNavBarSkinBasedExplorerBarPainter.DrawSeparator(ALinkViewInfo: TdxNavBarLinkViewInfo); begin if not DrawSkinElement(FSkinBasedPainterHelper.NavBarSeparator, Canvas, ALinkViewInfo.Rect) then inherited; end; function TdxNavBarSkinBasedExplorerBarPainter.CreateSkinHelper: TdxNavBarSkinBasedPainterHelper; begin Result := GetSkinPainterHelperClass.Create(GetDefaultColorSchemeName); end; class function TdxNavBarSkinBasedExplorerBarPainter.GetViewInfoClass: TdxNavBarViewInfoClass; begin Result := TdxNavBarSkinBasedExplorerBarViewInfo; end; class function TdxNavBarSkinBasedExplorerBarPainter.GetGroupViewInfoClass: TdxNavBarGroupViewInfoClass; begin Result := TdxNavBarSkinBasedExplorerBarGroupViewInfo; end; class function TdxNavBarSkinBasedExplorerBarPainter.GetLinkViewInfoClass: TdxNavBarLinkViewInfoClass; begin Result := TdxNavBarSkinBasedExplorerBarLinkViewInfo; end; class function TdxNavBarSkinBasedExplorerBarPainter.GetSkinPainterHelperClass: TdxNavBarSkinBasedPainterHelperClass; begin Result := TdxNavBarSkinBasedPainterHelper; end; procedure TdxNavBarSkinBasedExplorerBarPainter.ColorSchemeChanged(ASender: TObject); begin NavBar.InvalidateAll(doRecreate); end; function TdxNavBarSkinBasedExplorerBarPainter.GetColorSchemeName: TdxSkinName; begin Result := FSkinBasedPainterHelper.SkinName; end; function TdxNavBarSkinBasedExplorerBarPainter.GetColorSchemeHelper: IdxNavBarColorSchemes; begin Supports(FSkinBasedPainterHelper, IdxNavBarColorSchemes, Result); end; function TdxNavBarSkinBasedExplorerBarPainter.GetDefaultColorSchemeName: TdxSkinName; begin Result := ''; end; function TdxNavBarSkinBasedExplorerBarPainter.IsSkinAvailable: Boolean; begin Result := FSkinBasedPainterHelper.IsSkinAvailable; end; procedure TdxNavBarSkinBasedExplorerBarPainter.SetColorSchemeName(const AValue: TdxSkinName); begin FSkinBasedPainterHelper.SkinName := AValue; end; procedure TdxNavBarSkinBasedExplorerBarPainter.DoDrawDropTargetLinkSelection( AItemGroup: TdxNavBarGroupViewInfo; AItem1, AItem2: TdxNavBarLinkViewInfo); var ARect: TRect; AHeight: Integer; begin AHeight := TdxNavBarSkinBasedExplorerBarViewInfo(ViewInfo).GetDragDropItemTargetHeight; if AItem1 <> nil then ARect := cxRectSetBottom(AItem1.Rect, AItem1.Rect.Bottom, AHeight) else ARect := cxRectSetTop(AItem2.Rect, AItem2.Rect.Top, AHeight); if not DrawSkinElement(FSkinBasedPainterHelper.NavBarDragDropItemTarget, Canvas, ARect) then inherited; end; function TdxNavBarSkinBasedExplorerBarPainter.IsGroupCaptionButtonCompositeDraw( AGroupViewInfo: TdxNavBarGroupViewInfo): Boolean; begin Result := False; end; { TdxNavBarSkinBasedExplorerBarGroupViewInfo } function TdxNavBarSkinBasedExplorerBarGroupViewInfo.CaptionFontColor: TColor; var AElement: TdxSkinElement; begin with TdxNavBarSkinBasedExplorerBarPainter(Painter) do begin AElement := FSkinBasedPainterHelper.NavBarGroupButtonCaption; if AElement <> nil then Result := AElement.TextColor else Result := inherited CaptionFontColor; end; end; procedure TdxNavBarSkinBasedExplorerBarGroupViewInfo.CalculateBounds(var X, Y: Integer); var AElement: TdxSkinElement; begin inherited CalculateBounds(X, Y); with TdxNavBarSkinBasedExplorerBarPainter(Painter) do begin AElement := FSkinBasedPainterHelper.NavBarGroupButtonCaption; if (AElement <> nil) and IsCaptionVisible and not IsRectEmpty(FImageRect) then begin OffsetRect(FImageRect, AElement.ContentOffset.Left, 0); Inc(FCaptionTextRect.Left, AElement.ContentOffset.Left); end; end; end; { TdxNavBarSkinBasedExplorerBarLinkViewInfo } function TdxNavBarSkinBasedExplorerBarLinkViewInfo.FontColor: TColor; var AElement: TdxSkinElement; begin with TdxNavBarSkinBasedExplorerBarPainter(Painter) do begin AElement := FSkinBasedPainterHelper.NavBarItem; if (AElement <> nil) and (Item.Enabled) then Result := AElement.TextColor else Result := inherited FontColor; end; end; end.