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

275 lines
10 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 dxSkinsdxStatusBarPainter;
interface
uses
Windows, SysUtils, Classes, dxSkinsCore, cxLookAndFeels, dxSkinsLookAndFeelPainter, dxStatusBar,
cxGraphics, Graphics, cxLookAndFeelPainters;
type
{ TdxStatusBarSkinPainter }
TdxStatusBarSkinPainter = class(TdxStatusBarStandardPainter)
protected
class function CheckStatusBarRect(AFormStatusBar: TdxSkinElement; const R: TRect): TRect;
class procedure DrawContainerControl(APanelStyle: TdxStatusBarContainerPanelStyle); override;
class function GetSkinInfo(AStatusBar: TdxCustomStatusBar;
out ASkinInfo: TdxSkinLookAndFeelPainterInfo): Boolean;
class function IsSkinAvailable(AStatusBar: TdxCustomStatusBar): Boolean;
class function IsSizeGripInPanel(AStatusBar: TdxCustomStatusBar): Boolean; override;
public
class procedure AdjustTextColor(AStatusBar: TdxCustomStatusBar; var AColor: TColor;
Active: Boolean); override;
class function DrawSizeGripFirst: Boolean; override;
class function SeparatorSize: Integer; override;
class procedure DrawBorder(AStatusBar: TdxCustomStatusBar; ACanvas: TcxCanvas;
var R: TRect); override;
class procedure DrawClippedElement(AElement: TdxSkinElement; ACanvas: TcxCanvas;
const ARect, AClipRegion: TRect; ARegionOperation: TcxRegionOperation = roSet);
class procedure DrawEmptyPanel(AStatusBar: TdxCustomStatusBar; ACanvas: TcxCanvas;
R: TRect); override;
class procedure DrawPanelBorder(AStatusBar: TdxCustomStatusBar;
ABevel: TdxStatusBarPanelBevel; ACanvas: TcxCanvas; var R: TRect); override;
class procedure DrawPanelSeparator(AStatusBar: TdxCustomStatusBar;
ACanvas: TcxCanvas; const R: TRect); override;
class procedure DrawSizeGrip(AStatusBar: TdxCustomStatusBar; ACanvas: TcxCanvas;
R: TRect; AOverlapped: Boolean); override;
class procedure FillBackground(AStatusBar: TdxCustomStatusBar;
APanel: TdxStatusBarPanel; ACanvas: TcxCanvas; const R: TRect); override;
end;
implementation
uses
Types, cxGeometry;
type
TdxCustomStatusBarAccess = class(TdxCustomStatusBar);
{ TdxStatusBarSkinPainter }
class procedure TdxStatusBarSkinPainter.AdjustTextColor(AStatusBar: TdxCustomStatusBar;
var AColor: TColor; Active: Boolean);
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
inherited AdjustTextColor(AStatusBar, AColor, Active);
if AColor = clWindowText then
if GetSkinInfo(AStatusBar, ASkinInfo) then
begin
if Active then
begin
if ASkinInfo.FormStatusBar <> nil then
AColor := ASkinInfo.FormStatusBar.TextColor;
end
else
if ASkinInfo.BarDisabledTextColor <> nil then
AColor := ASkinInfo.BarDisabledTextColor.Value;
end;
end;
class function TdxStatusBarSkinPainter.CheckStatusBarRect(AFormStatusBar: TdxSkinElement;
const R: TRect): TRect;
begin
Result := R;
if Assigned(AFormStatusBar) then
with AFormStatusBar.ContentOffset do
begin
Dec(Result.Left, Left);
Inc(Result.Right, Right);
Inc(Result.Bottom, Bottom);
end;
end;
class procedure TdxStatusBarSkinPainter.DrawContainerControl(APanelStyle: TdxStatusBarContainerPanelStyle);
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
R, AParentRect: TRect;
ACanvas: TcxCanvas;
AControl: TdxStatusBarContainerControl;
AStatusBar: TdxCustomStatusBar;
begin
AParentRect := APanelStyle.StatusBarControl.ClientBounds;
AControl := APanelStyle.Container;
AStatusBar := APanelStyle.StatusBarControl;
ACanvas := AControl.Canvas;
OffsetRect(AParentRect, -AControl.Left, -AControl.Top);
R := AControl.ClientRect;
if GetSkinInfo(AStatusBar, ASkinInfo) and (ASkinInfo.FormStatusBar <> nil) then
begin
DrawClippedElement(ASkinInfo.FormStatusBar, ACanvas,
CheckStatusBarRect(ASkinInfo.FormStatusBar, AParentRect), R,
roIntersect);
end
else
inherited;
end;
class function TdxStatusBarSkinPainter.DrawSizeGripFirst: Boolean;
begin
Result := False;
end;
class function TdxStatusBarSkinPainter.SeparatorSize: Integer;
begin
Result := 1;
end;
class procedure TdxStatusBarSkinPainter.DrawBorder(AStatusBar: TdxCustomStatusBar; ACanvas: TcxCanvas;
var R: TRect);
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
ABorderWidth: Integer;
AStatusBarRect: TRect;
begin
if GetSkinInfo(AStatusBar, ASkinInfo) and (ASkinInfo.FormStatusBar <> nil) then
begin
AStatusBarRect := AStatusBar.Bounds;
DrawClippedElement(ASkinInfo.FormStatusBar, ACanvas,
CheckStatusBarRect(ASkinInfo.FormStatusBar, AStatusBarRect), R,
roIntersect);
R := cxRectInflate(R, -1, -ASkinInfo.FormStatusBar.ContentOffset.Top, -1, -1);
ABorderWidth := TdxCustomStatusBarAccess(AStatusBar).BorderWidth;
R := cxRectInflate(R, -ABorderWidth, -ABorderWidth);
end
else
inherited;
end;
class procedure TdxStatusBarSkinPainter.DrawClippedElement(AElement: TdxSkinElement;
ACanvas: TcxCanvas; const ARect: TRect; const AClipRegion: TRect;
ARegionOperation: TcxRegionOperation = roSet);
begin
ACanvas.SaveClipRegion;
try
ACanvas.SetClipRegion(TcxRegion.Create(AClipRegion), ARegionOperation);
AElement.Draw(ACanvas.Handle, ARect);
finally
ACanvas.RestoreClipRegion;
end;
end;
class procedure TdxStatusBarSkinPainter.DrawEmptyPanel(AStatusBar: TdxCustomStatusBar;
ACanvas: TcxCanvas; R: TRect);
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
if not GetSkinInfo(AStatusBar, ASkinInfo) or (ASkinInfo.FormStatusBar = nil) then
inherited DrawEmptyPanel(AStatusBar, ACanvas, R)
else
DrawClippedElement(ASkinInfo.FormStatusBar, ACanvas,
CheckStatusBarRect(ASkinInfo.FormStatusBar, AStatusBar.Bounds), R);
end;
class procedure TdxStatusBarSkinPainter.DrawPanelBorder(AStatusBar: TdxCustomStatusBar;
ABevel: TdxStatusBarPanelBevel; ACanvas: TcxCanvas; var R: TRect);
var
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
if (ABevel <> dxpbNone) and GetSkinInfo(AStatusBar, ASkinInfo) and
(ASkinInfo.LinkBorderPainter <> nil) then
begin
ASkinInfo.LinkBorderPainter.Draw(ACanvas.Handle, R);
R := cxRectContent(R, ASkinInfo.LinkBorderPainter.ContentOffset.Rect);
end
else
inherited;
end;
class procedure TdxStatusBarSkinPainter.DrawPanelSeparator(AStatusBar: TdxCustomStatusBar;
ACanvas: TcxCanvas; const R: TRect);
begin
if not IsSkinAvailable(AStatusBar) then
inherited DrawPanelSeparator(AStatusBar, ACanvas, R);
end;
class procedure TdxStatusBarSkinPainter.DrawSizeGrip(AStatusBar: TdxCustomStatusBar;
ACanvas: TcxCanvas; R: TRect; AOverlapped: Boolean);
var
ARect: TRect;
ASkinInfo: TdxSkinLookAndFeelPainterInfo;
begin
if GetSkinInfo(AStatusBar, ASkinInfo) and (ASkinInfo.FormStatusBar <> nil) and
(ASkinInfo.SizeGrip <> nil) then
begin
ARect := cxRectContent(R, ASkinInfo.FormStatusBar.ContentOffset.Rect);
ARect.Left := ARect.Right - ASkinInfo.SizeGrip.Size.cx;
ARect.Top := ARect.Bottom - ASkinInfo.SizeGrip.Size.cy;
ASkinInfo.SizeGrip.Draw(ACanvas.Handle, ARect);
end
else
inherited DrawSizeGrip(AStatusBar, ACanvas, R, AOverlapped);
end;
class procedure TdxStatusBarSkinPainter.FillBackground(
AStatusBar: TdxCustomStatusBar; APanel: TdxStatusBarPanel; ACanvas: TcxCanvas;
const R: TRect);
begin
if not IsSkinAvailable(AStatusBar) then
inherited;
end;
class function TdxStatusBarSkinPainter.GetSkinInfo(AStatusBar: TdxCustomStatusBar;
out ASkinInfo: TdxSkinLookAndFeelPainterInfo): Boolean;
begin
with TdxCustomStatusBarAccess(AStatusBar) do
Result := GetExtendedStylePainters.GetPainterData(LookAndFeel.SkinPainter,
ASkinInfo);
end;
class function TdxStatusBarSkinPainter.IsSkinAvailable(
AStatusBar: TdxCustomStatusBar): Boolean;
begin
with TdxCustomStatusBarAccess(AStatusBar) do
Result := LookAndFeel.SkinPainter <> nil;
end;
class function TdxStatusBarSkinPainter.IsSizeGripInPanel(AStatusBar: TdxCustomStatusBar): Boolean;
begin
Result := not IsSkinAvailable(AStatusBar);
end;
initialization
dxStatusBarSkinPainterClass := TdxStatusBarSkinPainter;
finalization
dxStatusBarSkinPainterClass := nil;
end.