From 6f73d6d007bc5a111427f4309e6dbe1e6ef8eda7 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Sun, 22 Apr 2018 22:41:18 +0000 Subject: [PATCH] jvcllaz: Improved themed painting in JvOutlookBar. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@6340 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- .../examples/JvOutlookBar/OLBarDemo.lpi | 1 - .../examples/JvOutlookBar/OLBarMainFormU.lfm | 114 +++++-- .../examples/JvOutlookBar/OLBarMainFormU.pas | 25 +- components/jvcllaz/run/JvCore/JvThemes.pas | 7 + .../run/JvCustomControls/JvOutlookBar.pas | 322 ++++++++++-------- 5 files changed, 287 insertions(+), 182 deletions(-) diff --git a/components/jvcllaz/examples/JvOutlookBar/OLBarDemo.lpi b/components/jvcllaz/examples/JvOutlookBar/OLBarDemo.lpi index f73ad7d05..ee3fd5d96 100644 --- a/components/jvcllaz/examples/JvOutlookBar/OLBarDemo.lpi +++ b/components/jvcllaz/examples/JvOutlookBar/OLBarDemo.lpi @@ -13,7 +13,6 @@ - diff --git a/components/jvcllaz/examples/JvOutlookBar/OLBarMainFormU.lfm b/components/jvcllaz/examples/JvOutlookBar/OLBarMainFormU.lfm index 07cc44683..95864cd51 100644 --- a/components/jvcllaz/examples/JvOutlookBar/OLBarMainFormU.lfm +++ b/components/jvcllaz/examples/JvOutlookBar/OLBarMainFormU.lfm @@ -24,7 +24,7 @@ object OLBarMainForm: TOLBarMainForm Width = 5 AutoSnap = False end - object StatusBar1: TStatusBar + object StatusBar: TStatusBar Left = 0 Height = 23 Top = 365 @@ -81,11 +81,9 @@ object OLBarMainForm: TOLBarMainForm Caption = 'Standard Shortcuts' Color = 4210816 DownFont.Color = clWindowText - DownFont.Height = -11 - DownFont.Name = 'MS Sans Serif' + DownFont.Height = -12 Font.Color = clWhite - Font.Height = -11 - Font.Name = 'Tahoma' + Font.Height = -12 ParentColor = False TopButtonIndex = 0 end @@ -118,15 +116,14 @@ object OLBarMainForm: TOLBarMainForm ButtonSize = olbsLarge Caption = 'My Shortcuts' DownFont.Color = clWindowText - DownFont.Height = -11 - DownFont.Name = 'MS Sans Serif' + DownFont.Height = -12 Font.Color = clWhite - Font.Height = -11 - Font.Name = 'Tahoma' + Font.Height = -12 ParentColor = False TopButtonIndex = 0 end item + Alignment = taRightJustify Buttons = < item Caption = 'My Computer' @@ -150,21 +147,22 @@ object OLBarMainForm: TOLBarMainForm Caption = 'Other Shortcuts' Color = clInactiveCaption DownFont.Color = clWindowText - DownFont.Height = -11 - DownFont.Name = 'MS Sans Serif' - Font.Color = clWhite - Font.Height = -11 - Font.Name = 'Tahoma' + DownFont.Height = -12 + Font.Color = clWindowText + Font.Height = -12 ParentColor = False TopButtonIndex = 0 end> LargeImages = ImageList1 SmallImages = ImageList2 ActivePageIndex = 1 - ThemedBackground = False OnButtonClick = JvOutlookBar1ButtonClick OnPageChange = JvOutlookBar1PageChange OnPageChanging = JvOutlookBar1PageChanging + BorderStyle = bsNone + Font.Color = clWindowText + Font.Height = -12 + ParentFont = False PopupMenu = popOL TabOrder = 1 OnContextPopup = JvOutlookBar1ContextPopup @@ -180,84 +178,132 @@ object OLBarMainForm: TOLBarMainForm ClientWidth = 557 TabOrder = 2 object Panel2: TPanel + AnchorSideTop.Control = Panel1 + AnchorSideTop.Side = asrBottom Left = 0 - Height = 63 - Top = 302 + Height = 56 + Top = 309 Width = 557 Align = alBottom + Anchors = [akLeft, akRight] + AutoSize = True BevelOuter = bvNone - ClientHeight = 63 + ClientHeight = 56 ClientWidth = 557 TabOrder = 0 object Button1: TButton - Left = 3 + AnchorSideLeft.Control = Panel2 + AnchorSideTop.Control = Panel2 + Left = 0 Height = 25 - Top = 11 + Top = 4 Width = 102 AutoSize = True + BorderSpacing.Top = 4 Caption = 'Assign images' OnClick = Button1Click TabOrder = 0 end object chkSmallImages: TCheckBox - Left = 8 + AnchorSideLeft.Control = Panel2 + AnchorSideTop.Control = Button1 + AnchorSideTop.Side = asrBottom + Left = 0 Height = 19 - Top = 41 + Top = 33 Width = 93 Action = acSmallButtons + BorderSpacing.Top = 4 + BorderSpacing.Bottom = 4 TabOrder = 1 end object Button2: TButton - Left = 109 + AnchorSideLeft.Control = Button1 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Button1 + Left = 106 Height = 25 - Top = 11 + Top = 4 Width = 110 AutoSize = True + BorderSpacing.Left = 4 Caption = 'Remove images' OnClick = Button2Click TabOrder = 2 end object Button3: TButton - Left = 224 + AnchorSideLeft.Control = Button2 + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Button1 + Left = 220 Height = 25 - Top = 11 - Width = 91 + Top = 4 + Width = 59 + AutoSize = True + BorderSpacing.Left = 4 Caption = 'Font...' OnClick = Button3Click TabOrder = 3 end object chkButtonFont: TCheckBox - Left = 224 + AnchorSideLeft.Control = chkFlat + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkSmallImages + Left = 180 Height = 19 - Top = 41 + Top = 33 Width = 125 + BorderSpacing.Left = 24 Caption = 'Change button font' TabOrder = 4 end object chkFlat: TCheckBox - Left = 112 + AnchorSideLeft.Control = chkSmallImages + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkSmallImages + Left = 117 Height = 19 - Top = 40 + Top = 33 Width = 39 + BorderSpacing.Left = 24 Caption = 'Flat' OnClick = chkFlatClick TabOrder = 5 end object chkThemed: TCheckBox - Left = 378 + AnchorSideLeft.Control = chkButtonFont + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkSmallImages + Left = 329 Height = 19 - Top = 40 + Top = 33 Width = 64 + BorderSpacing.Left = 24 Caption = 'Themed' Checked = True OnChange = chkThemedChange State = cbChecked TabOrder = 6 end + object ChkThemedBackground: TCheckBox + AnchorSideLeft.Control = chkThemed + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = chkSmallImages + Left = 417 + Height = 19 + Top = 33 + Width = 131 + BorderSpacing.Left = 24 + Caption = 'Themed background' + Checked = True + OnChange = ChkThemedBackgroundChange + State = cbChecked + TabOrder = 7 + end end object Memo1: TMemo Left = 0 - Height = 302 + Height = 309 Top = 0 Width = 557 Align = alClient diff --git a/components/jvcllaz/examples/JvOutlookBar/OLBarMainFormU.pas b/components/jvcllaz/examples/JvOutlookBar/OLBarMainFormU.pas index 91bc2ff17..6e46d4cea 100644 --- a/components/jvcllaz/examples/JvOutlookBar/OLBarMainFormU.pas +++ b/components/jvcllaz/examples/JvOutlookBar/OLBarMainFormU.pas @@ -40,6 +40,7 @@ type { TOLBarMainForm } TOLBarMainForm = class(TForm) + ChkThemedBackground: TCheckBox; chkThemed: TCheckBox; popOL: TPopupMenu; Splitter1: TSplitter; @@ -50,7 +51,7 @@ type popPage: TPopupMenu; Editbuttoncaption1: TMenuItem; Editpagecaption1: TMenuItem; - StatusBar1: TStatusBar; + StatusBar: TStatusBar; JvOutlookBar1: TJvOutlookBar; Panel1: TPanel; Panel2: TPanel; @@ -71,6 +72,7 @@ type procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure chkThemedChange(Sender: TObject); + procedure ChkThemedBackgroundChange(Sender: TObject); procedure JvOutlookBar1ButtonClick(Sender: TObject; Index: Integer); procedure JvOutlookBar1PageChanging(Sender: TObject; Index: Integer; var AllowChange: Boolean); @@ -135,11 +137,12 @@ procedure TOLBarMainForm.JvOutlookBar1ButtonClick(Sender: TObject; var P:TJvOutlookBarPage; begin if (Index > -1) then - with JvOutlookBar1 do - begin - P := Pages[ActivePageIndex]; - Caption := Format('Clicked button "%s" on page "%s"',[P.Buttons[Index].Caption,P.Caption]); - end; + with JvOutlookBar1 do + begin + P := Pages[ActivePageIndex]; + Statusbar.SimpleText := Format('Clicked button "%s" on page "%s"', + [P.Buttons[Index].Caption,P.Caption]); + end; end; procedure TOLBarMainForm.JvOutlookBar1PageChanging(Sender: TObject; @@ -147,7 +150,7 @@ procedure TOLBarMainForm.JvOutlookBar1PageChanging(Sender: TObject; begin with JvOutlookBar1 do if (ActivePageIndex > -1) and (Index > -1) then - Caption := Format('Page changing from "%s" to "%s"', + Statusbar.SimpleText := Format('Page changing from "%s" to "%s"', [Pages[ActivePageIndex].Caption, Pages[Index].Caption]); end; @@ -155,7 +158,8 @@ procedure TOLBarMainForm.JvOutlookBar1PageChange(Sender: TObject; Index: Integer); begin if Index > -1 then - Caption := Format('Page changed to "%s"',[JvOutlookBar1.Pages[Index].Caption]); + Statusbar.SimpleText := Format('Page changed to "%s"', + [JvOutlookBar1.Pages[Index].Caption]); end; procedure TOLBarMainForm.JvOutlookBar1ContextPopup(Sender: TObject; @@ -202,6 +206,11 @@ begin JvOutlookbar1.Themed := chkThemed.Checked; end; +procedure TOLBarMainForm.ChkThemedBackgroundChange(Sender: TObject); +begin + JvOutlookbar1.ThemedBackground := ChkThemedBackground.Checked; +end; + procedure TOLBarMainForm.FormCreate(Sender: TObject); begin Memo1.Wordwrap := True; diff --git a/components/jvcllaz/run/JvCore/JvThemes.pas b/components/jvcllaz/run/JvCore/JvThemes.pas index aa364dce5..2fee6a2f5 100644 --- a/components/jvcllaz/run/JvCore/JvThemes.pas +++ b/components/jvcllaz/run/JvCore/JvThemes.pas @@ -67,7 +67,9 @@ type function DoGetElementSize(DC: HDC; Details: TThemedElementDetails; Rect: PRect; ElementSize: TElementSize; out Size: TSize): Boolean; {$ENDIF ~COMPILER16_UP} + *******************) public + (**************** {$IFNDEF COMPILER7_UP} procedure ApplyThemeChange; {$ENDIF ~COMPILER7_UP} @@ -79,8 +81,10 @@ type function GetElementSize(DC: HDC; Details: TThemedElementDetails; const Rect: TRect; ElementSize: TElementSize; out Size: TSize): Boolean; overload; function IsSystemStyle: Boolean; + ********************) function Enabled: Boolean; function Available: Boolean; + (******************** function GetSystemColor(Color: TColor): TColor; {$ENDIF ~COMPILER16_UP} ****************) @@ -842,6 +846,7 @@ function TThemeServicesEx.IsSystemStyle: Boolean; begin Result := True; end; +**********************) function TThemeServicesEx.Enabled: Boolean; begin @@ -852,6 +857,8 @@ function TThemeServicesEx.Available: Boolean; begin Result := ThemesAvailable; end; + +(****************************** {$ENDIF ~COMPILER16_UP} *******************) diff --git a/components/jvcllaz/run/JvCustomControls/JvOutlookBar.pas b/components/jvcllaz/run/JvCustomControls/JvOutlookBar.pas index 04b31bb12..c68cbe3dd 100644 --- a/components/jvcllaz/run/JvCustomControls/JvOutlookBar.pas +++ b/components/jvcllaz/run/JvCustomControls/JvOutlookBar.pas @@ -41,6 +41,7 @@ Known Issues: unit JvOutlookBar; {$mode objfpc}{$H+} +{.$DEFINE JVCLThemesEnabled} interface @@ -299,7 +300,7 @@ type procedure SetSmallImages(const Value: TCustomImageList); procedure SetPageImages(const Value: TCustomImageList); procedure SetPageButtonHeight(const Value: Integer); - procedure SetThemedBackground(const Value: Boolean); + function DrawTopPages: Integer; procedure DrawCurrentPage(PageIndex: Integer); procedure DrawPageButton(R: TRect; Index: Integer; Pressed: Boolean); @@ -308,6 +309,7 @@ type procedure DrawArrowButtons(Index: Integer); procedure DrawButtonFrame(PageIndex, ButtonIndex, PressedIndex: Integer); function DrawPicture(R: TRect; Picture: TPicture): Boolean; + procedure DoDwnClick(Sender: TObject); procedure DoUpClick(Sender: TObject); procedure RedrawRect(R: TRect; Erase: Boolean = False); @@ -322,6 +324,7 @@ type procedure SetDisabledFontColor1(const Value: TColor); procedure SetDisabledFontColor2(const Value: TColor); procedure SetThemed(const Value: Boolean); + procedure SetThemedBackground(const Value: Boolean); procedure SetWordWrap(const Value: Boolean); protected (* @@ -329,6 +332,7 @@ type function DoEraseBackground(ACanvas: TCanvas; Param: LPARAM): Boolean; override; {$ENDIF} *) + procedure CreateHandle; override; procedure FontChanged; override; function GetButtonHeight(PageIndex, ButtonIndex: Integer): Integer; function GetButtonTopHeight(PageIndex, ButtonIndex: Integer): Integer; @@ -339,6 +343,7 @@ type function GetPageTextRect(Index: Integer): TRect; function GetPageRect(Index: Integer): TRect; function GetTextSize(PageIndex, ButtonIndex: Integer): TSize; + function IsThemedStored: Boolean; procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure Paint; override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; @@ -356,13 +361,9 @@ type function DoDrawPageButton(ARect: TRect; Index: Integer; Down: Boolean): Boolean; function DoDrawButton(ARect: TRect; Index: Integer; Down, Inside: Boolean): Boolean; function DoDrawButtonFrame(ARect: TRect; Index: Integer; Down, Inside: Boolean): Boolean; - function DoCustomDraw(ARect: TRect; Stage: TJvOutlookBarCustomDrawStage; Index: Integer; Down, Inside: Boolean): Boolean; virtual; - public - constructor Create(AOwner: TComponent); override; - destructor Destroy; override; - procedure InitiateAction; override; - function GetButtonAtPos(P: TPoint): TJvOutlookBarButton; - function GetPageButtonAtPos(P: TPoint): TJvOutlookBarPage; + function DoCustomDraw(ARect: TRect; Stage: TJvOutlookBarCustomDrawStage; + Index: Integer; Down, Inside: Boolean): Boolean; virtual; + procedure Resize; override; protected property PopUpObject: TObject read FPopUpObject write FPopUpObject; property Width default 100; @@ -379,6 +380,7 @@ type property ButtonSize: TJvBarButtonSize read FButtonSize write SetButtonSize default olbsLarge; property PageButtonHeight: Integer read FPageButtonHeight write SetPageButtonHeight default 19; property ActivePageIndex: Integer read GetActivePageIndex write SetActivePageIndex default 0; + property Themed: Boolean read FThemed write SetThemed stored IsThemedStored; property ThemedBackground: Boolean read FThemedBackGround write SetThemedBackground default True; property OnPageChanging: TOutlookBarPageChanging read FOnPageChanging write FOnPageChanging; property OnPageChange: TOutlookBarPageChange read FOnPageChange write FOnPageChange; @@ -386,11 +388,16 @@ type property OnEditButton: TOutlookBarEditCaption read FOnEditButton write FOnEditButton; property OnEditPage: TOutlookBarEditCaption read FOnEditPage write FOnEditPage; property OnCustomDraw: TJvOutlookBarCustomDrawEvent read FOnCustomDraw write FOnCustomDraw; - property Themed:Boolean read FThemed write SetThemed; property PageBtnProps:TJvPageBtnProps read FPageBtnProps; property DisabledFontColor1:TColor read FDisabledFontColor1 write SetDisabledFontColor1; //clWhite; property DisabledFontColor2:TColor read FDisabledFontColor2 write SetDisabledFontColor2; //clGrayText; + public + constructor Create(AOwner: TComponent); override; + destructor Destroy; override; + procedure InitiateAction; override; + function GetButtonAtPos(P: TPoint): TJvOutlookBarButton; + function GetPageButtonAtPos(P: TPoint): TJvOutlookBarPage; public property ActivePage: TJvOutlookBarPage read GetActivePage; property WordWrap: Boolean read FWordWrap write SetWordWrap default True; @@ -399,7 +406,6 @@ type TJvOutlookBar = class(TJvCustomOutlookBar) public property PopUpObject; - property Themed; property DisabledFontColor1; property DisabledFontColor2; property PageBtnProps; @@ -413,6 +419,7 @@ type property ButtonSize; property PageButtonHeight; property ActivePageIndex; + property Themed; property ThemedBackground; property OnButtonClick; property OnCustomDraw; @@ -423,6 +430,7 @@ type property Action; property Anchors; property BiDiMode; + property BorderSpacing; property ParentBiDiMode; property DragCursor; property DragKind; @@ -456,6 +464,7 @@ implementation uses Math, + JvThemes, JvConsts, JvJVCLUtils; {$R ..\..\resource\JvOutlookBar.res} @@ -654,7 +663,7 @@ begin *) end; - + (* //=== { TJvRepeatButton } ==================================================== type @@ -714,6 +723,7 @@ begin raise; end; end; +*) //=== { TJvOutlookBarButtonActionLink } ====================================== @@ -1329,17 +1339,16 @@ begin TJvCustomOutlookBar(Owner).Repaint; end; + (* //=== { TJvThemedTopBottomButton } =========================================== -{$IFDEF JVCLThemesEnabled} - type TJvThemedTopBottomButton = class(TJvRepeatButton) private FIsUpBtn: Boolean; protected - procedure WMEraseBkgnd(var Msg: TWmEraseBkgnd); message WM_ERASEBKGND; procedure Paint; override; +// procedure WMEraseBkgnd(var Msg: TLMEraseBkgnd); message LM_ERASEBKGND; end; procedure TJvThemedTopBottomButton.Paint; @@ -1349,7 +1358,8 @@ var begin if csDestroying in ComponentState then Exit; - if {Themed}StyleServices.Enabled and (not Flat) then + + if StyleServices.Enabled and (not Flat) then begin if not Enabled then Button := tsArrowBtnUpDisabled @@ -1372,13 +1382,13 @@ begin else inherited Paint; end; - -procedure TJvThemedTopBottomButton.WMEraseBkgnd(var Msg: TWmEraseBkgnd); +{ +procedure TJvThemedTopBottomButton.WMEraseBkgnd(var Msg: TLMEraseBkgnd); begin Msg.Result := 1; end; - -{$ENDIF JVCLThemesEnabled} +} +*) //=== { TJvCustomOutlookBar } ================================================ @@ -1391,21 +1401,24 @@ begin FWordWrap := True; FPageBtnProps := TJvPageBtnProps.Create(self); DoubleBuffered := True; - FThemed := ThemeServices.ThemesEnabled; + FThemed := StyleServices.Enabled; + FThemedBackground := true; ControlStyle := ControlStyle - [csAcceptsControls] + [csOpaque]; -// IncludeThemeStyle(Self, [csNeedsBorderPaint]); <--- wp + IncludeThemeStyle(Self, [csNeedsBorderPaint]); Bmp := TBitmap.Create; FDisabledFontColor1 := clWhite; FDisabledFontColor2 := clGrayText; try - {$IFDEF JVCLThemesEnabled} + // {$IFDEF JVCLThemesEnabled} + { FTopButton := TJvThemedTopBottomButton.Create(Self); TJvThemedTopBottomButton(FTopButton).FIsUpBtn := True; - {$ELSE} - FTopButton := TJvRepeatButton.Create(Self); - {$ENDIF JVCLThemesEnabled} + } + // {$ELSE} + FTopButton := TSpeedButton.Create(self); //TJvRepeatButton.Create(Self); + // {$ENDIF JVCLThemesEnabled} with FTopButton do begin Parent := Self; @@ -1418,12 +1431,14 @@ begin Top := -1000; end; - {$IFDEF JVCLThemesEnabled} + // {$IFDEF JVCLThemesEnabled} + { FBtmButton := TJvThemedTopBottomButton.Create(Self); TJvThemedTopBottomButton(FBtmButton).FIsUpBtn := False; - {$ELSE} - FBtmButton := TJvRepeatButton.Create(Self); - {$ENDIF JVCLThemesEnabled} + } + //{$ELSE} + FBtmButton := TSpeedButton.Create(Self); //TJvRepeatButton.Create(Self); + //{$ENDIF JVCLThemesEnabled} with FBtmButton do begin Parent := Self; @@ -1534,9 +1549,30 @@ var SavedColor: TColor; Flags: Cardinal; HasImage: Boolean; + Btn: TThemedButton; + Details: TThemedElementDetails; begin Assert(Assigned(FPageBtnProps)); ATop := R.Top + 1; + + // Background and frame + if Themed then begin + if Pressed then + Details := StyleServices.GetElementDetails(tbPushButtonPressed) +// Details := StyleServices.GetElementDetails(ttbButtonPressed) +// Details := StyleServices.GetElementDetails(tebNormalGroupHead) + else + if Index = FHotPageBtn then + Details := StyleServices.GetElementDetails(tbPushButtonHot) +// Details := StyleServices.GetElementDetails(ttbButtonHot) +// Details := StyleServices.GetElementDetails(tebNormalGroupHead) + else + Details := StyleServices.GetElementDetails(tbPushButtonNormal); +// Details := StyleServices.GetElementDetails(ttbButtonNormal); +// Details := StyleServices.GetElementDetails(tebSpecialGroupHead); + InflateRect(R, 1, 1); + StyleServices.DrawElement(Canvas.Handle, Details, R); + end else if Pressed then begin if BorderStyle = bsNone then @@ -1557,6 +1593,8 @@ begin Frame3D(Canvas, R, FPageBtnProps.Face, FPageBtnProps.Shadow, FPageBtnProps.BorderWidth); end; end; + + // Icon Flags := DT_CENTER or DT_VCENTER or DT_SINGLELINE; HasImage := Assigned(PageImages) and (Pages[Index].ImageIndex >= 0) and (Pages[Index].ImageIndex < PageImages.Count); SavedDC := SaveDC(Canvas.Handle); @@ -1596,19 +1634,30 @@ begin finally RestoreDC(Canvas.Handle, SavedDC); end; + + // Text SetBkMode(Canvas.Handle, TRANSPARENT); OffsetRect(R, 0, -1); SavedColor := Canvas.Font.Color; try - if not Pages[Index].Enabled then - begin - OffsetRect(R, 1, 1); - Canvas.Font.Color := FDisabledFontColor1; //clWhite; + if Themed then begin + if not Pages[Index].Enabled then begin + OffsetRect(R, 1, 1); + Details := StyleServices.GetElementDetails(tbPushButtonPressed) +// Details := StyleServices.GetElementDetails(ttbButtonDisabled) + end; + StyleServices.DrawText(Canvas, Details, Pages[Index].Caption, R, Flags or DT_END_ELLIPSIS, 0); + end else begin + if not Pages[Index].Enabled then + begin + OffsetRect(R, 1, 1); + Canvas.Font.Color := FDisabledFontColor1; //clWhite; + DrawText(Canvas, Pages[Index].Caption, -1, R, Flags or DT_END_ELLIPSIS); + OffsetRect(R, -1, -1); + Canvas.Font.Color := FDisabledFontColor2; //clGrayText; + end; DrawText(Canvas, Pages[Index].Caption, -1, R, Flags or DT_END_ELLIPSIS); - OffsetRect(R, -1, -1); - Canvas.Font.Color := FDisabledFontColor2; //clGrayText; end; - DrawText(Canvas, Pages[Index].Caption, -1, R, Flags or DT_END_ELLIPSIS); finally Canvas.Font.Color := SavedColor; end; @@ -1618,12 +1667,10 @@ function TJvCustomOutlookBar.DrawTopPages: Integer; var R: TRect; I: Integer; - {$IFDEF JVCLThemesEnabled} ToolBar: TThemedToolBar; Details: TThemedElementDetails; ClipRect: TRect; LColor: Cardinal; - {$ENDIF JVCLThemesEnabled} begin Result := -1; if csDestroying in ComponentState then @@ -1634,7 +1681,6 @@ begin begin if DoDrawPageButton(R, I, FPressedPageBtn = I) then begin - {$IFDEF JVCLThemesEnabled} if Themed then // Warren changed. begin if (FPressedPageBtn = I) or (FHotPageBtn = I) then @@ -1649,26 +1695,18 @@ begin InflateRect(R, 1, 1); StyleServices.DrawElement(Canvas.Handle, Details, R, @ClipRect); InflateRect(R, -1, -1); - end - else + end else StyleServices.DrawElement(Canvas.Handle, Details, R); { Determine text color } if FPressedPageBtn = I then ToolBar := ttbButtonPressed - else - if FHotPageBtn = I then + else if FHotPageBtn = I then ToolBar := ttbButtonHot else ToolBar := ttbButtonNormal; Details := StyleServices.GetElementDetails(ToolBar); - - with Details do - GetThemeColor(StyleServices.Theme[Element], Part, State, TMT_TEXTCOLOR, LColor); - Canvas.Font.Color := LColor; - end - else - {$ENDIF JVCLThemesEnabled} + end else begin Canvas.Brush.Color := PageBtnProps.Face;// clBtnFace; Canvas.FillRect(R); @@ -1685,6 +1723,7 @@ begin Result := Pages.Count - 1; end; +{ Draw the buttons inside each page } procedure TJvCustomOutlookBar.DrawButtons(Index: Integer); var I: Integer; @@ -1692,10 +1731,8 @@ var C: TColor; SavedDC: Integer; SavedColor: TColor; - {$IFDEF JVCLThemesEnabled} - ThemedColor: Cardinal; + flags: Integer; Details: TThemedElementDetails; - {$ENDIF JVCLThemesEnabled} begin if csDestroying in ComponentState then Exit; @@ -1706,25 +1743,12 @@ begin R := GetButtonRect(Index, Pages[Index].TopButtonIndex); C := Canvas.Pen.Color; Canvas.Font := Pages[Index].Font; - - {$IFDEF JVCLThemesEnabled} - if Themed then - begin - Details := StyleServices.GetElementDetails(ttbButtonNormal); - with Details do - GetThemeColor(StyleServices.Theme[Element], Part, State, TMT_TEXTCOLOR, ThemedColor); - end; - {$ENDIF JVCLThemesEnabled} try Canvas.Brush.Style := bsClear; for I := Pages[Index].TopButtonIndex to Pages[Index].Buttons.Count - 1 do begin Canvas.Font := Pages[Index].Font; // Canvas.Rectangle(R); // DEBUG - {$IFDEF JVCLThemesEnabled} - if Themed then - Canvas.Font.Color := ThemedColor; - {$ENDIF JVCLThemesEnabled} if Pages[Index].Buttons[I].Down then begin Canvas.Font := Pages[Index].DownFont; @@ -1739,28 +1763,37 @@ begin SavedDC := SaveDC(Canvas.Handle); try if LargeImages <> nil then - LargeImages.Draw(Canvas, R.Left + ((R.Right - R.Left) - LargeImages.Width) div 2, R.Top + 4, + LargeImages.Draw(Canvas, + R.Left + ((R.Right - R.Left) - LargeImages.Width) div 2, + R.Top + 4, Pages[Index].Buttons[I].ImageIndex, - - Pages[Index].Enabled and Pages[Index].Buttons[I].Enabled); + Pages[Index].Enabled and Pages[Index].Buttons[I].Enabled + ); finally RestoreDC(Canvas.Handle, SavedDC); end; R3 := GetButtonTextRect(ActivePageIndex, I); SetBkMode(Canvas.Handle, TRANSPARENT); - if not Pages[Index].Enabled or not Pages[Index].Buttons[I].Enabled then - begin - if ColorToRGB(Pages[Index].Color) = ColorToRGB(clGrayText) then - Canvas.Font.Color := PageBtnProps.Face//clBtnFace - else - Canvas.Font.Color := clGrayText; - end; - if FWordWrap then - DrawText(Canvas.Handle, PChar(Pages[Index].Buttons[I].Caption), -1, R3, - DT_WORDBREAK or DT_CENTER or DT_VCENTER) + if FWordWrap and (LargeImages <> nil) then + Flags := DT_WORDBREAK or DT_CENTER or DT_VCENTER else - DrawText(Canvas.Handle, PChar(Pages[Index].Buttons[I].Caption), -1, R3, - DT_EXPANDTABS or DT_SINGLELINE or DT_CENTER or DT_VCENTER); + Flags := DT_EXPANDTABS or DT_SINGLELINE or DT_CENTER or DT_VCENTER or DT_END_ELLIPSIS; + if Themed and (Pages[Index].Color = clDefault) then begin + if Pages[Index].Enabled and Pages[Index].Buttons[I].Enabled then + Details := StyleServices.GetElementDetails(ttbButtonNormal) + else + Details := StyleServices.GetElementDetails(ttbButtonDisabled); + StyleServices.DrawText(Canvas, Details, Pages[Index].Buttons[I].Caption, R3, Flags, 0); + end else begin + if not Pages[Index].Enabled or not Pages[Index].Buttons[I].Enabled then + begin + if ColorToRGB(Pages[Index].Color) = ColorToRGB(clGrayText) then + Canvas.Font.Color := PageBtnProps.Face //clBtnFace + else + Canvas.Font.Color := clGrayText; + end; + DrawText(Canvas.Handle, PChar(Pages[Index].Buttons[I].Caption), -1, R3, Flags); + end; finally Canvas.Font.Color := SavedColor; end; @@ -1779,17 +1812,27 @@ begin RestoreDC(Canvas.Handle, SavedDC); end; R3 := GetButtonTextRect(ActivePageIndex, I); - SetBkMode(Canvas.Handle, TRANSPARENT); - if not Pages[Index].Enabled or not Pages[Index].Buttons[I].Enabled then - begin - if ColorToRGB(Pages[Index].Color) = ColorToRGB(clGrayText) then - Canvas.Font.Color := PageBtnProps.Face//clBtnFace - else - Canvas.Font.Color := clGrayText; - end; InflateRect(R3, -4, 0); - DrawText(Canvas.Handle, PChar(Pages[Index].Buttons[I].Caption), -1, R3, - DT_EXPANDTABS or DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_NOCLIP or DT_EDITCONTROL); + SetBkMode(Canvas.Handle, TRANSPARENT); + Flags := DT_EXPANDTABS or DT_SINGLELINE or DT_LEFT or DT_VCENTER or DT_NOCLIP or DT_EDITCONTROL; + if Themed and (Pages[Index].Color = clDefault) then + begin + if Pages[Index].Enabled and Pages[Index].Buttons[I].Enabled then + Details := StyleServices.GetElementDetails(ttbButtonNormal) + else + Details := StyleServices.GetElementDetails(ttbButtonDisabled); + StyleServices.DrawText(Canvas, Details, Pages[Index].Buttons[I].Caption, R3, Flags, 0); + end else + begin + if not Pages[Index].Enabled or not Pages[Index].Buttons[I].Enabled then + begin + if ColorToRGB(Pages[Index].Color) = ColorToRGB(clGrayText) then + Canvas.Font.Color := PageBtnProps.Face//clBtnFace + else + Canvas.Font.Color := clGrayText; + end; + DrawText(Canvas.Handle, PChar(Pages[Index].Buttons[I].Caption), -1, R3, Flags); + end; finally Canvas.Font.Color := SavedColor; end; @@ -1865,14 +1908,13 @@ procedure TJvCustomOutlookBar.DrawCurrentPage(PageIndex: Integer); var R: TRect; AColor: TColor; - {$IFDEF JVCLThemesEnabled} Details: TThemedElementDetails; - {$ENDIF JVCLThemesEnabled} begin if csDestroying in ComponentState then Exit; if (PageIndex < 0) or (PageIndex >= Pages.Count) or (Pages[PageIndex].Buttons = nil) then Exit; + R := GetPageRect(PageIndex); AColor := Canvas.Brush.Color; try @@ -1882,14 +1924,12 @@ begin begin if not DrawPicture(R, Pages[PageIndex].Picture) then begin - {$IFDEF JVCLThemesEnabled} if (Canvas.Brush.Color = clDefault) and ThemedBackground and Themed then begin - Details := StyleServices.GetElementDetails(tebHeaderBackgroundNormal); + Details := StyleServices.GetElementDetails(tebNormalGroupBackground); //tebHeaderBackgroundNormal); StyleServices.DrawElement(Canvas.Handle, Details, R); end else - {$ENDIF JVCLThemesEnabled} begin if Canvas.Brush.Color = clDefault then Canvas.Brush.Color := Self.Color; @@ -1911,12 +1951,9 @@ procedure TJvCustomOutlookBar.DrawBottomPages(StartIndex: Integer); var R: TRect; I: Integer; - {$IFDEF JVCLThemesEnabled} Details: TThemedElementDetails; ClipRect: TRect; ToolBar: TThemedToolBar; - LColor: Cardinal; - {$ENDIF JVCLThemesEnabled} begin if csDestroying in ComponentState then Exit; @@ -1925,7 +1962,7 @@ begin begin if DoDrawPageButton(R, I, FPressedPageBtn = I) then begin - {$IFDEF JVCLThemesEnabled} + // {$IFDEF JVCLThemesEnabled} if Themed then begin if (FPressedPageBtn = I) or (FHotPageBtn = I) then @@ -1940,26 +1977,18 @@ begin InflateRect(R, 1, 1); StyleServices.DrawElement(Canvas.Handle, Details, R, @ClipRect); InflateRect(R, -1, -1); - end - else + end else StyleServices.DrawElement(Canvas.Handle, Details, R); { Determine text color } if FPressedPageBtn = I then ToolBar := ttbButtonPressed - else - if FHotPageBtn = I then + else if FHotPageBtn = I then ToolBar := ttbButtonHot else ToolBar := ttbButtonNormal; Details := StyleServices.GetElementDetails(ToolBar); - - with Details do - GetThemeColor(StyleServices.Theme[Element], Part, State, TMT_TEXTCOLOR, LColor); - Canvas.Font.Color := LColor; - end - else - {$ENDIF JVCLThemesEnabled} + end else begin Canvas.Brush.Color := PageBtnProps.Face;//clBtnFace; Canvas.FillRect(R); @@ -2161,14 +2190,17 @@ begin end; end; +function TJvCustomOutlookBar.IsThemedStored: Boolean; +begin + Result := not StyleServices.Enabled; +end; + procedure TJvCustomOutlookBar.Paint; var I: Integer; R: TRect; - {$IFDEF JVCLThemesEnabled} Details: TThemedElementDetails; ClipRect: TRect; - {$ENDIF JVCLThemesEnabled} Rgn: HRGN; begin if csDestroying in ComponentState then @@ -2177,26 +2209,25 @@ begin Canvas.Brush.Color := Self.Color; if Pages.Count = 0 then // we only need to draw the background when there are no pages begin - {$IFDEF JVCLThemesEnabled} if ThemedBackground and Themed then begin R := ClientRect; ClipRect := R; InflateRect(R, 1, 0); - Details := StyleServices.GetElementDetails(ttbButtonHot); + Details := StyleServices.GetElementDetails(tebNormalGroupBackground); StyleServices.DrawElement(Canvas.Handle, Details, R, @ClipRect); end else - {$ENDIF JVCLThemesEnabled} begin if DoDrawBackGround then Canvas.FillRect(ClientRect); end; end; - if IsVista then { Warren Vista paint bug workaround } + { + if IsVista then // Warren Vista paint bug workaround Canvas.FillRect(ClientRect); - + } SetBkMode(Canvas.Handle, TRANSPARENT); I := DrawTopPages; @@ -2339,9 +2370,11 @@ end; procedure TJvCustomOutlookBar.SetThemed(const Value: Boolean); begin - if Value and (not ThemeServices.ThemesEnabled) then { Warren added ability to theme/detheme this component for yourself instead of just checking if XP is themed.} + if Value and (not ThemeServices.ThemesEnabled) then + { Warren added ability to theme/detheme this component for yourself instead of just checking if XP is themed.} exit; FThemed := Value; + Invalidate; end; procedure TJvCustomOutlookBar.SetWordWrap(const Value: Boolean); @@ -2538,10 +2571,8 @@ begin end; procedure TJvCustomOutlookBar.MouseLeave(Control: TControl); -{$IFDEF JVCLThemesEnabled} var R: TRect; -{$ENDIF JVCLThemesEnabled} begin if csDesigning in ComponentState then Exit; @@ -2549,14 +2580,12 @@ begin RedrawRect(FButtonRect); FPressedPageBtn := -1; FLastButtonIndex := -1; - {$IFDEF JVCLThemesEnabled} if Themed and (FHotPageBtn >= 0) then begin R := GetPageButtonRect(FHotPageBtn); RedrawRect(R); FHotPageBtn := -1; end; - {$ENDIF JVCLThemesEnabled} end; function TJvCustomOutlookBar.GetButtonTopHeight(PageIndex, @@ -2734,8 +2763,12 @@ begin if Value <> FThemedBackGround then begin FThemedBackGround := Value; + if Themed then + Invalidate; + { if ([csDesigning, csLoading] * ComponentState = []) and Themed then Repaint; + } end; end; @@ -2752,6 +2785,20 @@ begin end; end; +procedure TJvCustomOutlookBar.CreateHandle; +var + i: Integer; +begin + inherited; + if Font.Size = 0 then Font.Size := 9; + for i:=0 to Pages.Count - 1 do begin + if Pages[i].Font.Size = 0 then + Pages[i].Font.Size := 9; + if Pages[i].DownFont.Size = 0 then + Pages[i].DownFont.Size := 9; + end; +end; + procedure TJvCustomOutlookBar.FontChanged; var I: Integer; @@ -2850,17 +2897,23 @@ begin Pages[I].Buttons[J].ActionChange(Pages[I].Buttons[J].Action, csLoading in ComponentState); end; +procedure TJvCustomOutlookBar.Resize; +begin + Invalidate; + inherited; +end; + + //---- Warren added page button properties Nov 2008 constructor TJvPageBtnProps.Create(owner: TJvCustomOUtlookBar); begin - Fowner := owner; - FShadow := clBtnShadow; - FHighlight := clBtnHighlight; - FDkShadow := cl3DDkShadow; - FFace := clBtnFace; - - FBorderWidth := 1; + FOwner := owner; + FShadow := clBtnShadow; + FHighlight := clBtnHighlight; + FDkShadow := cl3DDkShadow; + FFace := clBtnFace; + FBorderWidth := 1; end; procedure TJvPageBtnProps.SetBorderWidth(const Value: INteger); @@ -2888,13 +2941,4 @@ begin FShadow := Value; end; - -{$IFDEF UNITVERSIONING} -initialization - RegisterUnitVersion(HInstance, UnitVersioning); - -finalization - UnregisterUnitVersion(HInstance); -{$ENDIF UNITVERSIONING} - end.