Componentes.Terceros.DevExp.../internal/x.36/1/ExpressDocking Library/Sources/dxDockControlXPView.pas
2008-09-04 11:31:51 +00:00

472 lines
16 KiB
ObjectPascal

{*******************************************************************}
{ }
{ Developer Express Visual Component Library }
{ ExpressDocking }
{ }
{ Copyright (c) 2002-2008 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 EXPRESSDOCKING 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 dxDockControlXPView;
{$I cxVer.inc}
interface
uses
Menus, Windows, Graphics, Classes, Controls, ExtCtrls, Messages, Forms,
dxDockControl;
type
TdxDockControlXPPainter = class(TdxDockControlPainter)
protected
function NeedRedrawOnResize: Boolean; override;
public
// CustomDockControl
function CanVerticalCaption: Boolean; override;
function GetCaptionButtonSize: Integer; override;
function GetCaptionHeight: Integer; override;
procedure DrawBorder(ACanvas: TCanvas; ARect: TRect); override;
procedure DrawCaption(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean); override;
procedure DrawCaptionSeparator(ACanvas: TCanvas; ARect: TRect); override;
procedure DrawCaptionText(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean); override;
procedure DrawCaptionCloseButton(ACanvas: TCanvas; ARect: TRect;
IsActive, IsDown, IsHot, IsSwitched: Boolean); override;
procedure DrawCaptionHideButton(ACanvas: TCanvas; ARect: TRect;
IsActive, IsDown, IsHot, IsSwitched: Boolean); override;
procedure DrawCaptionMaximizeButton(ACanvas: TCanvas; ARect: TRect;
IsActive, IsDown, IsHot, IsSwitched: Boolean); override;
procedure DrawClient(ACanvas: TCanvas; ARect: TRect); override;
// TabContainer
procedure DrawTabs(ACanvas: TCanvas; ARect, AActiveTabRect: TRect;
APosition: TdxTabContainerTabsPosition); override;
procedure DrawTab(ACanvas: TCanvas; AControl: TdxCustomDockControl;
ARect: TRect; IsActive: Boolean; APosition: TdxTabContainerTabsPosition); override;
procedure DrawTabsNextTabButton(ACanvas: TCanvas; ARect: TRect;
IsDown, IsHot, IsEnable: Boolean; APosition: TdxTabContainerTabsPosition); override;
procedure DrawTabsPrevTabButton(ACanvas: TCanvas; ARect: TRect;
IsDown, IsHot, IsEnable: Boolean; APosition: TdxTabContainerTabsPosition); override;
// AutoHideContainer
procedure DrawHideBar(ACanvas: TCanvas; ARect: TRect; APosition: TdxAutoHidePosition); override;
procedure DrawHideBarButton(ACanvas: TCanvas; AControl: TdxCustomDockControl;
ARect: TRect; APosition: TdxAutoHidePosition); override;
end;
implementation
uses
dxUxTheme, dxThemeManager, dxThemeConsts, dxDockConsts, cxGraphics, cxGeometry;
function TdxDockControlXPPainter.CanVerticalCaption: Boolean;
begin
if OpenTheme(totTab) <> 0 then Result := False
else Result := inherited CanVerticalCaption;
end;
function TdxDockControlXPPainter.GetCaptionButtonSize: Integer;
begin
if OpenTheme(totTab) <> 0 then Result := 14
else Result := inherited GetCaptionButtonSize;
end;
function TdxDockControlXPPainter.GetCaptionHeight: Integer;
begin
if OpenTheme(totTab) <> 0 then
begin
Result := 7 + GetFont.Size + 7;
if Result < 2 + GetImageHeight + 2 then
Result := 2 + GetImageHeight + 2;
end
else Result := inherited GetCaptionHeight;
end;
procedure TdxDockControlXPPainter.DrawBorder(ACanvas: TCanvas;
ARect: TRect);
var
ATheme: TdxTheme;
begin
ATheme := OpenTheme(totToolBar);
if ATheme <> 0 then
begin
if IsThemeBackgroundPartiallyTransparent(ATheme, TP_BUTTON, TS_HOT) then
cxDrawTransparentControlBackground(DockControl, ACanvas, ARect);
DrawThemeBackground(ATheme, ACanvas.Handle, TP_BUTTON, TS_HOT, ARect);
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawCaption(ACanvas: TCanvas; ARect: TRect; IsActive: Boolean);
var
ATheme: TdxTheme;
AClipRgn: HRGN;
AClipRgnExists: Boolean;
begin
ATheme := OpenTheme(totTab);
if ATheme <> 0 then
begin
if IsActive then
begin
AClipRgn := CreateRectRgn(0, 0, 0, 0);
try
AClipRgnExists := GetClipRgn(ACanvas.Handle, AClipRgn) = 1;
with ARect do
begin
ExcludeClipRect(ACanvas.Handle, Left, Top, Left + 2, Top + 2);
ExcludeClipRect(ACanvas.Handle, Right - 2, Top, Right, Top + 2);
ExcludeClipRect(ACanvas.Handle, Right - 2, Bottom - 2, Right, Bottom);
ExcludeClipRect(ACanvas.Handle, Left, Bottom - 2, Left + 2, Bottom);
end;
DrawThemeBackground(OpenTheme(totExplorerBar), ACanvas.Handle, EBP_NORMALGROUPBACKGROUND, 0, ARect);
if AClipRgnExists then
SelectClipRgn(ACanvas.Handle, AClipRgn)
else
SelectClipRgn(ACanvas.Handle, 0);
finally
DeleteObject(AClipRgn);
end;
end
else
DrawThemeBackground(ATheme, ACanvas.Handle, TABP_BODY, 0, ARect);
DrawThemeBackground(OpenTheme(totButton), ACanvas.Handle, BP_GROUPBOX, 0, ARect);
end
else
inherited;
end;
procedure TdxDockControlXPPainter.DrawCaptionSeparator(ACanvas: TCanvas; ARect: TRect);
var
ATheme: TdxTheme;
begin
ATheme := OpenTheme(totTab);
if ATheme <> 0 then
DrawThemeBackground(ATheme, ACanvas.Handle, TABP_BODY, 0, ARect)
else
inherited;
end;
procedure TdxDockControlXPPainter.DrawCaptionCloseButton(ACanvas: TCanvas;
ARect: TRect; IsActive, IsDown, IsHot, IsSwitched: Boolean);
var
ATheme: TdxTheme;
AState: Integer;
begin
ATheme := OpenTheme(totWindow);
if ATheme <> 0 then
begin
if IsDown and IsHot then
AState := CBS_PUSHED
else if IsHot then
AState := CBS_HOT
else AState := CBS_NORMAL;
DrawThemeBackground(ATheme, ACanvas.Handle, WP_SMALLCLOSEBUTTON, AState, ARect)
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawCaptionHideButton(ACanvas: TCanvas;
ARect: TRect; IsActive, IsDown, IsHot, IsSwitched: Boolean);
var
R, R1: TRect;
ABitmap, ARotatedBitmap: TBitmap;
ATheme: TdxTheme;
AState: Integer;
begin
ATheme := OpenTheme(totExplorerBar);
if ATheme <> 0 then
begin
if IsDown and IsHot then
AState := EBHP_PRESSED
else if IsHot then
AState := EBHP_HOT
else AState := EBHP_NORMAL;
ABitmap := TBitmap.Create;
try
ABitmap.PixelFormat := pf32bit;
R := Rect(0, 0, 16, 16);
ABitmap.Width := R.Right - R.Left;
ABitmap.Height := R.Bottom - R.Top;
R1 := R;
InflateRect(R1, 2, 2);
DrawThemeBackground(ATheme, ABitmap.Canvas.Handle, EBP_HEADERPIN, AState, R);
if not IsSwitched then RotateBitmap(ABitmap, raPlus90);
ARotatedBitmap := TBitmap.Create;
try
ARotatedBitmap.Width := ARect.Right - ARect.Left - 2;
ARotatedBitmap.Height := ARect.Bottom - ARect.Top - 2;
StretchBlt(ARotatedBitmap.Canvas.Handle, 0, 0, ARotatedBitmap.Width, ARotatedBitmap.Height,
ABitmap.Canvas.Handle, 0, 0, ABitmap.Width, ABitmap.Height, SRCCOPY);
ARotatedBitmap.PixelFormat := pf24bit;
ARotatedBitmap.Transparent := True;
ARotatedBitmap.TransparentColor := ARotatedBitmap.Canvas.Pixels[0, 0];
ACanvas.Draw(ARect.Left + 1, ARect.Top + 1, ARotatedBitmap);
finally
ARotatedBitmap.Free
end;
finally
ABitmap.Free;
end;
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawCaptionMaximizeButton(ACanvas: TCanvas;
ARect: TRect; IsActive, IsDown, IsHot, IsSwitched: Boolean);
var
ATheme: TdxTheme;
APart, AState: Integer;
begin
ATheme := OpenTheme(totWindow);
if ATheme <> 0 then
begin
if IsSwitched then
begin
APart := WP_RESTOREBUTTON;
if IsDown and IsHot then
AState := RBS_PUSHED
else if IsHot then
AState := RBS_HOT
else AState := RBS_NORMAL;
end
else
begin
APart := WP_MAXBUTTON;
if IsDown and IsHot then
AState := MAXBS_PUSHED
else if IsHot then
AState := MAXBS_HOT
else AState := MAXBS_NORMAL;
end;
DrawThemeBackground(ATheme, ACanvas.Handle, APart, AState, ARect)
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawClient(ACanvas: TCanvas; ARect: TRect);
var
ATheme: TdxTheme;
begin
ATheme := OpenTheme(totTab);
if ATheme <> 0 then
DrawThemeBackground(ATheme, ACanvas.Handle, TABP_BODY, 0, ARect)
else inherited;
end;
procedure TdxDockControlXPPainter.DrawCaptionText(ACanvas: TCanvas;
ARect: TRect; IsActive: Boolean);
var
R: TRect;
begin
if OpenTheme(totTab) <> 0 then
begin
if IsValidImageIndex(DockControl.ImageIndex) then
begin
R.Left := ARect.Left + 2 * GetCaptionHorizInterval;
R.Top := ARect.Top + (ARect.Bottom - ARect.Top - GetImageHeight) div 2;
R.Right := R.Left + GetImageWidth;
R.Bottom := R.Top + GetImageHeight;
if RectInRect(R, ARect) then
begin
DrawImage(ACanvas, DockControl.Images, DockControl.ImageIndex, R);
ARect.Left := R.Right + 2 * GetCaptionHorizInterval;
end;
end;
ACanvas.Brush.Style := bsClear;
ACanvas.Font := GetFont;
ACanvas.Font.Color := GetCaptionFontColor(IsActive);
cxDrawText(ACanvas.Handle, DockControl.Caption, ARect,
DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_END_ELLIPSIS);
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawHideBar(ACanvas: TCanvas; ARect: TRect;
APosition: TdxAutoHidePosition);
var
ATheme: TdxTheme;
begin
ATheme := OpenTheme(totTab);
if ATheme <> 0 then
DrawThemeBackground(ATheme, ACanvas.Handle, TABP_BODY, 0, ARect)
else inherited;
end;
procedure TdxDockControlXPPainter.DrawHideBarButton(ACanvas: TCanvas;
AControl: TdxCustomDockControl; ARect: TRect; APosition: TdxAutoHidePosition);
var
R: TRect;
ABitmap: TBitmap;
ATheme: TdxTheme;
Temp: Integer;
begin
ATheme := OpenTheme(totTab);
if ATheme <> 0 then
begin
ABitmap := TBitmap.Create;
try
ABitmap.PixelFormat := pf32bit;
R := ARect;
OffsetRect(R, -R.Left, -R.Top);
if APosition in [ahpLeft, ahpRight] then
begin
Temp := R.Right;
R.Right := R.Left + (R.Bottom - R.Top);
R.Bottom := R.Top + (Temp - R.Left);
end;
ABitmap.Width := R.Right - R.Left;
ABitmap.Height := R.Bottom - R.Top;
DrawThemeBackground(ATheme, ABitmap.Canvas.Handle, TABP_TOPTABITEM, TTIS_NORMAL, R);
case APosition of
ahpTop: RotateBitmap(ABitmap, ra180);
ahpLeft: RotateBitmap(ABitmap, raMinus90);
ahpRight: RotateBitmap(ABitmap, raPlus90);
end;
cxBitBlt(ACanvas.Handle, ABitmap.Canvas.Handle, ARect, cxNullPoint, SRCCOPY);
finally
ABitmap.Free;
end;
DrawHideBarButtonContent(ACanvas, AControl, ARect, APosition);
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawTab(ACanvas: TCanvas; AControl: TdxCustomDockControl;
ARect: TRect; IsActive: Boolean; APosition: TdxTabContainerTabsPosition);
var
R, R1: TRect;
ABitmap: TBitmap;
ATheme: TdxTheme;
AState: Integer;
begin
ATheme := OpenTheme(totTab);
if ATheme <> 0 then
begin
if IsActive then
AState := TTIS_SELECTED
else AState := TTIS_NORMAL;
ABitmap := TBitmap.Create;
try
ABitmap.PixelFormat := pf32bit;
R1 := ARect;
if not IsActive then
if APosition = tctpTop then
Dec(ARect.Bottom, 2)
else Inc(ARect.Top, 2);
R := ARect;
ABitmap.Width := R.Right - R.Left;
ABitmap.Height := R.Bottom - R.Top;
OffsetRect(R, -R.Left, -R.Top);
DrawThemeBackground(ATheme, ABitmap.Canvas.Handle, TABP_TOPTABITEM, AState, R);
if APosition = tctpBottom then
RotateBitmap(ABitmap, ra180);
cxBitBlt(ACanvas.Handle, ABitmap.Canvas.Handle, ARect, cxNullPoint, SRCCOPY);
finally
ABitmap.Free;
ARect := R1;
end;
DrawTabContent(ACanvas, AControl, ARect, IsActive, APosition);
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawTabs(ACanvas: TCanvas; ARect, AActiveTabRect: TRect;
APosition: TdxTabContainerTabsPosition);
var
R: TRect;
ATheme: TdxTheme;
begin
ATheme := OpenTheme(totTab);
if ATheme <> 0 then
begin
DrawThemeBackground(ATheme, ACanvas.Handle, TABP_BODY, 0, ARect);
R := ARect;
Inc(R.Right, 2);
if APosition = tctpTop then
R.Top := AActiveTabRect.Bottom - 2
else R.Bottom := AActiveTabRect.Top + 4;
DrawThemeBackground(ATheme, ACanvas.Handle, TABP_PANE, 0, R);
if APosition = tctpTop then
R.Top := AActiveTabRect.Bottom + 1
else R.Bottom := AActiveTabRect.Top - 1;
DrawThemeBackground(ATheme, ACanvas.Handle, TABP_BODY, 0, R);
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawTabsNextTabButton(ACanvas: TCanvas;
ARect: TRect; IsDown, IsHot, IsEnable: Boolean; APosition: TdxTabContainerTabsPosition);
var
ATheme: TdxTheme;
AState: Integer;
begin
ATheme := OpenTheme(totScrollBar);
if ATheme <> 0 then
begin
if not IsEnable then
AState := ABS_RIGHTDISABLED
else if IsDown and IsHot then
AState := ABS_RIGHTPRESSED
else if IsHot then
AState := ABS_RIGHTHOT
else AState := ABS_RIGHTNORMAL;
DrawThemeBackground(ATheme, ACanvas.Handle, SBP_ARROWBTN, AState, ARect);
end
else inherited;
end;
procedure TdxDockControlXPPainter.DrawTabsPrevTabButton(ACanvas: TCanvas;
ARect: TRect; IsDown, IsHot, IsEnable: Boolean; APosition: TdxTabContainerTabsPosition);
var
ATheme: TdxTheme;
AState: Integer;
begin
ATheme := OpenTheme(totScrollBar);
if ATheme <> 0 then
begin
if not IsEnable then
AState := ABS_LEFTDISABLED
else if IsDown and IsHot then
AState := ABS_LEFTPRESSED
else if IsHot then
AState := ABS_LEFTHOT
else AState := ABS_LEFTNORMAL;
DrawThemeBackground(ATheme, ACanvas.Handle, SBP_ARROWBTN, AState, ARect);
end
else inherited;
end;
function TdxDockControlXPPainter.NeedRedrawOnResize: Boolean;
begin
Result := True;
end;
end.