You've already forked lazarus-ccr
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2658 8e941d3f-bd1b-0410-a28a-d453659cc2b4
3431 lines
102 KiB
ObjectPascal
3431 lines
102 KiB
ObjectPascal
unit ugradtabcontrol;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
@name GradTabControl
|
|
@author Eugen Bolz
|
|
@lastchange 13.12.2009 (DD.MM.YYYY)
|
|
@version 0.2
|
|
@comments TGradTabControl is based on TNotebook/TPageControl/TTabControl
|
|
@license http://creativecommons.org/licenses/LGPL/2.1/
|
|
------------------------------------------------------------------------------}
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
{.$DEFINE DEBUGTAB}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, LResources, SysUtils, Menus, LCLType, ComCtrls,
|
|
LCLProc, LCLIntf, ExtCtrls, Graphics, ugradbtn, Controls,
|
|
uRotateBitmap, Buttons, Forms, ImgList, gradtabstyle
|
|
{$IFDEF DEBUGTAB}
|
|
, sharedloggerlcl
|
|
{$ELSE}
|
|
, DummyLogger
|
|
{$ENDIF};
|
|
|
|
type
|
|
TGradTabControl = class;
|
|
TGradTabPage = class;
|
|
|
|
{ TGradTabCloseButton }
|
|
|
|
TGradTabCloseButton = class(TGradButton)
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
end;
|
|
|
|
{ TGradTabPageButton }
|
|
|
|
TGradTabPageButton = class( TGradButton )
|
|
private
|
|
FCloseButton : TGradTabCloseButton;
|
|
FPage: TGradTabPage;
|
|
FShowCloseButton : Boolean;
|
|
FShowCloseButtonOnMouseOver: Boolean;
|
|
procedure AlignCloseButton;
|
|
procedure SetShowCloseButton(AValue: Boolean);
|
|
procedure SetShowCloseButtonOnMouseOver(const AValue: Boolean);
|
|
protected
|
|
procedure SetRotateDirection(const Value: TRotateDirection); override;
|
|
procedure RealSetText(const Value: TCaption); override;
|
|
procedure SetAutoHeightBorderSpacing(const AValue: Integer); override;
|
|
procedure SetAutoWidthBorderSpacing(const AValue: Integer); override;
|
|
procedure SetShowGlyph(const Value: Boolean); override;
|
|
procedure CloseBtnBackgroundPaint(Sender: TGradButton;
|
|
TargetCanvas: TCanvas; R: TRect; BState: TButtonState);
|
|
procedure GetContentRect(var TheRect: TRect); override;
|
|
procedure SetBaseColor(const Value: TColor); override;
|
|
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
|
procedure CloseButtonLeave(Sender: TObject);
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Resize; override;
|
|
procedure SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;
|
|
property ShowCloseButton : Boolean read FShowCloseButton write SetShowCloseButton default false;
|
|
property ShowCloseButtonOnMouseOver : Boolean read FShowCloseButtonOnMouseOver write SetShowCloseButtonOnMouseOver default false;
|
|
property Page : TGradTabPage read FPage write FPage;
|
|
published
|
|
property OnStartDock;
|
|
property OnStartDrag;
|
|
property OnDockDrop;
|
|
property OnDockOver;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnEndDock;
|
|
property OnEndDrag;
|
|
property OnMouseDown;
|
|
property OnMouseUp;
|
|
property OnMouseMove;
|
|
property OnMouseWheel;
|
|
property OnMouseWheelUp;
|
|
property OnMouseWheelDown;
|
|
end;
|
|
|
|
TGradTabPageButtonClickEvent = procedure(GradTabControl : TGradTabControl;AIndex : Integer) of object;
|
|
TGradTabPageButtonMouseDownUpEvent = procedure(GradTabControl : TGradTabControl;Button: TMouseButton;
|
|
Shift: TShiftState; X, Y, AIndex: Integer) of object;
|
|
TGradTabPageButtonMouseMoveEvent = procedure(GradTabControl : TGradTabControl; Shift: TShiftState;
|
|
X, Y, AIndex: Integer) of object;
|
|
|
|
//Properties of the Tab should be accessable from here
|
|
TGradTabPage = class(TCustomControl)
|
|
private
|
|
FActiveTabColor: TColor;
|
|
FButton : TGradTabPageButton;
|
|
FCaption: TCaption;
|
|
FGradTabControl : TGradTabControl;
|
|
FFlags: TPageFlags;
|
|
FImageIndex: Integer;
|
|
FNormalTabColor: TColor;
|
|
FOwnerTabColor: Boolean;
|
|
FShowCloseButtonOnMouseOver: Boolean;
|
|
FTabVisible,FCurrentlyDestroying,FShowCloseButton : Boolean;
|
|
function GetTabButtonLayout: TButtonLayout;
|
|
function GetTabColor: TColor;
|
|
function GetTabGlyph: TBitmap;
|
|
function GetTabShowGlyph: Boolean;
|
|
function GetTabTextAlignment: TTextAlignment;
|
|
function GetTabPopupMenu : TPopupMenu;
|
|
function GetText : TCaption;
|
|
procedure SetImageIndex(const AValue: Integer);
|
|
procedure SetShowCloseButtonOnMouseOver(const AValue: Boolean);
|
|
procedure SetTabButtonLayout(const AValue: TButtonLayout);
|
|
procedure SetTabColor(const AValue: TColor);
|
|
procedure SetTabGlyph(const AValue: TBitmap);
|
|
procedure SetTabPopupMenu(Value : TPopupMenu);
|
|
procedure SetTabShowGlyph(const AValue: Boolean);
|
|
procedure SetTabTextAlignment(const AValue: TTextAlignment);
|
|
procedure SetText(const Value: TCaption);
|
|
procedure SetEnabled(Value: Boolean); override;
|
|
protected
|
|
function GetPageIndex: integer;
|
|
procedure SetPageIndex(AValue: Integer);
|
|
procedure SetParent(NewParent: TWinControl); override;
|
|
procedure SetShowCloseButton(Value: Boolean);
|
|
procedure SetTabVisible(Value: Boolean);
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure DestroyHandle; override;
|
|
procedure Paint; override;
|
|
property TabButton : TGradTabPageButton read FButton;
|
|
function VisibleIndex: integer;
|
|
procedure UpdateImage;
|
|
published
|
|
property TabVisible : Boolean read FTabVisible write SetTabVisible default true;
|
|
property PageIndex : Integer read GetPageIndex write SetPageIndex;
|
|
property Caption : TCaption read GetText write SetText;
|
|
property ShowCloseButton : Boolean read FShowCloseButton write SetShowCloseButton default false;
|
|
property ShowCloseButtonOnMouseOver : Boolean read FShowCloseButtonOnMouseOver write SetShowCloseButtonOnMouseOver default false;
|
|
property TabPopupMenu : TPopupMenu read GetTabPopupMenu write SetTabPopupMenu;
|
|
property Color;
|
|
property TabColor : TColor read GetTabColor write SetTabColor;
|
|
property TabTextAlignment : TTextAlignment read GetTabTextAlignment write SetTabTextAlignment default taCenter;
|
|
property TabGlyph : TBitmap read GetTabGlyph write SetTabGlyph;
|
|
property TabShowGlyph : Boolean read GetTabShowGlyph write SetTabShowGlyph;
|
|
property TabButtonLayout : TButtonLayout read GetTabButtonLayout write SetTabButtonLayout;
|
|
property ImageIndex : Integer read FImageIndex write SetImageIndex default 0;
|
|
property Enabled;
|
|
property PopupMenu;
|
|
property OnStartDock;
|
|
property OnStartDrag;
|
|
property OnDockDrop;
|
|
property OnDockOver;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnEndDock;
|
|
property OnEndDrag;
|
|
property OnMouseDown;
|
|
property OnMouseUp;
|
|
property OnMouseMove;
|
|
property OnMouseWheel;
|
|
property OnMouseWheelUp;
|
|
property OnMouseWheelDown;
|
|
property ActiveTabColor : TColor read FActiveTabColor write FActiveTabColor default clGreen;
|
|
property NormalTabColor : TColor read FNormalTabColor write FNormalTabColor default clBlue;
|
|
property OwnerTabColor : Boolean read FOwnerTabColor write FOwnerTabColor default false;
|
|
end;
|
|
|
|
{ TFormPage }
|
|
|
|
TFormPage = class(TGradTabPage)
|
|
private
|
|
FDestroyPageAtDestroy: Boolean;
|
|
FOldForm : TCustomForm;
|
|
FShowPageAtDestroy: Boolean;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure FormToPage(TheForm : TCustomForm);
|
|
procedure PageToForm(AShow : Boolean);
|
|
published
|
|
property TheForm : TCustomForm read FOldForm;
|
|
property ShowPageAtDestroy : Boolean read FShowPageAtDestroy write FShowPageAtDestroy default false;
|
|
property DestroyPageAtDestroy : Boolean read FDestroyPageAtDestroy write FDestroyPageAtDestroy default false;
|
|
end;
|
|
|
|
{ TGradTabPagesBar }
|
|
|
|
TTabs = Array of Integer;
|
|
|
|
{
|
|
@name TGradTabPagesBar
|
|
@comments Shows and Order the TabButtons
|
|
}
|
|
TGradTabPagesBar = class(TCustomControl)
|
|
private
|
|
FActiveTabColor: TColor;
|
|
FNeedOrderButtons: Boolean;
|
|
FNormalTabColor: TColor;
|
|
FPageList : TListWithEvent;
|
|
FTabControl : TGradTabControl;
|
|
FShowFromButton, FMovedTo : Integer;
|
|
FTabPosition : TTabPosition;
|
|
FTabHeight,FLongWidth : Integer;
|
|
FActiveIndex: Integer;
|
|
protected
|
|
procedure InsertButton(AButton: TGradTabPageButton; Index: Integer);
|
|
procedure OrderButtons;
|
|
procedure UnFocusButton(Index: Integer);
|
|
procedure FocusButton(Index: Integer);
|
|
procedure SetTabPosition(Value: TTabPosition);
|
|
function IsVisible(Index: Integer) : Boolean;
|
|
procedure ChangeLeftTop(LastTabPosition : TTabPosition);
|
|
function GetViewedTabs : TTabs;
|
|
function GetViewableTabs(FromIndex : Integer) : TTabs;
|
|
function GetTabsOfSide(FromIndex : Integer; FromLeftSide : Boolean) : TTabs;
|
|
procedure ScrollToTab(PIndex : Integer);
|
|
procedure UpdateAllButtons;
|
|
procedure NewStyle;
|
|
public
|
|
constructor Create(AOwner: TComponent; var thePageList: TListWithEvent;
|
|
TheTabControl : TGradTabControl);
|
|
procedure Paint; override;
|
|
procedure Resize; override;
|
|
procedure MoveToNext;
|
|
procedure MoveToPrior;
|
|
procedure MoveTo(Num: Integer);
|
|
procedure MoveToNorm;
|
|
property TabPosition : TTabPosition read FTabPosition write SetTabPosition;
|
|
property NeedOrderButtons : Boolean read FNeedOrderButtons;
|
|
published
|
|
property OnStartDock;
|
|
property OnStartDrag;
|
|
property OnDockDrop;
|
|
property OnDockOver;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnEndDock;
|
|
property OnEndDrag;
|
|
property OnMouseDown;
|
|
property OnMouseUp;
|
|
property OnMouseMove;
|
|
property OnMouseWheel;
|
|
property OnMouseWheelUp;
|
|
property OnMouseWheelDown;
|
|
property ActiveTabColor : TColor read FActiveTabColor write FActiveTabColor default clGreen;
|
|
property NormalTabColor : TColor read FNormalTabColor write FNormalTabColor default clBlue;
|
|
end;
|
|
|
|
// Is parent of the Next/Prev Buttons
|
|
{
|
|
@name TGradTabBar
|
|
@description
|
|
}
|
|
TGradTabBar = class(TCustomControl)
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure Paint; override;
|
|
end;
|
|
|
|
TGradTabPages = class(TStrings)
|
|
private
|
|
FPageList: TListWithEvent;
|
|
FGradTabControl : TGradTabControl;
|
|
procedure PageListChange(Ptr: Pointer; AnAction: TListNotification);
|
|
protected
|
|
function Get(Index: Integer): String; override;
|
|
function GetCount: Integer; override;
|
|
function GetObject(Index: Integer): TObject; override;
|
|
procedure Put(Index: Integer; const S: String); override;
|
|
public
|
|
constructor Create(var thePageList: TListWithEvent;
|
|
theGradTabControl: TGradTabControl);
|
|
procedure Clear; override;
|
|
procedure Delete(Index: Integer); override;
|
|
procedure Insert(Index: Integer; const S: String); override;
|
|
procedure Move(CurIndex, NewIndex: Integer); override;
|
|
end;
|
|
|
|
TGradTabControlPaintEvent = procedure(Sender: TCustomControl;
|
|
TargetCanvas: TCanvas) of object;
|
|
|
|
{ TGradTabControl }
|
|
|
|
TGradTabControl = class(TCustomControl)
|
|
private
|
|
FAutoShowScrollButton: Boolean;
|
|
FCustomDraw: Boolean;
|
|
FImages: TImageList;
|
|
FIsUpdating: Boolean;
|
|
FMoveIncrement: Integer;
|
|
FLeftButton, FRightButton : TGradButton;
|
|
FOnCustomDraw: TGradTabControlPaintEvent;
|
|
FOnTabCloseButtonClick: TGradTabPageButtonClickEvent;
|
|
FOnPageChanged: TNotifyEvent;
|
|
FShowLeftTopScrollButton: Boolean;
|
|
FShowRightBottomScrollButton: Boolean;
|
|
FStyle: TGradTabStyleBase;
|
|
FTabStrings : TStrings; //TGradTabPages
|
|
FPageList: TList; //Is Managed by TGradTabPages
|
|
FOnTabButtonClick : TGradTabPageButtonClickEvent;
|
|
FOnTabButtonMouseDown,
|
|
FOnTabButtonMouseUp : TGradTabPageButtonMouseDownUpEvent;
|
|
FOnTabButtonMouseMove : TGradTabPageButtonMouseMoveEvent;
|
|
FPageIndex, fPageIndexOnLastChange, fPageIndexOnLastShow,
|
|
FTabHeight, FLongWidth : Integer;
|
|
FBar : TGradTabBar;
|
|
FImageChangeLink : TChangeLink;
|
|
FPagesBar: TGradTabPagesBar;
|
|
FPagesPopup : TPopupMenu;
|
|
FTabPosition : TTabPosition;
|
|
FLongTabs : Boolean;
|
|
procedure AssignEvents(TheControl : TCustomControl);
|
|
procedure AlignPage(APage : TGradTabPage; ARect : TRect);
|
|
procedure AlignPages;
|
|
function GetActiveTabColor: TColor;
|
|
function GetNormalTabColor: TColor;
|
|
function GetTabPopupMenu: TPopupMenu;
|
|
procedure ImageListChange(Sender: TObject);
|
|
procedure SetActiveTabColor(const AValue: TColor);
|
|
procedure SetCustomDraw(const AValue: Boolean);
|
|
procedure SetNormalTabColor(const AValue: TColor);
|
|
procedure SetStyle(const AValue: TGradTabStyleBase);
|
|
procedure SetTabPopupMenu(const AValue: TPopupMenu);
|
|
procedure UpdateTabImages;
|
|
function GetCurrentPage : TGradTabPage;
|
|
function GetPage(AIndex: Integer) : TGradTabPage;
|
|
function GetCount : Integer;
|
|
function GetPagesBarDragOver: TDragOverEvent;
|
|
procedure MoveTab(Sender: TObject; NewIndex: Integer);
|
|
function FindVisiblePage(Index: Integer): Integer;
|
|
procedure PageButtonMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure PageButtonMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure PageButtonMouseClick(Sender: TObject);
|
|
procedure PageCloseButtonMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure PopupMouseClick(Sender: TObject);
|
|
procedure PageButtonMouseMove(Sender: TObject; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
procedure SetAutoShowScrollButtons(const AValue: Boolean);
|
|
procedure SetImages(const AValue: TImageList);
|
|
procedure SetLongWidth(const AValue: Integer);
|
|
procedure SetShowLeftTopScrollButton(const AValue: Boolean);
|
|
procedure SetShowRightBottomScrollButton(const AValue: Boolean);
|
|
|
|
//SubControl Events
|
|
procedure SubMouseWheel(Sender: TObject; Shift: TShiftState;
|
|
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
|
procedure SubMouseWheelUp(Sender: TObject;
|
|
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
|
|
procedure SubMouseWheelDown(Sender: TObject;
|
|
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
|
|
procedure SubMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure SubMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
procedure SubMouseClick(Sender: TObject);
|
|
procedure SubMouseDblClick(Sender: TObject);
|
|
procedure SubMouseMove(Sender: TObject; Shift: TShiftState;
|
|
X, Y: Integer);
|
|
procedure SubDragOver(Sender, Source: TObject;
|
|
X,Y: Integer; State: TDragState; var Accept: Boolean);
|
|
procedure SubDragDrop(Sender, Source: TObject; X,Y: Integer);
|
|
//End
|
|
|
|
// Style Event Wrapper
|
|
procedure StyleTabButton(Sender: TGradButton;
|
|
TargetCanvas: TCanvas; R: TRect; BState : TButtonState);
|
|
procedure StyleTabCloseButton(Sender: TGradButton;
|
|
TargetCanvas: TCanvas; R: TRect; BState : TButtonState);
|
|
procedure StyleTabButtonBorder(Sender: TGradButton;
|
|
TargetCanvas: TCanvas; R: TRect; BState : TButtonState);
|
|
|
|
// End
|
|
|
|
procedure PopupTabs(Sender: TObject);
|
|
procedure MoveLeftTopClick(Sender: TObject);
|
|
procedure MoveRightBottomClick(Sender: TObject);
|
|
procedure PageRemoved(Index: Integer);
|
|
procedure SetCurrentPage(Value : TGradTabPage);
|
|
procedure SetCurrentPageNum(Value: Integer);
|
|
procedure SetPagesBarDragOver(const AValue: TDragOverEvent);
|
|
procedure ShowPage(Index: Integer);
|
|
procedure ShowCurrentPage;
|
|
procedure UnShowPage(Index: Integer);
|
|
protected
|
|
function ChildClassAllowed(ChildClass: TClass): boolean; override;
|
|
procedure InsertPage(APage: TGradTabPage; Index: Integer);
|
|
procedure AddRemovePageHandle(APage: TGradTabPage);
|
|
procedure RemovePage(Index: Integer);
|
|
procedure InvPaint;
|
|
procedure SetTabHeight(Value: Integer);
|
|
procedure SetTabs(Value: TStrings);
|
|
procedure SetTabPosition(Value : TTabPosition);
|
|
procedure SetLongTabs(Value : Boolean);
|
|
procedure Change;
|
|
procedure UpdateTabProperties;
|
|
public
|
|
constructor Create(AOwner: TComponent); override;
|
|
destructor Destroy; override;
|
|
procedure BeginUpdate;
|
|
procedure EndUpdate;
|
|
function GetTabRect(AIndex : Integer) : TRect;
|
|
function AddPage(AName: String) : Integer;
|
|
function AddPage(APage: TGradTabPage) : Integer;
|
|
function GetTabBarSize(TabPos : TTabPosition) : Integer;
|
|
function GetClientRect: TRect; override;
|
|
procedure Paint; override;
|
|
procedure Resize; override;
|
|
procedure UpdateAllDesignerFlags;
|
|
procedure UpdateDesignerFlags(APageIndex: integer);
|
|
|
|
property IsUpdating : Boolean read FIsUpdating;
|
|
property Page[Index: Integer] : TGradTabPage read GetPage;
|
|
property Bar : TGradTabBar read FBar;
|
|
property PagesBar : TGradTabPagesBar read FPagesBar;
|
|
property PageList: TList read FPageList;
|
|
property Tabs : TStrings read FTabStrings write SetTabs;
|
|
property PageCount : Integer read GetCount;
|
|
published
|
|
property Align;
|
|
property BorderSpacing;
|
|
property ActivePage : TGradTabPage read GetCurrentPage write SetCurrentPage;
|
|
property OnTabButtonClick : TGradTabPageButtonClickEvent read FOnTabButtonClick write FOnTabButtonClick;
|
|
property OnTabButtonMouseDown : TGradTabPageButtonMouseDownUpEvent read FOnTabButtonMouseDown write FOnTabButtonMouseDown;
|
|
property OnTabButtonMouseUp : TGradTabPageButtonMouseDownUpEvent read FOnTabButtonMouseUp write FOnTabButtonMouseUp;
|
|
property OnTabButtonMouseMove : TGradTabPageButtonMouseMoveEvent read FOnTabButtonMouseMove write FOnTabButtonMouseMove;
|
|
property OnTabCloseButtonClick : TGradTabPageButtonClickEvent read FOnTabCloseButtonClick write FOnTabCloseButtonClick;
|
|
property OnStartDock;
|
|
property OnStartDrag;
|
|
property OnDockDrop;
|
|
property OnDockOver;
|
|
property OnDragDrop;
|
|
property OnDragOver;
|
|
property OnEndDock;
|
|
property OnEndDrag;
|
|
property OnMouseDown;
|
|
property OnMouseUp;
|
|
property OnMouseMove;
|
|
property OnMouseWheel;
|
|
property OnMouseWheelUp;
|
|
property OnMouseWheelDown;
|
|
property OnClick;
|
|
property OnDblClick;
|
|
property TabPopupMenu : TPopupMenu read GetTabPopupMenu write SetTabPopupMenu;
|
|
property PopupMenu;
|
|
property PageIndex : Integer read FPageIndex write SetCurrentPageNum;
|
|
property TabHeight : Integer read FTabHeight write SetTabHeight;
|
|
property TabPosition : TTabPosition read FTabPosition write SetTabPosition default tpTop;
|
|
property LongTabs : Boolean read FLongTabs write SetLongTabs;
|
|
property LongWidth: Integer read FLongWidth write SetLongWidth;
|
|
property OnPageChanged: TNotifyEvent read FOnPageChanged write FOnPageChanged;
|
|
property AutoShowScrollButtons : Boolean read FAutoShowScrollButton write SetAutoShowScrollButtons default true;
|
|
property ShowLeftTopScrollButton : Boolean read FShowLeftTopScrollButton write SetShowLeftTopScrollButton;
|
|
property ShowRightBottomScrollButton : Boolean read FShowRightBottomScrollButton write SetShowRightBottomScrollButton;
|
|
property Images : TImageList read FImages write SetImages;
|
|
property NormalTabColor: TColor read GetNormalTabColor write SetNormalTabColor default clBlue;
|
|
property ActiveTabColor: TColor read GetActiveTabColor write SetActiveTabColor default clGreen;
|
|
property CustomDraw : Boolean read FCustomDraw write SetCustomDraw;
|
|
property OnCustomDraw : TGradTabControlPaintEvent read FOnCustomDraw write FOnCustomDraw;
|
|
property Style : TGradTabStyleBase read FStyle write SetStyle;
|
|
end;
|
|
|
|
procedure Register;
|
|
function IsAssigned(var Obj : TObject) : String;
|
|
function BoolStr(BV : Boolean) : String;
|
|
function IncAr(var Ar : TTabs) : Integer;
|
|
function Form2Page(theTabControl : TGradTabControl; theForm : TCustomForm) : TFormPage;
|
|
|
|
implementation
|
|
|
|
uses
|
|
gradtabcontroleditor, ComponentEditors;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
Register
|
|
------------------------------------------------------------------------------}
|
|
procedure Register;
|
|
begin
|
|
RegisterComponents('Misc',[TGradTabControl]);
|
|
RegisterComponentEditor(TGradTabControl,TGradTabControlComponentEditor);
|
|
RegisterComponentEditor(TGradTabPage,TGradTabPageComponentEditor);
|
|
RegisterNoIcon([TGradTabPage]);
|
|
end;
|
|
|
|
function IsAssigned(var Obj: TObject): String;
|
|
begin
|
|
Result := 'Assigned: '+BoolToStr(Assigned(Obj),true);
|
|
end;
|
|
|
|
function BoolStr(BV: Boolean): String;
|
|
begin
|
|
Result := BoolToStr(BV,true);
|
|
end;
|
|
|
|
function ValueInArray(Needle : Integer; Stack : TTabs) : Boolean;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
Result := false;
|
|
|
|
DebugLn('ValueInArray: Needle=%d Low=%d High=%d',[Needle, Low(Stack), High(Stack)]);
|
|
|
|
for i := Low(Stack) to High(Stack) do
|
|
if Needle =Stack[i] then
|
|
begin
|
|
Result := true;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
function IncAr(var Ar : TTabs) : Integer;
|
|
begin
|
|
SetLength(Ar, Length(Ar)+1);
|
|
Result := Length(Ar)-1;
|
|
end;
|
|
|
|
function Form2Page(theTabControl: TGradTabControl; theForm: TCustomForm
|
|
): TFormPage;
|
|
begin
|
|
Result := TFormPage.Create(theTabControl);
|
|
Result.FormToPage(theForm);
|
|
Result.ShowPageAtDestroy:=false;
|
|
Result.Parent := theTabControl;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPageButton Create(AOwner: TComponent
|
|
------------------------------------------------------------------------------}
|
|
constructor TGradTabPageButton.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
|
|
ControlStyle := ControlStyle+[csNoDesignSelectable,csDesignInteractive]-[csCaptureMouse];
|
|
FCloseButton := TGradTabCloseButton.Create(AOwner);
|
|
FCloseButton.Width:=14;
|
|
FCloseButton.Height:=14;
|
|
TextAlignment:=taCenter;
|
|
FCloseButton.Left:=1;
|
|
FCloseButton.Top:=1;
|
|
FCloseButton.Caption:='';
|
|
FCloseButton.OnMouseLeave:=@CloseButtonLeave;
|
|
|
|
FShowCloseButton:=false;
|
|
FShowCloseButtonOnMouseOver:=false;
|
|
|
|
SetSubComponent(true);
|
|
end;
|
|
|
|
destructor TGradTabPageButton.Destroy;
|
|
begin
|
|
FCloseButton.Free;
|
|
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TGradTabPageButton.CloseButtonLeave(Sender: TObject);
|
|
begin
|
|
if not FShowCloseButton then Exit;
|
|
if not FShowCloseButtonOnMouseOver then Exit;
|
|
|
|
// Hide Close Button Fix
|
|
FCloseButton.Visible:=false;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPageButton AlignCloseButton
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPageButton.AlignCloseButton;
|
|
var
|
|
TheRect : TRect;
|
|
DisplayWidth, DisplayHeight: Integer;
|
|
NewTop,NewLeft : Integer;
|
|
begin
|
|
if not HasParent then Exit;
|
|
|
|
//GetBackgroundRect(TheRect);
|
|
GetContentRect(TheRect);
|
|
|
|
DisplayWidth:= TheRect.Right-TheRect.Left;
|
|
DisplayHeight:=TheRect.Bottom-TheRect.Top;
|
|
|
|
case RotateDirection of
|
|
rdNormal: begin
|
|
NewTop:=(DisplayHeight div 2)-(FCloseButton.Height div 2);
|
|
NewLeft:=DisplayWidth-(FCloseButton.Width);
|
|
end;
|
|
rdRight: begin
|
|
NewTop:=DisplayHeight-(FCloseButton.Height);
|
|
NewLeft:=(DisplayWidth div 2)-(FCloseButton.Width div 2);
|
|
end;
|
|
rdLeft: begin
|
|
NewTop:=1;
|
|
NewLeft:=(DisplayWidth div 2)-(FCloseButton.Width div 2);
|
|
end;
|
|
end;
|
|
|
|
FCloseButton.Top:=NewTop+TheRect.Top;
|
|
FCloseButton.Left:=NewLeft+TheRect.Left;
|
|
|
|
FCloseButton.UpdateButton;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPageButton SetShowCloseButton(AValue: Boolean)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPageButton.SetShowCloseButton(AValue: Boolean);
|
|
begin
|
|
if AValue = FShowCloseButton then Exit;
|
|
FShowCloseButton:=AValue;
|
|
|
|
if AValue then
|
|
begin
|
|
AlignCloseButton;
|
|
FCloseButton.Parent:=Self;
|
|
end else begin
|
|
FCloseButton.Parent:=nil;
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabPageButton.SetShowCloseButtonOnMouseOver(const AValue: Boolean
|
|
);
|
|
begin
|
|
{*
|
|
IF ShowCloseButton AND ShowCloseButtonOnMouseOver
|
|
then the CloseButton is Invisible until the Mouse is Over the CloseButton
|
|
*}
|
|
|
|
if FShowCloseButtonOnMouseOver=AValue then exit;
|
|
if not FShowCloseButton then Exit;
|
|
|
|
FShowCloseButtonOnMouseOver:=AValue;
|
|
|
|
FCloseButton.Visible:=false;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPageButton Resize
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPageButton.Resize;
|
|
begin
|
|
inherited Resize;
|
|
|
|
AlignCloseButton;
|
|
end;
|
|
|
|
procedure TGradTabPageButton.SetBounds(aLeft, aTop, aWidth, aHeight: integer);
|
|
var
|
|
ParentControl : TGradTabControl;
|
|
begin
|
|
inherited SetBounds(aLeft, aTop, aWidth, aHeight);
|
|
|
|
AlignCloseButton;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPageButton SetRotateDirection(const Value: TRotateDirection)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPageButton.SetRotateDirection(const Value: TRotateDirection);
|
|
begin
|
|
inherited;
|
|
|
|
case Value of
|
|
rdNormal: TextAlignment := taLeftJustify;
|
|
rdLeft, rdRight: TextAlignment := taCenter;
|
|
end;
|
|
|
|
FCloseButton.RotateDirection:=Value;
|
|
if FShowCloseButton then
|
|
AlignCloseButton;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPageButton.SetText(const Value: TCaption)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPageButton.RealSetText(const Value: TCaption);
|
|
var
|
|
NewCaption : TCaption;
|
|
begin
|
|
Logger.EnterMethod(Self, 'RealSetText');
|
|
|
|
NewCaption:=Value;
|
|
|
|
inherited RealSetText(NewCaption);
|
|
|
|
AlignCloseButton;
|
|
|
|
Logger.Send('Parent Assigned', Assigned(Parent));
|
|
Logger.Send('Parent is TGradTabPagesBar', Parent is TGradTabPagesBar);
|
|
|
|
if Assigned(Parent) AND (Parent is TGradTabPagesBar) then
|
|
(Parent as TGradTabPagesBar).OrderButtons;
|
|
|
|
Logger.ExitMethod(Self, 'RealSetText');
|
|
end;
|
|
|
|
procedure TGradTabPageButton.SetAutoHeightBorderSpacing(const AValue: Integer);
|
|
begin
|
|
if ShowGlyph then
|
|
inherited SetAutoHeightBorderSpacing(AValue+Glyph.Height)
|
|
else
|
|
inherited SetAutoHeightBorderSpacing(AValue);
|
|
|
|
if Parent <> nil then (Parent AS TGradTabPagesBar).OrderButtons;
|
|
end;
|
|
|
|
procedure TGradTabPageButton.SetAutoWidthBorderSpacing(const AValue: Integer);
|
|
begin
|
|
if ShowGlyph then
|
|
inherited SetAutoWidthBorderSpacing(AValue+Glyph.Width)
|
|
else
|
|
inherited SetAutoWidthBorderSpacing(AValue);
|
|
|
|
if Parent <> nil then (Parent AS TGradTabPagesBar).OrderButtons;
|
|
end;
|
|
|
|
procedure TGradTabPageButton.SetShowGlyph(const Value: Boolean);
|
|
begin
|
|
inherited SetShowGlyph(Value);
|
|
|
|
if Parent <> nil then (Parent AS TGradTabPagesBar).OrderButtons;
|
|
end;
|
|
|
|
procedure TGradTabPageButton.CloseBtnBackgroundPaint(Sender: TGradButton;
|
|
TargetCanvas: TCanvas; R: TRect; BState: TButtonState);
|
|
begin
|
|
// nothing
|
|
end;
|
|
|
|
procedure TGradTabPageButton.GetContentRect(var TheRect: TRect);
|
|
begin
|
|
inherited GetContentRect(TheRect);
|
|
|
|
if ShowCloseButton then
|
|
begin
|
|
case RotateDirection of
|
|
rdNormal: begin
|
|
TheRect.Right :=TheRect.Right-(FCloseButton.Glyph.Width);
|
|
end;
|
|
rdLeft: begin
|
|
TheRect.Top := TheRect.Top+(FCloseButton.Glyph.Height);
|
|
end;
|
|
rdRight: begin
|
|
TheRect.Bottom := TheRect.Bottom-(FCloseButton.Glyph.Height);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabPageButton.SetBaseColor(const Value: TColor);
|
|
begin
|
|
inherited SetBaseColor(Value);
|
|
|
|
FCloseButton.Color:=Value;
|
|
end;
|
|
|
|
procedure TGradTabPageButton.MouseMove(Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
CloseBtnRect : TRect;
|
|
begin
|
|
inherited MouseMove(Shift, X, Y);
|
|
|
|
if not FShowCloseButton then Exit;
|
|
if not FShowCloseButtonOnMouseOver then Exit;
|
|
|
|
CloseBtnRect.Top:=FCloseButton.Top;
|
|
CloseBtnRect.Left:=FCloseButton.Left;
|
|
CloseBtnRect.Right:=FCloseButton.Left+FCloseButton.Width;
|
|
CloseBtnRect.Bottom:=FCloseButton.Top+FCloseButton.Height;
|
|
|
|
// Shows the Close Button
|
|
FCloseButton.Visible:=PtInRect(CloseBtnRect, Point(X,Y));
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage Create(AOwner: TGradTabPageButton)
|
|
------------------------------------------------------------------------------}
|
|
constructor TGradTabPage.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
|
|
FCurrentlyDestroying := false;
|
|
fCompStyle := csPage;
|
|
ControlStyle := ControlStyle + [csAcceptsControls,csDesignFixedBounds,csNoDesignVisible];
|
|
|
|
Align := alClient;
|
|
|
|
FButton := TGradTabPageButton.Create(Self);
|
|
FButton.Page := Self;
|
|
|
|
FTabVisible:=true;
|
|
FShowCloseButton:=false;
|
|
FImageIndex:=0;
|
|
|
|
FActiveTabColor:=clGreen;
|
|
FNormalTabColor:=clBlue;
|
|
FOwnerTabColor:=false;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage Destroy
|
|
------------------------------------------------------------------------------}
|
|
destructor TGradTabPage.Destroy;
|
|
begin
|
|
FCurrentlyDestroying := true;
|
|
Parent := nil;
|
|
|
|
FButton.Parent := nil;
|
|
FButton.Free;
|
|
|
|
inherited;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage DestroyHandle
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPage.DestroyHandle;
|
|
begin
|
|
inherited DestroyHandle;
|
|
Exclude(FFlags,pfAdded);
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage GetPageIndex: integer
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabPage.GetPageIndex: integer;
|
|
begin
|
|
if (Parent<>nil) and (Parent is TGradTabControl) then
|
|
Result:=TGradTabControl(Parent).PageList.IndexOf(Self)
|
|
else
|
|
Result := -1;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage SetPageIndex(AValue: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPage.SetPageIndex(AValue: Integer);
|
|
begin
|
|
if (Parent<>nil) and (Parent is TGradTabControl) then begin
|
|
TGradTabControl(Parent).MoveTab(Self,AValue);
|
|
end;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage SetParent(NewParent: TWinControl)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPage.SetParent(NewParent: TWinControl);
|
|
var
|
|
OldParent: TWinControl;
|
|
ParentTabControl: TGradTabControl;
|
|
i: integer;
|
|
begin
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabPage.SetParent');
|
|
{$ENDIF}
|
|
|
|
if (NewParent=Parent) or (pfInserting in FFlags) then Exit;
|
|
//if ((Parent<>nil)) AND (NewParent=Parent) then exit;
|
|
CheckNewParent(NewParent);
|
|
OldParent:=Parent;
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('OldParent: %s NewParent: %s',[DbgSName(OldParent),DbgSName(NewParent)]);
|
|
{$ENDIF}
|
|
|
|
if (OldParent<>NewParent) and (OldParent<>nil)
|
|
and (OldParent is TGradTabControl)
|
|
and (not (pfRemoving in FFlags))
|
|
then begin
|
|
// remove from old pagelist
|
|
ParentTabControl := TGradTabControl(OldParent);
|
|
i := PageIndex;
|
|
if i >= 0 then
|
|
ParentTabControl.RemovePage(i);
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('Page removed from old TabControl');
|
|
{$ENDIF}
|
|
end;
|
|
|
|
inherited SetParent(NewParent);
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('New Parent set');
|
|
{$ENDIF}
|
|
|
|
if (OldParent<>NewParent) and (Parent<>nil)
|
|
and (Parent is TGradTabControl) then begin
|
|
// add to new pagelist
|
|
ParentTabControl:=TGradTabControl(Parent);
|
|
i:=ParentTabControl.PageList.IndexOf(Self);
|
|
if i<0 then
|
|
ParentTabControl.InsertPage(Self,ParentTabControl.PageCount);
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('Insert Page in new Parent');
|
|
{$ENDIF}
|
|
end;
|
|
|
|
FGradTabControl := TGradTabControl(NewParent);
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabPage.SetParent end');
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage SetShowCloseButton(Value: Boolean)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPage.SetShowCloseButton(Value: Boolean);
|
|
begin
|
|
if FShowCloseButton=Value then Exit;
|
|
|
|
FShowCloseButton:=Value;
|
|
FButton.ShowCloseButton:=Value;
|
|
|
|
if not Value then
|
|
FButton.Caption:=FCaption
|
|
else
|
|
SetText(FCaption);
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage SetTabVisible(Value: Boolean)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPage.SetTabVisible(Value: Boolean);
|
|
begin
|
|
if Value = FTabVisible then exit;
|
|
FTabVisible := Value;
|
|
|
|
if csDesigning in ComponentState then
|
|
Exit;
|
|
|
|
if Parent.HandleAllocated then
|
|
begin
|
|
TGradTabControl(Parent).AddRemovePageHandle(Self);
|
|
if FTabVisible then
|
|
begin
|
|
// check if there was no visible tab
|
|
if TGradTabControl(Parent).PageIndex = -1 then
|
|
TGradTabControl(Parent).PageIndex:=PageIndex;
|
|
end
|
|
else
|
|
// Check if the page is active and set a new pageindex
|
|
TGradTabControl(Parent).PageRemoved(PageIndex);
|
|
end;
|
|
|
|
FButton.Visible:=FTabVisible;
|
|
|
|
if FTabVisible then
|
|
TGradTabControl(Parent).PagesBar.OrderButtons
|
|
else begin
|
|
FButton.Left:=-FButton.Width;
|
|
FButton.Top:=-FButton.Height;
|
|
end;
|
|
|
|
|
|
//DoTabVisible; { TODO }
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage GetTabPopupMenu : TPopupMenu
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabPage.GetTabPopupMenu : TPopupMenu;
|
|
begin
|
|
Result := FButton.PopupMenu;
|
|
end;
|
|
|
|
procedure TGradTabPage.SetTabTextAlignment(const AValue: TTextAlignment);
|
|
begin
|
|
if FButton.TextAlignment = AValue then Exit;
|
|
FButton.TextAlignment:= AValue;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage SetTabPopupMenu(Value: TPopupMenu)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPage.SetTabPopupMenu(Value : TPopupMenu);
|
|
begin
|
|
if not Assigned(FButton) then Exit;
|
|
if not Assigned(Value) then Exit;
|
|
|
|
FButton.PopupMenu:=Value;
|
|
end;
|
|
|
|
procedure TGradTabPage.SetTabShowGlyph(const AValue: Boolean);
|
|
begin
|
|
FButton.ShowGlyph:= AValue;
|
|
end;
|
|
|
|
function TGradTabPage.GetTabColor: TColor;
|
|
begin
|
|
Result := FButton.Color
|
|
end;
|
|
|
|
function TGradTabPage.GetTabButtonLayout: TButtonLayout;
|
|
begin
|
|
Result := FButton.ButtonLayout;
|
|
end;
|
|
|
|
function TGradTabPage.GetTabGlyph: TBitmap;
|
|
begin
|
|
Result := FButton.Glyph;
|
|
end;
|
|
|
|
function TGradTabPage.GetTabShowGlyph: Boolean;
|
|
begin
|
|
Result := FButton.ShowGlyph;
|
|
end;
|
|
|
|
function TGradTabPage.GetTabTextAlignment: TTextAlignment;
|
|
begin
|
|
Result := FButton.TextAlignment;
|
|
end;
|
|
|
|
procedure TGradTabPage.SetImageIndex(const AValue: Integer);
|
|
begin
|
|
if FGradTabControl=nil then Exit;
|
|
if FImageIndex=AValue then exit;
|
|
FImageIndex:=AValue;
|
|
|
|
if (FGradTabControl.Images <> nil) AND (FImageIndex<>-1) then
|
|
begin
|
|
UpdateImage;
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabPage.SetShowCloseButtonOnMouseOver(const AValue: Boolean);
|
|
begin
|
|
if FShowCloseButtonOnMouseOver=AValue then exit;
|
|
FShowCloseButtonOnMouseOver:=AValue;
|
|
|
|
FButton.ShowCloseButtonOnMouseOver:=AValue;
|
|
end;
|
|
|
|
procedure TGradTabPage.SetTabButtonLayout(const AValue: TButtonLayout);
|
|
begin
|
|
FButton.ButtonLayout:=AValue;
|
|
end;
|
|
|
|
procedure TGradTabPage.SetTabColor(const AValue: TColor);
|
|
begin
|
|
if FButton.Color = AValue then Exit;
|
|
|
|
FButton.Color:=AValue;
|
|
end;
|
|
|
|
procedure TGradTabPage.SetTabGlyph(const AValue: TBitmap);
|
|
begin
|
|
if FButton.Glyph = AValue then Exit;
|
|
|
|
FButton.Glyph.Assign(AValue);
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage SetText(Value: TCaption)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPage.SetText(const Value: TCaption);
|
|
begin
|
|
FCaption := Value;
|
|
|
|
if FShowCloseButton then
|
|
FButton.Caption:=FCaption+' '
|
|
else
|
|
FButton.Caption:={IntToStr(PageIndex)+': '+}FCaption;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage GetText : TCaption
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabPage.GetText : TCaption;
|
|
begin
|
|
Result := FCaption;
|
|
end;
|
|
|
|
procedure TGradTabPage.SetEnabled(Value: Boolean);
|
|
begin
|
|
inherited SetEnabled(Value);
|
|
|
|
FButton.Enabled:=Value;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage Paint
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPage.Paint;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
{for i := 0 to Height do
|
|
begin
|
|
Canvas.Pen.Color:=ColorBetween(Color,Parent.Color,i / (Height ));
|
|
|
|
Canvas.Line(0,i,Width,i);
|
|
//Canvas.FillRect(-1,-1,Width,Height);
|
|
|
|
end;
|
|
|
|
Canvas.TextOut(Width-Canvas.TextWidth(DbgSName(Self)),0,DbgSName(Self));
|
|
}
|
|
inherited;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPage VisibleIndex
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabPage.VisibleIndex: integer;
|
|
var
|
|
List: TList;
|
|
i: Integer;
|
|
begin
|
|
if (Parent<>nil) and (Parent is TGradTabControl) then begin
|
|
Result:=0;
|
|
List:=TGradTabControl(Parent).PageList;
|
|
i:=0;
|
|
repeat
|
|
if i=List.Count then exit(-1);
|
|
if (TObject(List[i])=Self) then exit;
|
|
if TGradTabPage(List[i]).TabVisible or (csDesigning in ComponentState)
|
|
then inc(Result);
|
|
inc(i);
|
|
until false;
|
|
end else
|
|
Result := -1;
|
|
end;
|
|
|
|
procedure TGradTabPage.UpdateImage;
|
|
begin
|
|
if FGradTabControl = nil then Exit;
|
|
|
|
FButton.Glyph.Clear;
|
|
|
|
if Assigned(FGradTabControl.Images) AND (FGradTabControl.Images.Count<>0)
|
|
AND (ImageIndex < FGradTabControl.Images.Count) AND (ImageIndex<>-1) then begin
|
|
FGradTabControl.Images.GetBitmap(ImageIndex,FButton.Glyph);
|
|
FButton.ShowGlyph:=true;
|
|
end;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar Create(AOwner: TComponent; var theTabList: TListWithEvent;
|
|
TheTabControl : TGradTabControl)
|
|
------------------------------------------------------------------------------}
|
|
constructor TGradTabPagesBar.Create(AOwner: TComponent; var thePageList: TListWithEvent;
|
|
TheTabControl : TGradTabControl);
|
|
begin
|
|
inherited Create(AOwner);
|
|
|
|
FPageList := thePageList;
|
|
FShowFromButton:=-1;
|
|
ControlStyle := ControlStyle+[csNoDesignSelectable];
|
|
FTabPosition:=tpTop;
|
|
FMovedTo:=1;
|
|
FTabControl := TheTabControl;
|
|
SetSubComponent(true);
|
|
|
|
FTabControl.FLeftButton.Visible:=false;
|
|
FTabControl.FRightButton.Visible:=false;
|
|
|
|
FActiveTabColor:=clGreen;
|
|
FNormalTabColor:=clBlue;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar Paint
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPagesBar.Paint;
|
|
begin
|
|
{Canvas.Brush.Color:=clBlue;
|
|
Canvas.FillRect(0,0,Width,Height);
|
|
}
|
|
//WriteLn(Left, ' ' ,Top, ' ' ,Width, ' ' ,Height);
|
|
|
|
inherited;
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.Resize;
|
|
begin
|
|
inherited Resize;
|
|
|
|
OrderButtons;
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.MoveToNext;
|
|
var
|
|
TheTabs : TTabs;
|
|
VIA, L : Boolean;
|
|
FLastShowFrom : Integer;
|
|
begin
|
|
{$IFDEF DEBUGTAB}DebugLn('MoveToNext Begin');{$ENDIF}
|
|
//DebugLn(GetStackTrace(true));
|
|
TheTabs:= GetViewedTabs;
|
|
|
|
VIA := ValueInArray(FPageList.Count-1,TheTabs);
|
|
L := (Length(TheTabs)>1);
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('ValueInArray=%s Length=%s',[BoolToStr(VIA,true),BoolToStr(L,true)]);
|
|
{$ENDIF}
|
|
|
|
FLastShowFrom:= FShowFromButton;
|
|
|
|
if VIA AND L then
|
|
FShowFromButton := TheTabs[0]
|
|
else
|
|
Inc(FShowFromButton);
|
|
|
|
if FShowFromButton>=FPageList.Count then
|
|
FShowFromButton:= FPageList.Count-1;
|
|
|
|
{if not FTabControl.Page[FShowFromButton].Enabled then
|
|
FShowFromButton := FLastShowFrom;}
|
|
|
|
{$IFDEF DEBUGTAB}DebugLn('New FShowFromButton: %d',[FShowFromButton]);{$ENDIF}
|
|
OrderButtons;
|
|
|
|
{$IFDEF DEBUGTAB}DebugLn('MoveToNext End');{$ENDIF}
|
|
|
|
//GetViewedTabs;
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.MoveToPrior;
|
|
var
|
|
FLastShowFrom : Integer;
|
|
begin
|
|
FLastShowFrom:= FShowFromButton;
|
|
|
|
Dec(FShowFromButton);
|
|
if FShowFromButton<0 then FShowFromButton := 0;
|
|
|
|
{$IFDEF DEBUGTAB}DebugLn('New FShowFromButton: %d',[FShowFromButton]);{$ENDIF}
|
|
OrderButtons;
|
|
|
|
//GetViewedTabs;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar InsertButton(AButton: TGradTabPageButton; Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPagesBar.InsertButton(AButton: TGradTabPageButton; Index: Integer);
|
|
var
|
|
LastLeft : Integer;
|
|
begin
|
|
LastLeft := 0;
|
|
|
|
Logger.EnterMethod(Self, 'InsertButton('+IntToStr(Index)+')');
|
|
|
|
if (Index >= 1) AND (FPageList.Count>=1) then
|
|
LastLeft := TGradTabPage(FPageList.Items[Index-1]).TabButton.Left;
|
|
|
|
FTabControl.AssignEvents(AButton);
|
|
|
|
with AButton do
|
|
begin
|
|
Left := -123;
|
|
ShowFocusBorder := false;
|
|
TextAlignment := taCenter;
|
|
BorderSides := [bsTopLine,bsRightLine,bsLeftLine];
|
|
OnMouseDown := @FTabControl.PageButtonMouseDown;
|
|
OnMouseUp := @FTabControl.PageButtonMouseUp;
|
|
OnClick := @FTabControl.PageButtonMouseClick;
|
|
OnMouseMove := @FTabControl.PageButtonMouseMove;
|
|
FCloseButton.OnMouseUp := @FTabControl.PageCloseButtonMouseUp;
|
|
|
|
FTabControl.Style.PrepareButton(AButton);
|
|
|
|
if FTabControl.Style.HasTabButtonPaint then
|
|
begin
|
|
OnNormalBackgroundPaint := @FTabControl.StyleTabButton;
|
|
OnDisabledBackgroundPaint := @FTabControl.StyleTabButton;
|
|
OnDownBackgroundPaint := @FTabControl.StyleTabButton;
|
|
OnHotBackgroundPaint := @FTabControl.StyleTabButton;
|
|
|
|
if FTabControl.Style.HasBorderButtonPaint then
|
|
OnBorderBackgroundPaint := @FTabControl.StyleTabButtonBorder;
|
|
|
|
OwnerBackgroundDraw := true;
|
|
|
|
if FTabControl.Style.HasCloseButtonPaint then
|
|
begin
|
|
FCloseButton.OnNormalBackgroundPaint := @FTabControl.StyleTabCloseButton;
|
|
FCloseButton.OnDisabledBackgroundPaint := @FTabControl.StyleTabCloseButton;
|
|
FCloseButton.OnDownBackgroundPaint := @FTabControl.StyleTabCloseButton;
|
|
FCloseButton.OnHotBackgroundPaint := @FTabControl.StyleTabCloseButton;
|
|
|
|
FCloseButton.OwnerBackgroundDraw := true;
|
|
end;
|
|
end else begin
|
|
OwnerBackgroundDraw := false;
|
|
end;
|
|
end;
|
|
|
|
if Assigned(PopupMenu) then
|
|
AButton.PopupMenu := PopupMenu;
|
|
|
|
{if (Index >= 1) AND (FPageList.Count>=1) then
|
|
UnFocusButton(Index-1);
|
|
|
|
FocusButton(Index);
|
|
|
|
OrderButtons;}
|
|
|
|
Logger.ExitMethod(Self, 'InsertButton('+IntToStr(Index)+')');
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.MoveTo(Num: Integer);
|
|
|
|
function GetLast : Integer;
|
|
var
|
|
Btn : TGradButton;
|
|
i,l : Integer;
|
|
begin
|
|
Result := 1;
|
|
if FPageList.Count = 0 then Exit;
|
|
|
|
l := 1;
|
|
|
|
for i := 0 to FPageList.Count-2 do
|
|
begin
|
|
Btn := TGradTabPage(FPageList.Items[i]).TabButton;
|
|
|
|
L := L + 1;
|
|
|
|
if TabPosition in [tpTop, tpBottom] then begin
|
|
L := L + Btn.Width;
|
|
//if Result > Width then Result := Result - Width;
|
|
end else begin
|
|
L := L + Btn.Height;
|
|
//if Result > Height then Result := Result - Height;
|
|
end;
|
|
end;
|
|
|
|
Result := l;
|
|
|
|
//Result :=
|
|
end;
|
|
|
|
var
|
|
i : Integer;
|
|
begin
|
|
{$IFDEF DEBUGTAB}DebugLn('MoveTo Max: %d, Current: %d',[GetLast+1,FMovedTo]);{$ENDIF}
|
|
|
|
if FMovedTo > 1 then FMovedTo := 1;
|
|
if FMovedTo < -GetLast then FMovedTo := -GetLast+2;
|
|
|
|
//OrderButtons;
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.MoveToNorm;
|
|
begin
|
|
FMovedTo:=1;
|
|
|
|
OrderButtons;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar OrderButtons
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPagesBar.OrderButtons;
|
|
var
|
|
LastLeft, LastTop, i, BarWidth, BarHeight: Integer;
|
|
NewDirection: TRotateDirection;
|
|
NewBorderSides: TBorderSides;
|
|
NewGradientType: TGradientType;
|
|
B : TGradButton;
|
|
begin
|
|
if csDestroying in FTabControl.ComponentState then Exit;
|
|
if FPageList.Count=0 then Exit;
|
|
|
|
if (FTabControl.IsUpdating) then
|
|
begin
|
|
FNeedOrderButtons := true;
|
|
Exit;
|
|
end;
|
|
|
|
FNeedOrderButtons := false;
|
|
|
|
Logger.EnterMethod(Self, 'OrderButtons');
|
|
|
|
FMovedTo:=0;
|
|
|
|
for i := FShowFromButton-1 downto 0 do
|
|
begin
|
|
if i >= FPageList.Count then Continue;
|
|
B := TGradTabPage(FPageList.Items[i]).TabButton;
|
|
if FTabPosition in [tpRight, tpLeft] then
|
|
Dec(FMovedTo,B.Height+1);
|
|
|
|
if FTabPosition in [tpTop, tpBottom] then
|
|
Dec(FMovedTo,B.Width+1);
|
|
end;
|
|
|
|
Inc(FMovedTo);
|
|
|
|
LastLeft:= FMovedTo;
|
|
LastTop := FMovedTo;
|
|
|
|
{ if FTabPosition in [tpTop, tpBottom] then begin
|
|
BarWidth:= Width;
|
|
BarHeight:= 0;
|
|
end else begin }
|
|
BarWidth := Width;
|
|
BarHeight:= Height;
|
|
//end;
|
|
|
|
case FTabPosition of
|
|
tpTop:
|
|
begin
|
|
NewBorderSides := [bsTopLine, bsRightLine, bsLeftLine];
|
|
NewGradientType := gtHorizontal;
|
|
NewDirection := rdNormal;
|
|
end;
|
|
tpBottom:
|
|
begin
|
|
NewBorderSides := [bsBottomLine, bsRightLine, bsLeftLine];
|
|
NewGradientType := gtHorizontal;
|
|
NewDirection := rdNormal;
|
|
end;
|
|
tpLeft:
|
|
begin
|
|
NewBorderSides := [bsTopLine, bsBottomLine, bsLeftLine];
|
|
if FTabControl.LongTabs then begin
|
|
NewGradientType := gtHorizontal;
|
|
NewDirection := rdNormal;
|
|
end else begin
|
|
NewGradientType := gtVertical;
|
|
NewDirection := rdLeft;
|
|
end;
|
|
end;
|
|
tpRight:
|
|
begin
|
|
NewBorderSides := [bsTopLine, bsBottomLine, bsRightLine];
|
|
if FTabControl.LongTabs then begin
|
|
NewGradientType := gtHorizontal;
|
|
NewDirection := rdNormal;
|
|
end else begin
|
|
NewGradientType := gtVertical;
|
|
NewDirection := rdRight;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
FActiveIndex:=FTabControl.PageIndex;
|
|
|
|
Logger.EnterMethod(Self, 'GROUP: foreach FPageList[i]');
|
|
for i := 0 to FPageList.Count - 1 do
|
|
begin
|
|
B := TGradTabPage(FPageList.Items[i]).TabButton;
|
|
|
|
Logger.EnterMethod(Self, 'GROUP: TabButton of Page');
|
|
Logger.Send('Visible', B.Visible);
|
|
|
|
if B.Visible then
|
|
begin
|
|
B.RotateDirection := NewDirection;
|
|
B.BorderSides := NewBorderSides;
|
|
B.GradientType := NewGradientType;
|
|
|
|
Logger.Send('Before', 0);
|
|
Logger.Send('i', i);
|
|
Logger.Send('Width', B.Width);
|
|
Logger.Send('Height', B.Height);
|
|
Logger.Send('Left', B.Left);
|
|
Logger.Send('Top', B.Top);
|
|
Logger.Send('BarWidth', BarWidth);
|
|
Logger.Send('BarHeight', BarHeight);
|
|
|
|
case FTabPosition of
|
|
tpTop:
|
|
begin
|
|
//if B.Width < B.GetAutoWidth then
|
|
B.Width := B.GetAutoWidth;
|
|
|
|
B.Left := LastLeft;
|
|
LastLeft := LastLeft + B.Width + 1;
|
|
|
|
if FActiveIndex = i then begin
|
|
B.Top := 0;
|
|
B.Height:= BarHeight;
|
|
end else begin
|
|
B.Top := 3;
|
|
B.Height:= BarHeight-3;
|
|
end;
|
|
end;
|
|
tpBottom:
|
|
begin
|
|
//if B.Width < B.GetAutoWidth then
|
|
B.Width := B.GetAutoWidth;
|
|
|
|
B.Left := LastLeft;
|
|
LastLeft := LastLeft + B.Width + 1;
|
|
|
|
B.Top := 0;
|
|
|
|
if FActiveIndex = i then
|
|
B.Height := BarHeight
|
|
else
|
|
B.Height := BarHeight-3;
|
|
end;
|
|
tpLeft:
|
|
begin
|
|
if FTabControl.LongTabs then begin
|
|
if (B.GetAutoWidth > FTabControl.LongWidth) then
|
|
begin
|
|
FTabControl.LongWidth:=B.GetAutoWidth;
|
|
Exit;
|
|
end;
|
|
|
|
end;
|
|
|
|
B.Height:= B.GetAutoHeight;
|
|
|
|
B.Top := LastTop;
|
|
LastTop := LastTop + B.Height + 1;
|
|
|
|
if FActiveIndex = i then begin
|
|
B.Left := 0;
|
|
B.Width:= FTabControl.GetTabBarSize(tpLeft);
|
|
end else begin
|
|
B.Left := 3;
|
|
B.Width:= FTabControl.GetTabBarSize(tpLeft)-3;
|
|
end;
|
|
end;
|
|
tpRight:
|
|
begin
|
|
if FTabControl.LongTabs then begin
|
|
if (B.GetAutoWidth > FTabControl.LongWidth) then
|
|
begin
|
|
FTabControl.LongWidth:=B.GetAutoWidth;
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
B.Height:= B.GetAutoHeight;
|
|
|
|
B.Top := LastTop;
|
|
LastTop := LastTop + B.Height + 1;
|
|
|
|
B.Left := 0;
|
|
|
|
if FActiveIndex = i then
|
|
B.Width := FTabControl.GetTabBarSize(tpRight)
|
|
else begin
|
|
B.Width := FTabControl.GetTabBarSize(tpRight)-3;
|
|
end;
|
|
|
|
Logger.Send('Width', B.Width);
|
|
Logger.Send('TabBarSize(tpRight)', FTabControl.GetTabBarSize(tpRight));
|
|
Logger.Send('FActive', FActiveIndex);
|
|
end;
|
|
end;
|
|
|
|
Logger.Send('After', 0);
|
|
Logger.Send('i', i);
|
|
Logger.Send('Width', B.Width);
|
|
Logger.Send('Height', B.Height);
|
|
Logger.Send('Left', B.Left);
|
|
Logger.Send('Top', B.Top);
|
|
Logger.Send('BarWidth', BarWidth);
|
|
Logger.Send('BarHeight', BarHeight);
|
|
end;
|
|
|
|
if B.Parent <> Self then
|
|
B.Parent := Self;
|
|
|
|
Logger.ExitMethod(Self, 'GROUP: TabButton of Page');
|
|
end;
|
|
|
|
Logger.ExitMethod(Self, 'GROUP: foreach FPageList[i]');
|
|
|
|
Logger.Send('BarWidth', BarWidth);
|
|
Logger.Send('LastLeft', LastLeft);
|
|
Logger.Send('FMovedTo', FMovedTo);
|
|
Logger.Send('BarHeight', BarHeight);
|
|
Logger.Send('LastTop', LastTop);
|
|
|
|
Logger.Send('BarWidth < (LastLeft-FMovedTo)', BarWidth < (LastLeft-FMovedTo));
|
|
Logger.Send('BarHeight < (LastTop-FMovedTo)', BarHeight < (LastTop-FMovedTo));
|
|
|
|
Logger.Send('TabControl.AutoShowScrollButtons', FTabControl.AutoShowScrollButtons);
|
|
|
|
if not FTabControl.AutoShowScrollButtons then
|
|
begin
|
|
Logger.ExitMethod(Self, 'OrderButtons');
|
|
Exit;
|
|
end;
|
|
|
|
if ((BarWidth < (LastLeft-FMovedTo))
|
|
OR (BarHeight < (LastTop-FMovedTo))
|
|
OR (FMovedTo <> 1))
|
|
AND ((BarHeight<>0)
|
|
AND (BarWidth<>0)) then begin
|
|
FTabControl.FLeftButton.Visible:=true;
|
|
FTabControl.FRightButton.Visible:=true;
|
|
end else begin
|
|
FTabControl.FLeftButton.Visible:=false;
|
|
FTabControl.FRightButton.Visible:=false;
|
|
end;
|
|
|
|
Logger.Send('FR', FTabControl.FRightButton.Visible);
|
|
Logger.Send('FL', FTabControl.FLeftButton.Visible);
|
|
|
|
Logger.ExitMethod(Self, 'OrderButtons');
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar UnFocusButton(Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPagesBar.UnFocusButton(Index: Integer);
|
|
begin
|
|
if (Index < 0) or (Index >= FPageList.Count) then Exit;
|
|
|
|
Logger.EnterMethod(Self, 'UnFocusButton('+IntToStr(Index)+')');
|
|
|
|
with TGradTabPage(FPageList.Items[Index]).TabButton do
|
|
begin
|
|
case FTabPosition of
|
|
tpTop : begin
|
|
Top:=3;
|
|
Height:=Self.Height-3;
|
|
end;
|
|
tpBottom: begin
|
|
Top:=0;
|
|
Height:=Self.Height-3;
|
|
end;
|
|
tpRight: begin
|
|
Left := 0;
|
|
Width:= Self.Width-3;
|
|
end;
|
|
tpLeft: begin
|
|
Left := 3;
|
|
Width:=Self.Width-3;
|
|
end;
|
|
end;
|
|
|
|
if TGradTabPage(FPageList.Items[Index]).OwnerTabColor then
|
|
Color := TGradTabPage(FPageList.Items[Index]).NormalTabColor
|
|
else
|
|
Color := NormalTabColor;
|
|
|
|
UpdatePositions;
|
|
end;
|
|
|
|
Logger.ExitMethod(Self, 'UnFocusButton('+IntToStr(Index)+')');
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar FocusButton(Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPagesBar.FocusButton(Index: Integer);
|
|
var
|
|
CurTabs : TTabs;
|
|
DoNext : Boolean;
|
|
c : Integer;
|
|
begin
|
|
if csDestroying in FTabControl.ComponentState then Exit;
|
|
if (Index < 0) or (Index >= FPageList.Count) then Exit;
|
|
|
|
Logger.EnterMethod(Self, 'FocusButton('+IntToStr(Index)+')');
|
|
|
|
with TGradTabPage(FPageList.Items[Index]).TabButton do
|
|
begin
|
|
case FTabPosition of
|
|
tpTop, tpBottom : begin
|
|
Top:=0;
|
|
Height:=Self.Height;
|
|
|
|
DoNext := ((Left+Width)>= Self.Width);
|
|
end;
|
|
tpRight, tpLeft: begin
|
|
Left := 0;
|
|
Width:= Self.Width;
|
|
|
|
if FTabControl.LongTabs then
|
|
Height := FTabControl.TabHeight;
|
|
|
|
DoNext := ((Top+Height)>= Self.Height);
|
|
end;
|
|
end;
|
|
|
|
if TGradTabPage(FPageList.Items[Index]).OwnerTabColor then
|
|
Color := TGradTabPage(FPageList.Items[Index]).ActiveTabColor
|
|
else
|
|
Color := ActiveTabColor;
|
|
|
|
UpdateButton;
|
|
Invalidate;
|
|
end;
|
|
|
|
if not (FTabControl.FRightButton.Visible AND FTabControl.FLeftButton.Visible) then Exit;
|
|
C := 0;
|
|
|
|
ScrollToTab(Index);
|
|
|
|
Logger.ExitMethod(Self, 'FocusButton('+IntToStr(Index)+')');
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar SetTabPosition(Value: TTabPosition)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPagesBar.SetTabPosition(Value: TTabPosition);
|
|
|
|
function DbgsTabPosition(V : TTabPosition) : String;
|
|
begin
|
|
case V of
|
|
tpTop : Result := 'tpTop';
|
|
tpBottom: Result := 'tpBottom';
|
|
tpRight: Result := 'tpRight';
|
|
tpLeft: Result := 'tpLeft';
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
if FTabPosition = Value then Exit;
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('Change TabPosition from %s to %s',[DbgsTabPosition(FTabPosition),DbgsTabPosition(Value)]);
|
|
{$ENDIF}
|
|
|
|
FTabPosition:=Value;
|
|
|
|
OrderButtons;
|
|
end;
|
|
|
|
function TGradTabPagesBar.IsVisible(Index: Integer): Boolean;
|
|
var
|
|
TheButton : TGradTabPageButton;
|
|
begin
|
|
if (Index < 0) or (Index >= FPageList.Count) then Exit;
|
|
|
|
TheButton := TGradTabPage(FPageList.Items[Index]).TabButton;
|
|
|
|
if TabPosition in [tpTop, tpBottom] then
|
|
Result := TheButton.Visible AND (TheButton.Left >= 0) AND (TheButton.Left+TheButton.Width <= Width+5)
|
|
else
|
|
Result := TheButton.Visible AND (TheButton.Top >= 0) AND (TheButton.Top+TheButton.Height <= Height+5);
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.ChangeLeftTop(LastTabPosition: TTabPosition);
|
|
begin
|
|
|
|
end;
|
|
|
|
function TGradTabPagesBar.GetViewedTabs: TTabs;
|
|
var
|
|
i,l : Integer;
|
|
begin
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('GetViewedTabs');
|
|
DebugLn('Width=%d Height=%d',[Width,Height]);
|
|
{$ENDIF}
|
|
for i := 0 to FPageList.Count-1 do
|
|
begin
|
|
with TGradTabPage(FPageList.Items[i]).TabButton do
|
|
begin
|
|
if ((TabPosition in [tpTop, tpBottom]) AND (Left >= 0) {AND (Left <=(Self.Width-10))} AND (Left+Width < Self.Width)) OR
|
|
((TabPosition in [tpLeft, tpRight]) AND (Top >= 0) {AND (Top <=(Self.Height-10))} AND (Top+Height < Self.Height)) then
|
|
begin
|
|
l := IncAr(Result);
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('L=%d T=%d W=%d H=%d Caption=%s',[Left, Top, Width, Height, Caption]);
|
|
DebugLn('%d. Value: %d',[l,i]);
|
|
{$ENDIF}
|
|
Result[l] := i;
|
|
end;
|
|
end;
|
|
end;
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('GetViewedTabs End');
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function TGradTabPagesBar.GetViewableTabs(FromIndex: Integer): TTabs;
|
|
var
|
|
i,l, Last : Integer;
|
|
begin
|
|
Last := 1;
|
|
for i := FromIndex to FPageList.Count-1 do
|
|
begin
|
|
with TGradTabPage(FPageList.Items[i]).TabButton do
|
|
begin
|
|
case TabPosition of
|
|
tpTop,tpBottom : begin
|
|
if Last + Width < Self.Width then
|
|
begin
|
|
l := IncAr(Result);
|
|
Result[l] := i;
|
|
Inc(Last, Width+1);
|
|
end;
|
|
end;
|
|
tpLeft,tpRight : begin
|
|
if Last + Height < Self.Height then
|
|
begin
|
|
l := IncAr(Result);
|
|
Result[l] := i;
|
|
Inc(Last, Height+1);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
end;
|
|
|
|
function TGradTabPagesBar.GetTabsOfSide(FromIndex: Integer; FromLeftSide: Boolean
|
|
): TTabs;
|
|
var
|
|
i,l,fstart,fend : Integer;
|
|
begin
|
|
if FromLeftSide then begin
|
|
fstart := 0;
|
|
fend:= FromIndex-1;
|
|
end else begin
|
|
fstart:= FromIndex+1;
|
|
fend:= FPageList.Count-1;
|
|
end;
|
|
|
|
for i := fstart to fend do
|
|
begin
|
|
l := IncAr(Result);
|
|
Result[l] := i;
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.ScrollToTab(PIndex: Integer);
|
|
var
|
|
CurTabs, TabsLeft, TabsRight : TTabs;
|
|
C : Integer;
|
|
DoNext : Boolean;
|
|
IsInLeft, IsInRight : Boolean;
|
|
begin
|
|
C := 0;
|
|
|
|
if (FPageList.Count=0) OR (PIndex>=FPageList.Count) then Exit;
|
|
if IsVisible(PIndex) then Exit;
|
|
|
|
Logger.EnterMethod(Self, 'ScrollToTab('+IntToStr(PIndex)+')');
|
|
|
|
CurTabs := GetViewedTabs;
|
|
TabsLeft:= GetTabsOfSide(CurTabs[0],true);
|
|
TabsRight:= GetTabsOfSide(CurTabs[High(CurTabs)],false);
|
|
|
|
IsInLeft:= ValueInArray(PIndex,TabsLeft);
|
|
IsInRight:= ValueInArray(PIndex,TabsRight);
|
|
|
|
if IsInLeft then begin
|
|
FShowFromButton := TabsLeft[0];
|
|
OrderButtons;
|
|
if IsVisible(PIndex) then
|
|
begin
|
|
Logger.Send('Tab is Visible', 0);
|
|
Logger.ExitMethod(Self, 'ScrollToTab('+IntToStr(PIndex)+')');
|
|
Exit;
|
|
end;
|
|
end;
|
|
|
|
repeat
|
|
Logger.Watch('RepeatCount', C);
|
|
|
|
with TGradTabPage(FPageList.Items[PIndex]).TabButton do
|
|
case FTabPosition of
|
|
tpTop, tpBottom : DoNext := ((Left+Width)>= Self.Width);
|
|
tpRight, tpLeft: DoNext := ((Top+Height)>= Self.Height);
|
|
end;
|
|
|
|
if DoNext then MoveToNext else MoveToPrior;
|
|
|
|
Inc(C);
|
|
|
|
Logger.Watch('IsVisible', IsVisible(PIndex));
|
|
until(IsVisible(PIndex));
|
|
|
|
Logger.ExitMethod(Self, 'ScrollToTab('+IntToStr(PIndex)+')');
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.UpdateAllButtons;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
for i:= 0 to FPageList.Count-1 do
|
|
begin
|
|
TGradTabPage(FPageList[i]).TabButton.UpdateButton;
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabPagesBar.NewStyle;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
for i:= 0 to FPageList.Count-1 do
|
|
begin
|
|
with TGradTabPage(FPageList[i]).TabButton do
|
|
begin
|
|
FTabControl.Style.PrepareButton(TGradTabPage(FPageList[i]).TabButton);
|
|
if FTabControl.Style.HasTabButtonPaint then
|
|
begin
|
|
OnNormalBackgroundPaint:=@FTabControl.StyleTabButton;
|
|
OnDisabledBackgroundPaint:=@FTabControl.StyleTabButton;
|
|
OnDownBackgroundPaint:=@FTabControl.StyleTabButton;
|
|
OnHotBackgroundPaint:=@FTabControl.StyleTabButton;
|
|
|
|
if FTabControl.Style.HasBorderButtonPaint then
|
|
OnBorderBackgroundPaint := @FTabControl.StyleTabButtonBorder;
|
|
|
|
OwnerBackgroundDraw:=true;
|
|
|
|
if FTabControl.Style.HasCloseButtonPaint then
|
|
begin
|
|
FCloseButton.OnNormalBackgroundPaint := @FTabControl.StyleTabCloseButton;
|
|
FCloseButton.OnDisabledBackgroundPaint := @FTabControl.StyleTabCloseButton;
|
|
FCloseButton.OnDownBackgroundPaint := @FTabControl.StyleTabCloseButton;
|
|
FCloseButton.OnHotBackgroundPaint := @FTabControl.StyleTabCloseButton;
|
|
|
|
FCloseButton.OwnerBackgroundDraw := true;
|
|
FCloseButton.UpdateButton;
|
|
end;
|
|
end else begin
|
|
OwnerBackgroundDraw:=false;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar Create(AOwner: TComponent)
|
|
------------------------------------------------------------------------------}
|
|
constructor TGradTabBar.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
ControlStyle := ControlStyle+[csNoDesignSelectable];
|
|
SetSubComponent(true);
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar Destroy
|
|
------------------------------------------------------------------------------}
|
|
destructor TGradTabBar.Destroy;
|
|
begin
|
|
inherited;
|
|
end;
|
|
|
|
{-------------------------------------------------------------------------------
|
|
TGradTabPagesBar Paint
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabBar.Paint;
|
|
begin
|
|
{Canvas.Brush.Color:=clFuchsia;
|
|
Canvas.FillRect(0,0,Width,Height);
|
|
}
|
|
{$IFDEF DEBUGTAB}
|
|
//WriteLn(Left, ' ' ,Top, ' ' ,Width, ' ' ,Height);
|
|
{$ENDIF}
|
|
|
|
inherited;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages Constructor
|
|
------------------------------------------------------------------------------}
|
|
constructor TGradTabPages.Create(var thePageList: TListWithEvent;
|
|
theGradTabControl: TGradTabControl);
|
|
begin
|
|
inherited Create;
|
|
fPageList := thePageList;
|
|
fPageList.OnChange:=@PageListChange;
|
|
fGradTabControl:= theGradTabControl;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
procedure TGradTabPages.PageListChange(Ptr: Pointer; AnAction: TListNotification);
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPages.PageListChange(Ptr: Pointer; AnAction: TListNotification);
|
|
var
|
|
APage: TGradTabPage;
|
|
begin
|
|
if (AnAction=lnAdded) then begin
|
|
APage:=TObject(Ptr) as TGradTabPage;
|
|
if not (pfInserting in APage.FFlags) then
|
|
APage.Parent:=fGradTabControl;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages Get
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabPages.Get(Index: Integer): String;
|
|
begin
|
|
//Logger.Send('TGradTabPages.Get', Index);
|
|
|
|
if (Index<0) or (Index>=fPageList.Count) then
|
|
RaiseGDBException('TGradTabPages.Get Index out of bounds');
|
|
|
|
Result := TGradTabPage(fPageList[Index]).Caption;
|
|
//Logger.Send('TGradTabPages.Get', Result);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages GetCount
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabPages.GetCount: Integer;
|
|
begin
|
|
Result := fPageList.Count;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages GetObject
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabPages.GetObject(Index: Integer): TObject;
|
|
begin
|
|
if (Index<0) or (Index>=fPageList.Count) then
|
|
RaiseGDBException('TGradTabPages.GetObject Index out of bounds');
|
|
Result := TGradTabPage(fPageList[Index]);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages Put
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPages.Put(Index: Integer; const S: String);
|
|
begin
|
|
if (Index<0) or (Index>=fPageList.Count) then
|
|
RaiseGDBException('TGradTabPages.Put Index out of bounds');
|
|
|
|
TGradTabPage(fPageList[Index]).Caption := S;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages Clear
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPages.Clear;
|
|
begin
|
|
{$IFDEF DEBUGTAB}DebugLn('TGradTabPages.Clear Begin');{$ENDIF}
|
|
while fPageList.Count>0 do
|
|
Delete(fPageList.Count-1);
|
|
{$IFDEF DEBUGTAB}DebugLn('TGradTabPages.Clear End');{$ENDIF}
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages Delete(Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPages.Delete(Index: Integer);
|
|
var
|
|
APage: TGradTabPage;
|
|
begin
|
|
// Make sure Index is in the range of valid pages to delete
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn(['TGradTabPages.Delete B ',FGradTabControl.Name,' Index=',Index,' fPageList.Count=',fPageList.Count,' fNoteBook.PageIndex=',FGradTabControl.PageIndex]);
|
|
{$ENDIF}
|
|
if (Index >= 0) and
|
|
(Index < fPageList.Count) then
|
|
begin
|
|
APage:=TGradTabPage(fPageList[Index]);
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('B Parent = nil');
|
|
{$ENDIF}
|
|
// delete handle
|
|
APage.Parent:=nil;
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('B APage.Free');
|
|
{$ENDIF}
|
|
|
|
// free the page
|
|
APage.Free;
|
|
end;
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn(['TGradTabPages.Delete END ',FGradTabControl.Name,' Index=',Index,' fPageList.Count=',fPageList.Count,' fNoteBook.PageIndex=',FGradTabControl.PageIndex]);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages Insert(Inder: Integer; const S: String)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPages.Insert(Index: Integer; const S: String);
|
|
var
|
|
NewPage: TGradTabPage;
|
|
NewOwner: TComponent;
|
|
begin
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn(['TGradTabPages.Insert A ',FGradTabControl.Name,' Index=',Index,' S="',S,'"']);
|
|
{$ENDIF}
|
|
NewOwner:=FGradTabControl.Owner;
|
|
if NewOwner=nil then
|
|
NewOwner:=FGradTabControl;
|
|
|
|
NewPage := TGradTabPage.Create(NewOwner);
|
|
|
|
with NewPage do
|
|
begin
|
|
Caption := S;
|
|
end;
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn(['TGradTabPages.Insert B ',FGradTabControl.Name,' Index=',Index,' S="',S,'"']);
|
|
{$ENDIF}
|
|
{TODO}
|
|
FGradTabControl.InsertPage(NewPage,Index);
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn(['TGradTabPages.Insert END ',FGradTabControl.Name,' Index=',Index,' S="',S,'"']);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabPages Move
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabPages.Move(CurIndex, NewIndex: Integer);
|
|
var
|
|
APage: TGradTabPage;
|
|
NewControlIndex, NewPageIndex: integer;
|
|
begin
|
|
if CurIndex=NewIndex then exit;
|
|
NewPageIndex:=NewIndex;
|
|
|
|
APage:=TGradTabPage(fPageList[CurIndex]);
|
|
|
|
// calculate new control index (i.e. ZOrderPosition)
|
|
if NewIndex>=fPageList.Count-1 then
|
|
NewControlIndex:=FGradTabControl.ControlCount-1
|
|
else
|
|
NewControlIndex:=FGradTabControl.GetControlIndex(TGradTabPage(fPageList[NewIndex]));
|
|
|
|
// calculate new PageIndex
|
|
{TODO}
|
|
if FGradTabControl.PageIndex=CurIndex then
|
|
NewPageIndex:=NewIndex
|
|
else if FGradTabControl.PageIndex>CurIndex then begin
|
|
if FGradTabControl.PageIndex<=NewIndex then
|
|
NewPageIndex:=FGradTabControl.PageIndex-1;
|
|
end else begin
|
|
if FGradTabControl.PageIndex>=NewIndex then
|
|
NewPageIndex:=FGradTabControl.PageIndex+1;
|
|
end;
|
|
|
|
// move Page in fPageList
|
|
fPageList.Move(CurIndex, NewIndex);
|
|
|
|
// move in wincontrol list
|
|
FGradTabControl.SetControlIndex(APage,NewControlIndex);
|
|
|
|
// update PageIndex
|
|
FGradTabControl.PageIndex:=NewPageIndex;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl Create(AOwner: TComponent)
|
|
------------------------------------------------------------------------------}
|
|
constructor TGradTabControl.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
|
|
FImageChangeLink := TChangeLink.Create;
|
|
FImageChangeLink.OnChange:=@ImageListChange;
|
|
|
|
FTabPosition:=tpTop;
|
|
FAutoShowScrollButton:=true;
|
|
fCompStyle := csNoteBook;
|
|
|
|
ControlStyle := [{csAcceptsControls, }csDesignInteractive];
|
|
TabStop:=true;
|
|
|
|
FPageList := TListWithEvent.Create;
|
|
FTabStrings := TGradTabPages.Create(TListWithEvent(FPageList), Self);
|
|
FPageIndex:=-1;
|
|
|
|
FTabHeight:=20;
|
|
|
|
FPagesPopup := TPopupMenu.Create(Self);
|
|
FPagesPopup.OnPopup:=@PopupTabs;
|
|
|
|
FBar := TGradTabBar.Create(Self);
|
|
FBar.Height:=FTabHeight;
|
|
FBar.Top:=0;
|
|
FBar.Left:=0;
|
|
FBar.Width:=Width;
|
|
FBar.Parent := Self;
|
|
//FBar.Align:=alTop;
|
|
|
|
FMoveIncrement:=1;
|
|
|
|
FLeftButton := TGradButton.Create(Self);
|
|
FLeftButton.Parent := FBar;
|
|
FLeftButton.Align:= alLeft;
|
|
FLeftButton.Caption:='<';
|
|
FLeftButton.AutoWidth:=true;
|
|
FLeftButton.Visible := false;
|
|
FLeftButton.SetSubComponent(true);
|
|
|
|
FRightButton := TGradButton.Create(Self);
|
|
FRightButton.Parent := FBar;
|
|
FRightButton.Align:= alRight;
|
|
FRightButton.Caption:='>';
|
|
FRightButton.AutoWidth:=true;
|
|
FRightButton.Visible:= false;
|
|
FRightButton.SetSubComponent(true);
|
|
|
|
FPagesBar := TGradTabPagesBar.Create(Self,TListWithEvent(FPageList), Self);
|
|
FPagesBar.Parent:=FBar;
|
|
FPagesBar.Align:=alClient;
|
|
FPagesBar.Left:=0;
|
|
FPagesBar.Top:=0;
|
|
FPagesBar.Width:=FBar.Width;
|
|
FPagesBar.Height:=FBar.Height;
|
|
|
|
AssignEvents(FBar);
|
|
AssignEvents(FPagesBar);
|
|
//AssignEvents(FRightButton);
|
|
//AssignEvents(FLeftButton);
|
|
|
|
FLeftButton.OnClick:=@MoveLeftTopClick;
|
|
FRightButton.OnClick:=@MoveRightBottomClick;
|
|
|
|
with FRightButton, FLeftButton do
|
|
begin
|
|
OnMouseUp:=nil;
|
|
OnMouseDown:=nil;
|
|
PopupMenu:=FPagesPopup;
|
|
end;
|
|
|
|
FRightButton.PopupMenu:=FPagesPopup;
|
|
|
|
Height:=200;
|
|
Width:=200;
|
|
|
|
FStyle := TGradTabStandardStyle.Create;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl Destroy
|
|
------------------------------------------------------------------------------}
|
|
destructor TGradTabControl.Destroy;
|
|
begin
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabControl.Destroy Start');
|
|
DebugLn('B Tabs.Clear');
|
|
{$ENDIF}
|
|
Tabs.Clear;
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('A Tabs.Clear');
|
|
DebugLn('B FreeAndNil(FTabStrings)');
|
|
{$ENDIF}
|
|
FreeAndNil(FTabStrings);
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('A FreeAndNil(FTabStrings)');
|
|
DebugLn('B FreeAndNil(FPageList)');
|
|
{$ENDIF}
|
|
FreeAndNil(FPageList);
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('A FreeAndNil(FPageList)');
|
|
{$ENDIF}
|
|
//FLeftButton.Free;
|
|
//FRightButton.Free;
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabControl.Destroy End');
|
|
{$ENDIF}
|
|
|
|
FImageChangeLink.Destroy;
|
|
|
|
inherited;
|
|
end;
|
|
|
|
procedure TGradTabControl.BeginUpdate;
|
|
begin
|
|
Logger.EnterMethod(Self, 'BeginUpdate');
|
|
FIsUpdating := True;
|
|
end;
|
|
|
|
procedure TGradTabControl.EndUpdate;
|
|
begin
|
|
FIsUpdating:= False;
|
|
|
|
if FPagesBar.NeedOrderButtons then
|
|
begin
|
|
Logger.Send('OrderButtonsNeeded', 0);
|
|
FPagesBar.OrderButtons;
|
|
end;
|
|
Logger.ExitMethod(Self, 'EndUpdate');
|
|
end;
|
|
|
|
function TGradTabControl.GetTabRect(AIndex: Integer): TRect;
|
|
begin
|
|
if (AIndex >= FPageList.Count) or (AIndex < 0) then Exit;
|
|
with TGradTabPage(FPageList[AIndex]).TabButton do
|
|
begin
|
|
Result.Left:=Left;
|
|
Result.Top:=Top;
|
|
Result.Bottom:=Top+Height;
|
|
Result.Right:=Left+Width;
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabControl.AssignEvents(TheControl: TCustomControl);
|
|
begin
|
|
if TheControl = nil then Exit;
|
|
with TheControl do
|
|
begin
|
|
OnMouseWheel:=@SubMouseWheel;
|
|
OnMouseWheelUp:=@SubMouseWheelUp;
|
|
OnMouseWheelDown:=@SubMouseWheelDown;
|
|
OnClick:=@SubMouseClick;
|
|
OnDblClick:=@SubMouseDblClick;
|
|
OnMouseMove:=@SubMouseMove;
|
|
OnMouseDown:=@SubMouseDown;
|
|
OnMouseUp:=@SubMouseUp;
|
|
OnDragOver:=@SubDragOver;
|
|
OnDragDrop:=@SubDragDrop;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl AlignPage(APage : TGradTabPage; ARect : TRect)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.AlignPage(APage : TGradTabPage; ARect : TRect);
|
|
begin
|
|
if APage <> nil then
|
|
with APage do
|
|
begin
|
|
Left:=ARect.Left;
|
|
Top :=ARect.Top;
|
|
Width := ARect.Right;
|
|
Height:= ARect.Bottom;
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabControl.AlignPages;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
for i := 0 to FPageList.Count-1 do
|
|
AlignPage(TGradTabPage(FPageList.Items[i]),GetClientRect);
|
|
|
|
UpdateAllDesignerFlags;
|
|
end;
|
|
|
|
function TGradTabControl.GetActiveTabColor: TColor;
|
|
begin
|
|
Result := FPagesBar.ActiveTabColor;
|
|
end;
|
|
|
|
function TGradTabControl.GetNormalTabColor: TColor;
|
|
begin
|
|
Result := FPagesBar.NormalTabColor;
|
|
end;
|
|
|
|
function TGradTabControl.GetTabPopupMenu: TPopupMenu;
|
|
begin
|
|
Result := FPagesBar.PopupMenu;
|
|
end;
|
|
|
|
procedure TGradTabControl.ImageListChange(Sender: TObject);
|
|
begin
|
|
UpdateTabImages;
|
|
end;
|
|
|
|
procedure TGradTabControl.SetActiveTabColor(const AValue: TColor);
|
|
begin
|
|
FPagesBar.ActiveTabColor:= AValue;
|
|
end;
|
|
|
|
procedure TGradTabControl.SetCustomDraw(const AValue: Boolean);
|
|
begin
|
|
if FCustomDraw=AValue then exit;
|
|
FCustomDraw:=AValue;
|
|
|
|
Invalidate;
|
|
end;
|
|
|
|
procedure TGradTabControl.SetNormalTabColor(const AValue: TColor);
|
|
begin
|
|
FPagesBar.NormalTabColor:=AValue;
|
|
end;
|
|
|
|
procedure TGradTabControl.SetStyle(const AValue: TGradTabStyleBase);
|
|
begin
|
|
if FStyle = AValue then Exit;
|
|
if FStyle <> nil then
|
|
begin
|
|
FStyle.Free;
|
|
FStyle := nil;
|
|
end;
|
|
|
|
FStyle := AValue;
|
|
|
|
if FStyle = nil then
|
|
begin
|
|
FStyle := TGradTabStandardStyle.Create;
|
|
end;
|
|
|
|
// Update all Tab Paintings
|
|
InvPaint;
|
|
PagesBar.NewStyle;
|
|
|
|
if FStyle.HasLeftRightButtonPaint then
|
|
begin
|
|
FLeftButton.OnNormalBackgroundPaint := @FStyle.TabLeftRightButton;
|
|
FLeftButton.OnDownBackgroundPaint := @FStyle.TabLeftRightButton;
|
|
FLeftButton.OnHotBackgroundPaint := @FStyle.TabLeftRightButton;
|
|
FLeftButton.OnBorderBackgroundPaint := @FStyle.TabLeftRightBorderButton;
|
|
|
|
FLeftButton.OwnerBackgroundDraw := true;
|
|
|
|
FRightButton.OnNormalBackgroundPaint := @FStyle.TabLeftRightButton;
|
|
FRightButton.OnDownBackgroundPaint := @FStyle.TabLeftRightButton;
|
|
FRightButton.OnHotBackgroundPaint := @FStyle.TabLeftRightButton;
|
|
FRightButton.OnBorderBackgroundPaint := @FStyle.TabLeftRightBorderButton;
|
|
|
|
FRightButton.OwnerBackgroundDraw := true;
|
|
end;
|
|
PagesBar.UpdateAllButtons;
|
|
end;
|
|
|
|
procedure TGradTabControl.SetTabPopupMenu(const AValue: TPopupMenu);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
FPagesBar.PopupMenu := AValue;
|
|
|
|
for i := 0 to PageCount -1 do
|
|
Page[i].TabButton.PopupMenu := AValue;
|
|
end;
|
|
|
|
procedure TGradTabControl.UpdateTabImages;
|
|
var
|
|
i : Integer;
|
|
begin
|
|
if FImages = nil then Exit;
|
|
|
|
{$IFDEF DEBUGTAB}DebugLn('TGradTabControl.UpdateTabImages Images.Count: %d',[Images.Count]);{$ENDIF}
|
|
|
|
for i := 0 to PageCount-1 do
|
|
TGradTabPage(FPageList.Items[i]).UpdateImage;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl GetCurrentPage : TGradTabPage
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabControl.GetCurrentPage : TGradTabPage;
|
|
begin
|
|
Result := nil;
|
|
|
|
if FPageIndex <> -1 then
|
|
Result := TGradTabPage(FPageList.Items[FPageIndex]);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl GetPage(AIndex: Integer) : TGradTabPage
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabControl.GetPage(AIndex: Integer) : TGradTabPage;
|
|
begin
|
|
Result := nil;
|
|
|
|
if (AIndex >= 0) AND (AIndex < FPageList.Count) then
|
|
Result := TGradTabPage(FPageList.Items[AIndex]);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl GetCount : Integer
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabControl.GetCount : Integer;
|
|
begin
|
|
Result := FPageList.Count;
|
|
end;
|
|
|
|
function TGradTabControl.GetPagesBarDragOver: TDragOverEvent;
|
|
begin
|
|
Result := FPagesBar.OnDragOver;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl MoveTab(Sender: TObject; NewIndex: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.MoveTab(Sender: TObject; NewIndex: Integer);
|
|
begin
|
|
if (Sender <> nil) and (NewIndex < PageCount) then begin
|
|
TGradTabPages(FTabStrings).Move(TGradTabPage(Sender).PageIndex,NewIndex);
|
|
end
|
|
else ; //raise exception?
|
|
Change;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl FindVisiblePage(Index: Integer): Integer
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabControl.FindVisiblePage(Index: Integer): Integer;
|
|
begin
|
|
for Result := Index to FPageList.Count - 1 do
|
|
if TGradTabPage(FPageList[Result]).TabVisible then
|
|
exit;
|
|
// if arrived here no visible forward page was found, search backwards
|
|
for Result := Index - 1 downto 0 do
|
|
if TGradTabPage(FPageList[Result]).TabVisible then
|
|
exit;
|
|
Result := -1;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl PageButtonMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.PageButtonMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
AButton : TGradTabPageButton;
|
|
begin
|
|
AButton := TGradTabPageButton(Sender);
|
|
|
|
if Assigned(FOnTabButtonMouseDown) then
|
|
FOnTabButtonMouseDown(Self, Button, Shift, X,Y, FPageList.IndexOf(AButton.Owner));
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl PageButtonMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.PageButtonMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
AButton : TGradTabPageButton;
|
|
begin
|
|
AButton := TGradTabPageButton(Sender);
|
|
if Assigned(FOnTabButtonMouseUp) then
|
|
FOnTabButtonMouseUp(Self, Button, Shift, X,Y, FPageList.IndexOf(AButton.Owner));
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl.PageButtonMouseClick(Sender: TObject)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.PageButtonMouseClick(Sender: TObject);
|
|
var
|
|
AButton : TGradTabPageButton;
|
|
begin
|
|
BeginUpdate;
|
|
AButton := TGradTabPageButton(Sender);
|
|
PageIndex:=FPageList.IndexOf(AButton.Owner);
|
|
EndUpdate;
|
|
|
|
if Assigned(FOnTabButtonClick) then
|
|
FOnTabButtonClick(Self, FPageList.IndexOf(AButton.Owner));
|
|
end;
|
|
|
|
procedure TGradTabControl.PageCloseButtonMouseUp(Sender: TObject;
|
|
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
AButton : TGradTabPageButton;
|
|
begin
|
|
AButton := TGradTabPageButton(TControl(Sender).Parent);
|
|
|
|
if Assigned(FOnTabCloseButtonClick) then
|
|
FOnTabCloseButtonClick(Self, FPageList.IndexOf(AButton.Owner));
|
|
end;
|
|
|
|
procedure TGradTabControl.PopupMouseClick(Sender: TObject);
|
|
var
|
|
AButton : TGradTabPageButton;
|
|
begin
|
|
AButton := Page[(Sender as TMenuItem).Tag].TabButton;
|
|
PageButtonMouseClick(AButton);
|
|
end;
|
|
|
|
procedure TGradTabControl.PageButtonMouseMove(Sender: TObject;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
var
|
|
AButton : TGradTabPageButton;
|
|
begin
|
|
AButton := TGradTabPageButton(Sender);
|
|
|
|
if Assigned(FOnTabButtonMouseMove) then
|
|
FOnTabButtonMouseMove(Self, Shift, X,Y, FPageList.IndexOf(AButton.Owner));
|
|
end;
|
|
|
|
procedure TGradTabControl.SetAutoShowScrollButtons(const AValue: Boolean);
|
|
begin
|
|
if FAutoShowScrollButton=AValue then exit;
|
|
FAutoShowScrollButton:=AValue;
|
|
|
|
FPagesBar.OrderButtons;
|
|
end;
|
|
|
|
procedure TGradTabControl.SetImages(const AValue: TImageList);
|
|
begin
|
|
{$IFDEF DEBUGTAB}DebugLn('TGradTabControl.SetImages FImages: ', IsAssigned(FImages));{$ENDIF}
|
|
if FImages=AValue then exit;
|
|
if (AValue = nil) AND (FImages<>nil) then
|
|
FImages.UnRegisterChanges(FImageChangeLink);
|
|
|
|
FImages:=AValue;
|
|
|
|
if FImages <> nil then
|
|
FImages.RegisterChanges(FImageChangeLink);
|
|
|
|
UpdateTabImages;
|
|
end;
|
|
|
|
procedure TGradTabControl.SetLongWidth(const AValue: Integer);
|
|
begin
|
|
{$IFDEF DEBUGTAB} DebugLn('SetLongWidth Old=%d New=%d',[FLongWidth, AValue]); {$ENDIF}
|
|
if FLongWidth = AValue then Exit;
|
|
{$IFDEF DEBUGTAB} DebugLn('NewLongWidth set'); {$ENDIF}
|
|
FLongWidth:=AValue;
|
|
SetTabPosition(TabPosition);
|
|
end;
|
|
|
|
procedure TGradTabControl.SetShowLeftTopScrollButton(const AValue: Boolean);
|
|
begin
|
|
if FShowLeftTopScrollButton=AValue then exit;
|
|
FShowLeftTopScrollButton:=AValue;
|
|
|
|
FLeftButton.Visible:=AValue;
|
|
end;
|
|
|
|
procedure TGradTabControl.SetShowRightBottomScrollButton(const AValue: Boolean
|
|
);
|
|
begin
|
|
if FShowRightBottomScrollButton=AValue then exit;
|
|
FShowRightBottomScrollButton:=AValue;
|
|
|
|
FRightButton.Visible:=AValue;
|
|
end;
|
|
|
|
procedure TGradTabControl.SubMouseWheel(Sender: TObject; Shift: TShiftState;
|
|
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
|
begin
|
|
if Assigned(OnMouseWheel) then
|
|
OnMouseWheel(Sender, Shift, WheelDelta, MousePos, Handled);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubMouseWheelUp(Sender: TObject;
|
|
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
|
|
begin
|
|
if Assigned(OnMouseWheelUp) then
|
|
OnMouseWheelUp(Sender, Shift, MousePos, Handled);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubMouseWheelDown(Sender: TObject;
|
|
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
|
|
begin
|
|
if Assigned(OnMouseWheelDown) then
|
|
OnMouseWheelDown(Sender, Shift, MousePos, Handled);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubMouseDown(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
if Assigned(OnMouseDown) then
|
|
OnMouseDown(Sender, Button, Shift, X, Y);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubMouseUp(Sender: TObject; Button: TMouseButton;
|
|
Shift: TShiftState; X, Y: Integer);
|
|
begin
|
|
if Assigned(OnMouseUp) then
|
|
OnMouseUp(Sender, Button, Shift, X, Y);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubMouseClick(Sender: TObject);
|
|
begin
|
|
if Assigned(OnClick) then
|
|
OnClick(Sender);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubMouseDblClick(Sender: TObject);
|
|
begin
|
|
if Assigned(OnDblClick) then
|
|
OnDblClick(Sender);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubMouseMove(Sender: TObject; Shift: TShiftState; X,
|
|
Y: Integer);
|
|
begin
|
|
if Assigned(OnMouseMove) then
|
|
OnMouseMove(Sender, Shift, X, Y);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean);
|
|
begin
|
|
if Assigned(OnDragOver) then
|
|
OnDragOver(Sender, Source, X, Y, State, Accept);
|
|
end;
|
|
|
|
procedure TGradTabControl.SubDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
begin
|
|
if Assigned(OnDragDrop) then
|
|
OnDragDrop(Sender, Source, X, Y);
|
|
end;
|
|
|
|
procedure TGradTabControl.StyleTabButton(Sender: TGradButton;
|
|
TargetCanvas: TCanvas; R: TRect; BState: TButtonState);
|
|
begin
|
|
if FStyle.HasTabButtonPaint then
|
|
FStyle.TabButton(Self, FPageList.IndexOf(Sender.Owner), Sender,
|
|
TargetCanvas, R, BState);
|
|
end;
|
|
|
|
procedure TGradTabControl.StyleTabCloseButton(Sender: TGradButton;
|
|
TargetCanvas: TCanvas; R: TRect; BState: TButtonState);
|
|
begin
|
|
if FStyle.HasCloseButtonPaint then
|
|
FStyle.TabCloseButton(Self, FPageList.IndexOf(Sender.Owner), Sender,
|
|
TargetCanvas, R, BState);
|
|
end;
|
|
|
|
procedure TGradTabControl.StyleTabButtonBorder(Sender: TGradButton;
|
|
TargetCanvas: TCanvas; R: TRect; BState: TButtonState);
|
|
begin
|
|
if FStyle.HasBorderButtonPaint then
|
|
FStyle.TabButtonBorder(Self, FPageList.IndexOf(Sender.Owner), Sender,
|
|
TargetCanvas, R, BState);
|
|
end;
|
|
|
|
procedure TGradTabControl.PopupTabs(Sender: TObject);
|
|
var
|
|
tempMenu : TMenuItem;
|
|
i : Integer;
|
|
begin
|
|
with FPagesPopup.Items do begin
|
|
Clear;
|
|
|
|
for i := 0 to PageCount-1 do begin
|
|
tempMenu := TMenuItem.Create(FPagesPopup);
|
|
|
|
tempMenu.Caption:=Page[i].Caption;
|
|
tempMenu.OnClick:=@PopupMouseClick;
|
|
tempMenu.Tag:=i;
|
|
|
|
//DebugLn('I=%d OnClick-Assigned=%s',[i,BoolStr(Assigned(Page[i].TabButton.OnClick))]);
|
|
|
|
Add(tempMenu);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabControl.MoveLeftTopClick(Sender: TObject);
|
|
begin
|
|
PagesBar.MoveToPrior;
|
|
end;
|
|
|
|
procedure TGradTabControl.MoveRightBottomClick(Sender: TObject);
|
|
begin
|
|
PagesBar.MoveToNext;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl PageRemoved(Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.PageRemoved(Index: Integer);
|
|
var
|
|
NewPageIndex: Integer;
|
|
begin
|
|
if not (csLoading in ComponentState) then
|
|
begin
|
|
// if this page is showing, then show the next page before deleting it
|
|
if Index = FPageIndex then
|
|
begin
|
|
NewPageIndex := FindVisiblePage(Index);
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabControl.PageRemoved Index: %d NewPageIndex: %d',[Index, NewPageIndex]);
|
|
{$ENDIF}
|
|
if NewPageIndex >= 0 then
|
|
PageIndex := NewPageIndex
|
|
else
|
|
FPageIndex := NewPageIndex;
|
|
end;
|
|
|
|
FPagesBar.OrderButtons;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl SetCurrentPage(Value : TGradTabPage)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.SetCurrentPage(Value : TGradTabPage);
|
|
begin
|
|
if FPageList.IndexOf(Value) = -1 then Exit;
|
|
|
|
SetCurrentPageNum(FPageList.IndexOf(Value));
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl SetCurrentPageNum(Value: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.SetCurrentPageNum(Value: Integer);
|
|
var
|
|
Last : Integer;
|
|
begin
|
|
FPagesBar.OrderButtons;
|
|
|
|
if (Value<0) or (Value>=fPageList.Count) then Exit;
|
|
if FPageIndex=Value then Exit;
|
|
if not Page[Value].Enabled then Exit;
|
|
if not Page[Value].TabVisible then Exit;
|
|
|
|
Last := FPageIndex;
|
|
|
|
// Set PageIndex here, that Un/FocusButton called by Un/ShowPage can
|
|
// read the current PageIndex to draw the right Style :)
|
|
FPageIndex := Value;
|
|
|
|
if Last <> -1 then UnShowPage(Last);
|
|
|
|
ShowPage(Value);
|
|
|
|
UpdateAllDesignerFlags;
|
|
|
|
if ([csDesigning, csLoading, csDestroying] * ComponentState = [])
|
|
and Assigned(OnPageChanged) then
|
|
OnPageChanged(Self);
|
|
end;
|
|
|
|
procedure TGradTabControl.SetPagesBarDragOver(const AValue: TDragOverEvent);
|
|
begin
|
|
FPagesBar.OnDragOver:=AValue;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl ShowPage(Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.ShowPage(Index: Integer);
|
|
begin
|
|
Logger.EnterMethod(Self, 'ShowPage('+IntToStr(Index)+')');
|
|
|
|
// Focus the TabButton
|
|
FPagesBar.FocusButton(Index);
|
|
|
|
// Enable Page
|
|
with TGradTabPage(FPageList.Items[Index]) do
|
|
begin
|
|
Visible:=true;
|
|
BringToFront;
|
|
end;
|
|
|
|
UpdateDesignerFlags(Index);
|
|
|
|
AlignPage(TGradTabPage(FPageList.Items[Index]), GetClientRect);
|
|
Logger.ExitMethod(Self, 'ShowPage('+IntToStr(Index)+')');
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl UnShowPage(Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.UnShowPage(Index: Integer);
|
|
begin
|
|
// Disable Page
|
|
|
|
if (Index<0) or (Index>=fPageList.Count) then Exit;
|
|
|
|
Logger.EnterMethod(Self, 'UnShowPage('+IntToStr(Index)+')');
|
|
|
|
// Unfocus the TabButton
|
|
FPagesBar.UnFocusButton(Index);
|
|
|
|
UpdateDesignerFlags(Index);
|
|
|
|
with TGradTabPage(FPageList.Items[Index]) do
|
|
Visible:=false;
|
|
|
|
Logger.ExitMethod(Self, 'UnShowPage('+IntToStr(Index)+')');
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl function ChildClassAllowed(ChildClass: TClass): boolean;
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabControl.ChildClassAllowed(ChildClass: TClass): boolean;
|
|
begin
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabControl.ChildClassAllowed ',ChildClass.ClassName);
|
|
{$ENDIF}
|
|
|
|
Result := (ChildClass<>nil);
|
|
Result := ChildClass.InheritsFrom(TGradTabPage) AND Result;
|
|
if Result then Exit;
|
|
|
|
if GetCurrentPage=nil then begin
|
|
Result := ChildClass.InheritsFrom(TGradTabBar);
|
|
end else begin
|
|
if (ChildClass.InheritsFrom(TControl)) AND (NOT ChildClass.InheritsFrom(TGradTabPage)) then begin
|
|
TControl(ChildClass.ClassParent).Parent := GetCurrentPage;
|
|
Result := true;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl InsertPage(APage: TGradTabPage; Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.InsertPage(APage: TGradTabPage; Index: Integer);
|
|
var
|
|
NewZPosition: integer;
|
|
begin
|
|
if FPageList.IndexOf(APage)>=0 then exit;
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn(['TGradTabControl.InsertPage A ',dbgsName(Self),' Index=',Index,' Name=',
|
|
APage.Name,' Caption=',APage.Caption]);
|
|
{$ENDIF}
|
|
APage.DisableAlign;
|
|
try
|
|
if Index<FPageList.Count then
|
|
NewZPosition:=GetControlIndex(TGradTabPage(fPageList[Index]))
|
|
else
|
|
NewZPosition:=-1;
|
|
Include(APage.FFlags,pfInserting);
|
|
FPageList.Insert(Index,APage);
|
|
Exclude(APage.FFlags,pfInserting);
|
|
APage.Parent := Self;
|
|
|
|
if APage.Caption = '' then
|
|
APage.Caption:=APage.Name;
|
|
|
|
FPagesBar.InsertButton(APage.TabButton, Index);
|
|
|
|
if NewZPosition>=0 then
|
|
SetControlIndex(APage,NewZPosition);
|
|
if PageIndex = -1 then
|
|
FPageIndex := Index;
|
|
|
|
{$IFDEF DEBUGTAB}DebugLn('APage.Name empty: %s',[BoolToStr(APage.Name='',true)]);{$ENDIF}
|
|
|
|
if HandleAllocated and (not (csLoading in ComponentState)) then begin
|
|
AddRemovePageHandle(APage);
|
|
if PageIndex = Index then
|
|
ShowCurrentPage;
|
|
end;
|
|
finally
|
|
APage.EnableAlign;
|
|
|
|
AlignPage(APage, GetClientRect);
|
|
SetCurrentPageNum(Index);
|
|
end;
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn(['TGradTabControl.InsertPage END ',dbgsName(Self),' Index=',
|
|
Index,' Name=',APage.Name,' Caption=',APage.Caption]);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl RemovePage(Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.AddRemovePageHandle(APage: TGradTabPage);
|
|
begin
|
|
if (not (csDestroying in APage.ComponentState))
|
|
and (APage.TabVisible or (csDesigning in ComponentState)) then begin
|
|
{$IFDEF NOTEBOOK_DEBUG}
|
|
DebugLn(['TGradTabControl.AddRemovePageHandle ADD ',DbgSName(APage),' pfAdded=',pfAdded in APage.FFlags]);
|
|
{$ENDIF}
|
|
if (pfAdded in APage.FFlags) then exit;
|
|
Include(APage.FFlags,pfAdding);
|
|
APage.FFlags:=APage.FFlags+[pfAdded]-[pfAdding];
|
|
APage.AdjustSize;
|
|
end else begin
|
|
{$IFDEF NOTEBOOK_DEBUG}
|
|
DebugLn(['TGradTabControl.AddRemovePageHandle REMOVE ',DbgSName(APage),' pfAdded=',pfAdded in APage.FFlags]);
|
|
{$ENDIF}
|
|
if not (pfAdded in APage.FFlags) or (pfRemoving in APage.FFlags) then
|
|
exit;
|
|
APage.FFlags := APage.FFlags - [pfAdded] + [pfRemoving];
|
|
if APage.HandleAllocated then
|
|
APage.DestroyHandle;
|
|
Exclude(APage.FFlags, pfRemoving);
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl RemovePage(Index: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.RemovePage(Index: Integer);
|
|
var
|
|
APage: TGradTabPage;
|
|
begin
|
|
if (Index >= 0) and (Index < FPageList.Count) then
|
|
begin
|
|
APage:=TGradTabPage(fPageList[Index]);
|
|
APage.FTabVisible:=false; { TODO }
|
|
if HandleAllocated then
|
|
AddRemovePageHandle(APage); { TODO?}
|
|
|
|
PageRemoved(Index);
|
|
FPageList.Delete(Index);
|
|
|
|
APage.Parent:=nil;
|
|
|
|
if FPageIndex >= Index then
|
|
Dec(FPageIndex);
|
|
|
|
FPagesBar.OrderButtons;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl InvPaint
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.InvPaint;
|
|
begin
|
|
if csDesigning in ComponentState then
|
|
Invalidate
|
|
else
|
|
Paint;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl SetTabHeight(Value: Integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.SetTabHeight(Value: Integer);
|
|
begin
|
|
if FTabHeight = Value then Exit;
|
|
|
|
FTabHeight:=Value;
|
|
|
|
SetTabPosition(TabPosition);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl SetTabs(Value: TStrings)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.SetTabs(Value: TStrings);
|
|
begin
|
|
FTabStrings.Assign(Value);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl SetTabPosition(Value : TTabPosition)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.SetTabPosition(Value : TTabPosition);
|
|
var
|
|
tempSize : Integer;
|
|
begin
|
|
FTabPosition:=Value;
|
|
|
|
tempSize:=FTabHeight;
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabControl.SetTabPosition Before');
|
|
DebugLn('FBar Left %d Top %d Height %d Width %d',[ FBar.Left, Fbar.Top, FBar.Height, FBar.Width]);
|
|
DebugLn('FPagesBar Left %d Top %d Height %d Width %d',[ FPagesBar.Left, FPagesbar.Top, FPagesBar.Height, FPagesBar.Width]);
|
|
DebugLn('Control Left %d Top %d Height %d Width %d',[ Left, Top, Height, Width]);
|
|
{$ENDIF}
|
|
|
|
FPagesBar.TabPosition:=Value;
|
|
|
|
case Value of
|
|
tpTop: begin
|
|
FBar.Height:=FTabHeight;
|
|
FBar.Top:=0;
|
|
FBar.Left:=0;
|
|
FBar.Width:=Width;
|
|
//FBar.Align:=alTop;
|
|
end;
|
|
tpLeft:begin
|
|
FBar.Height:=Height;
|
|
FBar.Top:=0;
|
|
FBar.Left:=0;
|
|
FBar.Width:=GetTabBarSize(tpLeft);
|
|
//FBar.Align:=alLeft;
|
|
end;
|
|
tpBottom:begin
|
|
FBar.Height:=tempSize;
|
|
FBar.Top:=Height-tempSize;
|
|
FBar.Left:=0;
|
|
FBar.Width:=Width;
|
|
//FBar.Align := alBottom;
|
|
end;
|
|
tpRight:begin
|
|
FBar.Left:=Width-GetTabBarSize(tpRight);
|
|
FBar.Top:=0;
|
|
FBar.Height:=Height;
|
|
FBar.Width:=GetTabBarSize(tpRight);
|
|
//FBar.Align:=alRight;
|
|
end;
|
|
end;
|
|
|
|
//FPagesBar.Align:=alClient;
|
|
|
|
case Value of
|
|
tpTop: begin
|
|
FLeftButton.Align:=alLeft;
|
|
FLeftButton.RotateDirection:=rdNormal;
|
|
FLeftButton.AutoWidth:=true;
|
|
FLeftButton.AutoHeight:=false;
|
|
FRightButton.Align:=alRight;
|
|
FRightButton.RotateDirection:=rdNormal;
|
|
FRightButton.AutoWidth:=true;
|
|
FRightButton.AutoHeight:=false;
|
|
//FBar.Align:=alTop;
|
|
end;
|
|
tpLeft:begin
|
|
FLeftButton.Align:=alTop;
|
|
FLeftButton.RotateDirection:=rdRight;
|
|
FLeftButton.AutoWidth:=false;
|
|
FLeftButton.AutoHeight:=true;
|
|
FRightButton.Align:=alBottom;
|
|
FRightButton.RotateDirection:=rdRight;
|
|
FRightButton.AutoWidth:=false;
|
|
FRightButton.AutoHeight:=true;
|
|
//FBar.Align:=alLeft;
|
|
end;
|
|
tpBottom:begin
|
|
FLeftButton.Align:=alLeft;
|
|
FLeftButton.RotateDirection:=rdNormal;
|
|
FLeftButton.AutoWidth:=true;
|
|
FLeftButton.AutoHeight:=false;
|
|
FRightButton.Align:=alRight;
|
|
FRightButton.RotateDirection:=rdNormal;
|
|
FRightButton.AutoWidth:=true;
|
|
FRightButton.AutoHeight:=false;
|
|
//FBar.Align := alBottom;
|
|
end;
|
|
tpRight:begin
|
|
FLeftButton.Align:=alTop;
|
|
FLeftButton.RotateDirection:=rdRight;
|
|
FLeftButton.AutoWidth:=false;
|
|
FLeftButton.AutoHeight:=true;
|
|
FRightButton.Align:=alBottom;
|
|
FRightButton.RotateDirection:=rdRight;
|
|
FRightButton.AutoWidth:=false;
|
|
FRightButton.AutoHeight:=true;
|
|
//FBar.Align:=alRight;
|
|
end;
|
|
end;
|
|
|
|
if not FPagesBar.IsVisible(FPageIndex) then
|
|
FPagesBar.FocusButton(FPageIndex);
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabControl.SetTabPosition After');
|
|
DebugLn('FBar Left %d Top %d Height %d Width %d',[ FBar.Left, Fbar.Top, FBar.Height, FBar.Width]);
|
|
DebugLn('FPagesBar Left %d Top %d Height %d Width %d',[ FPagesBar.Left, FPagesbar.Top, FPagesBar.Height, FPagesBar.Width]);
|
|
DebugLn('Control Left %d Top %d Height %d Width %d',[ Left, Top, Height, Width]);
|
|
{$ENDIF}
|
|
|
|
AlignPages;
|
|
|
|
FPagesBar.UpdateAllButtons;
|
|
InvPaint;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl SetLongTabs(Value : Boolean)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.SetLongTabs(Value : Boolean);
|
|
begin
|
|
if FLongTabs=Value then Exit;
|
|
FLongTabs:=Value;
|
|
|
|
SetTabPosition(TabPosition);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl Update
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.Change;
|
|
begin
|
|
ShowCurrentPage;
|
|
fPageIndexOnLastChange := fPageIndex;
|
|
if ([csLoading,csDestroying]*ComponentState=[])
|
|
then begin
|
|
if Assigned(fOnPageChanged) then fOnPageChanged(Self);
|
|
end;
|
|
end;
|
|
|
|
procedure TGradTabControl.UpdateTabProperties;
|
|
begin
|
|
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl AddPage(AName: String) : Integer
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabControl.AddPage(AName: String) : Integer;
|
|
begin
|
|
Result := FTabStrings.Add(AName);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl AddPage(APage: TGradTabPage) : Integer
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabControl.AddPage(APage: TGradTabPage) : Integer;
|
|
begin
|
|
Result := FPageList.Count;
|
|
FPageList.Insert(Result, APage);
|
|
end;
|
|
|
|
function TGradTabControl.GetTabBarSize(TabPos: TTabPosition): Integer;
|
|
begin
|
|
if TabPos in [tpTop,tpBottom] then
|
|
Result := TabHeight
|
|
else if LongTabs then
|
|
Result := LongWidth
|
|
else
|
|
Result := TabHeight;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl GetClientRect: TRect
|
|
------------------------------------------------------------------------------}
|
|
function TGradTabControl.GetClientRect: TRect;
|
|
var
|
|
tempR : TRect;
|
|
begin
|
|
tempR := Inherited;
|
|
|
|
case FTabPosition of
|
|
tpTop: begin
|
|
tempR.Top:=FTabHeight+2;
|
|
tempR.Left:=2;
|
|
tempR.Right:=Width-2;
|
|
tempR.Bottom:=Height-2;
|
|
end;
|
|
tpBottom: begin
|
|
tempR.Top:=2;
|
|
tempR.Left:=2;
|
|
tempR.Right:=Width-2;
|
|
tempR.Bottom:=Height-FTabHeight-2;
|
|
end;
|
|
tpRight: begin
|
|
tempR.Top:=2;
|
|
tempR.Left:=2;
|
|
tempR.Right:=Width-GetTabBarSize(tpRight)-2;
|
|
tempR.Bottom:=Height-2;
|
|
end;
|
|
tpLeft: begin
|
|
tempR.Top:=2;
|
|
tempR.Left:=GetTabBarSize(tpLeft)+2;
|
|
tempR.Right:=Width-2;
|
|
tempR.Bottom:=Height-2;
|
|
end;
|
|
end;
|
|
|
|
Result := tempR;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl Paint
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.Paint;
|
|
begin
|
|
FStyle.TabControl(Self, Self.Canvas);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl Resize
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.Resize;
|
|
begin
|
|
inherited;
|
|
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabControl.Resize HasParent %s FPageList.Count %d',[BoolToStr(HasParent,true), FPageList.Count]);
|
|
{$ENDIF}
|
|
|
|
if HasParent and (FPageList.Count<>0) then
|
|
AlignPage(GetCurrentPage, GetClientRect);
|
|
|
|
|
|
case FTabPosition of
|
|
tpTop: begin
|
|
FBar.Width:=Width;
|
|
FBar.Top:=0;
|
|
end;
|
|
tpBottom: begin
|
|
FBar.Width:=Width;
|
|
FBar.Top:=Height-FTabHeight;
|
|
end;
|
|
tpLeft: begin
|
|
FBar.Height:=Height;
|
|
FBar.Left:=0;
|
|
FBar.Top:=0;
|
|
end;
|
|
tpRight: begin
|
|
FBar.Height:=Height;
|
|
FBar.Left:=Width-GetTabBarSize(tpRight);
|
|
FBar.Top:=0;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
procedure TGradTabControl.UpdateAllDesignerFlags;
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.UpdateAllDesignerFlags;
|
|
var
|
|
i: integer;
|
|
begin
|
|
for i:=0 to PageCount-1 do
|
|
UpdateDesignerFlags(i);
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl UpdateDesignerFlags(APageIndex: integer)
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.UpdateDesignerFlags(APageIndex: integer);
|
|
begin
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn('TGradTabControl.UpdateDesignerFlags: Index: %d Current: %d Assigned: %s',[APageIndex, FPageIndex,BoolToStr(Assigned(Page[APageIndex]),true)]);
|
|
{$ENDIF}
|
|
|
|
if APageIndex<>FPageIndex then
|
|
Page[APageIndex].ControlStyle:=
|
|
Page[APageIndex].ControlStyle+[csNoDesignVisible{,csNoDesignSelectable}]
|
|
else
|
|
Page[APageIndex].ControlStyle:=
|
|
Page[APageIndex].ControlStyle-[csNoDesignVisible{,csNoDesignSelectable}];
|
|
|
|
{$IFDEF DEBUGTAB} DebugLn('TGradTabControl.UpdateDesignerFlags End'); {$ENDIF}
|
|
|
|
end;
|
|
|
|
{------------------------------------------------------------------------------
|
|
TGradTabControl.ShowCurrentPage
|
|
------------------------------------------------------------------------------}
|
|
procedure TGradTabControl.ShowCurrentPage;
|
|
var
|
|
CurPage: TGradTabPage;
|
|
begin
|
|
if (FPageIndex >= 0) and (FPageIndex < FPageList.Count) then
|
|
begin
|
|
CurPage:=Page[FPageIndex];
|
|
// first make the new page visible
|
|
{$IFDEF DEBUGTAB}DebugLn(['TGradTabControl.ShowCurrentPage ',DbgSName(CurPage),' CurPage.Visible=',CurPage.Visible]);{$ENDIF}
|
|
if CurPage.Visible then begin
|
|
if FPageIndexOnLastShow<>fPageIndex then begin
|
|
// some widgetsets like win32/64 do not send WM_SIZE messages for
|
|
// hidden pages. Force resizing page (it is alClient).
|
|
{$IFDEF DEBUGTAB}
|
|
DebugLn(['TGradTabControl.ShowCurrentPage ',dbgsName(Self),' ',DbgSName(CurPage),' CurPage.Visible=',CurPage.Visible,' BoundsRect=',dbgs(BoundsRect),' ClientRect=',dbgs(ClientRect),' CurPage.BoundsRect=',dbgs(CurPage.BoundsRect),' CurPage.ClientRect=',dbgs(CurPage.ClientRect)]);
|
|
{$ENDIF}
|
|
ReAlign;
|
|
// TCustomPage.IsControlVisible is overriden
|
|
// therefore AutoSizing of childs was skipped => do it now
|
|
CurPage.ReAlign;
|
|
end;
|
|
end else begin
|
|
CurPage.Visible := true;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
{ TFormPage }
|
|
|
|
constructor TFormPage.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
|
|
FShowPageAtDestroy:=false;
|
|
FDestroyPageAtDestroy:=false;
|
|
end;
|
|
|
|
destructor TFormPage.Destroy;
|
|
var
|
|
FOld : TCustomForm;
|
|
begin
|
|
if FDestroyPageAtDestroy AND (FOldForm <> nil) then begin
|
|
FOld := FOldForm;
|
|
PageToForm(false);
|
|
FOld.Free;
|
|
FOld := nil;
|
|
end else
|
|
PageToForm(FShowPageAtDestroy);
|
|
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TFormPage.FormToPage(TheForm: TCustomForm);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
if FOldForm = TheForm then Exit;
|
|
FOldForm := TheForm;
|
|
|
|
for i := TheForm.ControlCount-1 downto 0 do begin
|
|
TheForm.Controls[i].Parent := Self;
|
|
end;
|
|
|
|
Caption:=TheForm.Caption;
|
|
|
|
if TheForm.Visible then
|
|
TheForm.Close;
|
|
end;
|
|
|
|
procedure TFormPage.PageToForm(AShow : Boolean);
|
|
var
|
|
i : Integer;
|
|
begin
|
|
for i := ControlCount-1 downto 0 do begin
|
|
Controls[i].Parent := FOldForm;
|
|
end;
|
|
|
|
if AShow then
|
|
FOldForm.Show;
|
|
FOldForm := nil;
|
|
end;
|
|
|
|
{ TGradTabCloseButton }
|
|
|
|
constructor TGradTabCloseButton.Create(AOwner: TComponent);
|
|
var
|
|
tempPic : TPicture;
|
|
begin
|
|
|
|
//FOwnerBackgroundDraw:=true;
|
|
|
|
inherited Create(AOwner);
|
|
|
|
try
|
|
tempPic := TPicture.Create;
|
|
|
|
tempPic.LoadFromLazarusResource('btn_cancel');
|
|
|
|
Glyph.Assign(tempPic.Graphic);
|
|
finally
|
|
tempPic.Free;
|
|
end;
|
|
|
|
ShowGlyph:=true;
|
|
BorderSides:=[];
|
|
//Color:=clRed;
|
|
|
|
SetSubComponent(true);
|
|
end;
|
|
|
|
initialization
|
|
{$I ugradtabcontrol.lrs}
|
|
|
|
end.
|
|
|