Componentes.Terceros.DevExp.../internal/x.44/1/ExpressSkins Library/Sources/dxSkinsdxNavBarPainter.pas
2009-06-29 12:09:02 +00:00

1124 lines
36 KiB
ObjectPascal

{********************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressSkins Library }
{ }
{ Copyright (c) 2006-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 EXPRESSSKINS 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 dxSkinsdxNavBarPainter;
interface
uses
Types, Windows, Graphics, Classes, dxNavBar, dxNavBarBase, dxNavBarCollns, dxNavBarStyles,
dxNavBarExplorerViews, dxNavBarGraphics, cxLookAndFeels, cxLookAndFeelPainters,
dxSkinsLookAndFeelPainter, dxNavBarConsts, dxNavBarOffice11Views, ImgList,
cxGraphics, cxClasses, dxNavBarOfficeViews;
type
{ TdxNavBarSkinNavPaneLinkViewInfo }
TdxNavBarSkinNavPaneLinkViewInfo = class(TdxNavBarOffice3LinkViewInfo)
public
function FontColor: TColor; override;
function SelectionRect: TRect; override;
end;
{ TdxNavBarSkinNavPaneGroupViewInfo }
TdxNavBarSkinNavPaneGroupViewInfo = class(TdxNavBarOffice11NavPaneGroupViewInfo)
public
function CaptionFontColor: TColor; override;
end;
{ TdxNavBarSkinNavPaneViewInfo }
TdxNavBarSkinNavPaneViewInfo = class(TdxNavBarOffice11NavPaneViewInfo)
protected
function GetOverflowPanelClientOffset: TRect; override;
function GetOverflowPanelImageWidthAddon: Integer; override;
function GetOverflowPanelSignWidth: Integer; override;
function GetSkinInfo(var ASkinInfo: TdxSkinLookAndFeelPainterInfo): Boolean;
public
procedure AssignDefaultNavigationPaneHeaderStyle; override;
function GetHeaderHeight: Integer; override;
function GetOverflowPanelHeight: Integer; override;
function HeaderFont: TFont; override;
function HeaderFontColor: TColor; override;
end;
{ TdxNavBarSkinNavPanePainter }
TdxNavBarSkinNavPanePainter = class(TdxNavBarOffice11NavPanePainter)
private
FLookAndFeel: TcxLookAndFeel;
function GetSkinNameAssigned: Boolean;
function GetSkinName: TdxSkinName;
function InternalDrawScrollButton(ADownButton: Boolean; const ARect: TRect;
AState: TdxNavBarObjectStates): Boolean;
function IsSkinNameStored: Boolean;
procedure SetSkinNameAssigned(AValue: Boolean);
procedure SetSkinName(const Value: TdxSkinName);
// Custom draw
function CustomDrawHeader: Boolean;
function CustomDrawOverflowPanel: Boolean;
function CustomDrawSplitter: Boolean;
protected
function CreateViewInfo: TdxNavBarViewInfo; override;
function CreateGroupViewInfo(AViewInfo: TdxNavBarViewInfo; AGroup: TdxNavBarGroup;
ACaptionVisible: Boolean; AItemsVisible: Boolean): TdxNavBarGroupViewInfo; override;
function CreateLinkViewInfo(AViewInfo: TdxNavBarGroupViewInfo;
ALink: TdxNavBarItemLink; ACaptionVisible: Boolean;
AImageVisisble: Boolean): TdxNavBarLinkViewInfo; override;
function GetMasterLookAndFeel: TcxLookAndFeel; override;
function GetSkinPainterData(var AData: TdxSkinLookAndFeelPainterInfo): Boolean; virtual;
function IsSkinAvailable: Boolean;
procedure LookAndFeelChanged(Sender: TcxLookAndFeel; AChangedValues: TcxLookAndFeelValues); virtual;
public
constructor Create(ANavBar: TdxCustomNavBar); override;
destructor Destroy; override;
procedure DrawBackground; override;
procedure DrawBorder; override;
procedure DrawBottomScrollButton; override;
procedure DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupCaptionButton(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupControl(ACanvas: TCanvas; ARect: TRect;
AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawHeader; override;
procedure DrawItemSelection(ALinkViewInfo: TdxNavBarLinkViewInfo); override;
procedure DrawOverflowPanel; override;
procedure DrawOverflowPanelItems; override;
procedure DrawOverflowPanelSign; override;
procedure DrawPopupMenuItem(ACanvas: TCanvas; ARect: TRect;
AImageList: TCustomImageList; AImageIndex: Integer; AText: String;
State: TdxNavBarObjectStates); override;
procedure DrawSplitter; override;
procedure DrawTopScrollButton; override;
property LookAndFeel: TcxLookAndFeel read FLookAndFeel;
published
property SkinName: TdxSkinName read GetSkinName write SetSkinName stored IsSkinNameStored;
property SkinNameAssigned: Boolean read GetSkinNameAssigned write SetSkinNameAssigned default False;
end;
{ TdxNavBarSkinExplorerBarPainter }
TdxNavBarSkinExplorerBarPainter = class(TdxNavBarExplorerBarPainter)
private
FLookAndFeel: TcxLookAndFeel;
function GetSkinNameAssigned: Boolean;
function GetSkinName: TdxSkinName;
function IsSkinNameStored: Boolean;
procedure SetSkinNameAssigned(AValue: Boolean);
procedure SetSkinName(const Value: TdxSkinName);
protected
function CreateGroupViewInfo(AViewInfo: TdxNavBarViewInfo; AGroup: TdxNavBarGroup;
ACaptionVisible: Boolean; AItemsVisible: Boolean): TdxNavBarGroupViewInfo; override;
function CreateLinkViewInfo(AViewInfo: TdxNavBarGroupViewInfo;
ALink: TdxNavBarItemLink; ACaptionVisible: Boolean;
AImageVisisble: Boolean): TdxNavBarLinkViewInfo; override;
function GetMasterLookAndFeel: TcxLookAndFeel; override;
function GetSkinPainterData(var AData: TdxSkinLookAndFeelPainterInfo): Boolean; virtual;
function IsSkinAvailable: Boolean;
procedure DrawGroupTopBorder(AGroupViewInfo: TdxNavBarGroupViewInfo);
procedure LookAndFeelChanged(Sender: TcxLookAndFeel; AChangedValues: TcxLookAndFeelValues); virtual;
public
constructor Create(ANavBar: TdxCustomNavBar); override;
destructor Destroy; override;
procedure DrawBackground; override;
procedure DrawGroupBackground(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupCaption(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupCaptionButton(AGroupViewInfo: TdxNavBarGroupViewInfo); override;
procedure DrawGroupControl(ACanvas: TCanvas; ARect: TRect;
AGroupViewInfo: TdxNavBarGroupViewInfo); override;
property LookAndFeel: TcxLookAndFeel read FLookAndFeel;
published
property SkinName: TdxSkinName read GetSkinName write SetSkinName stored IsSkinNameStored;
property SkinNameAssigned: Boolean read GetSkinNameAssigned write SetSkinNameAssigned default False;
end;
{ TdxNavBarSkinExplorerBarLinkViewInfo }
TdxNavBarSkinExplorerBarLinkViewInfo = class(TdxNavBarLinkViewInfo)
public
function FontColor: TColor; override;
end;
{ TdxNavBarSkinExplorerBarGroupViewInfo }
TdxNavBarSkinExplorerBarGroupViewInfo = class(TdxNavBarGroupViewInfo)
public
function CaptionFontColor: TColor; override;
procedure CalculateBounds(X: Integer; Y: Integer); override;
end;
implementation
uses
dxNavBarViewsFact, dxSkinsCore, Math, cxGeometry;
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;
end;
{ TdxNavBarSkinNavPaneGroupViewInfo }
function TdxNavBarSkinNavPaneGroupViewInfo.CaptionFontColor: TColor;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
with TdxNavBarSkinNavPanePainter(Painter) do
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneGroupButton[False];
if AElement <> nil then
Result := AElement.TextColor
else
Result := inherited CaptionFontColor;
end;
end;
{ TdxNavBarSkinNavPaneLinkViewInfo }
function TdxNavBarSkinNavPaneLinkViewInfo.FontColor: TColor;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
with TdxNavBarSkinNavPanePainter(Painter) do
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneItem;
if AElement <> nil then
Result := AElement.TextColor
else
Result := inherited FontColor;
end;
end;
function TdxNavBarSkinNavPaneLinkViewInfo.SelectionRect: TRect;
begin
Result := Rect;
InflateRect(Result, -2, 0);
end;
{ TdxNavBarSkinNavPaneViewInfo }
procedure TdxNavBarSkinNavPaneViewInfo.AssignDefaultNavigationPaneHeaderStyle;
begin
with NavBar.DefaultStyles.NavigationPaneHeader do
begin
ResetValues;
HAlignment := haCenter;
BackColor := clNone;
BackColor2 := clNone;
Font.Color := clNone;
Font.Name := 'Arial';
Font.Style := [fsBold];
Font.Size := 9;
end;
end;
function TdxNavBarSkinNavPaneViewInfo.HeaderFont: TFont;
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
Result := inherited HeaderFont;
if (Result.Size = 9) and GetSkinInfo(ASkinInfo) then
if Assigned(ASkinInfo.NavPaneCaptionFontSize) then
Result.Size := ASkinInfo.NavPaneCaptionFontSize.Value;
end;
function TdxNavBarSkinNavPaneViewInfo.HeaderFontColor: TColor;
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
if GetSkinInfo(ASkinInfo) and (ASkinInfo.NavPaneGroupCaption <> nil) then
Result := ASkinInfo.NavPaneGroupCaption.TextColor
else
Result := inherited HeaderFontColor;
end;
function TdxNavBarSkinNavPaneViewInfo.GetHeaderHeight: Integer;
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
Result := inherited GetHeaderHeight;
if GetSkinInfo(ASkinInfo) then
if Assigned(ASkinInfo.NavPaneCaptionHeight) then
Result := Max(ASkinInfo.NavPaneCaptionHeight.Value, Result);
end;
function TdxNavBarSkinNavPaneViewInfo.GetOverflowPanelHeight: Integer;
var
AOverflowButton: TdxSkinElement;
AOverflowPanel: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
Result := inherited GetOverflowPanelHeight;
if GetSkinInfo(ASkinInfo) then
begin
AOverflowButton := ASkinInfo.NavPaneOverflowPanelItem;
AOverflowPanel := ASkinInfo.NavPaneOverflowPanel;
if (AOverflowButton <> nil) and (AOverflowPanel <> nil) then
with AOverflowPanel.ContentOffset do
Result := Max(Result, Top + Bottom + AOverflowButton.Size.cy);
end;
end;
function TdxNavBarSkinNavPaneViewInfo.GetOverflowPanelClientOffset: TRect;
var
AOverflowPanel: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AOverflowPanel := nil;
if GetSkinInfo(ASkinInfo) then
AOverflowPanel := ASkinInfo.NavPaneOverflowPanel;
if AOverflowPanel = nil then
Result := inherited GetOverflowPanelClientOffset
else
Result := AOverflowPanel.ContentOffset.Rect;
end;
function TdxNavBarSkinNavPaneViewInfo.GetOverflowPanelImageWidthAddon: Integer;
var
AOverflowButton: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
if GetSkinInfo(ASkinInfo) then
AOverflowButton := ASkinInfo.NavPaneOverflowPanelItem
else
AOverflowButton := nil;
if AOverflowButton = nil then
Result := inherited GetOverflowPanelImageWidthAddon
else
with AOverflowButton.ContentOffset do
Result := (Left + Right) div 2;
end;
function TdxNavBarSkinNavPaneViewInfo.GetOverflowPanelSignWidth: Integer;
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
Result := inherited GetOverflowPanelSignWidth;
if GetSkinInfo(ASkinInfo) then
begin
if ASkinInfo.NavPaneOverflowPanelExpandedItem <> nil then
with ASkinInfo.NavPaneOverflowPanelExpandedItem do
Result := Max(Size.cx, Result);
end;
end;
function TdxNavBarSkinNavPaneViewInfo.GetSkinInfo(
var ASkinInfo: TdxSkinLookAndFeelPainterInfo): Boolean;
begin
with TdxNavBarSkinNavPanePainter(Painter) do
Result := GetSkinPainterData(ASkinInfo);
end;
{ TdxNavBarSkinNavPanePainter }
constructor TdxNavBarSkinNavPanePainter.Create(ANavBar: TdxCustomNavBar);
begin
inherited Create(ANavBar);
FLookAndFeel := TcxLookAndFeel.Create(nil);
FLookAndFeel.NativeStyle := False;
FLookAndFeel.OnChanged := LookAndFeelChanged;
end;
destructor TdxNavBarSkinNavPanePainter.Destroy;
begin
FLookAndFeel.Free;
inherited Destroy;
end;
function TdxNavBarSkinNavPanePainter.CreateViewInfo: TdxNavBarViewInfo;
begin
Result := TdxNavBarSkinNavPaneViewInfo.Create(Self);
end;
function TdxNavBarSkinNavPanePainter.CreateGroupViewInfo(AViewInfo: TdxNavBarViewInfo;
AGroup: TdxNavBarGroup; ACaptionVisible: Boolean; AItemsVisible: Boolean): TdxNavBarGroupViewInfo;
begin
Result := TdxNavBarSkinNavPaneGroupViewInfo.Create(AViewInfo, AGroup, ACaptionVisible,
AItemsVisible);
end;
function TdxNavBarSkinNavPanePainter.CreateLinkViewInfo(AViewInfo: TdxNavBarGroupViewInfo;
ALink: TdxNavBarItemLink; ACaptionVisible: Boolean;
AImageVisisble: Boolean): TdxNavBarLinkViewInfo;
begin
Result := TdxNavBarSkinNavPaneLinkViewInfo.Create(AViewInfo, ALink, ACaptionVisible,
AImageVisisble);
end;
function TdxNavBarSkinNavPanePainter.GetMasterLookAndFeel: TcxLookAndFeel;
begin
Result := FLookAndFeel;
end;
function TdxNavBarSkinNavPanePainter.GetSkinPainterData(
var AData: TdxSkinLookAndFeelPainterInfo): Boolean;
begin
Result := GetExtendedStylePainters.GetPainterData(FLookAndFeel.SkinPainter, AData);
end;
procedure TdxNavBarSkinNavPanePainter.LookAndFeelChanged(
Sender: TcxLookAndFeel; AChangedValues: TcxLookAndFeelValues);
begin
NavBar.InvalidateAll(doRecreate);
end;
function TdxNavBarSkinNavPanePainter.InternalDrawScrollButton(ADownButton: Boolean;
const ARect: TRect; AState: TdxNavBarObjectStates): Boolean;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneScrollButtons[ADownButton];
Result := AElement <> nil;
if Result then
AElement.Draw(Canvas.Handle, ARect, 0, NavBarObjectStateToSkinState(AState));
end;
function TdxNavBarSkinNavPanePainter.IsSkinAvailable: Boolean;
begin
Result := FLookAndFeel.SkinPainter <> nil;
end;
function TdxNavBarSkinNavPanePainter.IsSkinNameStored: Boolean;
begin
Result := SkinNameAssigned;
end;
function TdxNavBarSkinNavPanePainter.GetSkinName: TdxSkinName;
begin
Result := FLookAndFeel.SkinName;
end;
procedure TdxNavBarSkinNavPanePainter.SetSkinName(const Value: TdxSkinName);
begin
FLookAndFeel.SkinName := Value;
end;
function TdxNavBarSkinNavPanePainter.GetSkinNameAssigned: Boolean;
begin
Result := lfvSkinName in FLookAndFeel.AssignedValues;
end;
procedure TdxNavBarSkinNavPanePainter.SetSkinNameAssigned(AValue: Boolean);
begin
if AValue then
FLookAndFeel.AssignedValues := FLookAndFeel.AssignedValues + [lfvSkinName]
else
FLookAndFeel.AssignedValues := FLookAndFeel.AssignedValues - [lfvSkinName];
end;
function TdxNavBarSkinNavPanePainter.CustomDrawHeader: Boolean;
begin
Result := False;
if Assigned(NavBar.OnCustomDrawNavigationPaneHeader) then
NavBar.OnCustomDrawNavigationPaneHeader(NavBar, Canvas, ViewInfo, Result);
end;
function TdxNavBarSkinNavPanePainter.CustomDrawOverflowPanel: Boolean;
begin
Result := False;
if Assigned(NavBar.OnCustomDrawNavigationPaneOverflowPanel) then
NavBar.OnCustomDrawNavigationPaneOverflowPanel(NavBar, Canvas, ViewInfo, Result);
end;
function TdxNavBarSkinNavPanePainter.CustomDrawSplitter: Boolean;
begin
Result := False;
if Assigned(NavBar.OnCustomDrawNavigationPaneSplitter) then
NavBar.OnCustomDrawNavigationPaneSplitter(NavBar, Canvas, ViewInfo, Result);
end;
procedure TdxNavBarSkinNavPanePainter.DrawBackground;
var
AColor: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AColor := nil;
if GetSkinPainterData(ASkinInfo) then
AColor := ASkinInfo.NavBarBackgroundColor;
if AColor = nil then
inherited DrawBackground
else
begin
Canvas.Brush.Color := AColor.Color;
Canvas.FillRect(NavBar.ClientRect);
end;
end;
procedure TdxNavBarSkinNavPanePainter.DrawBorder;
begin
if not IsSkinAvailable then
inherited DrawBorder;
end;
procedure TdxNavBarSkinNavPanePainter.DrawBottomScrollButton;
begin
with ViewInfo do
if not InternalDrawScrollButton(True, BottomScrollButtonRect,
BottomScrollButtonState)
then
inherited DrawBottomScrollButton;
end;
procedure TdxNavBarSkinNavPanePainter.DrawHeader;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
if not CustomDrawHeader then
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneGroupCaption;
if AElement = nil then
inherited DrawHeader
else
begin
AElement.Draw(Canvas.Handle, ViewInfo.HeaderRect);
DrawHeaderText;
end;
end;
end;
procedure TdxNavBarSkinNavPanePainter.DrawGroupBorder(AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneGroupClient;
if AElement = nil then
inherited DrawGroupBorder(AGroupViewInfo)
else
begin
AElement.Draw(Canvas.Handle, AGroupViewInfo.ControlRect);
end;
end;
procedure TdxNavBarSkinNavPanePainter.DrawGroupCaptionButton(
AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AElement: TdxSkinElement;
ARect: TRect;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AElement := nil;
with AGroupViewInfo do
begin
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneGroupButton[sActive in AGroupViewInfo.State];
if AElement = nil then
inherited DrawGroupCaptionButton(AGroupViewInfo)
else
begin
ARect := AGroupViewInfo.CaptionRect;
Dec(ARect.Top);
AElement.Draw(Canvas.Handle, ARect, 0, NavBarObjectStateToSkinState(State));
end;
end;
end;
procedure TdxNavBarSkinNavPanePainter.DrawGroupControl(ACanvas: TCanvas; ARect: TRect;
AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneGroupClient;
if AElement = nil then
inherited DrawGroupControl(ACanvas, ARect, AGroupViewInfo)
else
AElement.Draw(ACanvas.Handle, ARect);
end;
procedure TdxNavBarSkinNavPanePainter.DrawItemSelection(
ALinkViewInfo: TdxNavBarLinkViewInfo);
var
AItem: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
AState: TdxSkinElementState;
begin
AItem := nil;
AState := NavBarObjectStateToSkinState(ALinkViewInfo.State);
if GetSkinPainterData(ASkinInfo) then
if (AState = esNormal) and (sSelected in ALinkViewInfo.State) then
AItem := ASkinInfo.NavPaneSelectedItem
else
AItem := ASkinInfo.NavPaneItem;
if AItem = nil then
inherited DrawItemSelection(ALinkViewInfo)
else
AItem.Draw(Canvas.Handle, ALinkViewInfo.SelectionRect, 0, AState);
end;
procedure TdxNavBarSkinNavPanePainter.DrawOverflowPanel;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
if not CustomDrawOverflowPanel then
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneOverflowPanel;
if AElement = nil then
inherited DrawOverflowPanel
else
begin
AElement.Draw(Canvas.Handle, ViewInfo.OverflowPanelRect);
DrawOverflowPanelSign;
DrawOverflowPanelItems;
end;
end;
end;
procedure TdxNavBarSkinNavPanePainter.DrawOverflowPanelItems;
var
AElementItem: TdxSkinElement;
AElementState: TdxSkinElementState;
AGroup: TdxNavBarGroup;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
I: Integer;
R: TRect;
begin
AElementItem := nil;
if GetSkinPainterData(ASkinInfo) then
AElementItem := ASkinInfo.NavPaneOverflowPanelItem;
if AElementItem = nil then
inherited DrawOverflowPanelItems
else
with ViewInfo do
for I := 0 to OverflowPanelVisibleItemCount - 1 do
begin
R := OverflowPanelItems[I].SelectionRect;
AGroup := OverflowPanelItems[I].Group;
if NavBar.NavigationPaneOverflowPanelHotTrackedIndex = I then
AElementState := esHot
else
if NavBar.NavigationPaneOverflowPanelPressedIndex = I then
AElementState := esPressed
else
AElementState := esNormal;
AElementItem.Draw(Canvas.Handle, R, Byte(AGroup = NavBar.ActiveGroup),
AElementState);
R := ViewInfo.OverflowPanelItems[I].Rect;
with ImagePainterClass do
if IsValidImage(GetOverflowPanelImageList, GetOverflowPanelImageIndex(AGroup)) then
DrawImage(Canvas, GetOverflowPanelImageList, GetOverflowPanelImageIndex(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 TdxNavBarSkinNavPanePainter.DrawOverflowPanelSign;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
AState: TdxSkinElementState;
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneOverflowPanelExpandedItem;
if AElement = nil then
inherited DrawOverflowPanelSign
else
with ViewInfo do
begin
if NavBar.NavigationPaneOverflowPanelSignPressed then
AState := esPressed
else
if NavBar.NavigationPaneOverflowPanelSignHotTracked then
AState := esHot
else
AState := esNormal;
AElement.Draw(Canvas.Handle, ViewInfo.OverflowPanelSignRect, 0, AState);
end;
end;
procedure TdxNavBarSkinNavPanePainter.DrawPopupMenuItem(ACanvas: TCanvas; ARect: TRect;
AImageList: TCustomImageList; AImageIndex: Integer; AText: String;
State: TdxNavBarObjectStates);
var
ABuf: TcxBitmap;
APopupMenu: TdxSkinElement;
ASelected: TdxSkinElement;
ASeparator: TdxSkinElement;
ASideStrip: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
AImageAreaWidth: Integer;
R: TRect;
function InitializeElements: Boolean;
begin
Result := GetSkinPainterData(ASkinInfo);
if Result then
begin
APopupMenu := ASkinInfo.PopupMenu;
ASelected := ASkinInfo.PopupMenuLinkSelected;
ASeparator := ASkinInfo.PopupMenuSeparator;
ASideStrip := ASkinInfo.PopupMenuSideStrip;
Result := (APopupMenu <> nil) and (ASelected <> nil) and (ASeparator <> nil) and
(ASideStrip <> nil);
end;
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 TdxNavBarSkinNavPaneViewInfo(ViewInfo) do
InflateRect(R, -GetOverflowPanelPopupMenuImageIndent,
-GetOverflowPanelPopupMenuImageIndent);
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 TdxNavBarSkinNavPaneViewInfo(ViewInfo) do
R.Left := AImageAreaWidth + GetOverflowPanelPopupMenuTextIndent;
if sDisabled in State then
ACanvas.Font.Color := clGrayText
else
ACanvas.Font.Color := clMenuText;
ACanvas.Brush.Style := bsClear;
cxDrawText(ACanvas.Handle, 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 TdxNavBarSkinNavPaneViewInfo(ViewInfo) do
AImageAreaWidth := 2 * GetOverflowPanelPopupMenuImageIndent + GetSmallImageWidth;
ABuf := TcxBitmap.CreateSize(ARect);
try
ABuf.Canvas.Font := ACanvas.Font;
ABuf.PixelFormat := pf32bit;
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;
BitBlt(ACanvas.Handle, ARect.Left, ARect.Top, ABuf.Width, ABuf.Height,
ABuf.Canvas.Handle, 0, 0, SRCCOPY);
finally
ABuf.Free;
end;
end;
end;
procedure TdxNavBarSkinNavPanePainter.DrawSplitter;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
if not CustomDrawSplitter then
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavPaneSplitter;
if AElement = nil then
inherited DrawSplitter
else
AElement.Draw(Canvas.Handle, ViewInfo.SplitterRect);
end;
end;
procedure TdxNavBarSkinNavPanePainter.DrawTopScrollButton;
begin
with ViewInfo do
if not InternalDrawScrollButton(False, TopScrollButtonRect,
TopScrollButtonState)
then
inherited DrawTopScrollButton;
end;
{ TdxNavBarSkinExplorerBarPainter }
constructor TdxNavBarSkinExplorerBarPainter.Create(ANavBar: TdxCustomNavBar);
begin
inherited Create(ANavBar);
FLookAndFeel := TcxLookAndFeel.Create(nil);
FLookAndFeel.NativeStyle := False;
FLookAndFeel.OnChanged := LookAndFeelChanged;
end;
destructor TdxNavBarSkinExplorerBarPainter.Destroy;
begin
FLookAndFeel.Free;
inherited Destroy;
end;
procedure TdxNavBarSkinExplorerBarPainter.DrawBackground;
var
ABackground: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
ABackground := nil;
if GetSkinPainterData(ASkinInfo) then
ABackground := ASkinInfo.NavBarBackgroundColor;
if ABackground = nil then
inherited DrawBackground
else
ABackground.Draw(Canvas.Handle, NavBar.ClientRect);
end;
procedure TdxNavBarSkinExplorerBarPainter.DrawGroupBackground(
AGroupViewInfo: TdxNavBarGroupViewInfo);
begin
if not IsSkinAvailable then
inherited DrawGroupBackground(AGroupViewInfo);
end;
procedure TdxNavBarSkinExplorerBarPainter.DrawGroupBorder(
AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavBarGroupClient;
if AElement = nil then
inherited DrawGroupBorder(AGroupViewInfo)
else
begin
AElement.Draw(Canvas.Handle, AGroupViewInfo.ItemsRect);
if not AGroupViewInfo.IsCaptionVisible then
DrawGroupTopBorder(AGroupViewInfo);
end;
end;
procedure TdxNavBarSkinExplorerBarPainter.DrawGroupTopBorder(
AGroupViewInfo: TdxNavBarGroupViewInfo);
var
ACanvas: TcxCanvas;
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
R: TRect;
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavBarGroupHeader;
if AElement <> nil then
begin
ACanvas := TcxCanvas.Create(Canvas);
try
ACanvas.SaveClipRegion;
try
R := AGroupViewInfo.ItemsRect;
ACanvas.SetClipRegion(TcxRegion.Create(cxRectSetHeight(R, 1)), roSet);
R.Bottom := R.Top + 1;
Dec(R.Top, AElement.Size.cy);
AElement.Draw(ACanvas.Handle, R);
finally
ACanvas.RestoreClipRegion;
end;
finally
ACanvas.Free;
end;
end;
end;
procedure TdxNavBarSkinExplorerBarPainter.DrawGroupCaption(
AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavBarGroupHeader;
if AElement <> nil then
begin
AElement.Draw(Canvas.Handle, AGroupViewInfo.CaptionRect);
DrawGroupCaptionButton(AGroupViewInfo);
DrawGroupCaptionText(AGroupViewInfo);
if AGroupViewInfo.IsCaptionImageVisible then
DrawGroupCaptionImage(AGroupViewInfo);
end else
inherited DrawGroupCaption(AGroupViewInfo);
end;
procedure TdxNavBarSkinExplorerBarPainter.DrawGroupCaptionButton(
AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AElement := nil;
with AGroupViewInfo do
begin
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavBarGroupButtons[sExpanded in State];
if AElement = nil then
inherited DrawGroupCaptionButton(AGroupViewInfo)
else
if Group.ShowExpandButton then
AElement.Draw(Canvas.Handle, AGroupViewInfo.CaptionSignRect, 0,
NavBarObjectStateToSkinState(State));
end;
end;
procedure TdxNavBarSkinExplorerBarPainter.DrawGroupControl(ACanvas: TCanvas;
ARect: TRect; AGroupViewInfo: TdxNavBarGroupViewInfo);
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavBarGroupClient;
if AElement = nil then
inherited DrawGroupControl(ACanvas, ARect, AGroupViewInfo)
else
AElement.Draw(ACanvas.Handle, cxRectInflate(ARect, 1, 0, 1, 1));
end;
function TdxNavBarSkinExplorerBarPainter.CreateGroupViewInfo(
AViewInfo: TdxNavBarViewInfo; AGroup: TdxNavBarGroup; ACaptionVisible: Boolean;
AItemsVisible: Boolean): TdxNavBarGroupViewInfo;
begin
Result := TdxNavBarSkinExplorerBarGroupViewInfo.Create(AViewInfo, AGroup,
ACaptionVisible, AItemsVisible);
end;
function TdxNavBarSkinExplorerBarPainter.CreateLinkViewInfo(
AViewInfo: TdxNavBarGroupViewInfo; ALink: TdxNavBarItemLink; ACaptionVisible: Boolean;
AImageVisisble: Boolean): TdxNavBarLinkViewInfo;
begin
Result := TdxNavBarSkinExplorerBarLinkViewInfo.Create(AViewInfo, ALink,
ACaptionVisible, AImageVisisble);
end;
function TdxNavBarSkinExplorerBarPainter.GetMasterLookAndFeel: TcxLookAndFeel;
begin
Result := FLookAndFeel;
end;
function TdxNavBarSkinExplorerBarPainter.GetSkinPainterData(
var AData: TdxSkinLookAndFeelPainterInfo): Boolean;
begin
Result := GetExtendedStylePainters.GetPainterData(FLookAndFeel.SkinPainter, AData);
end;
function TdxNavBarSkinExplorerBarPainter.IsSkinAvailable: Boolean;
begin
Result := FLookAndFeel.SkinPainter <> nil;
end;
procedure TdxNavBarSkinExplorerBarPainter.LookAndFeelChanged(
Sender: TcxLookAndFeel; AChangedValues: TcxLookAndFeelValues);
begin
NavBar.InvalidateAll(doRecreate);
end;
function TdxNavBarSkinExplorerBarPainter.IsSkinNameStored: Boolean;
begin
Result := SkinNameAssigned;
end;
function TdxNavBarSkinExplorerBarPainter.GetSkinName: TdxSkinName;
begin
Result := FLookAndFeel.SkinName;
end;
procedure TdxNavBarSkinExplorerBarPainter.SetSkinName(const Value: TdxSkinName);
begin
FLookAndFeel.SkinName := Value;
end;
function TdxNavBarSkinExplorerBarPainter.GetSkinNameAssigned: Boolean;
begin
Result := lfvSkinName in FLookAndFeel.AssignedValues;
end;
procedure TdxNavBarSkinExplorerBarPainter.SetSkinNameAssigned(AValue: Boolean);
begin
if AValue then
FLookAndFeel.AssignedValues := FLookAndFeel.AssignedValues + [lfvSkinName]
else
FLookAndFeel.AssignedValues := FLookAndFeel.AssignedValues - [lfvSkinName];
end;
{ TdxNavBarSkinExplorerBarGroupViewInfo }
function TdxNavBarSkinExplorerBarGroupViewInfo.CaptionFontColor: TColor;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
with TdxNavBarSkinExplorerBarPainter(Painter) do
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavBarGroupHeader;
if AElement <> nil then
Result := AElement.TextColor
else
Result := inherited CaptionFontColor;
end;
end;
procedure TdxNavBarSkinExplorerBarGroupViewInfo.CalculateBounds(X: Integer; Y: Integer);
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
inherited CalculateBounds(X, Y);
with TdxNavBarSkinExplorerBarPainter(Painter) do
begin
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavBarGroupHeader
else
AElement := nil;
if (AElement <> nil) and IsCaptionVisible and not IsRectEmpty(FCaptionImageRect) then
begin
OffsetRect(FCaptionImageRect, AElement.ContentOffset.Left, 0);
Inc(FCaptionTextRect.Left, AElement.ContentOffset.Left);
end;
end;
end;
{ TdxNavBarSkinExplorerBarLinkViewInfo }
function TdxNavBarSkinExplorerBarLinkViewInfo.FontColor: TColor;
var
AElement: TdxSkinElement;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
with TdxNavBarSkinExplorerBarPainter(Painter) do
begin
AElement := nil;
if GetSkinPainterData(ASkinInfo) then
AElement := ASkinInfo.NavBarItem;
if AElement <> nil then
Result := AElement.TextColor
else
Result := inherited FontColor;
end;
end;
initialization
dxNavBarViewsFactory.RegisterView(dxNavBarSkinExplorerBarView,
'SkinExplorerBarView', TdxNavBarSkinExplorerBarPainter);
dxNavBarViewsFactory.RegisterView(dxNavBarSkinNavigatorPaneView,
'SkinNavigationPaneView', TdxNavBarSkinNavPanePainter);
RegisterClasses([TdxNavBarSkinNavPanePainter, TdxNavBarSkinExplorerBarPainter]);
finalization
dxNavBarViewsFactory.UnRegisterView(dxNavBarSkinExplorerBarView);
dxNavBarViewsFactory.UnRegisterView(dxNavBarSkinNavigatorPaneView);
end.