From ef82f9075b6e5a9a4a5dc632a87bc5b3dceabe30 Mon Sep 17 00:00:00 2001 From: sekelsenmat Date: Tue, 15 Nov 2011 12:57:24 +0000 Subject: [PATCH] customdrawn: Implements the close tab buttons git-svn-id: trunk@33540 - --- components/customdrawn/customdrawn_common.pas | 51 ++++++++++++++++++- components/customdrawn/customdrawn_wince.pas | 6 ++- .../customdrawn/customdrawncontrols.pas | 18 ++++++- components/customdrawn/customdrawndrawers.pas | 12 ++++- 4 files changed, 81 insertions(+), 6 deletions(-) diff --git a/components/customdrawn/customdrawn_common.pas b/components/customdrawn/customdrawn_common.pas index d51b931c59..81601e65fd 100644 --- a/components/customdrawn/customdrawn_common.pas +++ b/components/customdrawn/customdrawn_common.pas @@ -41,6 +41,8 @@ type procedure DrawTickmark(ADest: TCanvas; ADestPos: TPoint); override; procedure DrawSlider(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; AState: TCDControlState); override; procedure DrawCompactArrow(ADest: TCanvas; ADestPos: TPoint; ADirection: TCDControlState); override; + // Extra buttons drawing routines + procedure DrawSmallCloseButton(ADest: TCanvas; ADestPos: TPoint); override; // TCDControl procedure DrawControl(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; AState: TCDControlState; AStateEx: TCDControlStateEx); override; @@ -161,6 +163,9 @@ begin TCDLISTVIEW_COLUMN_TEXT_LEFT_SPACING: Result := 5; TCDLISTVIEW_LINE_TOP_SPACING: Result := 3; TCDLISTVIEW_LINE_BOTTOM_SPACING: Result := 3; + // + TCDCTABCONTROL_CLOSE_TAB_BUTTON_WIDTH: Result := 10; + TCDCTABCONTROL_CLOSE_TAB_BUTTON_EXTRA_SPACING: Result := 10; else Result := 0; end; @@ -173,6 +178,8 @@ const var ATabsStateEx: TCDCTabControlStateEx absolute AStateEx; lCaption: String; + lTabWidth, i: Integer; + IsPainting: Boolean = False; begin ADest.Font.Assign(AStateEx.Font); @@ -186,11 +193,34 @@ begin begin lCaption := ATabsStateEx.Tabs.Strings[ATabsStateEx.CurTabIndex]; Result := ADest.TextWidth(lCaption) + TCDTabControl_Common_TabCaptionExtraWidth; + if (nboShowCloseButtons in ATabsStateEx.Options) then + Result := Result + GetMeasures(TCDCTABCONTROL_CLOSE_TAB_BUTTON_WIDTH) + + GetMeasures(TCDCTABCONTROL_CLOSE_TAB_BUTTON_EXTRA_SPACING); end // in any other case we are referring to the aditional + button for adding a new tab else Result := ADest.TextWidth('+') + TCDTabControl_Common_TabCaptionExtraWidth; - end + end; + TCDCTABCONTROL_TAB_LEFT_POS: + begin + Result := 0; + for i := 0 to ATabsStateEx.CurTabIndex-1 do + begin + if i = ATabsStateEx.LeftmostTabVisibleIndex then IsPainting := True; + + if IsPainting then + Result := Result + GetMeasuresEx(ADest, TCDCTABCONTROL_TAB_WIDTH, AState, AStateEx); + end; + end; + TCDCTABCONTROL_CLOSE_BUTTON_POS_X: + begin + lTabWidth := GetMeasuresEx(ADest, TCDCTABCONTROL_TAB_WIDTH, AState, AStateEx); + Result := GetMeasuresEx(ADest, TCDCTABCONTROL_TAB_LEFT_POS, AState, AStateEx) + +lTabWidth + -GetMeasures(TCDCTABCONTROL_CLOSE_TAB_BUTTON_WIDTH) + -GetMeasures(TCDCTABCONTROL_CLOSE_TAB_BUTTON_EXTRA_SPACING); + end; + TCDCTABCONTROL_CLOSE_BUTTON_POS_Y: Result := 10; else Result := 0; end; @@ -452,6 +482,16 @@ begin ADest.Polygon(lPoints); end; +procedure TCDDrawerCommon.DrawSmallCloseButton(ADest: TCanvas; ADestPos: TPoint); +begin + ADest.Pen.Style := psSolid; + ADest.Pen.Color := clGray; + ADest.Pen.Width := 4; + ADest.Line(ADestPos.X, ADestPos.Y, ADestPos.X+10, ADestPos.Y+10); + ADest.Line(ADestPos.X+10, ADestPos.Y, ADestPos.X, ADestPos.Y+10); + ADest.Pen.Width := 1; +end; + procedure TCDDrawerCommon.DrawControl(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; AState: TCDControlState; AStateEx: TCDControlStateEx); var @@ -1310,6 +1350,7 @@ var lCaption: String; lTabHeightCorrection: Integer = 0; lTabRightBorderExtraHeight: Integer = 0; + lCloseButtonPos: TPoint; begin IsSelected := AStateEx.TabIndex = AStateEx.CurTabIndex; IsAddButton := AStateEx.CurTabIndex = AStateEx.Tabs.Count; @@ -1374,6 +1415,14 @@ begin if IsAddButton then lCaption := '+' else lCaption := AStateEx.Tabs.Strings[AStateEx.CurTabIndex]; ADest.TextOut(AStateEx.CurStartLeftPos+5, lTabTopPos+5, lCaption); + + // Now the close button + if (not IsAddButton) and (nboShowCloseButtons in AStateEx.Options) then + begin + lCloseButtonPos.X := GetMeasuresEx(ADest, TCDCTABCONTROL_CLOSE_BUTTON_POS_X, AState, AStateEx); + lCloseButtonPos.Y := GetMeasuresEx(ADest, TCDCTABCONTROL_CLOSE_BUTTON_POS_Y, AState, AStateEx); + DrawSmallCloseButton(ADest, lCloseButtonPos); + end; end; { TCDListViewDrawerCommon } diff --git a/components/customdrawn/customdrawn_wince.pas b/components/customdrawn/customdrawn_wince.pas index 6eba376303..42f727b0cb 100644 --- a/components/customdrawn/customdrawn_wince.pas +++ b/components/customdrawn/customdrawn_wince.pas @@ -231,13 +231,14 @@ end; procedure TCDDrawerWinCE.DrawTab(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; AState: TCDControlState; AStateEx: TCDCTabControlStateEx); var - IsSelected: Boolean; + IsSelected, IsAddButton: Boolean; lTabWidth, lTabHeight, lTabTopPos: Integer; Points: array of TPoint; lCaption: String; lTabHeightCorrection: Integer = 0; begin IsSelected := AStateEx.TabIndex = AStateEx.CurTabIndex; + IsAddButton := AStateEx.CurTabIndex = AStateEx.Tabs.Count; if not IsSelected then lTabHeightCorrection := 3; @@ -280,7 +281,8 @@ begin end; // Now the text - lCaption := AStateEx.Tabs.Strings[AStateEx.CurTabIndex]; + if IsAddButton then lCaption := '+' + else lCaption := AStateEx.Tabs.Strings[AStateEx.CurTabIndex]; ADest.TextOut(AStateEx.CurStartLeftPos+5, lTabTopPos+5, lCaption); end; diff --git a/components/customdrawn/customdrawncontrols.pas b/components/customdrawn/customdrawncontrols.pas index 972cdfb40c..074dc5269d 100644 --- a/components/customdrawn/customdrawncontrols.pas +++ b/components/customdrawn/customdrawncontrols.pas @@ -2055,13 +2055,15 @@ end; procedure TCDCustomTabControl.MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); var - lTabIndex: Integer; + lTabIndex, lCloseButtonSize: Integer; lNewPage: TCDTabSheet; + lCloseButtonPos: TPoint; begin inherited MouseUp(Button, Shift, X, Y); lTabIndex := MousePosToTabIndex(X, Y); + // Check if the add button was clicked if (nboShowAddTabButton in Options) and (lTabIndex = Tabs.Count) then begin if Self is TCDPageControl then @@ -2074,6 +2076,20 @@ begin Tabs.Add('New Tab'); if Assigned(OnUserAddedPage) then OnUserAddedPage(Self, nil); end; + end + // Check if a close button was clicked + else if (nboShowCloseButtons in Options) then + begin + FTabCState.CurTabIndex := lTabIndex; + lCloseButtonPos.X := FDrawer.GetMeasuresEx(Canvas, TCDCTABCONTROL_CLOSE_BUTTON_POS_X, FState, FStateEx); + lCloseButtonPos.Y := FDrawer.GetMeasuresEx(Canvas, TCDCTABCONTROL_CLOSE_BUTTON_POS_Y, FState, FStateEx); + lCloseButtonSize := FDrawer.GetMeasures(TCDCTABCONTROL_CLOSE_TAB_BUTTON_WIDTH); + if (X >= lCloseButtonPos.X) and (X <= lCloseButtonPos.X + lCloseButtonSize) and + (Y >= lCloseButtonPos.Y) and (Y <= lCloseButtonPos.Y + lCloseButtonSize) then + begin + if Self is TCDPageControl then (Self as TCDPageControl).RemovePage(lTabIndex) + else Tabs.Delete(lTabIndex); + end; end; end; diff --git a/components/customdrawn/customdrawndrawers.pas b/components/customdrawn/customdrawndrawers.pas index 8074978edb..ffdbc5ed82 100644 --- a/components/customdrawn/customdrawndrawers.pas +++ b/components/customdrawn/customdrawndrawers.pas @@ -42,12 +42,18 @@ const TCDLISTVIEW_LINE_TOP_SPACING = $1203; TCDLISTVIEW_LINE_BOTTOM_SPACING = $1204; + TCDCTABCONTROL_CLOSE_TAB_BUTTON_WIDTH = $2600; + TCDCTABCONTROL_CLOSE_TAB_BUTTON_EXTRA_SPACING = $2601; + // Measures Ex TCDCONTROL_CAPTION_WIDTH = $100; TCDCONTROL_CAPTION_HEIGHT = $101; - TCDCTABCONTROL_TAB_HEIGHT = $1100; - TCDCTABCONTROL_TAB_WIDTH = $1101; + TCDCTABCONTROL_TAB_HEIGHT = $2600; + TCDCTABCONTROL_TAB_WIDTH = $2601; + TCDCTABCONTROL_TAB_LEFT_POS = $2602; + TCDCTABCONTROL_CLOSE_BUTTON_POS_X = $2603; + TCDCTABCONTROL_CLOSE_BUTTON_POS_Y = $2604; // Colors TCDEDIT_BACKGROUND_COLOR = $400; @@ -266,6 +272,8 @@ type procedure DrawTickmark(ADest: TCanvas; ADestPos: TPoint); virtual; abstract; procedure DrawSlider(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; AState: TCDControlState); virtual; abstract; procedure DrawCompactArrow(ADest: TCanvas; ADestPos: TPoint; ADirection: TCDControlState); virtual; abstract; + // Extra buttons drawing routines + procedure DrawSmallCloseButton(ADest: TCanvas; ADestPos: TPoint); virtual; abstract; // TCDControl procedure DrawControl(ADest: TCanvas; ADestPos: TPoint; ASize: TSize; AState: TCDControlState; AStateEx: TCDControlStateEx); virtual; abstract;