Componentes.Terceros.TB2k-TBX/official/2.1.6+2.1.beta1/TBX/TBXToolPals.pas

987 lines
29 KiB
ObjectPascal

unit TBXToolPals;
// TBX Package
// Copyright 2001-2004 Alex A. Denisov. All Rights Reserved
// See TBX.chm for license and installation instructions
//
// $Id: TBXToolPals.pas 7 2004-02-21 06:07:53Z $
interface
uses
Windows, Messages, Classes, SysUtils, Controls, Forms, Graphics, TB2Item, TBX,
TBXThemes;
{$I ..\..\Source\TB2Ver.inc}
{$I TBX.inc}
type
TRowColCount = 1..100;
TTBXCustomToolPalette = class;
TTPCalcSize = procedure(Sender: TTBXCustomToolPalette; Canvas: TCanvas;
var AWidth, AHeight: Integer) of object;
TTPGetCellVisible = procedure(Sender: TTBXCustomToolPalette;
ACol, ARow: Integer; var Visible: Boolean) of object;
TTPGetCellHint = procedure(Sender: TTBXCustomToolPalette;
ACol, ARow: Integer; var HintText: string) of object;
TTPDrawCellImage = procedure(Sender: TTBXCustomToolPalette; Canvas: TCanvas;
ARect: TRect; ACol, ARow: Integer; Selected, Hot, Enabled: Boolean) of object;
TTPCellClick = procedure(Sender: TTBXCustomToolPalette;
var ACol, ARow: Integer; var AllowChange: Boolean) of object;
TTBXToolPaletteOptions = set of (tpoCustomImages, tpoNoAutoSelect);
TTBXCustomToolPalette = class(TTBXCustomItem)
private
FColCount: TRowColCount;
FPaletteOptions: TTBXToolPaletteOptions;
FRowCount: TRowColCount;
FSelectedCell: TPoint;
FOnCalcImageSize: TTPCalcSize;
FOnChange: TNotifyEvent;
FOnCellClick: TTPCellClick;
FOnDrawCellImage: TTPDrawCellImage;
FOnGetCellVisible: TTPGetCellVisible;
FOnGetCellHint: TTPGetCellHint;
procedure SetColCount(Value: TRowColCount);
procedure SetPaletteOptions(Value: TTBXToolPaletteOptions);
procedure SetRowCount(Value: TRowColCount);
procedure SetSelectedCell(Value: TPoint);
protected
procedure DoCalcCellSize(Canvas: TCanvas; var AWidth, AHeight: Integer); virtual;
procedure DoCalcImageSize(Canvas: TCanvas; var AWidth, AHeight: Integer); virtual;
function DoCellClick(var ACol, ARow: Integer): Boolean; virtual;
procedure DoChange; virtual;
procedure DoDrawCellImage(Canvas: TCanvas; const ARect: TRect; ACol, ARow: Integer; ItemInfo: TTBXItemInfo); virtual;
procedure DoGetCellVisible(ACol, ARow: Integer; var Visible: Boolean); virtual;
procedure DoGetHint(ACell: TPoint; var HintText: string); virtual;
function GetItemViewerClass(AView: TTBView): TTBItemViewerClass; override;
procedure HandleClickCell(ACol, ARow: Integer); virtual;
property ColCount: TRowColCount read FColCount write SetColCount default 1;
property PaletteOptions: TTBXToolPaletteOptions read FPaletteOptions write SetPaletteOptions;
property RowCount: TRowColCount read FRowCount write SetRowCount default 1;
property SelectedCell: TPoint read FSelectedCell write SetSelectedCell;
property OnChange: TNotifyEvent read FOnChange write FOnChange;
property OnCalcImageSize: TTPCalcSize read FOnCalcImageSize write FOnCalcImageSize;
property OnCellClick: TTPCellClick read FOnCellClick write FOnCellClick;
property OnDrawCellImage: TTPDrawCellImage read FOnDrawCellImage write FOnDrawCellImage;
property OnGetCellVisible: TTPGetCellVisible read FOnGetCellVisible write FOnGetCellVisible;
property OnGetCellHint: TTPGetCellHint read FOnGetCellHint write FOnGetCellHint;
public
constructor Create(AOwner: TComponent); override;
end;
TTBXToolPalette = class(TTBXCustomToolPalette)
public
property SelectedCell;
published
property ColCount;
property HelpContext;
property Images;
property Options;
property PaletteOptions;
property RowCount;
property Stretch;
property Visible;
property OnChange;
property OnCalcImageSize;
property OnCellClick;
property OnDrawCellImage;
property OnGetCellHint;
property OnGetCellVisible;
end;
TTBXToolViewer = class(TTBXItemViewer)
private
FCellHeight: Integer;
FCellWidth: Integer;
FColCount: Integer;
FRowCount: Integer;
FHotCell: TPoint;
protected
Indent: Integer;
MouseIsDown: Boolean;
procedure CalcCellSize(Canvas: TCanvas; var AWidth, AHeight: Integer); virtual;
procedure CalcImageSize(Canvas: TCanvas; var AWidth, AHeight: Integer); virtual;
procedure CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer); override;
function GetImageIndex(Col, Row: Integer): Integer;
function GetCellAt(X, Y: Integer; out Col, Row: Integer): Boolean;
function GetCellRect(ClientAreaRect: TRect; Col, Row: Integer): TRect; virtual;
function GetHint(Col, Row: Integer): string;
procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW;
procedure DrawCell(Canvas: TCanvas; const CellRect: TRect; Col, Row: Integer; var ItemInfo: TTBXItemInfo);
procedure DrawCellImage(Canvas: TCanvas; const ARect: TRect; Col, Row: Integer; ItemInfo: TTBXItemInfo); virtual;
procedure Entering(OldSelected: TTBItemViewer); override;
procedure InvalidateCell(ACol, ARow: Integer);
function IsCellVisible(Cell: TPoint): Boolean; virtual;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure MouseDown(Shift: TShiftState; X, Y: Integer;var MouseDownOnMenu: Boolean); override;
procedure MouseMove(X, Y: Integer); override;
procedure MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean); override;
procedure Paint(const Canvas: TCanvas; const ClientAreaRect: TRect; IsHoverItem, IsPushed, UseDisabledShadow: Boolean); override;
property CellHeight: Integer read FCellHeight;
property CellWidth: Integer read FCellWidth;
property ColCount: Integer read FColCount;
property HotCell: TPoint read FHotCell;
property RowCount: Integer read FRowCount;
public
constructor Create(AView: TTBView; AItem: TTBCustomItem; AGroupLevel: Integer); override;
end;
{ TTBXCustomColorSet }
TTBXCustomColorSet = class;
TCSGetColorInfo = procedure(Sender: TTBXCustomColorSet; Col, Row: Integer;
var Color: TColor; var Name: string) of object;
TTBXCustomColorSet = class(TComponent)
private
FPalettes: TList;
FColCount: Integer;
FRowCount: Integer;
FOnGetColorInfo: TCSGetColorInfo;
procedure SetColCount(Value: Integer);
procedure SetRowCount(Value: Integer);
protected
procedure UpdateSize(NewColCount, NewRowCount: Integer); virtual;
function ColorToString(Color: TColor): string; virtual;
procedure GetColorInfo(Col, Row: Integer; out Color: TColor; out ColorName: string); virtual;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
function GetColor(Col, Row: Integer): TColor;
function GetName(Col, Row: Integer): string;
property ColCount: Integer read FColCount write SetColCount;
property RowCount: Integer read FRowCount write SetRowCount;
property OnGetColorInfo: TCSGetColorInfo read FOnGetColorInfo write FOnGetColorInfo;
end;
TTBXColorSet = class(TTBXCustomColorSet)
published
property ColCount;
property RowCount;
property OnGetColorInfo;
end;
TTBXColorPalette = class(TTBXCustomToolPalette)
private
FColor: TColor;
FColorSet: TTBXCustomColorSet;
procedure SetColorSet(Value: TTBXCustomColorSet);
procedure SetColor(Value: TColor);
protected
procedure DoCalcImageSize(Canvas: TCanvas; var AWidth, AHeight: Integer); override;
procedure DoChange; override;
procedure DoGetCellVisible(ACol, ARow: Integer; var Visible: Boolean); override;
procedure DoGetHint(ACell: TPoint; var HintText: string); override;
procedure DoDrawCellImage(Canvas: TCanvas; const ARect: TRect; ACol, ARow: Integer; ItemInfo: TTBXItemInfo); override;
function GetColorSet: TTBXCustomColorSet;
function GetCellColor(ACol, ARow: Integer): TColor; virtual;
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
public
constructor Create(AOwner: TComponent); override;
function FindCell(AColor: TColor): TPoint;
function ColorToString(AColor: TColor): string;
published
property Color: TColor read FColor write SetColor default clNone;
property ColorSet: TTBXCustomColorSet read FColorSet write SetColorSet;
property HelpContext;
property InheritOptions;
property MaskOptions;
property Options default [tboShowHint];
property PaletteOptions;
property Stretch;
property Visible;
property OnChange;
property OnCellClick;
property OnGetCellHint;
end;
implementation
uses ImgList, TBXUxThemes;
var
DefaultColorSet: TTBXCustomColorSet;
type
TTBViewAccess = class(TTBView);
{ TTBXCustomToolPalette }
constructor TTBXCustomToolPalette.Create(AOwner: TComponent);
begin
inherited;
FColCount := 1;
FRowCount := 1;
FSelectedCell.X := -1;
// Options := Options + [tboToolbarStyle];
end;
procedure TTBXCustomToolPalette.DoCalcCellSize(Canvas: TCanvas; var AWidth, AHeight: Integer);
begin
end;
procedure TTBXCustomToolPalette.DoCalcImageSize(Canvas: TCanvas; var AWidth, AHeight: Integer);
begin
if Assigned(FOnCalcImageSize) then FOnCalcImageSize(Self, Canvas, AWidth, AHeight);
end;
function TTBXCustomToolPalette.DoCellClick(var ACol, ARow: Integer): Boolean;
begin
Result := True;
if Assigned(FOnCellClick) then FOnCellClick(Self, ACol, ARow, Result);
end;
procedure TTBXCustomToolPalette.DoChange;
begin
if Assigned(FOnChange) then FOnChange(Self);
end;
procedure TTBXCustomToolPalette.DoDrawCellImage(Canvas: TCanvas;
const ARect: TRect; ACol, ARow: Integer; ItemInfo: TTBXItemInfo);
begin
if Assigned(FOnDrawCellImage) then
begin
FOnDrawCellImage(Self, Canvas, ARect, ACol, ARow, ItemInfo.Selected,
ItemInfo.HoverKind <> hkNone, ItemInfo.Enabled);
end;
end;
procedure TTBXCustomToolPalette.DoGetCellVisible(ACol, ARow: Integer; var Visible: Boolean);
begin
if Assigned(FOnGetCellVisible) then FOnGetCellVisible(Self, ACol, ARow, Visible);
end;
procedure TTBXCustomToolPalette.DoGetHint(ACell: TPoint; var HintText: string);
begin
if Assigned(FOnGetCellHint) then FOnGetCellHint(Self, ACell.X, ACell.Y, HintText);
end;
function TTBXCustomToolPalette.GetItemViewerClass(AView: TTBView): TTBItemViewerClass;
begin
Result := TTBXToolViewer;
end;
procedure TTBXCustomToolPalette.HandleClickCell(ACol, ARow: Integer);
begin
if DoCellClick(ACol, ARow) and not (tpoNoAutoSelect in PaletteOptions) then
SelectedCell := Point(ACol, ARow);
end;
procedure TTBXCustomToolPalette.SetColCount(Value: TRowColCount);
begin
if FColCount <> Value then
begin
FColCount := Value;
Change(True);
end;
end;
procedure TTBXCustomToolPalette.SetPaletteOptions(Value: TTBXToolPaletteOptions);
begin
if FPaletteOptions <> Value then
begin
FPaletteOptions := Value;
Change(True);
end;
end;
procedure TTBXCustomToolPalette.SetRowCount(Value: TRowColCount);
begin
if FRowCount <> Value then
begin
FRowCount := Value;
Change(True);
end;
end;
procedure TTBXCustomToolPalette.SetSelectedCell(Value: TPoint);
begin
FSelectedCell := Value;
Change(True);
DoChange;
end;
{ TTBXToolViewer }
procedure TTBXToolViewer.CalcCellSize(Canvas: TCanvas; var AWidth, AHeight: Integer);
begin
CalcImageSize(Canvas, AWidth, AHeight);
TTBXCustomToolPalette(Item).DoCalcCellSize(Canvas, AWidth, AHeight);
Inc(AWidth, 6);
Inc(AHeight, 6);
end;
procedure TTBXToolViewer.CalcImageSize(Canvas: TCanvas; var AWidth, AHeight: Integer);
var
ImgList: TCustomImageList;
begin
ImgList := GetImageList;
if ImgList <> nil then
begin
AWidth := ImgList.Width;
AHeight := ImgList.Height;
end
else
begin
AWidth := 16;
AHeight := 16;
end;
TTBXCustomToolPalette(Item).DoCalcImageSize(Canvas, AWidth, AHeight);
end;
procedure TTBXToolViewer.CalcSize(const Canvas: TCanvas; var AWidth, AHeight: Integer);
var
CellWidth, CellHeight: Integer;
begin
if not IsToolbarStyle then with CurrentTheme do
Indent := GetPopupMargin(Self) + MenuImageTextSpace + MenuLeftCaptionMargin - 3
else
Indent := 0;
FColCount := TTBXCustomToolPalette(Item).ColCount;
FRowCount := TTBXCustomToolPalette(Item).RowCount;
CalcCellSize(Canvas, CellWidth, CellHeight);
AWidth := Indent + CellWidth * ColCount;
if not IsToolbarStyle then Inc(AWidth, CurrentTheme.MenuRightCaptionMargin);
AHeight := CellHeight * RowCount;
if AWidth < 8 then AWidth := 8;
if AHeight < 8 then AHeight := 8;
end;
procedure TTBXToolViewer.CMHintShow(var Message: TCMHintShow);
var
Col, Row: Integer;
begin
with Message.HintInfo^ do
begin
if GetCellAt(CursorPos.X - BoundsRect.Left, CursorPos.Y - BoundsRect.Top, Col, Row) then
begin
CursorRect := GetCellRect(CursorRect, Col, Row);
HintStr := GetHint(Col, Row);
end
else HintStr := '';
end;
end;
constructor TTBXToolViewer.Create(AView: TTBView; AItem: TTBCustomItem; AGroupLevel: Integer);
begin
inherited;
FColCount := TTBXCustomToolPalette(AItem).ColCount;
FRowCount := TTBXCustomToolPalette(AItem).RowCount;
end;
procedure TTBXToolViewer.DrawCell(Canvas: TCanvas; const CellRect: TRect;
Col, Row: Integer; var ItemInfo: TTBXItemInfo);
var
ImageWidth, ImageHeight: Integer;
R: TRect;
begin
CurrentTheme.PaintButton(Canvas, CellRect, ItemInfo);
CalcImageSize(Canvas, ImageWidth, ImageHeight);
R := Bounds((CellRect.Right + CellRect.Left - ImageWidth) div 2,
(CellRect.Top + CellRect.Bottom - ImageHeight) div 2, ImageWidth, ImageHeight);
DrawCellImage(Canvas, R, Col, Row, ItemInfo);
end;
procedure TTBXToolViewer.DrawCellImage(Canvas: TCanvas; const ARect: TRect;
Col, Row: Integer; ItemInfo: TTBXItemInfo);
var
ImgIndex: Integer;
ImgList: TCustomImageList;
begin
if not (tpoCustomImages in TTBXCustomToolPalette(Item).PaletteOptions) then
begin
ImgIndex := GetImageIndex(Col, Row);
ImgList := GetImageList;
if (ImgList <> nil) and (ImgIndex >= 0) and (ImgIndex < ImgList.Count) then
CurrentTheme.PaintImage(Canvas, ARect, ItemInfo, ImgList, ImgIndex);
end;
TTBXCustomToolPalette(Item).DoDrawCellImage(Canvas, ARect, Col, Row, ItemInfo);
end;
procedure TTBXToolViewer.Entering(OldSelected: TTBItemViewer);
begin
FHotCell := Point(-1, 0);
if (View is TTBXPopupView) and (OldSelected <> nil) then
begin
if OldSelected.Index > Index then
begin
FHotCell := Point(ColCount - 1, RowCount - 1);
while (FHotCell.X > 0) and not IsCellVisible(FHotCell) do Dec(FHotCell.X);
end
else if OldSelected.Index < Index then
FHotCell := Point(0, 0);
end;
inherited Entering(OldSelected);
end;
function TTBXToolViewer.GetCellAt(X, Y: Integer; out Col, Row: Integer): Boolean;
begin
{ Returns true if there is a cell at (X,Y) point }
if (CellWidth = 0) or (CellHeight = 0) then
begin
Col := 0;
Row := 0;
end
else if not TTBXCustomToolPalette(Item).Stretch then
begin
Col := (X - Indent) div CellWidth;
Row := Y div CellHeight;
end
else
begin
Col := (X - Indent) * ColCount div (BoundsRect.Right - BoundsRect.Left);
Row := Y * RowCount div (BoundsRect.Bottom - BoundsRect.Top);
end;
Result := IsCellVisible(Point(Col, Row));
end;
function TTBXToolViewer.GetCellRect(ClientAreaRect: TRect; Col, Row: Integer): TRect;
var
W, H: Integer;
begin
with ClientAreaRect do
if not TTBXCustomToolPalette(Item).Stretch then
begin
Result := Bounds(Left + Indent + Col * CellWidth, Top + Row * CellHeight, CellWidth, CellHeight)
end
else
begin
W := Right - Left;
H := Bottom - Top;
Result.Left := Left + Indent + W * Col div ColCount;
Result.Top := Top + H * Row div RowCount;
Result.Right := Left + W * (Col + 1) div ColCount;
Result.Bottom := Top + H * (Row + 1) div RowCount;
end;
end;
function TTBXToolViewer.GetHint(Col, Row: Integer): string;
begin
Result := '';
TTBXCustomToolPalette(Item).DoGetHint(Point(Col, Row), Result);
end;
function TTBXToolViewer.GetImageIndex(Col, Row: Integer): Integer;
begin
Result := Col + Row * ColCount;
end;
procedure TTBXToolViewer.InvalidateCell(ACol, ARow: Integer);
var
R: TRect;
begin
R := GetCellRect(BoundsRect, ACol, ARow);
InvalidateRect(View.Window.Handle, @R, False);
end;
function TTBXToolViewer.IsCellVisible(Cell: TPoint): Boolean;
var
ImgList: TCustomImageList;
begin
Result := (Cell.X >= 0) and (Cell.Y >= 0) and (Cell.X < ColCount) and (Cell.Y < RowCount);
if Result then
begin
if not (tpoCustomImages in TTBXCustomToolPalette(Item).PaletteOptions) then
begin
ImgList := GetImageList;
if ImgList <> nil then Result := (Cell.X + Cell.Y * ColCount) < ImgList.Count;
end;
TTBXCustomToolPalette(Item).DoGetCellVisible(Cell.X, Cell.Y, Result);
end;
end;
procedure TTBXToolViewer.KeyDown(var Key: Word; Shift: TShiftState);
var
OldPos, Pos: TPoint;
begin
if IsCellVisible(HotCell) then OldPos := HotCell
else if IsCellVisible(TTBXCustomToolPalette(Item).SelectedCell) then
OldPos := TTBXCustomToolPalette(Item).SelectedCell
else OldPos.X := -1;
if OldPos.X >= 0 then
begin
Pos := OldPos;
case Key of
VK_LEFT:
begin
Dec(Pos.X);
if Pos.X < 0 then
begin
Pos.X := ColCount - 1;
Dec(Pos.Y);
end;
end;
VK_UP: Dec(Pos.Y);
VK_RIGHT:
begin
Inc(Pos.X);
if Pos.X >= ColCount then
begin
Pos.X := 0;
Inc(Pos.Y);
end;
end;
VK_DOWN: Inc(Pos.Y);
VK_PRIOR: Pos.Y := 0;
VK_NEXT: Pos.Y := RowCount - 1;
VK_HOME: Pos.X := 0;
VK_END: Pos.Y := ColCount - 1;
VK_RETURN:
if IsCellVisible(HotCell) then
begin
TTBXCustomToolPalette(Item).HandleClickCell(HotCell.X, HotCell.Y);
Exit;
end;
else
inherited;
Exit;
end;
end
else
begin
OldPos := Point(-1, 0);
Pos := Point(0, 0);
end;
if ((OldPos.X <> Pos.X) or (OldPos.Y <> Pos.Y)) and IsCellVisible(Pos) then
begin
Key := 0;
FHotCell := Pos;
TTBXCustomToolPalette(Item).Change(False);
end;
end;
procedure TTBXToolViewer.MouseDown(Shift: TShiftState; X, Y: Integer; var MouseDownOnMenu: Boolean);
begin
MouseIsDown := True;
MouseMove(X, Y);
inherited;
View.SetCapture;
end;
procedure TTBXToolViewer.MouseMove(X, Y: Integer);
var
OldHotCell: TPoint;
begin
OldHotCell := HotCell;
if not GetCellAt(X, Y, FHotCell.X, FHotCell.Y) then FHotCell := Point(-1, 0);
if (HotCell.X <> OldHotCell.X) or (HotCell.Y <> OldHotCell.Y) then
begin
with TTBXCustomToolPalette(Item) do
begin
if Show and not IsRectEmpty(BoundsRect) and
not (Item is TTBControlItem) then
begin
Include(State, tbisInvalidated);
InvalidateCell(OldHotCell.X, OldHotCell.Y);
InvalidateCell(HotCell.X, HotCell.Y);
end;
end;
end;
end;
procedure TTBXToolViewer.MouseUp(X, Y: Integer; MouseWasDownOnMenu: Boolean);
var
Col, Row: Integer;
DAD: TTBDoneActionData;
begin
MouseIsDown := False;
if GetCellAt(X, Y, Col, Row) then
TTBXCustomToolPalette(Item).HandleClickCell(Col, Row);
DAD := TTBViewAccess(TTBViewAccess(View).GetRootView).DoneActionData;
DAD.ClickItem := Item;
DAD.DoneAction := tbdaClickItem;
DAD.Sound := True;
TTBViewAccess(TTBViewAccess(View).GetRootView).DoneActionData := DAD;
inherited;
end;
procedure TTBXToolViewer.Paint(const Canvas: TCanvas; const ClientAreaRect: TRect;
IsHoverItem, IsPushed, UseDisabledShadow: Boolean);
const
CDesigning: array [Boolean] of Integer = (0, IO_DESIGNING);
var
I, J: Integer;
ItemInfo: TTBXItemInfo;
Hover: TTBXHoverKind;
R, CellRect: TRect;
begin
FillChar(ItemInfo, SizeOf(TTBXItemInfo), 0);
ItemInfo.ViewType := GetViewType(View);
ItemInfo.ItemOptions := CDesigning[csDesigning in Item.ComponentState];
ItemInfo.Enabled := Item.Enabled or View.Customizing;
ItemInfo.Pushed := False;
ItemInfo.Selected := False;
ItemInfo.ImageShown := True;
with ItemInfo do CalcImageSize(Canvas, ImageWidth, ImageHeight);
ItemInfo.HoverKind := hkNone;
if not IsToolbarStyle then ItemInfo.PopupMargin := GetPopupMargin(Self);
if not IsToolbarStyle then with CurrentTheme do
begin
R := ClientAreaRect;
CurrentTheme.PaintMenuItemFrame(Canvas, R, ItemInfo);
end;
CalcCellSize(Canvas, FCellWidth, FCellHeight);
if IsHoverItem then
begin
if not ItemInfo.Enabled and not View.MouseOverSelected then Hover := hkKeyboardHover
else if ItemInfo.Enabled then Hover := hkMouseHover
else Hover := hkNone;
end
else
Hover := hkNone;
for J := 0 to RowCount - 1 do
for I := 0 to ColCount - 1 do
begin
if IsCellVisible(Point(I, J)) then
begin
if (Hover <> hkNone) and (HotCell.X = I) and (HotCell.Y = J) then
begin
ItemInfo.HoverKind := Hover;
if IsPushed then ItemInfo.Pushed := True
end
else
begin
ItemInfo.HoverKind := hkNone;
ItemInfo.Pushed := False;
end;
with TTBXCustomToolPalette(Item) do
if (SelectedCell.X = I) and (SelectedCell.Y = J) then
ItemInfo.Selected := True
else
ItemInfo.Selected := False;
CellRect := GetCellRect(ClientAreaRect, I, J);
DrawCell(Canvas, CellRect, I, J, ItemInfo);
end;
end;
end;
//----------------------------------------------------------------------------//
{ TTBXCustomColorSet }
constructor TTBXCustomColorSet.Create(AOwner: TComponent);
begin
inherited;
FPalettes := TList.Create;
end;
destructor TTBXCustomColorSet.Destroy;
begin
FPalettes.Free;
inherited;
end;
function TTBXCustomColorSet.GetColor(Col, Row: Integer): TColor;
var
Dummy: string;
begin
GetColorInfo(Col, Row, Result, Dummy);
end;
procedure TTBXCustomColorSet.GetColorInfo(Col, Row: Integer; out Color: TColor; out ColorName: string);
begin
Color := clNone;
SetLength(ColorName, 0);
if Assigned(FOnGetColorInfo) then FOnGetColorInfo(Self, Col, Row, Color, ColorName);
end;
function TTBXCustomColorSet.ColorToString(Color: TColor): string;
var
I, J: Integer;
C: TColor;
N: string;
function GetRGB(C: TColor): TColor;
begin
Result := (C and $FF00) + C shr 16 + (C and $FF shl 16);
end;
begin
if Color = clNone then Result := 'None'
else
begin
if Color < 0 then Color := GetSysColor(Color and $000000FF);
Color := Color and $00FFFFFF;
for J := 0 to RowCount - 1 do
for I := 0 to ColCount - 1 do
begin
GetColorInfo(I, J, C, N);
if C <> clNone then
begin
if C < 0 then C := GetSysColor(C and $000000FF);
C := C and $00FFFFFF;
if C = Color then
begin
Result := N;
if Length(N) = 0 then Result := '#' + IntToHex(GetRGB(Color), 6);
Exit;
end
end;
end;
Result := '#' + IntToHex(GetRGB(Color), 6);
end;
end;
function TTBXCustomColorSet.GetName(Col, Row: Integer): string;
var
Dummy: TColor;
begin
GetColorInfo(Col, Row, Dummy, Result);
end;
procedure TTBXCustomColorSet.SetColCount(Value: Integer);
begin
UpdateSize(Value, RowCount);
end;
procedure TTBXCustomColorSet.SetRowCount(Value: Integer);
begin
UpdateSize(ColCount, Value);
end;
procedure TTBXCustomColorSet.UpdateSize(NewColCount, NewRowCount: Integer);
var
I: Integer;
begin
FColCount := NewColCount;
FRowCount := NewRowCount;
for I := 0 to FPalettes.Count - 1 do
with TTBXColorPalette(FPalettes[I]) do
begin
ColCount := Self.ColCount;
RowCount := Self.RowCount;
end;
end;
//----------------------------------------------------------------------------//
{ TTBXColorPalette }
function TTBXColorPalette.ColorToString(AColor: TColor): string;
begin
Result := GetColorSet.ColorToString(AColor);
end;
constructor TTBXColorPalette.Create(AOwner: TComponent);
begin
inherited;
ColCount := DefaultColorSet.ColCount;
RowCount := DefaultColorSet.RowCount;
Options := Options + [tboShowHint];
FColor := clNone;
PaletteOptions := PaletteOptions + [tpoCustomImages];
end;
procedure TTBXColorPalette.DoCalcImageSize(Canvas: TCanvas; var AWidth, AHeight: Integer);
begin
AWidth := 12;
AHeight := 12;
end;
procedure TTBXColorPalette.DoChange;
begin
if SelectedCell.X >= 0 then
FColor := GetCellColor(SelectedCell.X, SelectedCell.Y);
inherited;
end;
procedure TTBXColorPalette.DoDrawCellImage(Canvas: TCanvas;
const ARect: TRect; ACol, ARow: Integer; ItemInfo: TTBXItemInfo);
var
R: TRect;
begin
R := ARect;
Canvas.Brush.Color := clBtnShadow;
Canvas.FrameRect(R);
InflateRect(R, -1, -1);
if ItemInfo.Enabled then
begin
Canvas.Brush.Color := GetCellColor(ACol, ARow);
Canvas.FillRect(R);
end;
end;
procedure TTBXColorPalette.DoGetCellVisible(ACol, ARow: Integer; var Visible: Boolean);
begin
Visible := GetCellColor(ACol, ARow) <> clNone;
end;
procedure TTBXColorPalette.DoGetHint(ACell: TPoint; var HintText: string);
begin
HintText := GetColorSet.GetName(ACell.X, ACell.Y);
end;
function TTBXColorPalette.FindCell(AColor: TColor): TPoint;
var
I, J: Integer;
C: TColor;
begin
if AColor <> clNone then AColor := ColorToRGB(AColor);
for J := 0 to RowCount - 1 do
for I := 0 to ColCount - 1 do
begin
C := GetCellColor(I, J);
if C <> clNone then C := ColorToRGB(C);
if C = AColor then
begin
Result.X := I;
Result.Y := J;
Exit;
end;
end;
Result.X := -1;
Result.Y := 0;
end;
function TTBXColorPalette.GetCellColor(ACol, ARow: Integer): TColor;
begin
Result := GetColorSet.GetColor(ACol, ARow);
end;
function TTBXColorPalette.GetColorSet: TTBXCustomColorSet;
begin
if FColorSet = nil then Result := DefaultColorSet
else Result := FColorSet;
end;
procedure TTBXColorPalette.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if (AComponent = FColorSet) and (Operation = opRemove) then ColorSet := nil;
end;
procedure TTBXColorPalette.SetColor(Value: TColor);
begin
FColor := Value;
SelectedCell := FindCell(Value);
end;
procedure TTBXColorPalette.SetColorSet(Value: TTBXCustomColorSet);
begin
if FColorSet <> Value then
begin
if Assigned(FColorSet) then FColorSet.FPalettes.Remove(Self);
FColorSet := Value;
if Assigned(Value) then
begin
Value.FreeNotification(Self);
Value.FPalettes.Add(Self);
ColCount := Value.ColCount;
RowCount := Value.RowCount;
end
else
begin
ColCount := DefaultColorSet.ColCount;
RowCount := DefaultColorSet.RowCount;
end;
Change(True);
end;
end;
{ TTBXDefaultColorSet }
type
TTBXDefaultColorSet = class (TTBXCustomColorSet)
protected
procedure GetColorInfo(Col, Row: Integer; out Color: TColor; out ColorName: string); override;
public
constructor Create(AOwner: TComponent); override;
end;
procedure TTBXDefaultColorSet.GetColorInfo(Col, Row: Integer; out Color: TColor; out ColorName: string);
procedure Clr(const AName: string; AColor: TColor);
begin
Color := AColor;
ColorName := AName;
end;
begin
Color := clNone;
Name := '';
case Row of
0:
case Col of
0: Clr('Black', $000000);
1: Clr('Brown', $003399);
2: Clr('Olive Green', $003333);
3: Clr('Dark Green', $003300);
4: Clr('Dark Teal', $663300);
5: Clr('Dark blue', $800000);
6: Clr('Indigo', $993333);
7: Clr('Gray-80%', $333333);
end;
1:
case Col of
0: Clr('Dark Red', $000080);
1: Clr('Orange', $0066FF);
2: Clr('Dark Yellow', $008080);
3: Clr('Green', $008000);
4: Clr('Teal', $808000);
5: Clr('Blue', $FF0000);
6: Clr('Blue-Gray', $996666);
7: Clr('Gray-50%', $808080);
end;
2:
case Col of
0: Clr('Red', $0000FF);
1: Clr('Light Orange', $0099FF);
2: Clr('Lime', $00CC99);
3: Clr('Sea Green', $669933);
4: Clr('Aqua', $CCCC33);
5: Clr('Light Blue', $FF6633);
6: Clr('Violet', $800080);
7: Clr('Gray-40%', $969696);
end;
3:
case Col of
0: Clr('Pink', $FF00FF);
1: Clr('Gold', $00CCFF);
2: Clr('Yellow', $00FFFF);
3: Clr('Bright Green', $00FF00);
4: Clr('Turquoise', $FFFF00);
5: Clr('Sky Blue', $FFCC00);
6: Clr('Plum', $663399);
7: Clr('Gray-25%', $C0C0C0);
end;
4:
case Col of
0: Clr('Rose', $CC99FF);
1: Clr('Tan', $99CCFF);
2: Clr('Light Yellow', $99FFFF);
3: Clr('Light Green', $CCFFCC);
4: Clr('Light Turquoise', $FFFFCC);
5: Clr('Pale Blue', $FFCC99);
6: Clr('Lavender', $FF99CC);
7: Clr('White', $FFFFFF);
end;
end;
end;
constructor TTBXDefaultColorSet.Create(AOwner: TComponent);
begin
inherited;
FColCount := 8;
FRowCount := 5;
end;
initialization
DefaultColorSet := TTBXDefaultColorSet.Create(nil);
finalization
DefaultColorSet.Free;
end.