
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2447 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2267 lines
81 KiB
ObjectPascal
2267 lines
81 KiB
ObjectPascal
unit spkt_Buttons;
|
|
|
|
{$mode delphi}
|
|
{.$Define EnhancedRecordSupport}
|
|
|
|
(*******************************************************************************
|
|
* *
|
|
* Plik: spkt_Buttons.pas *
|
|
* Opis: Modu³ zawieraj¹cy komponenty przycisków dla toolbara. *
|
|
* Copyright: (c) 2009 by Spook. Jakiekolwiek u¿ycie komponentu bez *
|
|
* uprzedniego uzyskania licencji od autora stanowi z³amanie *
|
|
* prawa autorskiego! *
|
|
* *
|
|
*******************************************************************************)
|
|
|
|
interface
|
|
|
|
uses
|
|
Graphics, Classes, Controls, Menus, ActnList, Math,
|
|
Dialogs, ImgList, Forms,
|
|
SpkGUITools, SpkGraphTools, SpkMath,
|
|
spkt_Const, spkt_BaseItem, spkt_Exceptions, spkt_Tools;
|
|
|
|
type TSpkButtonState = (bsIdle,
|
|
bsBtnHottrack, bsBtnPressed,
|
|
bsDropdownHottrack, bsDropdownPressed);
|
|
TSpkMouseButtonElement = (beNone, beButton, beDropdown);
|
|
TSpkButtonKind = (bkButton, bkButtonDropdown, bkDropdown);
|
|
|
|
type TSpkBaseButton = class;
|
|
|
|
TSpkButtonActionLink = class(TActionLink)
|
|
private
|
|
protected
|
|
FClient : TSpkBaseButton;
|
|
|
|
procedure AssignClient(AClient: TObject); override;
|
|
function IsOnExecuteLinked: Boolean; override;
|
|
procedure SetCaption(const Value: string); override;
|
|
procedure SetEnabled(Value: Boolean); override;
|
|
procedure SetImageIndex(Value: integer); override;
|
|
procedure SetVisible(Value: Boolean); override;
|
|
procedure SetOnExecute(Value: TNotifyEvent); override;
|
|
public
|
|
function IsCaptionLinked: Boolean; override;
|
|
function IsEnabledLinked: Boolean; override;
|
|
function IsImageIndexLinked: Boolean; override;
|
|
function IsVisibleLinked: Boolean; override;
|
|
end;
|
|
|
|
TSpkBaseButton = class abstract(TSpkBaseItem)
|
|
private
|
|
FMouseHoverElement : TSpkMouseButtonElement;
|
|
FMouseActiveElement : TSpkMouseButtonElement;
|
|
protected
|
|
FCaption : string;
|
|
FOnClick : TNotifyEvent;
|
|
|
|
FActionLink : TSpkButtonActionLink;
|
|
|
|
FButtonState : TSpkButtonState;
|
|
|
|
FButtonRect : T2DIntRect;
|
|
FDropdownRect : T2DIntRect;
|
|
|
|
FButtonKind : TSpkButtonKind;
|
|
FDropdownMenu : TPopupMenu;
|
|
|
|
// *** Obs³uga rysowania ***
|
|
|
|
/// <summary>Zadaniem metody w odziedziczonych klasach jest obliczenie
|
|
/// rectów przycisku i menu dropdown w zale¿noœci od FButtonState</summary>
|
|
procedure CalcRects; virtual; abstract;
|
|
|
|
function GetDropdownPoint : T2DIntPoint; virtual; abstract;
|
|
|
|
// *** Obs³uga akcji ***
|
|
|
|
procedure ActionChange(Sender: TObject; CheckDefaults: Boolean); virtual;
|
|
procedure DoActionChange(Sender: TObject);
|
|
procedure Click; virtual;
|
|
function GetDefaultCaption: String; virtual;
|
|
|
|
// *** Gettery i settery ***
|
|
|
|
procedure SetEnabled(const Value : boolean); override;
|
|
procedure SetDropdownMenu(const Value : TPopupMenu);
|
|
procedure SetRect(const Value: T2DIntRect); override;
|
|
procedure SetCaption(const Value : string);
|
|
procedure SetAction(const Value : TBasicAction); virtual;
|
|
procedure SetButtonKind(const Value : TSpkButtonKind);
|
|
function GetAction: TBasicAction;
|
|
|
|
property ButtonKind : TSpkButtonKind read FButtonKind write SetButtonKind;
|
|
property DropdownMenu : TPopupMenu read FDropdownMenu write SetDropdownMenu;
|
|
|
|
public
|
|
constructor Create(AOwner : TComponent); override;
|
|
|
|
procedure MouseLeave; override;
|
|
procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
|
|
X, Y: Integer); override;
|
|
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
|
|
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
|
|
X, Y: Integer); override;
|
|
|
|
function GetRootComponent: TComponent;
|
|
|
|
published
|
|
property Caption : string read FCaption write SetCaption;
|
|
property Action : TBasicAction read GetAction write SetAction;
|
|
property OnClick : TNotifyEvent read FOnClick write FOnClick;
|
|
end;
|
|
|
|
type TSpkLargeButton = class(TSpkBaseButton)
|
|
private
|
|
procedure FindBreakPlace(s : string; out Position : integer; out Width : integer);
|
|
protected
|
|
FLargeImageIndex: TImageIndex;
|
|
|
|
procedure CalcRects; override;
|
|
function GetDropdownPoint : T2DIntPoint; override;
|
|
procedure SetLargeImageIndex(const Value: TImageIndex);
|
|
public
|
|
constructor Create(AOwner : TComponent); override;
|
|
function GetWidth : integer; override;
|
|
function GetTableBehaviour : TSpkItemTableBehaviour; override;
|
|
function GetGroupBehaviour : TSpkItemGroupBehaviour; override;
|
|
function GetSize : TSpkItemSize; override;
|
|
procedure Draw(ABuffer : TBitmap; ClipRect : T2DIntRect); override;
|
|
published
|
|
property LargeImageIndex: TImageIndex read FLargeImageIndex write SetLargeImageIndex default -1;
|
|
property ButtonKind;
|
|
property DropdownMenu;
|
|
end;
|
|
|
|
type TSpkSmallButton = class(TSpkBaseButton)
|
|
private
|
|
protected
|
|
FImageIndex : TImageIndex;
|
|
|
|
FTableBehaviour : TSpkItemTableBehaviour;
|
|
FGroupBehaviour : TSPkItemGroupBehaviour;
|
|
FHideFrameWhenIdle : boolean;
|
|
FShowCaption : boolean;
|
|
|
|
procedure CalcRects; override;
|
|
function GetDropdownPoint : T2DIntPoint; override;
|
|
procedure ConstructRects(var BtnRect, DropRect : T2DIntRect);
|
|
procedure SetImageIndex(const Value : TImageIndex);
|
|
procedure SetGroupBehaviour(const Value: TSpkItemGroupBehaviour);
|
|
procedure SetHideFrameWhenIdle(const Value: boolean);
|
|
procedure SetTableBehaviour(const Value: TSpkItemTableBehaviour);
|
|
procedure SetShowCaption(const Value: boolean);
|
|
public
|
|
constructor Create(AOwner : TComponent); override;
|
|
|
|
function GetWidth : integer; override;
|
|
function GetTableBehaviour : TSpkItemTableBehaviour; override;
|
|
function GetGroupBehaviour : TSpkItemGroupBehaviour; override;
|
|
function GetSize : TSpkItemSize; override;
|
|
procedure Draw(ABuffer : TBitmap; ClipRect : T2DIntRect); override;
|
|
published
|
|
property ShowCaption : boolean read FShowCaption write SetShowCaption;
|
|
property TableBehaviour : TSpkItemTableBehaviour read FTableBehaviour write SetTableBehaviour;
|
|
property GroupBehaviour : TSpkItemGroupBehaviour read FGroupBehaviour write SetGroupBehaviour;
|
|
property HideFrameWhenIdle : boolean read FHideFrameWhenIdle write SetHideFrameWhenIdle;
|
|
property ImageIndex : TImageIndex read FImageIndex write SetImageIndex default -1;
|
|
property ButtonKind;
|
|
property DropdownMenu;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
LCLType, LCLIntf, LCLProc, SysUtils, spkt_Pane;
|
|
|
|
{ TSpkButtonActionLink }
|
|
|
|
procedure TSpkButtonActionLink.AssignClient(AClient: TObject);
|
|
begin
|
|
inherited AssignClient(AClient);
|
|
FClient:=TSpkBaseButton(AClient);
|
|
end;
|
|
|
|
function TSpkButtonActionLink.IsCaptionLinked: Boolean;
|
|
begin
|
|
result:=(inherited IsCaptionLinked) and
|
|
(assigned(FClient)) and
|
|
(FClient.Caption = (Action as TCustomAction).Caption);
|
|
end;
|
|
|
|
function TSpkButtonActionLink.IsEnabledLinked: Boolean;
|
|
begin
|
|
result:=(inherited IsEnabledLinked) and
|
|
(assigned(FClient)) and
|
|
(FClient.Enabled = (Action as TCustomAction).Enabled);
|
|
end;
|
|
|
|
function TSpkButtonActionLink.IsOnExecuteLinked: Boolean;
|
|
begin
|
|
Result := inherited IsOnExecuteLinked and
|
|
(@TSpkBaseButton(FClient).OnClick = @Action.OnExecute);
|
|
end;
|
|
|
|
function TSpkButtonActionLink.IsImageIndexLinked: Boolean;
|
|
begin
|
|
Result := (inherited IsImageIndexLinked) and
|
|
(
|
|
((FClient is TSpkSmallButton)
|
|
and (TSpkSmallButton(FClient).ImageIndex = (Action as TCustomAction).ImageIndex))
|
|
or
|
|
((FClient is TSpkLargeButton)
|
|
and (TSpkLargeButton(FClient).LargeImageIndex = (Action as TCustomAction).ImageIndex))
|
|
);
|
|
end;
|
|
|
|
function TSpkButtonActionLink.IsVisibleLinked: Boolean;
|
|
begin
|
|
result:=(inherited IsVisibleLinked) and
|
|
(assigned(FClient)) and
|
|
(FClient.Visible = (Action as TCustomAction).Visible);
|
|
end;
|
|
|
|
procedure TSpkButtonActionLink.SetCaption(const Value: string);
|
|
begin
|
|
if IsCaptionLinked then FClient.Caption := Value;
|
|
end;
|
|
|
|
procedure TSpkButtonActionLink.SetEnabled(Value: Boolean);
|
|
begin
|
|
if IsEnabledLinked then FClient.Enabled := Value;
|
|
end;
|
|
|
|
procedure TSpkButtonActionLink.SetImageIndex(Value: integer);
|
|
begin
|
|
if IsImageIndexLinked then begin
|
|
if (FClient is TSpkSmallButton) then
|
|
(TSpkSmallButton(FClient)).ImageIndex := Value;
|
|
if (FClient is TSpkLargeButton) then
|
|
(TSpkLargeButton(FClient)).LargeImageIndex := Value;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpkButtonActionLink.SetOnExecute(Value: TNotifyEvent);
|
|
begin
|
|
if IsOnExecuteLinked then FClient.OnClick := Value;
|
|
end;
|
|
|
|
procedure TSpkButtonActionLink.SetVisible(Value: Boolean);
|
|
begin
|
|
if IsVisibleLinked then FClient.Visible := Value;
|
|
end;
|
|
|
|
{ TSpkBaseButton }
|
|
|
|
procedure TSpkBaseButton.ActionChange(Sender: TObject; CheckDefaults: Boolean);
|
|
begin
|
|
if Sender is TCustomAction then
|
|
with TCustomAction(Sender) do
|
|
begin
|
|
if not CheckDefaults or (Self.Caption = '') or (Self.Caption = GetDefaultCaption) then
|
|
Self.Caption := Caption;
|
|
if not CheckDefaults or (Self.Enabled = True) then
|
|
Self.Enabled := Enabled;
|
|
if not CheckDefaults or (Self.Visible = True) then
|
|
Self.Visible := Visible;
|
|
if not CheckDefaults or not Assigned(Self.OnClick) then
|
|
Self.OnClick := OnExecute;
|
|
if self is TSpkSmallButton then begin
|
|
if not CheckDefaults or (TSpkSmallButton(self).ImageIndex < 0) then
|
|
TSpkSmallButton(self).ImageIndex := ImageIndex;
|
|
end;
|
|
if self is TSpkLargeButton then begin
|
|
if not CheckDefaults or (TSpkLargeButton(self).LargeImageIndex < 0) then
|
|
TSpkLargeButton(Self).LargeImageIndex := ImageIndex;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
constructor TSpkBaseButton.Create(AOwner : TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FCaption:=GetDefaultCaption;
|
|
FButtonState:=bsIdle;
|
|
FButtonKind:=bkButton;
|
|
{$IFDEF EnhancedRecordSupport}
|
|
FButtonRect:=T2DIntRect.Create(0, 0, 1, 1);
|
|
FDropdownRect:=T2DIntRect.Create(0, 0, 1, 1);
|
|
{$ELSE}
|
|
FButtonRect.Create(0, 0, 1, 1);
|
|
FDropdownRect.Create(0, 0, 1, 1);
|
|
{$ENDIF}
|
|
FMouseHoverElement:=beNone;
|
|
FMouseActiveElement:=beNone;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.Click;
|
|
begin
|
|
if Assigned(FOnClick) then
|
|
FOnClick(self)
|
|
end;
|
|
|
|
procedure TSpkBaseButton.DoActionChange(Sender: TObject);
|
|
begin
|
|
if Sender = Action then ActionChange(Sender, False);
|
|
end;
|
|
|
|
function TSpkBaseButton.GetAction: TBasicAction;
|
|
begin
|
|
if assigned(FActionLink) then
|
|
result:=FActionLink.Action else
|
|
result:=nil;
|
|
end;
|
|
|
|
function TSpkBaseButton.GetDefaultCaption: String;
|
|
begin
|
|
result := 'Button';
|
|
end;
|
|
|
|
function TSpkBaseButton.GetRootComponent: TComponent;
|
|
var
|
|
pane: TSpkBaseItem;
|
|
tab: TSpkBaseItem;
|
|
begin
|
|
result := nil;
|
|
if Collection <> nil then
|
|
pane := TSpkBaseItem(Collection.RootComponent)
|
|
else
|
|
exit;
|
|
if (pane <> nil) and (pane.Collection <> nil) then
|
|
tab := TSpkBaseItem(pane.Collection.RootComponent)
|
|
else
|
|
exit;
|
|
if (tab <> nil) and (tab.Collection <> nil) then
|
|
result := tab.Collection.RootComponent;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X,
|
|
Y: Integer);
|
|
begin
|
|
if FEnabled then
|
|
begin
|
|
// Przyciski reaguj¹ tylko na lewy przycisk myszy
|
|
if Button <> mbLeft then
|
|
exit;
|
|
|
|
if FMouseActiveElement = beButton then
|
|
begin
|
|
if FButtonState<>bsBtnPressed then
|
|
begin
|
|
FButtonState:=bsBtnPressed;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end else
|
|
if FMouseActiveElement = beDropdown then
|
|
begin
|
|
if FButtonState<>bsDropdownPressed then
|
|
begin
|
|
FButtonState:=bsDropdownPressed;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end else
|
|
if FMouseActiveElement = beNone then
|
|
begin
|
|
if FMouseHoverElement = beButton then
|
|
begin
|
|
FMouseActiveElement:=beButton;
|
|
|
|
if FButtonState<>bsBtnPressed then
|
|
begin
|
|
FButtonState:=bsBtnPressed;
|
|
if FToolbarDispatch<>nil then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end else
|
|
if FMouseHoverElement = beDropdown then
|
|
begin
|
|
FMouseActiveElement:=beDropdown;
|
|
|
|
if FButtonState<>bsDropdownPressed then
|
|
begin
|
|
FButtonState:=bsDropdownPressed;
|
|
if FToolbarDispatch<>nil then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FMouseHoverElement:=beNone;
|
|
FMouseActiveElement:=beNone;
|
|
if FButtonState<>bsIdle then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.MouseLeave;
|
|
begin
|
|
if FEnabled then
|
|
begin
|
|
if FMouseActiveElement = beNone then
|
|
begin
|
|
if FMouseHoverElement = beButton then
|
|
begin
|
|
// Placeholder, gdyby zasz³a potrzeba obs³ugi tego zdarzenia
|
|
end else
|
|
if FMouseHoverElement = beDropdown then
|
|
begin
|
|
// Placeholder, gdyby zasz³a potrzeba obs³ugi tego zdarzenia
|
|
end;
|
|
end;
|
|
|
|
if FButtonState<>bsIdle then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FMouseHoverElement:=beNone;
|
|
FMouseActiveElement:=beNone;
|
|
if FButtonState<>bsIdle then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.MouseMove(Shift: TShiftState; X, Y: Integer);
|
|
|
|
var NewMouseHoverElement : TSpkMouseButtonElement;
|
|
|
|
begin
|
|
if FEnabled then
|
|
begin
|
|
{$IFDEF EnhancedRecordSupport}
|
|
if FButtonRect.Contains(T2DIntPoint.Create(X,Y)) then
|
|
{$ELSE}
|
|
if FButtonRect.Contains(X,Y) then
|
|
{$ENDIF}
|
|
NewMouseHoverElement:=beButton else
|
|
if (FButtonKind = bkButtonDropdown) and
|
|
{$IFDEF EnhancedRecordSupport}
|
|
(FDropdownRect.Contains(T2DIntPoint.Create(X,Y))) then
|
|
{$ELSE}
|
|
(FDropdownRect.Contains(X,Y)) then
|
|
{$ENDIF}
|
|
NewMouseHoverElement:=beDropdown else
|
|
NewMouseHoverElement:=beNone;
|
|
|
|
if FMouseActiveElement = beButton then
|
|
begin
|
|
if (NewMouseHoverElement = beNone) and (FButtonState<>bsIdle) then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
if FToolbarDispatch<>nil then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end else
|
|
if (NewMouseHoverElement = beButton) and (FButtonState<>bsBtnPressed) then
|
|
begin
|
|
FButtonState:=bsBtnPressed;
|
|
if FToolbarDispatch<>nil then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end else
|
|
if FMouseActiveElement = beDropdown then
|
|
begin
|
|
if (NewMouseHoverElement = beNone) and (FButtonState<>bsIdle) then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
if FToolbarDispatch<>nil then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end else
|
|
if (NewMouseHoverElement = beDropdown) and (FButtonState<>bsDropdownPressed) then
|
|
begin
|
|
FButtonState:=bsDropdownPressed;
|
|
if FToolbarDispatch<>nil then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end else
|
|
if FMouseActiveElement = beNone then
|
|
begin
|
|
// Z uwagi na uproszczon¹ obs³ugê myszy w przycisku, nie ma potrzeby
|
|
// informowaæ poprzedniego elementu o tym, ¿e mysz opuœci³a jego obszar.
|
|
|
|
if NewMouseHoverElement = beButton then
|
|
begin
|
|
if FButtonState<>bsBtnHottrack then
|
|
begin
|
|
FButtonState:=bsBtnHottrack;
|
|
if FToolbarDispatch<>nil then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end else
|
|
if NewMouseHoverElement = beDropdown then
|
|
begin
|
|
if FButtonState<>bsDropdownHottrack then
|
|
begin
|
|
FButtonState:=bsDropdownHottrack;
|
|
if FToolbarDispatch<>nil then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
FMouseHoverElement:=NewMouseHoverElement;
|
|
end
|
|
else
|
|
begin
|
|
FMouseHoverElement:=beNone;
|
|
FMouseActiveElement:=beNone;
|
|
if FButtonState<>bsIdle then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
|
|
Y: Integer);
|
|
|
|
var ClearActive : boolean;
|
|
DropPoint: T2DIntPoint;
|
|
|
|
begin
|
|
if FEnabled then
|
|
begin
|
|
// Przyciski reaguj¹ tylko na lewy przycisk myszy
|
|
if Button <> mbLeft then
|
|
exit;
|
|
|
|
ClearActive:=not(ssLeft in Shift);
|
|
|
|
if FMouseActiveElement = beButton then
|
|
begin
|
|
// Zdarzenie zadzia³a tylko wtedy, gdy przycisk myszy zosta³ puszczony nad
|
|
// przyciskiem
|
|
if FMouseHoverElement = beButton then
|
|
begin
|
|
if FButtonKind in [bkButton, bkButtonDropdown] then
|
|
begin
|
|
Click;
|
|
FButtonState:=bsBtnHottrack;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end else
|
|
if FButtonKind = bkDropdown then
|
|
begin
|
|
if assigned(FDropdownMenu) then
|
|
begin
|
|
DropPoint:=FToolbarDispatch.ClientToScreen(GetDropdownPoint);
|
|
FDropdownMenu.Popup(DropPoint.x, DropPoint.y);
|
|
FButtonState:=bsBtnHottrack;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
end else
|
|
if FMouseActiveElement = beDropDown then
|
|
begin
|
|
// Zdarzenie zadzia³a tylko wtedy, gdy przycisk myszy zosta³ puszczony nad
|
|
// przyciskiem DropDown
|
|
|
|
if FMouseHoverElement = beDropDown then
|
|
begin
|
|
if assigned(FDropdownMenu) then
|
|
begin
|
|
DropPoint:=FToolbarDispatch.ClientToScreen(GetDropdownPoint);
|
|
FDropdownMenu.Popup(DropPoint.x, DropPoint.y);
|
|
FButtonState:=bsBtnHottrack;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if (ClearActive) and (FMouseActiveElement<>FMouseHoverElement) then
|
|
begin
|
|
// Z uwagi na uproszczon¹ obs³ugê, nie ma potrzeby informowaæ poprzedniego
|
|
// elementu o tym, ¿e mysz opuœci³a jego obszar.
|
|
|
|
if FMouseHoverElement = beButton then
|
|
begin
|
|
if FButtonState<>bsBtnHottrack then
|
|
begin
|
|
FButtonState:=bsBtnHottrack;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end else
|
|
if FMouseHoverElement = beDropdown then
|
|
begin
|
|
if FButtonState<>bsDropdownHottrack then
|
|
begin
|
|
FButtonState:=bsDropdownHottrack;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end else
|
|
if FMouseHoverElement = beNone then
|
|
begin
|
|
if FButtonState <> bsIdle then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
if ClearActive then
|
|
begin
|
|
FMouseActiveElement:=beNone;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FMouseHoverElement:=beNone;
|
|
FMouseActiveElement:=beNone;
|
|
if FButtonState<>bsIdle then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.SetAction(const Value: TBasicAction);
|
|
begin
|
|
if Value = nil then
|
|
begin
|
|
FActionLink.Free;
|
|
FActionLink := nil;
|
|
end
|
|
else
|
|
begin
|
|
if FActionLink = nil then
|
|
FActionLink := TSpkButtonActionLink.Create(self);
|
|
FActionLink.Action := Value;
|
|
FActionLink.OnChange := DoActionChange;
|
|
ActionChange(Value, csLoading in Value.ComponentState);
|
|
end;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.SetButtonKind(const Value: TSpkButtonKind);
|
|
begin
|
|
FButtonKind:=Value;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyMetricsChanged;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.SetCaption(const Value: string);
|
|
begin
|
|
FCaption:=Value;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyMetricsChanged;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.SetDropdownMenu(const Value: TPopupMenu);
|
|
begin
|
|
FDropdownMenu:=Value;
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyMetricsChanged;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.SetEnabled(const Value: boolean);
|
|
begin
|
|
inherited;
|
|
if not(FEnabled) then
|
|
begin
|
|
// Jeœli przycisk zosta³ wy³¹czony, zostaje natychmiast prze³¹czony
|
|
// w stan Idle i zerowane s¹ elementy aktywne i pod mysz¹. Jeœli zosta³
|
|
// w³¹czony, jego stan zmieni siê podczas pierwszej akcji myszy.
|
|
|
|
FMouseHoverElement:=beNone;
|
|
FMouseActiveElement:=beNone;
|
|
|
|
if FButtonState<>bsIdle then
|
|
begin
|
|
FButtonState:=bsIdle;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TSpkBaseButton.SetRect(const Value: T2DIntRect);
|
|
begin
|
|
inherited;
|
|
CalcRects;
|
|
end;
|
|
|
|
{ TSpkLargeButton }
|
|
|
|
procedure TSpkLargeButton.CalcRects;
|
|
begin
|
|
{$IFDEF EnhancedRecordSupport}
|
|
if FButtonKind = bkButtonDropdown then
|
|
begin
|
|
FButtonRect:=T2DIntRect.Create(FRect.Left, FRect.Top, FRect.Right, FRect.Bottom - LARGEBUTTON_DROPDOWN_FIELD_SIZE);
|
|
FDropdownRect:=T2DIntRect.Create(FRect.Left, FRect.Bottom - LARGEBUTTON_DROPDOWN_FIELD_SIZE + 1, FRect.Right, FRect.Bottom);
|
|
end
|
|
else
|
|
begin
|
|
FButtonRect:=FRect;
|
|
FDropdownRect:=T2DIntRect.Create(0, 0, 0, 0);
|
|
end;
|
|
{$ELSE}
|
|
if FButtonKind = bkButtonDropdown then
|
|
begin
|
|
FButtonRect.Create(FRect.Left, FRect.Top, FRect.Right, FRect.Bottom - LARGEBUTTON_DROPDOWN_FIELD_SIZE);
|
|
FDropdownRect.Create(FRect.Left, FRect.Bottom - LARGEBUTTON_DROPDOWN_FIELD_SIZE + 1, FRect.Right, FRect.Bottom);
|
|
end
|
|
else
|
|
begin
|
|
FButtonRect:=FRect;
|
|
FDropdownRect.Create(0, 0, 0, 0);
|
|
end;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
constructor TSpkLargeButton.Create(AOwner: TComponent);
|
|
begin
|
|
inherited;
|
|
FLargeImageIndex:=-1;
|
|
end;
|
|
|
|
procedure TSpkLargeButton.Draw(ABuffer: TBitmap; ClipRect: T2DIntRect);
|
|
|
|
var FrameColor: TColor;
|
|
InnerLightColor: TColor;
|
|
InnerDarkColor: TColor;
|
|
GradientFromColor: TColor;
|
|
GradientToColor: TColor;
|
|
GradientKind : TBackgroundKind;
|
|
DrawRgn, TmpRgn : HRGN;
|
|
x: Integer;
|
|
y: Integer;
|
|
|
|
FontColor: TColor;
|
|
BreakPos: Integer;
|
|
BreakWidth: Integer;
|
|
s: string;
|
|
TextHeight: Integer;
|
|
|
|
begin
|
|
if FToolbarDispatch=nil then
|
|
exit;
|
|
if FAppearance=nil then
|
|
exit;
|
|
|
|
if (FRect.width<2*LARGEBUTTON_RADIUS) or (FRect.Height<2*LARGEBUTTON_RADIUS) then
|
|
exit;
|
|
|
|
if FButtonKind in [bkButton, bkDropdown] then
|
|
begin
|
|
{$REGION 'Tryb bez dodatkowego przycisku z rozwijanym menu'}
|
|
// *** T³o ***
|
|
if not(FEnabled) then
|
|
begin
|
|
{$REGION 'T³o dla disabled'}
|
|
// Brak t³a
|
|
{$ENDREGION}
|
|
end else
|
|
if FButtonState = bsIdle then
|
|
begin
|
|
{$REGION 'T³o dla Idle'}
|
|
// Brak t³a
|
|
{$ENDREGION}
|
|
end else
|
|
if FButtonState = bsBtnHottrack then
|
|
begin
|
|
{$REGION 'T³o dla HotTrack'}
|
|
TGuiTools.DrawRoundRect(ABuffer.Canvas,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntRect.Create(FButtonRect.left,
|
|
FButtonRect.Top,
|
|
FButtonRect.Right,
|
|
FButtonRect.Bottom),
|
|
{$ELSE}
|
|
Create2DIntRect(FButtonRect.left,
|
|
FButtonRect.Top,
|
|
FButtonRect.Right,
|
|
FButtonRect.Bottom),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
FAppearance.Element.HotTrackGradientFromColor,
|
|
FAppearance.Element.HotTrackGradientToColor,
|
|
FAppearance.Element.HotTrackGradientType,
|
|
ClipRect);
|
|
|
|
TGuiTools.DrawAARoundFrame(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntRect.Create(FButtonRect.left+1,
|
|
FButtonRect.top+1,
|
|
FButtonRect.right-1,
|
|
FButtonRect.Bottom-1),
|
|
{$ELSE}
|
|
Create2DIntRect(FButtonRect.left+1,
|
|
FButtonRect.top+1,
|
|
FButtonRect.right-1,
|
|
FButtonRect.Bottom-1),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
FAppearance.Element.HotTrackInnerLightColor,
|
|
ClipRect);
|
|
TGuiTools.DrawAARoundFrame(ABuffer,
|
|
FButtonRect,
|
|
LARGEBUTTON_RADIUS,
|
|
FAppearance.Element.HotTrackFrameColor,
|
|
ClipRect);
|
|
{$ENDREGION}
|
|
end else
|
|
if FButtonState = bsBtnPressed then
|
|
begin
|
|
{$REGION 'T³o dla Pressed'}
|
|
TGuiTools.DrawRoundRect(ABuffer.Canvas,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntRect.Create(FButtonRect.left,
|
|
FButtonRect.Top,
|
|
FButtonRect.Right,
|
|
FButtonRect.Bottom),
|
|
{$ELSE}
|
|
Create2DIntRect(FButtonRect.left,
|
|
FButtonRect.Top,
|
|
FButtonRect.Right,
|
|
FButtonRect.Bottom),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
FAppearance.Element.ActiveGradientFromColor,
|
|
FAppearance.Element.ActiveGradientToColor,
|
|
FAppearance.Element.ActiveGradientType,
|
|
ClipRect);
|
|
|
|
|
|
TGuiTools.DrawAARoundFrame(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntRect.Create(FButtonRect.left+1,
|
|
FButtonRect.top+1,
|
|
FButtonRect.right-1,
|
|
FButtonRect.Bottom-1),
|
|
{$ELSE}
|
|
Create2DIntRect(FButtonRect.left+1,
|
|
FButtonRect.top+1,
|
|
FButtonRect.right-1,
|
|
FButtonRect.Bottom-1),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
FAppearance.Element.ActiveInnerLightColor,
|
|
ClipRect);
|
|
TGuiTools.DrawAARoundFrame(ABuffer,
|
|
FButtonRect,
|
|
LARGEBUTTON_RADIUS,
|
|
FAppearance.Element.ActiveFrameColor,
|
|
ClipRect);
|
|
{$ENDREGION}
|
|
end else
|
|
raise InternalException.create('TSpkLargeButton.Draw: Nieprawid³owa wartoœæ FButtonState!');
|
|
|
|
// *** Ikona ***
|
|
if not(FEnabled) then
|
|
begin
|
|
{$REGION 'Ikona wy³¹czona'}
|
|
if (FLargeImageIndex>=0) and
|
|
(FDisabledLargeImages<>nil) and
|
|
(FLargeImageIndex<FDisabledLargeImages.Count) then
|
|
begin
|
|
x:=FRect.left + (FRect.Width - FLargeImages.Width) div 2;
|
|
y:=FRect.top + LARGEBUTTON_BORDER_SIZE + LARGEBUTTON_GLYPH_MARGIN;
|
|
|
|
TGuiTools.DrawImage(ABuffer.Canvas,
|
|
FDisabledLargeImages,
|
|
FLargeImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x, y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x, y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end else
|
|
if (FLargeImageIndex>=0) and
|
|
(FLargeImages<>nil) and
|
|
(FLargeImageIndex<FLargeImages.Count) then
|
|
begin
|
|
x:=FRect.left + (FRect.Width - FLargeImages.Width) div 2;
|
|
y:=FRect.top + LARGEBUTTON_BORDER_SIZE + LARGEBUTTON_GLYPH_MARGIN;
|
|
|
|
TGuiTools.DrawDisabledImage(ABuffer.Canvas,
|
|
FLargeImages,
|
|
FLargeImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x, y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x, y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end;
|
|
{$ENDREGION}
|
|
end
|
|
else
|
|
begin
|
|
{$REGION 'Ikona zwyk³a'}
|
|
if (FLargeImageIndex>=0) and
|
|
(FLargeImages<>nil) and
|
|
(FLargeImageIndex<FLargeImages.Count) then
|
|
begin
|
|
x:=FRect.left + (FRect.Width - FLargeImages.Width) div 2;
|
|
y:=FRect.top + LARGEBUTTON_BORDER_SIZE + LARGEBUTTON_GLYPH_MARGIN;
|
|
|
|
TGUITools.DrawImage(ABuffer.Canvas,
|
|
FLargeImages,
|
|
FLargeImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x,y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x,y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end;
|
|
{$ENDREGION}
|
|
end;
|
|
|
|
// *** Tekst ***
|
|
|
|
if not(FEnabled) then
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.IdleCaptionColor);
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.HotTrackCaptionColor);
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=TColorTools.ColorToGrayscale(FAppearance.ELement.ActiveCaptionColor);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=FAppearance.Element.IdleCaptionColor;
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=FAppearance.Element.HotTrackCaptionColor;
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=FAppearance.ELement.ActiveCaptionColor;
|
|
end;
|
|
end;
|
|
|
|
ABuffer.Canvas.Font.assign(FAppearance.Element.CaptionFont);
|
|
ABuffer.Canvas.Font.Color:=FontColor;
|
|
|
|
if FButtonKind = bkButton then
|
|
FindBreakPlace(FCaption, BreakPos, BreakWidth) else
|
|
BreakPos:=0;
|
|
|
|
if BreakPos>0 then
|
|
begin
|
|
// Tekst z³amany
|
|
TextHeight:=ABuffer.Canvas.Textheight('Wy');
|
|
|
|
s:=copy(FCaption, 1, BreakPos-1);
|
|
x:=FRect.Left + (FRect.width - ABuffer.Canvas.Textwidth(s)) div 2;
|
|
y:=FRect.Top + LARGEBUTTON_CAPTION_TOP_RAIL - TextHeight div 2;
|
|
TGUITools.DrawText(ABuffer.Canvas, x, y, s, FontColor, ClipRect);
|
|
|
|
s:=copy(FCaption, BreakPos+1, length(FCaption) - BreakPos);
|
|
x:=FRect.Left + (FRect.width - ABuffer.Canvas.Textwidth(s)) div 2;
|
|
y:=FRect.Top + LARGEBUTTON_CAPTION_BOTTOM_RAIL - TextHeight div 2;
|
|
TGUITools.DrawText(ABuffer.Canvas, x, y, s, FontColor, ClipRect);
|
|
end
|
|
else
|
|
begin
|
|
// Tekst nie z³amany
|
|
TextHeight:=ABuffer.Canvas.Textheight('Wy');
|
|
|
|
x:=FButtonRect.Left + (FButtonRect.width - ABuffer.Canvas.Textwidth(FCaption)) div 2;
|
|
y:=FRect.Top + LARGEBUTTON_CAPTION_TOP_RAIL - TextHeight div 2;
|
|
TGUITools.DrawText(ABuffer.Canvas, x, y, FCaption, FontColor, ClipRect);
|
|
end;
|
|
|
|
if FButtonKind = bkDropdown then
|
|
begin
|
|
// Chevron strza³ki w dó³
|
|
|
|
if not(FEnabled) then
|
|
begin
|
|
case FButtonState of
|
|
bsIdle: FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.IdleCaptionColor);
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.HotTrackCaptionColor);
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=TColorTools.ColorToGrayscale(FAppearance.ELement.ActiveCaptionColor);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
case FButtonState of
|
|
bsIdle: FontColor:=FAppearance.Element.IdleCaptionColor;
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=FAppearance.Element.HotTrackCaptionColor;
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=FAppearance.ELement.ActiveCaptionColor;
|
|
end;
|
|
end;
|
|
|
|
ABuffer.Canvas.Font.Charset:=DEFAULT_CHARSET;
|
|
ABuffer.Canvas.Font.Name:='Marlett';
|
|
ABuffer.Canvas.Font.Size:=8;
|
|
ABuffer.Canvas.Font.Style:=[];
|
|
ABuffer.Canvas.Font.Orientation:=0;
|
|
|
|
x:=FButtonRect.Left + (FButtonRect.width - ABuffer.Canvas.Textwidth('u')) div 2;
|
|
y:=FButtonRect.bottom - ABuffer.Canvas.Textheight('u') - LARGEBUTTON_CHEVRON_HMARGIN;
|
|
TGUITools.DrawText(ABuffer.Canvas, x, y, 'u', FontColor, ClipRect);
|
|
end;
|
|
|
|
{$ENDREGION}
|
|
end
|
|
else
|
|
begin
|
|
{$REGION 'Tryb z rozwijanym menu'}
|
|
// *** T³o ***
|
|
if not(FEnabled) then
|
|
begin
|
|
{$REGION 'T³o dla Disabled'}
|
|
//
|
|
{$ENDREGION}
|
|
end else
|
|
if FButtonState = bsIdle then
|
|
begin
|
|
{$REGION 'T³o dla Idle'}
|
|
//
|
|
{$ENDREGION}
|
|
end else
|
|
if (FButtonState = bsBtnHottrack) or (FButtonState = bsDropdownHottrack) or
|
|
(FButtonState = bsBtnPressed) or (FButtonState = bsDropdownPressed) then
|
|
begin
|
|
{$REGION 'T³o dla aktywnego'}
|
|
|
|
// *** Przycisk ***
|
|
|
|
{$REGION 'Ustalanie kolorów'}
|
|
if FButtonState = bsBtnHottrack then
|
|
begin
|
|
FrameColor:=FAppearance.Element.HotTrackFrameColor;
|
|
InnerLightColor:=FAppearance.Element.HotTrackInnerLightColor;
|
|
GradientFromColor:=FAppearance.Element.HotTrackGradientFromColor;
|
|
GradientToColor:=FAppearance.Element.HotTrackGradientToColor;
|
|
GradientKind:=FAppearance.Element.HotTrackGradientType;
|
|
end else
|
|
if FButtonState = bsBtnPressed then
|
|
begin
|
|
FrameColor:=FAppearance.Element.ActiveFrameColor;
|
|
InnerLightColor:=FAppearance.Element.ActiveInnerLightColor;
|
|
GradientFromColor:=FAppearance.Element.ActiveGradientFromColor;
|
|
GradientToColor:=FAppearance.Element.ActiveGradientToColor;
|
|
GradientKind:=FAppearance.Element.ActiveGradientType;
|
|
end
|
|
else
|
|
begin
|
|
FrameColor:=TColorTools.Brighten(FAppearance.Element.HotTrackFrameColor,40);
|
|
InnerLightColor:=TColorTools.Brighten(FAppearance.Element.HotTrackInnerLightColor,40);
|
|
GradientFromColor:=TColorTools.Brighten(FAppearance.Element.HotTrackGradientFromColor,40);
|
|
GradientToColor:=TColorTools.Brighten(FAppearance.Element.HotTrackGradientToColor,40);
|
|
GradientKind:=FAppearance.Element.HotTrackGradientType;
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
{$REGION 'T³o przycisku'}
|
|
DrawRgn:=CreateRectRgn(FButtonRect.Left,
|
|
FButtonRect.Top + LARGEBUTTON_RADIUS,
|
|
FButtonRect.Right + 1,
|
|
FButtonRect.Bottom);
|
|
|
|
TmpRgn:=CreateRectRgn(FButtonRect.left + LARGEBUTTON_RADIUS,
|
|
FButtonRect.Top,
|
|
FButtonRect.right - LARGEBUTTON_RADIUS + 1,
|
|
FButtonRect.Top + LARGEBUTTON_RADIUS);
|
|
CombineRgn(DrawRgn, DrawRgn, TmpRgn, RGN_OR);
|
|
DeleteObject(TmpRgn);
|
|
|
|
TmpRgn:=CreateEllipticRgn(FButtonRect.Left,
|
|
FButtonRect.Top,
|
|
FButtonRect.Left + 2 * LARGEBUTTON_RADIUS + 1,
|
|
FButtonRect.Top + 2 * LARGEBUTTON_RADIUS + 1);
|
|
CombineRgn(DrawRgn, DrawRgn, TmpRgn, RGN_OR);
|
|
DeleteObject(TmpRgn);
|
|
|
|
TmpRgn:=CreateEllipticRgn(FButtonRect.Right - 2 * LARGEBUTTON_RADIUS + 1,
|
|
FButtonRect.Top,
|
|
FButtonRect.Right + 2,
|
|
FButtonRect.Top + 2 * LARGEBUTTON_RADIUS + 1);
|
|
CombineRgn(DrawRgn, DrawRgn, TmpRgn, RGN_OR);
|
|
DeleteObject(TmpRgn);
|
|
|
|
TGuiTools.DrawRegion(ABuffer.Canvas,
|
|
DrawRgn,
|
|
FRect,
|
|
GradientFromColor,
|
|
GradientToColor,
|
|
GradientKind,
|
|
ClipRect);
|
|
DeleteObject(DrawRgn);
|
|
{$ENDREGION}
|
|
|
|
{$REGION 'Ramka przycisku'}
|
|
// Wewnêtrzna ramka
|
|
TGuiTools.DrawAARoundCorner(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(FButtonRect.Left + 1, FButtonRect.Top + 1),
|
|
{$ELSE}
|
|
Create2DIntPoint(FButtonRect.Left + 1, FButtonRect.Top + 1),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
cpLeftTop,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
TGuiTools.DrawAARoundCorner(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(FButtonRect.Right - LARGEBUTTON_RADIUS, FButtonRect.Top + 1),
|
|
{$ELSE}
|
|
Create2DIntPoint(FButtonRect.Right - LARGEBUTTON_RADIUS, FButtonRect.Top + 1),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
cpRightTop,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
TGuiTools.DrawHLine(ABuffer,
|
|
FButtonRect.Left + LARGEBUTTON_RADIUS + 1,
|
|
FButtonRect.Right - LARGEBUTTON_RADIUS - 1,
|
|
FButtonRect.Top + 1,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
TGuiTools.DrawVLine(ABuffer,
|
|
FButtonRect.Left + 1,
|
|
FButtonRect.Top + LARGEBUTTON_RADIUS + 1,
|
|
FButtonRect.Bottom,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
TGuiTools.DrawVLine(ABuffer,
|
|
FButtonRect.Right - 1,
|
|
FButtonRect.Top + LARGEBUTTON_RADIUS + 1,
|
|
FButtonRect.Bottom,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
|
|
if FButtonState = bsBtnPressed then
|
|
TGuiTools.DrawHLine(ABuffer,
|
|
FButtonRect.Left + 1,
|
|
FButtonRect.Right - 1,
|
|
FButtonRect.Bottom,
|
|
FrameColor,
|
|
ClipRect) else
|
|
TGuiTools.DrawHLine(ABuffer,
|
|
FButtonRect.Left + 1,
|
|
FButtonRect.Right - 1,
|
|
FButtonRect.Bottom,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
|
|
// Zewnêtrzna ramka
|
|
TGuiTools.DrawAARoundCorner(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(FButtonRect.Left, FButtonRect.Top),
|
|
{$ELSE}
|
|
Create2DIntPoint(FButtonRect.Left, FButtonRect.Top),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
cpLeftTop,
|
|
FrameColor,
|
|
ClipRect);
|
|
TGuiTools.DrawAARoundCorner(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(FButtonRect.Right - LARGEBUTTON_RADIUS + 1, FButtonRect.Top),
|
|
{$ELSE}
|
|
Create2DIntPoint(FButtonRect.Right - LARGEBUTTON_RADIUS + 1, FButtonRect.Top),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
cpRightTop,
|
|
FrameColor,
|
|
ClipRect);
|
|
TGuiTools.DrawHLine(ABuffer,
|
|
FButtonRect.Left + LARGEBUTTON_RADIUS,
|
|
FButtonRect.Right - LARGEBUTTON_RADIUS,
|
|
FButtonRect.Top,
|
|
FrameColor,
|
|
ClipRect);
|
|
TGuiTools.DrawVLine(ABuffer,
|
|
FButtonRect.Left,
|
|
FButtonRect.Top + LARGEBUTTON_RADIUS,
|
|
FButtonRect.Bottom,
|
|
FrameColor,
|
|
ClipRect);
|
|
TGuiTools.DrawVLine(ABuffer,
|
|
FButtonRect.Right,
|
|
FButtonRect.Top + LARGEBUTTON_RADIUS,
|
|
FButtonRect.Bottom,
|
|
FrameColor,
|
|
ClipRect);
|
|
{$ENDREGION}
|
|
|
|
// *** Dropdown ***
|
|
|
|
{$REGION 'Ustalanie kolorów'}
|
|
if FButtonState = bsDropdownHottrack then
|
|
begin
|
|
FrameColor:=FAppearance.Element.HotTrackFrameColor;
|
|
InnerLightColor:=FAppearance.Element.HotTrackInnerLightColor;
|
|
InnerDarkColor:=FAppearance.Element.HotTrackInnerDarkColor;
|
|
GradientFromColor:=FAppearance.Element.HotTrackGradientFromColor;
|
|
GradientToColor:=FAppearance.Element.HotTrackGradientToColor;
|
|
GradientKind:=FAppearance.Element.HotTrackGradientType;
|
|
end else
|
|
if FButtonState = bsDropdownPressed then
|
|
begin
|
|
FrameColor:=FAppearance.Element.ActiveFrameColor;
|
|
InnerLightColor:=FAppearance.Element.ActiveInnerLightColor;
|
|
InnerDarkColor:=FAppearance.Element.ActiveInnerDarkColor;
|
|
GradientFromColor:=FAppearance.Element.ActiveGradientFromColor;
|
|
GradientToColor:=FAppearance.Element.ActiveGradientToColor;
|
|
GradientKind:=FAppearance.Element.ActiveGradientType;
|
|
end
|
|
else
|
|
begin
|
|
FrameColor:=TColorTools.Brighten(FAppearance.Element.HotTrackFrameColor,20);
|
|
InnerLightColor:=TColorTools.Brighten(FAppearance.Element.HotTrackInnerLightColor,20);
|
|
InnerDarkColor:=TColorTools.Brighten(FAppearance.Element.HotTrackInnerDarkColor,20);
|
|
GradientFromColor:=TColorTools.Brighten(FAppearance.Element.HotTrackGradientFromColor,20);
|
|
GradientToColor:=TColorTools.Brighten(FAppearance.Element.HotTrackGradientToColor,20);
|
|
GradientKind:=FAppearance.Element.HotTrackGradientType;
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
{$REGION 'T³o dropdown'}
|
|
DrawRgn:=CreateRectRgn(FDropdownRect.left,
|
|
FDropdownRect.Top,
|
|
FDropdownRect.Right + 1,
|
|
FDropdownRect.Bottom - LARGEBUTTON_RADIUS + 1);
|
|
|
|
TmpRgn:=CreateRectRgn(FDropdownRect.left + LARGEBUTTON_RADIUS,
|
|
FDropdownRect.Bottom - LARGEBUTTON_RADIUS + 1,
|
|
FDropdownRect.Right - LARGEBUTTON_RADIUS + 1,
|
|
FDropdownRect.Bottom + 1);
|
|
CombineRgn(DrawRgn, DrawRgn, TmpRgn, RGN_OR);
|
|
DeleteObject(TmpRgn);
|
|
|
|
TmpRgn:=CreateEllipticRgn(FDropdownRect.Left,
|
|
FDropdownRect.bottom - 2 * LARGEBUTTON_RADIUS + 1,
|
|
FDropdownRect.left + 2 * LARGEBUTTON_RADIUS + 1,
|
|
FDropdownRect.Bottom + 2);
|
|
CombineRgn(DrawRgn, DrawRgn, TmpRgn, RGN_OR);
|
|
DeleteObject(TmpRgn);
|
|
|
|
TmpRgn:=CreateEllipticRgn(FDropdownRect.Right - 2 * LARGEBUTTON_RADIUS + 1,
|
|
FDropdownRect.Bottom - 2 * LARGEBUTTON_RADIUS + 1,
|
|
FDropdownRect.Right + 2,
|
|
FDropdownRect.Bottom + 2);
|
|
CombineRgn(DrawRgn, DrawRgn, TmpRgn, RGN_OR);
|
|
DeleteObject(TmpRgn);
|
|
|
|
TGuiTools.DrawRegion(ABuffer.Canvas,
|
|
DrawRgn,
|
|
FRect,
|
|
GradientFromColor,
|
|
GradientToColor,
|
|
GradientKind,
|
|
ClipRect);
|
|
DeleteObject(DrawRgn);
|
|
{$ENDREGION}
|
|
|
|
{$REGION 'Ramka dropdown'}
|
|
// Wewnêtrzna ramka
|
|
|
|
TGuiTools.DrawAARoundCorner(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(FDropdownRect.Left + 1, FDropdownRect.Bottom - LARGEBUTTON_RADIUS),
|
|
{$ELSE}
|
|
Create2DIntPoint(FDropdownRect.Left + 1, FDropdownRect.Bottom - LARGEBUTTON_RADIUS),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
cpLeftBottom,
|
|
InnerLightColor);
|
|
TGuiTools.DrawAARoundCorner(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(FDropdownRect.right - LARGEBUTTON_RADIUS, FDropdownRect.Bottom - LARGEBUTTON_RADIUS),
|
|
{$ELSE}
|
|
Create2DIntPoint(FDropdownRect.right - LARGEBUTTON_RADIUS, FDropdownRect.Bottom - LARGEBUTTON_RADIUS),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
cpRightBottom,
|
|
InnerLightColor);
|
|
TGuiTools.DrawHLine(ABuffer,
|
|
FDropdownRect.Left + LARGEBUTTON_RADIUS + 1,
|
|
FDropdownRect.Right - LARGEBUTTON_RADIUS - 1,
|
|
FDropdownRect.Bottom - 1,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
TGuiTools.DrawVLine(ABuffer,
|
|
FDropdownRect.Left + 1,
|
|
FDropDownRect.Top + 1,
|
|
FDropDownRect.Bottom - LARGEBUTTON_RADIUS - 1,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
TGuiTools.DrawVLine(ABuffer,
|
|
FDropdownRect.Right - 1,
|
|
FDropDownRect.Top + 1,
|
|
FDropDownRect.Bottom - LARGEBUTTON_RADIUS - 1,
|
|
InnerLightColor,
|
|
ClipRect);
|
|
|
|
if FButtonState = bsDropdownPressed then
|
|
TGuiTools.DrawHLine(ABuffer,
|
|
FDropdownRect.Left + 1,
|
|
FDropdownRect.Right - 1,
|
|
FDropdownRect.Top,
|
|
FrameColor,
|
|
ClipRect)
|
|
else
|
|
TGuiTools.DrawHLine(ABuffer,
|
|
FDropdownRect.Left + 1,
|
|
FDropdownRect.Right - 1,
|
|
FDropdownRect.Top,
|
|
InnerDarkColor,
|
|
ClipRect);
|
|
|
|
|
|
// Zewnêtrzna ramka
|
|
TGuiTools.DrawAARoundCorner(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(FDropdownRect.Left, FDropdownRect.Bottom - LARGEBUTTON_RADIUS + 1),
|
|
{$ELSE}
|
|
Create2DIntPoint(FDropdownRect.Left, FDropdownRect.Bottom - LARGEBUTTON_RADIUS + 1),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
cpLeftBottom,
|
|
FrameColor);
|
|
TGuiTools.DrawAARoundCorner(ABuffer,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(FDropdownRect.right - LARGEBUTTON_RADIUS + 1, FDropdownRect.Bottom - LARGEBUTTON_RADIUS + 1),
|
|
{$ELSE}
|
|
Create2DIntPoint(FDropdownRect.right - LARGEBUTTON_RADIUS + 1, FDropdownRect.Bottom - LARGEBUTTON_RADIUS + 1),
|
|
{$ENDIF}
|
|
LARGEBUTTON_RADIUS,
|
|
cpRightBottom,
|
|
FrameColor);
|
|
TGuiTools.DrawHLine(ABuffer,
|
|
FDropdownRect.Left + LARGEBUTTON_RADIUS,
|
|
FDropdownRect.Right - LARGEBUTTON_RADIUS,
|
|
FDropdownRect.Bottom,
|
|
FrameColor,
|
|
ClipRect);
|
|
TGuiTools.DrawVLine(ABuffer,
|
|
FDropdownRect.Left,
|
|
FDropDownRect.Top,
|
|
FDropDownRect.Bottom - LARGEBUTTON_RADIUS,
|
|
FrameColor,
|
|
ClipRect);
|
|
TGuiTools.DrawVLine(ABuffer,
|
|
FDropdownRect.Right,
|
|
FDropDownRect.Top,
|
|
FDropDownRect.Bottom - LARGEBUTTON_RADIUS,
|
|
FrameColor,
|
|
ClipRect);
|
|
{$ENDREGION}
|
|
|
|
{$ENDREGION}
|
|
end else
|
|
raise InternalException.create('TSpkLargeButton.Draw: Nieprawid³owa wartoœæ FButtonState!');
|
|
|
|
// *** Ikona ***
|
|
if not(FEnabled) then
|
|
begin
|
|
{$REGION 'Ikona wy³¹czona'}
|
|
if (FLargeImageIndex>=0) and
|
|
(FDisabledLargeImages<>nil) and
|
|
(FLargeImageIndex<FDisabledLargeImages.Count) then
|
|
begin
|
|
x:=FRect.left + (FRect.Width - FLargeImages.Width) div 2;
|
|
y:=FRect.top + LARGEBUTTON_BORDER_SIZE + LARGEBUTTON_GLYPH_MARGIN;
|
|
|
|
TGuiTools.DrawImage(ABuffer.Canvas,
|
|
FDisabledLargeImages,
|
|
FLargeImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x, y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x, y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end else
|
|
if (FLargeImageIndex>=0) and
|
|
(FLargeImages<>nil) and
|
|
(FLargeImageIndex<FLargeImages.Count) then
|
|
begin
|
|
x:=FRect.left + (FRect.Width - FLargeImages.Width) div 2;
|
|
y:=FRect.top + LARGEBUTTON_BORDER_SIZE + LARGEBUTTON_GLYPH_MARGIN;
|
|
|
|
TGuiTools.DrawDisabledImage(ABuffer.Canvas,
|
|
FLargeImages,
|
|
FLargeImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x, y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x, y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end;
|
|
{$ENDREGION}
|
|
end
|
|
else
|
|
begin
|
|
{$REGION 'Ikona zwyk³a'}
|
|
if (FLargeImageIndex>=0) and
|
|
(FLargeImages<>nil) and
|
|
(FLargeImageIndex<FLargeImages.Count) then
|
|
begin
|
|
x:=FRect.left + (FRect.Width - FLargeImages.Width) div 2;
|
|
y:=FRect.top + LARGEBUTTON_BORDER_SIZE + LARGEBUTTON_GLYPH_MARGIN;
|
|
|
|
TGUITools.DrawImage(ABuffer.Canvas,
|
|
FLargeImages,
|
|
FLargeImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x,y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x,y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end;
|
|
{$ENDREGION}
|
|
end;
|
|
|
|
// *** Tekst ***
|
|
if not(FEnabled) then
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.IdleCaptionColor);
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.HotTrackCaptionColor);
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=TColorTools.ColorToGrayscale(FAppearance.ELement.ActiveCaptionColor);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=FAppearance.Element.IdleCaptionColor;
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=FAppearance.Element.HotTrackCaptionColor;
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=FAppearance.ELement.ActiveCaptionColor;
|
|
end;
|
|
end;
|
|
|
|
ABuffer.Canvas.Font.assign(FAppearance.Element.CaptionFont);
|
|
ABuffer.Canvas.Font.Color:=FontColor;
|
|
|
|
TextHeight:=ABuffer.Canvas.Textheight('Wy');
|
|
|
|
x:=FRect.Left + (FRect.width - ABuffer.Canvas.Textwidth(FCaption)) div 2;
|
|
y:=FRect.Top + LARGEBUTTON_CAPTION_TOP_RAIL - TextHeight div 2;
|
|
TGUITools.DrawText(ABuffer.Canvas, x, y, FCaption, FontColor, ClipRect);
|
|
|
|
// *** Chevron dropdown ***
|
|
|
|
if not(FEnabled) then
|
|
begin
|
|
case FButtonState of
|
|
bsIdle: FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.IdleCaptionColor);
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.HotTrackCaptionColor);
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=TColorTools.ColorToGrayscale(FAppearance.ELement.ActiveCaptionColor);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
case FButtonState of
|
|
bsIdle: FontColor:=FAppearance.Element.IdleCaptionColor;
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=FAppearance.Element.HotTrackCaptionColor;
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=FAppearance.ELement.ActiveCaptionColor;
|
|
end;
|
|
end;
|
|
|
|
ABuffer.Canvas.Font.Charset:=DEFAULT_CHARSET;
|
|
ABuffer.Canvas.Font.Name:='Marlett';
|
|
ABuffer.Canvas.Font.Size:=8;
|
|
ABuffer.Canvas.Font.Style:=[];
|
|
ABuffer.Canvas.Font.Orientation:=0;
|
|
|
|
x:=FDropdownRect.Left + (FDropdownRect.width - ABuffer.Canvas.Textwidth('u')) div 2;
|
|
y:=FDropdownRect.bottom - ABuffer.Canvas.Textheight('u') - LARGEBUTTON_CHEVRON_HMARGIN;
|
|
TGUITools.DrawText(ABuffer.Canvas, x, y, 'u', FontColor, ClipRect);
|
|
|
|
{$ENDREGION}
|
|
end;
|
|
end;
|
|
|
|
procedure TSpkLargeButton.FindBreakPlace(s: string; out Position : integer; out Width : integer);
|
|
|
|
var i : integer;
|
|
Bitmap : TBitmap;
|
|
BeforeWidth, AfterWidth : integer;
|
|
|
|
begin
|
|
Position:=-1;
|
|
Width:=-1;
|
|
|
|
if FToolbarDispatch=nil then
|
|
exit;
|
|
if FAppearance=nil then
|
|
exit;
|
|
|
|
Bitmap:=FToolbarDispatch.GetTempBitmap;
|
|
if Bitmap=nil then
|
|
exit;
|
|
|
|
Bitmap.canvas.font.assign(FAppearance.Element.CaptionFont);
|
|
|
|
Width:=Bitmap.Canvas.TextWidth(FCaption);
|
|
|
|
if length(s)>0 then
|
|
for i := 1 to length(s) do
|
|
if s[i]=' ' then
|
|
begin
|
|
if i>1 then
|
|
BeforeWidth:=Bitmap.Canvas.TextWidth(copy(s,1,i-1)) else
|
|
BeforeWidth:=0;
|
|
|
|
if i<length(s) then
|
|
AfterWidth:=Bitmap.Canvas.TextWidth(copy(s,i+1,length(s)-i)) else
|
|
AfterWidth:=0;
|
|
|
|
if (Position=-1) or (max(BeforeWidth,AfterWidth)<Width) then
|
|
begin
|
|
Width:=max(BeforeWidth,AfterWidth);
|
|
Position:=i;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TSpkLargeButton.GetDropdownPoint: T2DIntPoint;
|
|
begin
|
|
{$IFDEF EnhancedRecordSupport}
|
|
case FButtonKind of
|
|
bkDropdown: result:=T2DIntPoint.Create(FButtonRect.left, FButtonRect.Bottom+1);
|
|
bkButtonDropdown: result:=T2DIntPoint.Create(FDropdownRect.left, FDropdownRect.Bottom+1);
|
|
else
|
|
result:=T2DIntPoint.Create(0,0);
|
|
end;
|
|
{$ELSE}
|
|
case FButtonKind of
|
|
bkDropdown: result.Create(FButtonRect.left, FButtonRect.Bottom+1);
|
|
bkButtonDropdown: result.Create(FDropdownRect.left, FDropdownRect.Bottom+1);
|
|
else
|
|
result.Create(0,0);
|
|
end;
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function TSpkLargeButton.GetGroupBehaviour: TSpkItemGroupBehaviour;
|
|
begin
|
|
result:=gbSingleItem;
|
|
end;
|
|
|
|
function TSpkLargeButton.GetSize: TSpkItemSize;
|
|
begin
|
|
result:=isLarge;
|
|
end;
|
|
|
|
function TSpkLargeButton.GetTableBehaviour: TSpkItemTableBehaviour;
|
|
begin
|
|
result:=tbBeginsColumn;
|
|
end;
|
|
|
|
function TSpkLargeButton.GetWidth: integer;
|
|
|
|
var GlyphWidth : integer;
|
|
TextWidth : integer;
|
|
Bitmap : TBitmap;
|
|
BreakPos, RowWidth : integer;
|
|
|
|
begin
|
|
result:=-1;
|
|
|
|
if FToolbarDispatch=nil then
|
|
exit;
|
|
if FAppearance=nil then
|
|
exit;
|
|
|
|
Bitmap:=FToolbarDispatch.GetTempBitmap;
|
|
if Bitmap=nil then
|
|
exit;
|
|
|
|
// *** Glyph ***
|
|
if FLargeImages<>nil then
|
|
GlyphWidth:=2 * LARGEBUTTON_GLYPH_MARGIN + FLargeImages.Width else
|
|
GlyphWidth:=0;
|
|
|
|
// *** Tekst ***
|
|
if FButtonKind = bkButton then
|
|
begin
|
|
// £amiemy etykietê
|
|
FindBreakPlace(FCaption,BreakPos,RowWidth);
|
|
TextWidth:=2 * LARGEBUTTON_CAPTION_HMARGIN + RowWidth;
|
|
end
|
|
else
|
|
begin
|
|
// Nie ³amiemy etykiety
|
|
Bitmap.canvas.font.assign(FAppearance.Element.CaptionFont);
|
|
TextWidth:=2 * LARGEBUTTON_CAPTION_HMARGIN + Bitmap.Canvas.TextWidth(FCaption);
|
|
end;
|
|
|
|
result:=max(LARGEBUTTON_MIN_WIDTH, max(GlyphWidth, TextWidth));
|
|
end;
|
|
|
|
procedure TSpkLargeButton.SetLargeImageIndex(const Value: TImageIndex);
|
|
begin
|
|
FLargeImageIndex:=Value;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyMetricsChanged;
|
|
end;
|
|
|
|
{ TSpkSmallButton }
|
|
|
|
procedure TSpkSmallButton.CalcRects;
|
|
|
|
var RectVector : T2DIntVector;
|
|
|
|
begin
|
|
ConstructRects(FButtonRect, FDropdownRect);
|
|
{$IFDEF EnhancedRecordSupport}
|
|
RectVector:=T2DIntVector.Create(FRect.Left, FRect.Top);
|
|
{$ELSE}
|
|
RectVector.Create(FRect.Left, FRect.Top);
|
|
{$ENDIF}
|
|
FButtonRect:=FButtonRect + RectVector;
|
|
FDropdownRect:=FDropdownRect + RectVector;
|
|
end;
|
|
|
|
procedure TSpkSmallButton.ConstructRects(var BtnRect, DropRect: T2DIntRect);
|
|
|
|
var BtnWidth : integer;
|
|
DropdownWidth: Integer;
|
|
Bitmap : TBitmap;
|
|
TextWidth: Integer;
|
|
AdditionalPadding: Boolean;
|
|
|
|
begin
|
|
{$IFDEF EnhancedRecordSupport}
|
|
BtnRect:=T2DIntRect.Create(0, 0, 0, 0);
|
|
DropRect:=T2DIntRect.Create(0, 0, 0, 0);
|
|
{$ELSE}
|
|
BtnRect.Create(0, 0, 0, 0);
|
|
DropRect.Create(0, 0, 0, 0);
|
|
{$ENDIF}
|
|
|
|
if not(assigned(FToolbarDispatch)) then
|
|
exit;
|
|
if not(assigned(FAppearance)) then
|
|
exit;
|
|
|
|
Bitmap:=FToolbarDispatch.GetTempBitmap;
|
|
if not(assigned(Bitmap)) then
|
|
exit;
|
|
|
|
// *** Niezale¿nie od rodzaju, musi byæ miejsce dla ikony i/lub tekstu ***
|
|
|
|
BtnWidth:=0;
|
|
AdditionalPadding:=false;
|
|
|
|
// Ikona
|
|
if FImageIndex<>-1 then
|
|
begin
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_PADDING + SMALLBUTTON_GLYPH_WIDTH;
|
|
AdditionalPadding:=true;
|
|
end;
|
|
|
|
// Tekst
|
|
if FShowCaption then
|
|
begin
|
|
Bitmap.Canvas.Font.assign(FAppearance.Element.CaptionFont);
|
|
TextWidth:=Bitmap.Canvas.TextWidth(FCaption);
|
|
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_PADDING + TextWidth;
|
|
AdditionalPadding:=true;
|
|
end;
|
|
|
|
// Padding za tekstem lub ikon¹
|
|
if AdditionalPadding then
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_PADDING;
|
|
|
|
// Szerokoœæ zawartoœci przycisku musi wynosiæ co najmniej SMALLBUTTON_MIN_WIDTH
|
|
BtnWidth:=max(SMALLBUTTON_MIN_WIDTH, BtnWidth);
|
|
|
|
// *** Dropdown ***
|
|
case FButtonKind of
|
|
bkButton: begin
|
|
// Lewa krawêdŸ przycisku
|
|
if FGroupBehaviour in [gbContinuesGroup, gbEndsGroup] then
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_HALF_BORDER_WIDTH else
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_BORDER_WIDTH;
|
|
|
|
// Prawa krawêdŸ przycisku
|
|
if (FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) then
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_HALF_BORDER_WIDTH else
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_BORDER_WIDTH;
|
|
|
|
{$IFDEF EnhancedRecordSupport}
|
|
BtnRect:=T2DIntRect.Create(0, 0, BtnWidth - 1, PANE_ROW_HEIGHT - 1);
|
|
DropRect:=T2DIntRect.Create(0, 0, 0, 0);
|
|
{$ELSE}
|
|
BtnRect.Create(0, 0, BtnWidth - 1, PANE_ROW_HEIGHT - 1);
|
|
DropRect.Create(0, 0, 0, 0);
|
|
{$ENDIF}
|
|
end;
|
|
bkButtonDropdown: begin
|
|
// Lewa krawêdŸ przycisku
|
|
if FGroupBehaviour in [gbContinuesGroup, gbEndsGroup] then
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_HALF_BORDER_WIDTH else
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_BORDER_WIDTH;
|
|
|
|
// Prawa krawêdŸ przycisku
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_HALF_BORDER_WIDTH;
|
|
|
|
// Lewa krawêdŸ i zawartoœæ pola dropdown
|
|
DropdownWidth:=SMALLBUTTON_HALF_BORDER_WIDTH + SMALLBUTTON_DROPDOWN_WIDTH;
|
|
|
|
// Prawa krawêdŸ pola dropdown
|
|
if (FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) then
|
|
DropdownWidth:=DropdownWidth + SMALLBUTTON_HALF_BORDER_WIDTH else
|
|
DropdownWidth:=DropdownWidth + SMALLBUTTON_BORDER_WIDTH;
|
|
|
|
{$IFDEF EnhancedRecordSupport}
|
|
BtnRect:=T2DIntRect.Create(0, 0, BtnWidth - 1, PANE_ROW_HEIGHT - 1);
|
|
DropRect:=T2DIntRect.Create(BtnRect.right+1,
|
|
0,
|
|
BtnRect.right+DropdownWidth,
|
|
PANE_ROW_HEIGHT - 1);
|
|
{$ELSE}
|
|
BtnRect.Create(0, 0, BtnWidth - 1, PANE_ROW_HEIGHT - 1);
|
|
DropRect.Create(BtnRect.right+1, 0,
|
|
BtnRect.right+DropdownWidth, PANE_ROW_HEIGHT - 1);
|
|
{$ENDIF}
|
|
end;
|
|
bkDropdown: begin
|
|
// Lewa krawêdŸ przycisku
|
|
if FGroupBehaviour in [gbContinuesGroup, gbEndsGroup] then
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_HALF_BORDER_WIDTH else
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_BORDER_WIDTH;
|
|
|
|
// Prawa krawêdŸ przycisku
|
|
if (FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) then
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_HALF_BORDER_WIDTH else
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_BORDER_WIDTH;
|
|
|
|
// Dodatkowy obszar na dropdown + miejsce na œrodkow¹ krawêdŸ,
|
|
// dla kompatybilnoœci wymiarów z dkButtonDropdown
|
|
BtnWidth:=BtnWidth + SMALLBUTTON_BORDER_WIDTH + SMALLBUTTON_DROPDOWN_WIDTH;
|
|
|
|
{$IFDEF EnhancedRecordSupport}
|
|
BtnRect:=T2DIntRect.Create(0, 0, BtnWidth - 1, PANE_ROW_HEIGHT - 1);
|
|
DropRect:=T2DIntRect.Create(0, 0, 0, 0);
|
|
{$ELSE}
|
|
BtnRect.Create(0, 0, BtnWidth - 1, PANE_ROW_HEIGHT - 1);
|
|
DropRect.Create(0, 0, 0, 0);
|
|
{$ENDIF}
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
constructor TSpkSmallButton.Create(AOwner: TComponent);
|
|
begin
|
|
inherited Create(AOwner);
|
|
FImageIndex:=-1;
|
|
FTableBehaviour:=tbContinuesRow;
|
|
FGroupBehaviour:=gbSingleItem;
|
|
FHideFrameWhenIdle:=false;
|
|
FShowCaption:=true;
|
|
end;
|
|
|
|
procedure TSpkSmallButton.Draw(ABuffer: TBitmap; ClipRect: T2DIntRect);
|
|
var
|
|
FontColor: TColor;
|
|
x: Integer;
|
|
y: Integer;
|
|
begin
|
|
if FToolbarDispatch=nil then
|
|
exit;
|
|
if FAppearance=nil then
|
|
exit;
|
|
|
|
if (FRect.width<2*LARGEBUTTON_RADIUS) or (FRect.Height<2*LARGEBUTTON_RADIUS) then
|
|
exit;
|
|
|
|
// *** Przycisk ***
|
|
|
|
// T³o i ramka
|
|
{$REGION 'Rysowanie przycisku'}
|
|
if (FButtonState = bsIdle) and (not(FHideFrameWhenIdle)) then
|
|
begin
|
|
with FAppearance.Element do
|
|
TButtonTools.DrawButton(ABuffer,
|
|
FButtonRect,
|
|
IdleFrameColor,
|
|
IdleInnerLightColor,
|
|
IdleInnerDarkColor,
|
|
IdleGradientFromColor,
|
|
IdleGradientToColor,
|
|
IdleGradientType,
|
|
(FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]),
|
|
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) or (FButtonKind = bkButtonDropdown),
|
|
false,
|
|
false,
|
|
SMALLBUTTON_RADIUS,
|
|
ClipRect);
|
|
end else
|
|
if (FButtonState=bsBtnHottrack) then
|
|
begin
|
|
with FAppearance.Element do
|
|
TButtonTools.DrawButton(ABuffer,
|
|
FButtonRect,
|
|
HotTrackFrameColor,
|
|
HotTrackInnerLightColor,
|
|
HotTrackInnerDarkColor,
|
|
HotTrackGradientFromColor,
|
|
HotTrackGradientToColor,
|
|
HotTrackGradientType,
|
|
(FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]),
|
|
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) or (FButtonKind = bkButtonDropdown),
|
|
false,
|
|
false,
|
|
SMALLBUTTON_RADIUS,
|
|
ClipRect);
|
|
end else
|
|
if (FButtonState = bsBtnPressed) then
|
|
begin
|
|
with FAppearance.Element do
|
|
TButtonTools.DrawButton(ABuffer,
|
|
FButtonRect,
|
|
ActiveFrameColor,
|
|
ActiveInnerLightColor,
|
|
ActiveInnerDarkColor,
|
|
ActiveGradientFromColor,
|
|
ActiveGradientToColor,
|
|
ActiveGradientType,
|
|
(FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]),
|
|
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) or (FButtonKind = bkButtonDropdown),
|
|
false,
|
|
false,
|
|
SMALLBUTTON_RADIUS,
|
|
ClipRect);
|
|
end else
|
|
if (FButtonState in [bsDropdownHottrack, bsDropdownPressed]) then
|
|
begin
|
|
with FAppearance.Element do
|
|
TButtonTools.DrawButton(ABuffer,
|
|
FButtonRect,
|
|
TColorTools.Brighten(HotTrackFrameColor,40),
|
|
TColorTools.Brighten(HotTrackInnerLightColor,40),
|
|
TColorTools.Brighten(HotTrackInnerDarkColor,40),
|
|
TColorTools.Brighten(HotTrackGradientFromColor,40),
|
|
TColorTools.Brighten(HotTrackGradientToColor,40),
|
|
HotTrackGradientType,
|
|
(FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]),
|
|
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]) or (FButtonKind = bkButtonDropdown),
|
|
false,
|
|
false,
|
|
SMALLBUTTON_RADIUS,
|
|
ClipRect);
|
|
end;
|
|
{$ENDREGION}
|
|
|
|
// Ikona
|
|
if not(FEnabled) then
|
|
begin
|
|
{$REGION 'Ikona wy³¹czona'}
|
|
if (FImageIndex>=0) and
|
|
(FDisabledImages<>nil) and
|
|
(FImageIndex<FDisabledImages.Count) then
|
|
begin
|
|
if (FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]) then
|
|
x:=FButtonRect.Left + SMALLBUTTON_HALF_BORDER_WIDTH + SMALLBUTTON_PADDING else
|
|
x:=FButtonRect.Left + SMALLBUTTON_BORDER_WIDTH + SMALLBUTTON_PADDING;
|
|
y:=FButtonRect.top + (FButtonRect.height - FDisabledImages.Height) div 2;
|
|
|
|
TGuiTools.DrawImage(ABuffer.Canvas,
|
|
FDisabledImages,
|
|
FImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x, y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x, y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end else
|
|
if (FImageIndex>=0) and
|
|
(FImages<>nil) and
|
|
(FImageIndex<FImages.Count) then
|
|
begin
|
|
if (FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]) then
|
|
x:=FButtonRect.Left + SMALLBUTTON_HALF_BORDER_WIDTH + SMALLBUTTON_PADDING else
|
|
x:=FButtonRect.Left + SMALLBUTTON_BORDER_WIDTH + SMALLBUTTON_PADDING;
|
|
y:=FButtonRect.top + (FButtonRect.height - FImages.Height) div 2;
|
|
|
|
TGuiTools.DrawDisabledImage(ABuffer.Canvas,
|
|
FImages,
|
|
FImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x, y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x, y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end;
|
|
{$ENDREGION}
|
|
end
|
|
else
|
|
begin
|
|
{$REGION 'Ikona zwyk³a'}
|
|
if (FImageIndex>=0) and
|
|
(FImages<>nil) and
|
|
(FImageIndex<FImages.Count) then
|
|
begin
|
|
if (FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]) then
|
|
x:=FButtonRect.Left + SMALLBUTTON_HALF_BORDER_WIDTH + SMALLBUTTON_PADDING else
|
|
x:=FButtonRect.Left + SMALLBUTTON_BORDER_WIDTH + SMALLBUTTON_PADDING;
|
|
y:=FButtonRect.top + (FButtonRect.height - FImages.Height) div 2;
|
|
|
|
TGUITools.DrawImage(ABuffer.Canvas,
|
|
FImages,
|
|
FImageIndex,
|
|
{$IFDEF EnhancedRecordSupport}
|
|
T2DIntPoint.Create(x,y),
|
|
{$ELSE}
|
|
Create2DIntPoint(x,y),
|
|
{$ENDIF}
|
|
ClipRect);
|
|
end;
|
|
{$ENDREGION}
|
|
end;
|
|
|
|
// Tekst
|
|
if FShowCaption then
|
|
begin
|
|
ABuffer.Canvas.Font.Assign(FAppearance.Element.CaptionFont);
|
|
|
|
if not(FEnabled) then
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.IdleCaptionColor);
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.HotTrackCaptionColor);
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=TColorTools.ColorToGrayscale(FAppearance.ELement.ActiveCaptionColor);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=FAppearance.Element.IdleCaptionColor;
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=FAppearance.Element.HotTrackCaptionColor;
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=FAppearance.ELement.ActiveCaptionColor;
|
|
end;
|
|
end;
|
|
|
|
if (FGroupBehaviour in [gbContinuesGroup, gbEndsGroup]) then
|
|
x:=FButtonRect.Left + SMALLBUTTON_HALF_BORDER_WIDTH else
|
|
x:=FButtonRect.Left + SMALLBUTTON_BORDER_WIDTH;
|
|
|
|
if FImageIndex<>-1 then
|
|
x:=x + 2 * SMALLBUTTON_PADDING + SMALLBUTTON_GLYPH_WIDTH else
|
|
x:=x + SMALLBUTTON_PADDING;
|
|
y:=FButtonRect.Top + (FButtonRect.Height - ABuffer.Canvas.TextHeight('Wy')) div 2;
|
|
|
|
TGUITools.DrawText(ABuffer.Canvas,
|
|
x,
|
|
y,
|
|
FCaption,
|
|
FontColor,
|
|
ClipRect);
|
|
end;
|
|
|
|
// *** Dropdown ***
|
|
if FButtonKind = bkButton then
|
|
begin
|
|
// Nic dodatkowego do rysowania
|
|
end else
|
|
if FButtonKind = bkButtonDropdown then
|
|
begin
|
|
// T³o i ramka
|
|
{$REGION 'Rysowanie dropdowna'}
|
|
if (FButtonState = bsIdle) and (not(FHideFrameWhenIdle)) then
|
|
begin
|
|
with FAppearance.Element do
|
|
TButtonTools.DrawButton(ABuffer,
|
|
FDropdownRect,
|
|
IdleFrameColor,
|
|
IdleInnerLightColor,
|
|
IdleInnerDarkColor,
|
|
IdleGradientFromColor,
|
|
IdleGradientToColor,
|
|
IdleGradientType,
|
|
true,
|
|
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]),
|
|
false,
|
|
false,
|
|
SMALLBUTTON_RADIUS,
|
|
ClipRect);
|
|
end else
|
|
if (FButtonState in [bsBtnHottrack, bsBtnPressed]) then
|
|
begin
|
|
with FAppearance.Element do
|
|
TButtonTools.DrawButton(ABuffer,
|
|
FDropdownRect,
|
|
TColorTools.Brighten(HottrackFrameColor, 40),
|
|
TColorTools.Brighten(HottrackInnerLightColor, 40),
|
|
TColorTools.Brighten(HottrackInnerDarkColor, 40),
|
|
TColorTools.Brighten(HottrackGradientFromColor, 40),
|
|
TColorTools.Brighten(HottrackGradientToColor, 40),
|
|
HottrackGradientType,
|
|
true,
|
|
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]),
|
|
false,
|
|
false,
|
|
SMALLBUTTON_RADIUS,
|
|
ClipRect);
|
|
|
|
end else
|
|
if (FButtonState = bsDropdownHottrack) then
|
|
begin
|
|
with FAppearance.Element do
|
|
TButtonTools.DrawButton(ABuffer,
|
|
FDropdownRect,
|
|
HottrackFrameColor,
|
|
HottrackInnerLightColor,
|
|
HottrackInnerDarkColor,
|
|
HottrackGradientFromColor,
|
|
HottrackGradientToColor,
|
|
HottrackGradientType,
|
|
true,
|
|
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]),
|
|
false,
|
|
false,
|
|
SMALLBUTTON_RADIUS,
|
|
ClipRect);
|
|
end else
|
|
if (FButtonState = bsDropdownPressed) then
|
|
begin
|
|
with FAppearance.Element do
|
|
TButtonTools.DrawButton(ABuffer,
|
|
FDropdownRect,
|
|
ActiveFrameColor,
|
|
ActiveInnerLightColor,
|
|
ActiveInnerDarkColor,
|
|
ActiveGradientFromColor,
|
|
ActiveGradientToColor,
|
|
ActiveGradientType,
|
|
true,
|
|
(FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup]),
|
|
false,
|
|
false,
|
|
SMALLBUTTON_RADIUS,
|
|
ClipRect);
|
|
end;
|
|
|
|
// Chevron
|
|
if not(FEnabled) then
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.IdleCaptionColor);
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.HotTrackCaptionColor);
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=TColorTools.ColorToGrayscale(FAppearance.ELement.ActiveCaptionColor);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=FAppearance.Element.IdleCaptionColor;
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=FAppearance.Element.HotTrackCaptionColor;
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=FAppearance.ELement.ActiveCaptionColor;
|
|
end;
|
|
end;
|
|
|
|
ABuffer.Canvas.Font.Charset:=DEFAULT_CHARSET;
|
|
ABuffer.Canvas.Font.Name:='Marlett';
|
|
ABuffer.Canvas.Font.Size:=8;
|
|
ABuffer.Canvas.Font.Style:=[];
|
|
ABuffer.Canvas.Font.Orientation:=0;
|
|
|
|
if FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup] then
|
|
x:=FDropdownRect.Right - SMALLBUTTON_HALF_BORDER_WIDTH - (SMALLBUTTON_DROPDOWN_WIDTH + ABuffer.Canvas.Textwidth('u')) div 2 + 1 else
|
|
x:=FDropdownRect.Right - SMALLBUTTON_BORDER_WIDTH - (SMALLBUTTON_DROPDOWN_WIDTH + ABuffer.Canvas.Textwidth('u')) div 2 + 1;
|
|
y:=FDropdownRect.top + (FDropdownRect.height - ABuffer.Canvas.Textheight('u')) div 2;
|
|
TGUITools.DrawText(ABuffer.Canvas, x, y, 'u', FontColor, ClipRect);
|
|
{$ENDREGION}
|
|
end else
|
|
if FButtonKind = bkDropdown then
|
|
begin
|
|
// Chevron dropdown
|
|
|
|
if not(FEnabled) then
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.IdleCaptionColor);
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=TColorTools.ColorToGrayscale(FAppearance.Element.HotTrackCaptionColor);
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=TColorTools.ColorToGrayscale(FAppearance.ELement.ActiveCaptionColor);
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
FontColor:=clNone;
|
|
case FButtonState of
|
|
bsIdle: FontColor:=FAppearance.Element.IdleCaptionColor;
|
|
bsBtnHottrack,
|
|
bsDropdownHottrack : FontColor:=FAppearance.Element.HotTrackCaptionColor;
|
|
bsBtnPressed,
|
|
bsDropdownPressed: FontColor:=FAppearance.ELement.ActiveCaptionColor;
|
|
end;
|
|
end;
|
|
|
|
ABuffer.Canvas.Font.Charset:=DEFAULT_CHARSET;
|
|
ABuffer.Canvas.Font.Name:='Marlett';
|
|
ABuffer.Canvas.Font.Size:=8;
|
|
ABuffer.Canvas.Font.Style:=[];
|
|
ABuffer.Canvas.Font.Orientation:=0;
|
|
|
|
if FGroupBehaviour in [gbBeginsGroup, gbContinuesGroup] then
|
|
x:=FButtonRect.Right - SMALLBUTTON_HALF_BORDER_WIDTH - (SMALLBUTTON_DROPDOWN_WIDTH + ABuffer.Canvas.Textwidth('u')) div 2 + 1 else
|
|
x:=FButtonRect.Right - SMALLBUTTON_BORDER_WIDTH - (SMALLBUTTON_DROPDOWN_WIDTH + ABuffer.Canvas.Textwidth('u')) div 2 + 1;
|
|
y:=FButtonRect.top + (FButtonRect.height - ABuffer.Canvas.Textheight('u')) div 2;
|
|
TGUITools.DrawText(ABuffer.Canvas, x, y, 'u', FontColor, ClipRect);
|
|
end;
|
|
|
|
{$ENDREGION}
|
|
end;
|
|
|
|
function TSpkSmallButton.GetDropdownPoint: T2DIntPoint;
|
|
begin
|
|
{$IFDEF EnhancedRecordSupport}
|
|
if FButtonKind in [bkButtonDropdown, bkDropdown] then
|
|
result:=T2DIntPoint.Create(FButtonRect.left, FButtonRect.bottom+1) else
|
|
result:=T2DIntPoint.Create(0,0);
|
|
{$ELSE}
|
|
if FButtonKind in [bkButtonDropdown, bkDropdown] then
|
|
result.Create(FButtonRect.left, FButtonRect.bottom+1) else
|
|
result.Create(0,0);
|
|
{$ENDIF}
|
|
end;
|
|
|
|
function TSpkSmallButton.GetGroupBehaviour: TSpkItemGroupBehaviour;
|
|
begin
|
|
result:=FGroupBehaviour;
|
|
end;
|
|
|
|
function TSpkSmallButton.GetSize: TSpkItemSize;
|
|
begin
|
|
result:=isNormal;
|
|
end;
|
|
|
|
function TSpkSmallButton.GetTableBehaviour: TSpkItemTableBehaviour;
|
|
begin
|
|
result:=FTableBehaviour;
|
|
end;
|
|
|
|
function TSpkSmallButton.GetWidth: integer;
|
|
|
|
var BtnRect, DropRect : T2DIntRect;
|
|
|
|
begin
|
|
result:=-1;
|
|
|
|
if FToolbarDispatch=nil then
|
|
exit;
|
|
if FAppearance=nil then
|
|
exit;
|
|
|
|
ConstructRects(BtnRect, DropRect);
|
|
|
|
if FButtonKind = bkButtonDropdown then
|
|
result:=DropRect.Right+1 else
|
|
result:=BtnRect.Right+1;
|
|
end;
|
|
|
|
procedure TSpkSmallButton.SetGroupBehaviour(
|
|
const Value: TSpkItemGroupBehaviour);
|
|
begin
|
|
FGroupBehaviour := Value;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyMetricsChanged;
|
|
end;
|
|
|
|
procedure TSpkSmallButton.SetHideFrameWhenIdle(const Value: boolean);
|
|
begin
|
|
FHideFrameWhenIdle := Value;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyVisualsChanged;
|
|
end;
|
|
|
|
procedure TSpkSmallButton.SetImageIndex(const Value: TImageIndex);
|
|
begin
|
|
FImageIndex:=Value;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyMetricsChanged;
|
|
end;
|
|
|
|
procedure TSpkSmallButton.SetShowCaption(const Value: boolean);
|
|
begin
|
|
FShowCaption := Value;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyMetricsChanged;
|
|
end;
|
|
|
|
procedure TSpkSmallButton.SetTableBehaviour(
|
|
const Value: TSpkItemTableBehaviour);
|
|
begin
|
|
FTableBehaviour := Value;
|
|
|
|
if assigned(FToolbarDispatch) then
|
|
FToolbarDispatch.NotifyMetricsChanged;
|
|
end;
|
|
|
|
|
|
end.
|