| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998 | 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  $interfaceuses  Windows, Messages, Classes, SysUtils, Controls, Forms, Graphics, TB2Item, TBX,  TBXThemes;{$I TB2Ver.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;    FImageSize: Integer;    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;implementationuses ImgList, UxTheme, Types, TBXUtils;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);beginend;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  begin    Indent :=      GetPopupMargin(Self) + GetIntegerMetrics(Self, TMI_MENU_IMGTEXTSPACE) +      GetIntegerMetrics(Self, TMI_MENU_LCAPTIONMARGIN) - 3;  end    else  begin    Indent := 0;  end;  FColCount := TTBXCustomToolPalette(Item).ColCount;  FRowCount := TTBXCustomToolPalette(Item).RowCount;  CalcCellSize(Canvas, CellWidth, CellHeight);  AWidth := Indent + CellWidth * ColCount;  if not IsToolbarStyle then Inc(AWidth, CurrentTheme.GetIntegerMetrics(Self, TMI_MENU_RCAPTIONMARGIN));  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];  FImageSize := -1;end;procedure TTBXColorPalette.DoCalcImageSize(Canvas: TCanvas; var AWidth, AHeight: Integer);begin  if FImageSize < 0 then  begin    FImageSize := TBXScaleByTextHeightRunTime(Canvas, 12);  end;  AWidth := FImageSize;  AHeight := FImageSize;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.
 |