fccolorcombo.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:106k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit fcColorCombo;
  2. {
  3. //
  4. // Components : TfcColorCombo
  5. //
  6. // Copyright (c) 2001 by Woll2Woll Software
  7. //
  8. // Changes:
  9. // 3/19/99 -PYW- Rect is already correct now, so do not use GetIconIndent
  10. //               when colorcombo is not in a grid and not focused.
  11. // 3/25/99 -PYW- Exit if Combo is being destroyed to handle recordviewpanel support.
  12. // 4/13/99 -PYW- Added Shift Select Support.
  13. // 4/13/99 -PYW- Make sure events are set before adding all of the colors
  14. // 3/7/00 - Use clGrayText for disabled color
  15. // 4/19/00  PYW In certain cases Listbox can be nil.  Let CreateWnd create the listbox and update the color.
  16. // 10/13/2000 - PYW - Check for Null to initialize to blank.
  17. // 10/13/2000 - PYW - Make sure this paints correctly when it doesn't have the focus or in certain highlight cases.
  18. // 3/1/2002-Added new function to handle painting in a TDBCtrlGrid
  19. }
  20. {//**************************************************
  21. // Ideas: Add event to display different name when displaying list.
  22. // Ideas: Code to add Standard 255 Colors exists add another option for it?
  23. // Ideas: Add ColorDialog Standard Colors option?
  24. //9/27/2001- Respect value storing for csPaintcopy - Allows to paint correctly in grid
  25. //10/1/2001- Exposed OnMouseEnter and OnMouseLeave to be consistent with InfoPower.
  26. //10/1/2001- Exposed OnContextPopup.
  27. }
  28. interface
  29. uses
  30.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus,
  31.   fccombo,fccommon,dbctrls,db,grids, fcframe;
  32. {$i fcIfDef.pas}
  33. const
  34.   ColorRectMargin = 2;
  35. type
  36.   TfcOwnerDrawState = (odsChecked, odsComboBoxEdit, odsDefault, odsDisabled, odsFocus, odsGrayed, odsSelected);
  37.   TfcOwnerDrawStates = set of TfcOwnerDrawState;
  38.   TfcSortByOption = (csoNone, csoByRGB, csoByIntensity, csoByName);
  39.   TfcColorListBoxOption = (ccoShowSystemColors, ccoShowColorNone, ccoShowCustomColors, ccoShowStandardColors,
  40.       ccoShowColorNames, ccoShowGreyScale, ccoGroupSystemColors);
  41.   TfcColorListBoxOptions = set of TfcColorListBoxOption;
  42.   TfcColorDialogOption = (cdoEnabled, cdoPreventFullOpen,
  43.                           cdoFullOpen, cdoSolidColor, cdoAnyColor);
  44.   TfcColorDialogOptions = set of TfcColorDialogOption;
  45.   TfcColorDialogEvent = procedure(Sender: TObject; Dialog: TColorDialog) of object;
  46.   TfcCloseColorDialogEvent = procedure(Sender: TObject; Dialog: TColorDialog; MResult: TModalResult; var Accept: Boolean) of object;
  47. //  TfcCloseColorComboEvent = procedure(Sender: TObject; Accept: Boolean) of object;
  48.   TfcAddNewColorEvent = procedure(Sender: TObject; AColor:TColor; var AColorName:String;
  49.      var Accept: Boolean) of object;
  50.   TfcOnFilterColorEvent = procedure(Sender: TObject; AColor:TColor; AColorName:String;
  51.      var Accept: Boolean) of object;
  52.   TfcColorListFiller = class
  53.   private
  54.     FOptions:TfcColorListBoxOptions;
  55.     FList:TStringList;
  56.   public
  57.     procedure ColorCallbackProc(const s: String);
  58.     procedure FillColorList(var AList:TStringList;AOptions:TfcColorListBoxOptions;NoneString:String);
  59.   end;
  60.   TfcCustomColorCombo = class;
  61.   TfcCustomColorList = class(TCustomListBox)
  62.   private
  63.     { Private declarations }
  64.     FAlignment: TLeftRight;
  65.     FColorAlignment: TLeftRight;
  66.     FColorWidth: Integer;
  67.     FOptions: TfcColorListBoxOptions;
  68.     FCustomColors: TStringList;
  69.     FHighlightColor: TColor;
  70.     FHighlightTextColor: TColor;
  71.     FAllColors: TStringList;
  72.     FSelectedColor: TColor;
  73.     FOldSelectedColor: TColor;
  74.     FSortByOption : TfcSortByOption;
  75.     FTempColors: TStringList;
  76.     FGreyScaleIncrement: Integer;
  77.     FNoneString : String;
  78.     FOnAddNewColor: TfcAddNewColorEvent;
  79.     FOnFilterColor: TfcOnFilterColorEvent;
  80.     FPrevItem : Integer;
  81.     FLastPoint: TPoint;
  82.     FCloseOnUp: Boolean;
  83.     ItemIDMap: TList;
  84.     FClickedInControl: Boolean;
  85.     FIgnoreMouseScroll: Boolean;
  86.     FListBoxUpdated: boolean;
  87.     FColorMargin: Integer;
  88.     procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST;
  89.     procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
  90.     procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
  91.     procedure SetAlignment(Value: TLeftRight);
  92.     procedure SetColorAlignment(Value: TLeftRight);
  93.     procedure SetOptions(Value: TfcColorListBoxOptions);
  94.     procedure SetColorWidth(Value: Integer);
  95.     procedure SetColorMargin(Value: Integer);
  96.     procedure SetSelectedColor(Value: TColor);
  97.     procedure SetNoneString(Value: String);
  98.     procedure SetGreyScaleIncrement(Value: Integer);
  99.     procedure SetSortBy(Value: TfcSortByOption);
  100.     procedure SetCustomColors(Value: TStringList);
  101.     function GetSelectedColor: TColor;
  102.     function GetEditRectHeight: Integer;
  103. //    procedure ListChange(Sender: TObject);
  104.     {$Warnings Off}
  105.     function GetItemIndex: integer;
  106.     Procedure SetItemIndex(Value: integer);
  107.     function GetHighlightColor: TColor;
  108.     {$Warnings On}
  109.     function GetHighlightTextColor: TColor;
  110. //    function MapItemID(val: integer): integer;
  111.     procedure WMSize(var Message: TWMSize); message WM_SIZE;
  112.   protected
  113.     { Protected declarations }
  114.     function AddToAllColors(AName:String;AValue:String): Boolean; virtual;
  115.     procedure Click; override;
  116.     procedure CreateWnd; override;
  117.     procedure CustomColorsChangeEvent(Sender: TObject); virtual;
  118.     function HasDuplicateNames(var dup:String): Boolean; virtual;
  119.     procedure Loaded; override;
  120.     procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  121.     procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  122.     procedure CreateParams(var Params: TCreateParams); override;
  123.   public
  124.     { Public declarations }
  125.     Patch: Variant;
  126.     constructor Create(AOwner: TComponent); override;
  127.     destructor Destroy; override;
  128.     procedure InitColorList; virtual;
  129.     procedure SortList; virtual;
  130.     procedure UpdateItems; virtual;
  131.     procedure DoDrawItem(ACanvas:TCanvas; Index, CWidth, CHeight:Integer; Rect: TRect;
  132.        State: TOwnerDrawState;  Text:String; AColor:TColor); virtual;
  133.     function ColorFromIndex(Index: Integer):TColor; virtual;
  134.     property SelectedColor: TColor read GetSelectedColor write SetSelectedColor;
  135.     property OldSelectedColor: TColor read FOldSelectedColor write FOldSelectedColor;
  136.     property AllColors: TStringList read FAllColors;
  137.     property Alignment: TLeftRight read FAlignment write SetAlignment default taLeftJustify;
  138.     property ColorAlignment: TLeftRight read FColorAlignment write SetColorAlignment default taLeftJustify;
  139.     property ColorMargin: Integer read FColorMargin write SetColorMargin default 2;
  140.     property ColorWidth: Integer read FColorWidth write SetColorWidth;
  141.     property CustomColors: TStringList read FCustomColors write SetCustomColors;
  142.     property GreyScaleIncrement: Integer read FGreyScaleIncrement write SetGreyScaleIncrement default 15;
  143.     property HighlightColor: TColor read FHighlightColor write FHighlightColor;
  144.     property HighlightTextColor: TColor read FHighlightTextColor write FHighlightTextColor;
  145.     property ItemIndex read GetItemIndex write SetItemIndex;
  146.     property NoneString: String read FNoneString write SetNoneString;
  147.     property Options: TfcColorListBoxOptions read FOptions write SetOptions;
  148.     property SortBy: TfcSortByOption read FSortByOption write SetSortBy default csoNone;
  149.     property OnAddNewColor: TfcAddNewColorEvent read FOnAddNewColor write FOnAddNewColor;
  150.     property OnFilterColor: TfcOnFilterColorEvent read FOnFilterColor write FOnFilterColor;
  151.     { Published declarations }
  152.   end;
  153.   TfcColorList = class(TfcCustomColorList)
  154.   published
  155.     {$ifdef fcDelphi4Up}
  156.     property Anchors;
  157.     property Constraints;
  158.     {$endif}
  159.     property Align;
  160.     property Alignment;
  161.     property BorderStyle;
  162.     property Color;
  163.     property ColorAlignment;
  164.     property ColorMargin;
  165.     property ColorWidth;
  166.     property Columns;
  167.     property Ctl3D;
  168.     property CustomColors;
  169.     property DragCursor;
  170.     property DragMode;
  171.     property Enabled;
  172.     property ExtendedSelect;     //4/13/99 - PYW - Added Shift Select Support.
  173.     property Font;
  174.     property GreyScaleIncrement;
  175.     property ImeMode;
  176.     property ImeName;
  177.     property IntegralHeight;
  178.     property MultiSelect;
  179.     property NoneString;
  180.     property Options;
  181.     property ParentCtl3D;
  182.     property ParentFont;
  183.     property ParentShowHint;
  184.     property PopupMenu;
  185.     property SelectedColor;   //3/2/99 - Added SelectedColor and removed ItemIndex.
  186.     property SortBy;
  187.     property OnAddNewColor;
  188.     property OnFilterColor;
  189.     property OnClick;
  190.     {$ifdef fcDelphi5Up}
  191.     property OnContextPopup;
  192.     {$endif}
  193.     property OnDblClick;
  194.     property OnDragDrop;
  195.     property OnDragOver;
  196.     property OnEndDrag;
  197.     property OnEnter;
  198.     property OnExit;
  199.     property OnKeyDown;
  200.     property OnKeyPress;
  201.     property OnKeyUp;
  202.     property OnMouseDown;
  203.     property OnMouseMove;
  204.     property OnMouseUp;
  205.     property OnStartDrag;
  206.     property ParentColor;
  207.     property ShowHint;
  208.     property TabOrder;
  209.     property Visible;
  210.     property ItemHeight;
  211.   end;
  212.   TfcColorListOptions = class(TPersistent)
  213.   private
  214.      FCombo:TfcCustomColorCombo;
  215.      FColor:TColor;
  216.      FColorWidth: Integer;
  217.      FFont: TFont;
  218.      FGreyScaleIncrement: Integer;
  219.      FIntegralHeight:Boolean;
  220.      FItemHeight:Integer;
  221.      FOptions: TfcColorListBoxOptions;
  222.      FSortByOption : TfcSortByOption;
  223.      FNoneString : String;
  224.      procedure SetColor(Value: TColor);
  225.      procedure SetColorWidth(Value: Integer);
  226.      procedure SetFont(Value: TFont);
  227.      procedure SetGreyScaleIncrement(Value: Integer);
  228.      procedure SetIntegralHeight(Value: Boolean);
  229.      procedure SetItemHeight(Value: Integer);
  230.      procedure SetNoneString(Value: String);
  231.      procedure SetSortBy(Value: TfcSortByOption);
  232.      function StoreNoneString: boolean;
  233.   protected
  234.      procedure SetOptions(Value: TfcColorListBoxOptions);
  235.   published
  236.      constructor Create(AOwner: TfcCustomColorCombo);
  237.      destructor Destroy; override;
  238.      property Color: TColor read FColor write SetColor default clWindow;
  239.      property ColorWidth: Integer read FColorWidth write SetColorWidth default 0;
  240.      property Font: TFont read FFont write SetFont;
  241.      property GreyScaleIncrement: Integer read FGreyScaleIncrement write SetGreyScaleIncrement default 10;
  242.      property IntegralHeight: Boolean read FIntegralHeight write SetIntegralHeight default True;
  243.      property ItemHeight: Integer read FItemHeight write SetItemHeight default 16;
  244.      property NoneString: String read FNoneString write SetNoneString stored StoreNoneString;
  245.      property Options : TfcColorListBoxOptions read FOptions write SetOptions default [ccoShowStandardColors, ccoShowColorNames];
  246.      property SortBy: TfcSortByOption read FSortByOption write SetSortBy default csoNone;
  247.   end;
  248.   TfcColorComboDataType = (ccdColorName,ccdColor);   //Maybe add ccdColorHex?
  249.   TfcCustomColorCombo = class(TfcCustomCombo)
  250.   private
  251.     FAlignment: TLeftRight;
  252. //    FAlignmentVertical: TfcAlignVertical;
  253.     FAutoDropDown: boolean;
  254.     InAutoDropDown: boolean;
  255.     FColorAlignment: TLeftRight;
  256.     FColorDialog: TColorDialog;
  257.     FShowMatchText: Boolean;
  258.     FCustomColors: TStringList;
  259. //    FDataType: TfcColorComboDataType;
  260.     FListbox: TfcColorList;
  261.     FSelectedColor: TColor;
  262.     FDropDownWidth: integer;
  263.     FColorListOptions: TfcColorListOptions;
  264.     FOnDrawItem: TDrawItemEvent;
  265.     FOnInitColorDialog: TfcColorDialogEvent;
  266.     FOnCloseColorDialog: TfcCloseColorDialogEvent;
  267.     FColorDialogOptions: TfcColorDialogOptions;
  268.     FItemIndex: Integer;
  269.     SkipDataChange: Boolean;
  270.     SkipTextChange: Boolean;
  271.     SkipDropDown:Boolean;
  272. //    FOnCloseUp: TNotifyEvent;
  273.     FCloseOnUp: Boolean;
  274.     FOriginalIndex: Integer;
  275.     FOriginalSelectedColor: TColor;
  276.     FSelectedItemIndex: Integer;
  277.     FOnAddNewColor: TfcAddNewColorEvent;
  278.     FOnFilterColor: TfcOnFilterColorEvent;
  279.     SetModifiedInChangeEvent: boolean;
  280.     procedure SetAlignment(Value: TLeftRight);
  281. //    procedure SetAlignmentVertical(Value: TfcAlignVertical);
  282.     procedure SetColorAlignment(Value: TLeftRight);
  283.     procedure SetCustomColors(Value: TStringList);
  284.     procedure SetItemIndex(Value: integer);
  285.     procedure SetSelectedColor(Value: TColor);
  286.     procedure CustomColorsChangeEvent(Sender: TObject);
  287.     procedure ListMouseUp(Sender: TObject; Button: TMouseButton;
  288.       Shift: TShiftState; X, Y: Integer);
  289.     procedure ListMouseDown(Sender: TObject; Button: TMouseButton;
  290.       Shift: TShiftState; X, Y: Integer);
  291.     procedure CMExit(var Message: TCMExit); message CM_EXIT;
  292.     procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  293.     procedure CNCommand(var Message: TWMCommand); message CN_COMMAND;
  294.     procedure CNKeyDown(var Message: TWMKeyDown); message CN_KEYDOWN; {handle tab}
  295.     procedure WMLButtonDblClk(var Message: TWMLButtonDblClk); message WM_LBUTTONDBLCLK;
  296.     procedure WMPaste(var Message: TMessage); message WM_PASTE;
  297.     procedure WMSetFocus(var Message: TWMSetFocus); message WM_SETFOCUS;
  298.     function GetSelectedColorString: string;
  299.     procedure SetSelectedColorString(Value: string);
  300.     procedure UpdateSelectedColor;
  301.     function GetEffectiveAlignment: TLeftRight;
  302. protected
  303.     procedure Change; override; // 7/31/00
  304.     procedure AddNewColorEvent(Sender: TObject; AColor:TColor;
  305.       var AColorName:String;  var Accept: Boolean); virtual;
  306.     procedure OnFilterColorEvent(Sender: TObject; AColor:TColor;
  307.       AColorName:String;  var Accept: Boolean); virtual;
  308.     function GetComboColor(Index:Integer): TColor; virtual;
  309.     function GetComboDataType:TfcColorComboDataType; virtual;
  310.     function GetComboDisplayText(Value:integer): String; virtual;
  311.     function GetTextRect(ARect:TRect;Highlight:Boolean): TRect; virtual;
  312.     procedure ListBoxNeeded; virtual;
  313.     procedure PaintToCanvas(ACanvas: TCanvas; Rect: TRect; Highlight, GridPaint: Boolean;
  314.       Text: string); override;
  315.     procedure Paint; override;
  316.     procedure CreateWnd; override;
  317.     procedure DataChange(Sender: TObject); override;
  318.     Function Editable: boolean; override;
  319.     function EditCanModify: Boolean; override;
  320.     function GetDropDownControl: TWinControl; override;
  321.     function GetDropDownContainer: TWinControl; override;
  322.     function GetItemCount: Integer; override;
  323.     function GetItemSize: TSize; override;
  324. //    procedure HandleDropDownKeys(var Key: Word; Shift: TShiftState); override;
  325.     procedure HideCaret; override;
  326.     procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  327.     procedure KeyPress(var Key: Char); override;
  328.     procedure KeyUp(var Key: Word; Shift: TShiftState); override;
  329.     function GetIndentLeft(Rect: TRect): Integer; virtual;
  330.     function GetRightIndent(Rect:TRect): Integer; override;
  331.     function GetTopIndent: Integer; override;
  332.     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  333.     Procedure DrawColorRect(ACanvas:TCanvas;Rect:TRect;CurColor:TColor;Highlight:Boolean); virtual;
  334.     procedure SetComboText(Value:String); virtual;
  335.     procedure SetEditRect; override;
  336.     procedure ShowCaret; override;
  337.     procedure UpdateData(Sender: TObject); override;
  338.     procedure WndProc(var Message: TMessage); override;
  339.     property OnDrawItem: TDrawItemEvent read FOnDrawItem write FOnDrawItem;
  340.   public
  341.     constructor Create(AOwner: TComponent); override;
  342.     destructor Destroy; override;
  343.     procedure SelectAll; override;
  344.     procedure CloseUp(Accept: Boolean); override;
  345.     function ColorString(s: string): string;
  346.     function IsCustomColor(s: string): Boolean;
  347.     Function IsDroppedDown: boolean; override;
  348.     procedure DrawInGridCell(ACanvas:TCanvas;Rect:TRect;State:TGridDrawState); override;
  349.     procedure DropDown; override;
  350.     Function ExecuteColorDialog: boolean; virtual;
  351.     function GetColorFromRGBString(RGBString:String; var AColor:TColor):boolean;
  352.     Procedure GetColorRectInfo(Rect:TRect;var AWidth:Integer;var AHeight:Integer);
  353.     procedure RefreshList; virtual;
  354.     property ListBox: TfcColorList read FListBox;
  355.     property DroppedDown: boolean read isDroppedDown;
  356.     property SelectedColor: TColor read FSelectedColor write SetSelectedColor;
  357.     property UnboundAlignment: TLeftRight read GetEffectiveAlignment write SetAlignment default taLeftJustify;
  358. //    property AlignmentVertical: TfcAlignVertical read FAlignmentVertical write SetAlignmentVertical default fcavTop;
  359.     property AutoDropDown : boolean read FAutoDropDown write FAutoDropDown default False;
  360.     property ButtonStyle default cbsDownArrow;
  361.     property ColorAlignment: TLeftRight read FColorAlignment write SetColorAlignment default taLeftJustify;
  362.     //3/4/99 - Unused property.
  363. //    property ColorDataType: TfcColorComboDataType read FDataType write FDataType default ccdColorName;
  364.     property ColorDialog: TColorDialog read FColorDialog write FColorDialog;
  365.     property ColorDialogOptions: TfcColorDialogOptions read FColorDialogOptions write FColorDialogOptions default [cdoPreventFullOpen];
  366.     property ColorListOptions: TfcColorListOptions read FColorListOptions write FColorListOptions;
  367.     property CustomColors: TStringList read FCustomColors write SetCustomColors;
  368.     property SelectedColorString: string read GetSelectedColorString write SetSelectedColorString;
  369. //    property DropDownCount : integer read FDropDownCount write FDropDownCount default 8;
  370.     property DropDownWidth: Integer read FDropDownWidth write FDropDownWidth default 0;
  371.     property ItemIndex: integer read FItemIndex write SetItemIndex;
  372.     property ShowMatchText: Boolean read FShowMatchText write FShowMatchText default True;
  373.     property OnAddNewColor: TfcAddNewColorEvent read FOnAddNewColor write FOnAddNewColor;
  374.     property OnFilterColor: TfcOnFilterColorEvent read FOnFilterColor write FOnFilterColor;
  375. //    property OnCloseUp;//: TfcCloseColorComboEvent read FOnCloseUp write FOnCloseUp;
  376. //    property OnCloseUp: TNotifyEvent read FOnCloseUp write FOnCloseUp;
  377.     property OnInitColorDialog: TfcColorDialogEvent read FOnInitColorDialog write FOnInitColorDialog;
  378.     property OnCloseColorDialog: TfcCloseColorDialogEvent read FOnCloseColorDialog write FOnCloseColorDialog;
  379. //    property OnKeyPress: TKeyPressEvent read FOnKeyPress write FOnKeyPress;
  380.   end;
  381.   TfcColorCombo = class(TfcCustomColorCombo)
  382.   published
  383.     property Controller;
  384.     property DisableThemes;
  385.     {$ifdef fcDelphi5Up}
  386.     property Anchors;
  387.     property BiDiMode;
  388.     property Constraints;
  389.     property ParentBiDiMode;
  390.     {$endif}
  391.     property DataField;
  392.     property DataSource;
  393.     property InfoPower;
  394.     property UnboundAlignment;
  395.     property AlignmentVertical;
  396.     property AllowClearKey;
  397.     property AutoDropDown;
  398.     property AutoSelect;
  399.     property AutoSize;
  400.     property ShowButton;
  401.     property BorderStyle;
  402.     property ButtonStyle;
  403.     property ButtonEffects;
  404.     property ButtonGlyph;
  405.     property ButtonWidth;
  406.     property CharCase;
  407.     property Color;
  408.     property ColorAlignment;
  409.     //3/4/99 - Unused property.
  410.     //property ColorDataType;
  411.     property ColorDialog;
  412.     property ColorDialogOptions;
  413.     property ColorListOptions;
  414.     property CustomColors;
  415.     property Ctl3D;
  416.     property DragMode;
  417.     property DragCursor;
  418.     property DropDownCount;
  419.     property DropDownWidth;
  420.     property Enabled;
  421.     property Frame;
  422.     property Font;
  423.     {$ifdef ver100}
  424.     property ImeMode;
  425.     property ImeName;
  426.     {$endif}
  427.     property ParentColor;
  428.     property ParentCtl3D;
  429.     property ParentFont;
  430.     property ParentShowHint;
  431.     property PopupMenu;
  432.     property ReadOnly;
  433.     property ShowHint;
  434.     property ShowMatchText;
  435.     property SelectedColor;
  436.     property Style default csDropDownList;
  437.     property TabOrder;
  438.     property TabStop;
  439.     property Visible;
  440.     property OnAddNewColor;
  441.     property OnFilterColor;
  442.     property OnChange;
  443.     property OnClick;
  444.     {$ifdef fcDelphi5Up}
  445.     property OnContextPopup;
  446.     {$endif}
  447.     property OnDblClick;
  448.     property OnDragDrop;
  449.     property OnDragOver;
  450.     property OnDropDown;
  451.     property OnCloseUp;
  452.     property OnInitColorDialog;
  453.     property OnCloseColorDialog;
  454.     property OnEndDrag;
  455.     property OnEnter;
  456.     property OnExit;
  457.     property OnKeyDown;
  458.     property OnKeyPress;
  459.     property OnKeyUp;
  460.     property OnMouseEnter;
  461.     property OnMouseLeave;
  462.     property OnMouseDown;
  463.     property OnMouseMove;
  464.     property OnMouseUp;
  465.     property OnStartDrag;
  466. end;
  467. //procedure Register;
  468. implementation
  469. //       {$R FirstClass.dcr}
  470. {May wish to move the following functions to some common file}
  471. {function ColorStringToHex(AColor: string): TColor;
  472. var HexString: string;
  473. begin
  474.   result := clNone;
  475.   HexString := AColor;
  476.   if HexString = '' then Exit;
  477.   HexString := '$00' + HexString;
  478.   result := StringToColor(HexString);
  479. end;}
  480. procedure TfcCustomColorList.CustomColorsChangeEvent(Sender: TObject);
  481. begin
  482.    InitColorList;
  483. end;
  484. procedure TfcCustomColorList.WMNCHitTest(var Message: TWMNCHitTest);
  485. begin
  486.   DefaultHandler(Message);
  487. end;
  488. procedure TfcCustomColorList.Click;
  489. begin
  490.   OldSelectedColor := FSelectedColor;
  491.   if ItemIndex>=0 then
  492.      FSelectedColor := StringToColor('$'+Items.Values[Items.Names[ItemIndex]]);
  493.   //2/26/99 - Moved to ensure SelectedColor is updated before click event.
  494.   inherited;
  495. end;
  496. procedure FillColorList(var AList: TStringList;AOptions:TfcColorListBoxOptions;NoneString:String);
  497. var fill:TfcColorListFiller;
  498. begin
  499.    fill:= TfcColorListFiller.create;
  500.    fill.FillColorList(AList,AOptions,NoneString);
  501.    fill.free;
  502. end;
  503. {function ColorNamesCompare(s1,s2: string): Integer;
  504. var placement1, placement2: Integer;
  505.     Value1, Value2:String;
  506. begin
  507.   placement1 := 1;
  508.   placement2 := 1;
  509.   value1:= Copy(s1,pos('=',s1)+1,8);
  510.   value2 := Copy(s2,pos('=',s2)+1,8);
  511.   if StringToColor('$'+value1) = clNone then
  512.      placement1 := 0;
  513.   if StringToColor('$'+value2) = clNone then
  514.      placement2 := 0;
  515.   if placement1 < placement2 then result := -1
  516.   else if placement1 > placement2 then result := 1
  517.   else result := AnsiComparestr(Copy(s1,1,pos('=',s1)),Copy(s2,1,pos('=',s2)));
  518. end;
  519. }
  520. function ColorNamesCompareGroupSys(s1,s2: string): Integer;
  521. var placement1, placement2: Integer;
  522.     Value1, Value2: string;
  523. begin
  524.    if (Length(Copy(s1,pos('=',s1)+1,length(s1)))=8) and
  525.       (AnsiComparestr(Copy(s1,pos('=',s1)+1,2),'80')=0) then
  526.      placement1 := 2  //Group System Colors
  527.    else placement1 := 1;
  528.    if (Length(Copy(s2,pos('=',s2)+1,length(s2)))=8) and
  529.       (AnsiComparestr(Copy(s2,pos('=',s2)+1,2),'80')=0) then
  530.      placement2 := 2  //Group System Colors
  531.    else placement2 := 1;
  532.    value1:= Copy(s1,pos('=',s1)+1,8);
  533.    value2 := Copy(s2,pos('=',s2)+1,8);
  534.    if StringToColor('$'+value1) = clNone then
  535.      placement1 := 0;
  536.    if StringToColor('$'+value2) = clNone then
  537.       placement2 := 0;
  538.    if placement1 < placement2 then result := -1
  539.    else if placement1 > placement2 then result := 1
  540.    else result := AnsiComparestr(Copy(s1,1,pos('=',s1)),Copy(s2,1,pos('=',s2)));
  541. end;
  542. function ColorCompare(s1,s2: string;sortby:TfcSortByOption;seperatesyscolors:boolean): Integer;
  543. var red1,green1,blue1,reserved1:Byte;
  544.     red2,green2,blue2,reserved2:Byte;
  545.     placement1, placement2: integer;
  546.   function Highest(int1, int2, int3: integer): integer;
  547.   begin
  548.     if (int1=int2) and (int1=int3) then result :=0
  549.     else if (int1 >= int2) and (int1 >= int3) then result := 1
  550.     else if (int2 >= int1) and (int2 >= int3) then result := 2
  551.     else result := 3;
  552.   end;
  553.   function Lowest(int1, int2, int3: integer): integer;
  554.   begin
  555.     if (int1 = int2) and (int1 = int3) then result := 0
  556.     else if (int1 <= int2) and (int1 <= int3) then result := 1
  557.     else if (int2 <= int1) and (int2 <= int3) then result := 2
  558.     else result :=3;
  559.   end;
  560.   function GetAverage(r1,g1,b1:integer):integer;
  561.   begin
  562.     result := (r1+g1+b1) div 3;
  563.   end;
  564.   function GetPlacement(r,g,b: integer): integer;
  565.   var tolerance:integer;
  566.       val:double;
  567.   begin
  568.     tolerance:=16;     //?Maybe make this configurable???? Public property?
  569.     result := 15;
  570.     if Highest(r,g,b)=0 then begin
  571.        exit;
  572.     end
  573.     else if Highest(r,g,b)=1 then begin
  574.        if (R>G) and (G>B) then begin
  575.           val := (R-G);
  576.           val := (val/R)*100.0;
  577.           if (val < tolerance) then result := 2     //GreenishYellow color
  578.           else begin
  579.              val := (G/R)*100.0;
  580.              if (val < tolerance) then
  581.                 result := 14
  582.              else result :=1;
  583.           end;
  584.        end
  585.        else if (R=G) and (G>B) then result :=2
  586.        else if (R=B) and (B>G) then result :=12
  587.        else if (R>B) and (B>G) then begin
  588.           val := (R-B);
  589.           val := (val/R)*100.0;
  590.           if (val < tolerance) then result := 12     //GreenishYellow color
  591.           else begin
  592.              val := (B/R)*100.0;
  593.              if (val < tolerance) then result := 14
  594.              else result :=13;
  595.           end;
  596.        end
  597.        else if (R>G) and (G=B) then result :=14
  598.     end
  599.     else if Highest(r,g,b)=2 then begin
  600.        if (G>B) and (B>R) then begin
  601.           val := (G-B);
  602.           val := (val/G)*100.0;
  603.           if (val < tolerance) then
  604.              result := 7                 //Treat as G=B Placement
  605.           else begin
  606.              val := (B/G)*100.0;
  607.              if (val < tolerance) then result := 4  //Treat as basically Green
  608.              else result :=6;           //Treat as before G>B
  609.           end;
  610.        end
  611.        else if (G>R) and (R>B) then begin
  612.           val := (G-R);
  613.           val := (val/G)*100.0;
  614.           if (val < tolerance) then
  615.              result := 3      //Treat as G=R
  616.           else begin
  617.              val := (R/G)*100.0;
  618.              if (val < tolerance) then result := 4
  619.              else result :=3;
  620.           end;
  621.        end
  622.        else if (G>R) and (R=B) then result :=5
  623.        else if (G=B) and (B>R) then result :=7
  624.     end
  625.     else if Highest(r,g,b)=3 then begin
  626.        if (B>G) and (G>R) then begin
  627.           val := (B-G);
  628.           val := (val/B)*100.0;
  629.           if (val < tolerance) then result := 7
  630.           else begin
  631.             val := (G/B)*100.0;
  632.             if (val < tolerance) then result := 9
  633.             else result :=8
  634.           end;
  635.        end
  636.        else if (B>G) and (G=R) then result :=10
  637.        else if (B>R) and (R>G) then
  638.        begin
  639.           val := (B-R);
  640.           val := (val/B)*100.0;
  641.           if (val < tolerance) then result := 12
  642.           else begin
  643.             val := (R/B)*100.0;
  644.             if val < tolerance then result :=9
  645.             else result :=11;
  646.           end;
  647.        end
  648.     end
  649.   end;
  650. begin
  651.    if s1=s2 then begin
  652.      result := 0;
  653.      exit;
  654.    end;
  655.    //Get RGB values for each color....
  656.    fcColorToByteValues(ColorToRGB(StringToColor('$'+s1)),reserved1,blue1,green1,red1);
  657.    fcColorToByteValues(ColorToRGB(StringToColor('$'+s2)),reserved2,blue2,green2,red2);
  658.    //Sort either by csoByRGB or csoByIntensity
  659.    if (SortBy = csoByRGB) then begin
  660.      placement1 := getplacement(red1,green1,blue1);
  661.      placement2 := getplacement(red2,green2,blue2);
  662.    end
  663.    else begin
  664.    {For Intensity Seperate Colors and Greys. Put GreyScale at the Bottom}
  665.       if (red1=green1) and (red1=blue1) then
  666.          placement1:= 2
  667.       else placement1:=1;
  668.       if (red2=green2) and (red2=blue2) then
  669.          placement2:= 2
  670.       else placement2:=1;
  671.    end;
  672.    if seperatesyscolors then begin
  673.       if (Copy(s1,1,2)='80') then
  674.          placement1 := placement1+16;
  675.       if (Copy(s2,1,2)='80') then
  676.          placement2 := placement2+16;
  677.    end;
  678.    if s1='1FFFFFFF' then
  679.       placement1 := 0;
  680.    if s2='1FFFFFFF' then
  681.       placement2 := 0;
  682.    if placement1 < placement2 then result := -1
  683.    else if placement1 > placement2 then result := 1
  684.    else begin
  685.       if (not (SortBy = csoByRGB)) or ((placement1 mod 2) = 1) then begin
  686.         if GetAverage(red1,green1,blue1) < GetAverage(red2,green2,blue2) then
  687.            result :=-1
  688.         else if GetAverage(red1,green1,blue1) > GetAverage(red2,green2,blue2) then
  689.            result :=1
  690.         else result :=0;
  691.       end
  692.       else begin
  693.         if GetAverage(red1,green1,blue1) > GetAverage(red2,green2,blue2) then
  694.            result :=-1
  695.         else if GetAverage(red1,green1,blue1) < GetAverage(red2,green2,blue2) then
  696.            result :=1
  697.         else result :=0;
  698.       end;
  699.    end;
  700. end;
  701. function RGBCompareGroupSys(s1,s2: string): Integer;
  702. begin
  703.   result := ColorCompare(s1,s2,csoByRGB,True);
  704. end;
  705. function IntensityCompareGroupSys(s1,s2: string): Integer;
  706. begin
  707.   result := ColorCompare(s1,s2,csoByIntensity,True);
  708. end;
  709. function RGBCompare(s1,s2: string): Integer;
  710. begin
  711.   result := ColorCompare(s1,s2,csoByRGB,False);
  712. end;
  713. function IntensityCompare(s1,s2: string): Integer;
  714. begin
  715.   result := ColorCompare(s1,s2,csoByIntensity,False);
  716. end;
  717. procedure TfcColorListFiller.ColorCallbackProc(const s: String);
  718. const EndColors = 30; // Delphi 6 update pack 2 increases this to 30, previously 28
  719. var AColorInt: LongInt;
  720.     AColor: TColor;
  721. begin
  722.    IdentToColor(s, AColorInt);
  723.    AColorInt := AColorInt and $00ffffff;//$0080000000;
  724.    AColor := StringToColor(s);
  725.    //clBlack should only show up with Standard Colors and not be associated
  726.    //with System Colors.
  727.    if (S='clBlack') and (ccoShowStandardColors in FOptions) then
  728.       Flist.Add(Copy(S, 3, Length(s) - 2) + '=' + InttoHex(AColor, 6))
  729.    else if ((S<>'clBlack') and (S<> 'clNone') and
  730.        (((ccoShowStandardColors in FOptions) and (not (AColorInt in [COLOR_SCROLLBAR..ENDCOLORS]))
  731.        or ((AColorInt in [COLOR_SCROLLBAR..ENDCOLORS]) and (ccoShowSystemColors in FOptions))))) then
  732.       Flist.Add(Copy(S, 3, Length(s) - 2) + '=' + IntToHex(AColor,6));
  733. end;
  734. procedure TfcColorListFiller.FillColorList(var AList: TStringList;AOptions:TfcColorListBoxOptions;NoneString:String);
  735. begin
  736.    FList:=AList;
  737.    if (ccoShowColorNone in AOptions) then
  738.       FList.Add(NoneString+'='+IntToHex(clNone,6));
  739.    FOptions := AOptions;
  740.    GetColorValues(ColorCallbackProc);
  741.    AList := FList;
  742. end;
  743. //***************** TfcColorList ********************************
  744. procedure TfcCustomColorList.Loaded;
  745. begin
  746.   inherited Loaded;
  747.   InitColorList;           //Maybe should always call?
  748. end;
  749. procedure TfcCustomColorList.CreateWnd;
  750. begin
  751.   inherited CreateWnd;
  752.   InitColorList;           //Maybe should always call?
  753.   if not (Owner is TfcCustomColorCombo) then exit;
  754.   Windows.SetParent(Handle, 0);
  755.   CallWindowProc(DefWndProc, Handle, wm_SetFocus, 0, 0);
  756. end;
  757. constructor TfcCustomColorList.Create(AOwner: TComponent);
  758. begin
  759.   inherited Create(AOwner);
  760.   FOptions := [ccoShowStandardColors,ccoShowColorNames];
  761.   FCustomColors := TStringList.Create;
  762.   FTempColors := TStringList.Create;
  763.   FAllColors := TStringList.Create;
  764.   FAlignment := taLeftJustify;
  765.   FColorAlignment := taLeftJustify;
  766.   FSortByOption := csoNone;
  767.   FGreyScaleIncrement := 10;
  768.   FSelectedColor := clNullColor;
  769.   FHighlightColor := clNone;
  770.   FHighlightTextColor := clNone;
  771.   FColorMargin := 2;
  772.   ColorWidth := GetEditRectHeight-1;
  773.   //3/3/99 -PYW- Don't Default to True because of align issues.
  774.   // IntegralHeight:= True;
  775.   ControlStyle := ControlStyle - [csFixedHeight];
  776.   {$IFDEF WIN32}
  777.      ControlStyle := ControlStyle + [csReplicatable];
  778.   {$ENDIF}
  779.   FCustomColors.OnChange := CustomColorsChangeEvent;
  780.   FCloseOnUp := True;
  781.   ItemIDMap:= TList.create;
  782. end;
  783. destructor TfcCustomColorList.Destroy;
  784. begin
  785. //  DestroyHandle;
  786.   ItemIDMap.Free;
  787.   FCustomColors.Free;
  788.   FAllColors.Free;
  789.   FTempColors.Free;
  790.   inherited Destroy;
  791. end;
  792. { RSW }
  793. procedure TfcCustomColorList.MouseUp(Button: TMouseButton;
  794.   Shift: TShiftState; X, Y: Integer);
  795. begin
  796.   if Items.count<=0 then begin
  797.      FCloseOnUp := True;
  798.      exit;
  799.   end;
  800.   if (Button = mbLeft) and FCloseOnUp and (ItemIndex >=0) and
  801.      (PtInRect(ClientRect, Point(X, Y))) then
  802.   begin
  803.      SelectedColor := StringToColor('$'+Items.Values[Items.Names[ItemIndex]]);
  804.   end;
  805.   inherited;
  806.   if (Button= mbLeft) and FCloseOnUp and (Owner is TfcCustomColorCombo) and
  807.      (FClickedInControl or PtInRect(ClientRect, Point(X, Y))) then
  808.     (Owner as TfcCustomColorCombo).CloseUp(PtInRect(ClientRect, Point(X, Y)));
  809.   FCloseOnUp := True;
  810.   if not FClickedInControl then FIgnoreMouseScroll := True;
  811. end;
  812. procedure TfcCustomColorList.MouseMove(Shift: TShiftState; X, Y: Integer);
  813. var itemno:integer;
  814. begin
  815. {  if (not FIgnoreMouseScroll) and (not FClickedInControl) and PtInRect(ClientRect, Point(x, y)) then
  816.   begin
  817.     if not ((FLastPoint.X=0) and (FLastPoint.Y=0)) and (Owner is TfcCustomColorCombo) then
  818.        PostMessage(Handle, WM_LBUTTONDOWN, 0, 0); // Added to allow one-click selection and dragging.  -ksw (2/18/99)
  819.   end;
  820. }
  821.   inherited;
  822. {  if ((FLastPoint.x = x) and (FLastPoint.y = y)) or ((FLastPoint.x = -1) and (FLastPoint.y = -1)) then
  823.   begin
  824.     FLastPoint := Point(x, y);
  825.     Exit;
  826.   end;
  827. }
  828. {  if (FLastPoint.X=0) and (FLastPoint.Y=0) then
  829.      FLastPoint := Point(X,Y);
  830.   if (FLastPoint.X = X) and (FLastPoint.Y = Y) then Exit;
  831. }
  832.   if not (Owner is TfcCustomColorCombo) then exit;
  833.   if FIgnoreMouseScroll then exit;
  834.   itemno := ItemAtPos(Point(X,Y),True);
  835.   if FPrevItem = itemno then exit;
  836.   if (ItemIndex <> itemno) and (itemno >=0) then
  837.      SendMessage(Handle, LB_SETCURSEL, itemno, 0);
  838.      //ItemIndex := itemno;
  839.   FPrevItem := itemno;
  840.   FLastPoint := Point(X,Y);
  841. end;
  842. function TfcCustomColorList.HasDuplicateNames(var dup:String): Boolean;
  843. var i,j:integer;
  844.   function CompareColorStrings(s1,s2: string): Integer;
  845.   begin
  846.      if (AnsiCompareStr(s1,NoneString) = 0) and
  847.         (AnsiCompareStr(s2,NoneString) <> 0) then
  848.         result := -1
  849.      else if (AnsiCompareStr(s2,NoneString) = 0) and
  850.         (AnsiCompareStr(s1,NoneString) <> 0) then
  851.         result := 1
  852.      else
  853.         result := AnsiComparestr(s1,s2);
  854.   end;
  855. begin
  856.   result := False;
  857.   for i:= 0 to FAllColors.count-1 do begin
  858.      for j:=i+1 to FAllColors.Count-1 do begin
  859.          if CompareColorStrings(FAllColors.Names[i],FAllColors.Names[j])=0 then begin
  860.             dup := FAllColors.Names[j];
  861.             result := True;
  862.             exit;
  863.          end;
  864.      end;
  865.   end;
  866. end;
  867. {
  868. procedure TfcColorList.ListChange(Sender: TObject);
  869. var dup:String;
  870. begin
  871.   if HasDuplicateNames(dup) then
  872.      raise EInvalidOperation.Create('Duplicate Color Names not allowed');
  873. end;
  874. }
  875. procedure TfcCustomColorList.SetOptions(Value: TfcColorListBoxOptions);
  876. begin
  877.    if (Value <> FOptions) then begin
  878.      FOptions := Value;
  879.      if not (csLoading in ComponentState) then InitColorList;
  880.    end;
  881. end;
  882. procedure TfcCustomColorList.UpdateItems;
  883. var i:integer;
  884.     accept:boolean;
  885. begin
  886.    Items.Clear;                  //Update Items with list of color names.
  887.    ItemIDMap.Clear;
  888.    for i := 0 to FAllColors.Count - 1 do
  889.    begin
  890.        if Assigned(FOnFilterColor) then begin
  891.           accept := True;
  892.           FOnFilterColor(self, fcGetColorFromList(FAllColors,i), fcGetNamesFromStringList(FAllColors,i), accept);
  893.           if not accept then continue;
  894.        end;
  895.        ItemIDMap.Add(Pointer(i));
  896.        Items.Add(FAllColors.strings[i]);
  897.    end;
  898. end;
  899. function TfcCustomColorList.ColorFromIndex(Index: Integer):TColor;
  900. begin
  901.   result := fcGetColorFromList(Items,Index);
  902. end;
  903. procedure TfcCustomColorList.SortList;
  904. var i:integer;
  905.     curcolor:TColor;
  906. //    ColorValue:String;
  907. begin
  908.    FListBoxUpdated:= True;
  909.    curcolor:= FSelectedColor;
  910. {   if ItemIndex <> -1 then
  911.      ColorValue := Items.Names[ItemIndex]
  912.    else ColorValue := '';}
  913.             //If there are entries and Sorted is True then Sort the list.
  914.    //2/26/99 - Don't Check Sorted Anymore.
  915.    if {(Sorted = True) and }(FAllColors.Count > 0) then begin
  916.      case SortBy of
  917.         csoByRGB:
  918.            if not (ccoGroupSystemColors in Options) then
  919.               fcQuickSort(FAllColors, 0, FAllColors.Count - 1, RGBCompare, fcGetValuesFromStringList)
  920.            else
  921.               fcQuickSort(FAllColors, 0, FAllColors.Count - 1, RGBCompareGroupSys, fcGetValuesFromStringList);
  922.         csoByIntensity:
  923.            if not (ccoGroupSystemColors in Options) then
  924.               fcQuickSort(FAllColors, 0, FAllColors.Count - 1, IntensityCompare, fcGetValuesFromStringList)
  925.            else
  926.               fcQuickSort(FAllColors, 0, FAllColors.Count - 1, IntensityCompareGroupSys, fcGetValuesFromStringList);
  927.         csoByName:
  928.            if (ccoGroupSystemColors in Options) then
  929.              //2/26/99 - Already Sorted if ByName.
  930. {              fcQuickSort(FAllColors, 0, FAllColors.Count - 1, ColorNamesCompare, fcGetItemsFromStringList)
  931.            else}
  932.               fcQuickSort(FAllColors, 0, FAllColors.Count - 1, ColorNamesCompareGroupSys, fcGetItemsFromStringList);
  933.      end;
  934.    end;
  935.    UpdateItems;
  936.    {    3/4//99 - Call UpdateItems method instead.
  937.    Items.Clear;
  938.    ItemIDMap.Clear;
  939.    for i := 0 to FAllColors.Count - 1 do
  940.    begin
  941.        if Assigned(FOnFilterColor) then begin
  942.           accept := True;
  943.           FOnFilterColor(self, fcGetColorFromList(FAllColors,i), fcGetNamesFromStringList(FAllColors,i), accept);
  944.           if not accept then continue;
  945.        end;
  946.        ItemIDMap.Add(Pointer(i));
  947.        Items.Add(FAllColors.strings[i]);
  948.    end;}
  949.    i := fcValueInList(IntToHex(curcolor,6),FAllColors);
  950.    if i<> -1 then i := Items.indexofname(allcolors.Names[i]);
  951.    if i >= 0 then ItemIndex := i;   //Reset cursor if listbox has a current color
  952. end;
  953. procedure TfcCustomColorList.CreateParams(var Params: TCreateParams);
  954. begin
  955.   inherited CreateParams(Params);
  956.   with Params do begin
  957.     Style := Style or LBS_OWNERDRAWFIXED;
  958.     WindowClass.Style := CS_DBLCLKS;
  959.   end;
  960.   if not (Owner is TfcCustomColorCombo) then exit;
  961.   with Params do
  962.   begin
  963.     Style := Style or WS_BORDER;
  964.     ExStyle := WS_EX_TOOLWINDOW;
  965.     WindowClass.Style := CS_SAVEBITS;
  966.     ControlStyle := ControlStyle + [csNoDesignVisible];
  967.   end;
  968. end;
  969. procedure TfcCustomColorList.DoDrawItem(ACanvas:TCanvas; Index,CWidth,CHeight:Integer; Rect: TRect;
  970.    State: TOwnerDrawState; Text:String; AColor:TColor);
  971. var CurColor: TColor;
  972.     ColorRect, TextRect: TRect;
  973.     OrigPenColor,OrigColor,OrigFontColor:TColor;
  974.     OrigBKMode:Longint;
  975.     NoneFlag,ShowText:Boolean;
  976.     NoneStr:String;
  977.   function HighlightCol: TColor;
  978.   begin
  979.     if (odSelected in State) then result := GetHighlightColor
  980.     else result := OrigColor;
  981.   end;
  982.   function HighlightTextCol: TColor;
  983.   begin
  984.     if (odSelected in State) then result := GetHighlightTextColor
  985.     else result := OrigFontColor;
  986.   end;
  987. begin
  988.   OrigColor := ACanvas.Brush.Color;
  989.   OrigFontColor := ACanvas.Font.Color;
  990.   OrigPenColor := ACanvas.Pen.Color;
  991.   OrigBkMode := GetBKMode(ACanvas.Handle);
  992.   if (Index = -1) and (Text = '') then
  993.   begin
  994.     if (odSelected in State) then begin
  995.        SetBkMode(ACanvas.Handle,Opaque);
  996.        ACanvas.Brush.Color := GetHighlightColor;
  997.        ACanvas.FillRect(Rect);
  998.        SetBkColor(ACanvas.Handle,ColorToRGB(GetHighlightColor));
  999.        SetTextColor(ACanvas.Handle,ColorToRGB(GetHighlightTextColor));
  1000.        ACanvas.DrawFocusRect(Rect);
  1001.     end
  1002.     else begin
  1003.        SetBkMode(ACanvas.Handle,Opaque);
  1004.        ACanvas.Brush.Color := HighlightCol;
  1005.        ACanvas.FillRect(Rect);
  1006.        ACanvas.Brush.Color := OrigFontColor;
  1007.        ACanvas.DrawFocusRect(Rect);
  1008.     end;
  1009.     ACanvas.Brush.Color := OrigColor;
  1010.     ACanvas.Font.Color := OrigFontColor;
  1011.     ACanvas.Pen.Color := OrigPenColor;
  1012.     Exit;
  1013.   end;
  1014.   if AColor = clNullColor then CurColor := clNone
  1015.   else CurColor := AColor;
  1016.   if (CurColor = clNone) and (AColor <> clNullColor) then begin
  1017.      CurColor := OrigColor; //Make None Color same as background?????}
  1018.      NoneFlag := True;
  1019.   end
  1020.   else NoneFlag := False;
  1021.   ShowText := False;
  1022.   if ccoShowColorNames in Options then ShowText := True;
  1023.   if ShowText then
  1024.   begin
  1025.     if Alignment = taLeftJustify then begin
  1026.        if (ColorAlignment = taLeftJustify) then
  1027.           ColorRect := Classes.Rect(Rect.Left + ColorMargin, Rect.Top + ((Rect.Bottom-Rect.Top-CHeight) div 2),
  1028.                                 Rect.Left + ColorMargin + CWidth, Rect.Bottom - ((Rect.Bottom-Rect.Top-CHeight) div 2))
  1029.        else
  1030.           ColorRect := Classes.Rect(fcmax(Rect.Right-ColorMargin-CWidth,ACanvas.TextWidth(Text)+2*ColorMargin),
  1031.                                  Rect.Top + ColorMargin,
  1032.                                  Rect.Right - ColorMargin,
  1033.                                  Rect.Bottom - ColorMargin);
  1034.     end
  1035.     else begin
  1036.        if (ColorAlignment = taLeftJustify) then
  1037.           ColorRect := Classes.Rect(Rect.Left + ColorMargin, Rect.Top + ((Rect.Bottom-Rect.Top-CHeight) div 2),
  1038.                                     fcMin(Rect.Left + ColorMargin + CWidth,Rect.Right-(ACanvas.TextWidth(Text)+2*ColorMargin)),
  1039.                                     Rect.Bottom - ((Rect.Bottom-Rect.Top-CHeight) div 2))
  1040.        else
  1041.           ColorRect := Classes.Rect(fcmax(Rect.Right-ColorMargin-CWidth,ACanvas.TextWidth(Text)+2*ColorMargin),
  1042.                                  Rect.Top + ColorMargin,
  1043.                                  Rect.Right - ColorMargin,
  1044.                                  Rect.Bottom - ColorMargin);
  1045.     end;
  1046.     if (Index = -1) and (AColor = clNullColor) then ColorRect := Classes.Rect(Rect.Left,Rect.Top,Rect.Left,Rect.Top);
  1047.     if (Alignment = taLeftjustify) then begin
  1048.       if (ColorAlignment=taLeftJustify) then
  1049.          TextRect := Classes.Rect(ColorRect.Right + ColorMargin, Rect.Top, Rect.Right-ColorMargin, Rect.Bottom)
  1050.       else
  1051.          TextRect := Classes.Rect(Rect.Left + ColorMargin,Rect.Top,
  1052.                                   fcmax(Rect.Right-ColorMargin-CWidth,ACanvas.TextWidth(Text)+2*ColorMargin),
  1053.                                   Rect.Bottom);
  1054.     end
  1055.     else begin
  1056.       if (ColorAlignment=taLeftJustify) then
  1057.          TextRect := Classes.Rect(ColorRect.Left + ColorMargin,
  1058.                         Rect.Top, Rect.Right-ColorMargin,Rect.Bottom)
  1059.       else
  1060.          TextRect := Classes.Rect(Rect.Left + ColorMargin,Rect.Top,
  1061.                      fcmax(Rect.Right-2*ColorMargin-CWidth,Rect.Left+ACanvas.TextWidth(Text)+ColorMargin),
  1062.                      Rect.Bottom);
  1063.     end;
  1064.   end
  1065.   else begin
  1066.       ColorRect := Classes.Rect(Rect.Left + ColorMargin, Rect.Top + ColorMargin,
  1067.                                 Rect.Right - ColorMargin, Rect.Bottom - ColorMargin);
  1068.       if (Index = -1) and (AColor = clNullColor) then ColorRect := Classes.Rect(Rect.Left,Rect.Top,Rect.Left,Rect.Top);
  1069.   end;
  1070.   // Paint background color
  1071.   if (ItemIndex <> -1) then begin //3/3/99 - Eliminate Flicker when resizing with Align set.
  1072.     ACanvas.Brush.Color := HighlightCol;
  1073.     ACanvas.FillRect(Rect);
  1074.   end;
  1075.   if (AColor <> clNullColor) then begin
  1076.   // Paint Color Square
  1077.     ACanvas.Pen.Color := HighlightTextCol;
  1078.     ACanvas.Brush.Color := CurColor;
  1079.     if NoneFlag and
  1080.        (odSelected in State) and (odFocused in State) and (ShowText) then
  1081.        ACanvas.Brush.Color := GetHighlightColor;
  1082.     ACanvas.FillRect(ColorRect);
  1083.   // If Displaying Transparent Color Box then don't paint highlight
  1084.     if NoneFlag then begin
  1085.       if ShowText and (odSelected in State) and (odFocused in State) then
  1086.           ACanvas.Pen.Color := HighlightTextCol
  1087.       else if (ShowText = True) then
  1088.           ACanvas.Pen.Color := OrigFontColor
  1089.       else ACanvas.Pen.Color := CurColor;
  1090.     end;
  1091.     ACanvas.Rectangle(ColorRect.Left, ColorRect.Top, ColorRect.Right, ColorRect.Bottom);
  1092.   end;
  1093.   ACanvas.Brush.Color := HighlightCol;
  1094.   ACanvas.Font.Color := HighlightTextCol;
  1095.   SetBkMode(ACanvas.Handle,Transparent);
  1096.   NoneStr := NoneString;
  1097.   if (ShowText) and (Not NoneFlag) then begin
  1098.     if Alignment = taLeftJustify then
  1099. //      DrawText(ACanvas.Handle, PChar(GetNamesFromStringList(AllColors,Index)), Length(GetNamesFromStringList(AllColors,Index)), TextRect, DT_SINGLELINE or DT_VCENTER)
  1100.       DrawText(ACanvas.Handle, PChar(Text), Length(Text), TextRect, DT_SINGLELINE or DT_VCENTER)
  1101.     else
  1102.       DrawText(ACanvas.Handle, PChar(Text), Length(Text), TextRect, DT_SINGLELINE or DT_VCENTER or DT_RIGHT);
  1103.   end
  1104.   else if (ShowText) then begin
  1105.     if NoneString = '' then NoneStr := 'None';
  1106.     if Alignment = taLeftJustify then
  1107.       DrawText(ACanvas.Handle, PChar(NoneStr), Length(NoneStr), TextRect, DT_SINGLELINE or DT_VCENTER)
  1108.     else
  1109.       DrawText(ACanvas.Handle, PChar(NoneStr), Length(NoneStr), TextRect, DT_SINGLELINE or DT_VCENTER or DT_RIGHT);
  1110.   end;
  1111.   if NoneFlag then begin
  1112.     if (odSelected in State) and (odFocused in State) then
  1113.        ACanvas.Pen.Color := HighlightTextCol
  1114.     else ACanvas.Pen.Color := OrigFontColor;
  1115.     if ShowText then begin
  1116.        ACanvas.Polyline([Point(ColorRect.TopLeft.X,ColorRect.TopLeft.Y),
  1117.                          Point(ColorRect.BottomRight.X,ColorRect.BottomRight.Y)]);
  1118.        ACanvas.Polyline([Point(ColorRect.TopLeft.X,ColorRect.BottomRight.Y-1),
  1119.                          Point(ColorRect.BottomRight.X,ColorRect.TopLeft.Y-1)]);
  1120.     end
  1121.     else begin
  1122.        if (odSelected in State) and (odFocused in State) and ShowText then
  1123.             ACanvas.Font.Color := HighlightTextCol
  1124.        else ACanvas.Font.Color := OrigFontColor;
  1125.        DrawText(ACanvas.Handle, PChar(NoneStr), Length(NoneStr), ColorRect,
  1126.           DT_SINGLELINE or DT_VCENTER or DT_CENTER);
  1127.     end;
  1128.   end;
  1129.   // Reset Font, Pen, and Brush Colors
  1130.   ACanvas.Font.Color := HighlightTextCol;
  1131.   ACanvas.Pen.Color := HighlightTextCol;
  1132.   ACanvas.Brush.Color := HighlightCol;
  1133.   SetBkMode(ACanvas.Handle,Opaque);
  1134.   if (odSelected in State) and (odFocused in State) then
  1135.      ACanvas.DrawFocusRect(Rect);
  1136.  ACanvas.Brush.Color := OrigColor;
  1137.  ACanvas.Font.Color := OrigFontColor;
  1138.  ACanvas.Pen.Color := OrigPenColor;
  1139.  SetBkMode(ACanvas.Handle,OrigBkMode);
  1140. end;
  1141. procedure TfcCustomColorList.InitColorList;
  1142. var i, count: integer;
  1143.     FTempList: TStringList;
  1144. begin
  1145.    FTempList:= TStringList.Create;
  1146.                             //Fill Standard and System Colors
  1147.    FillColorList(FTempList,FOptions,NoneString);
  1148.    FAllColors.Clear;
  1149.    for i:=0 to FTempList.Count-1 do
  1150.       AddToAllColors(FTempList.Names[i],FTempList.Values[FTempList.Names[i]]);
  1151.    FTempList.Free;
  1152.                           //Fill with Custom Colors
  1153.    if ccoShowCustomColors in Options then
  1154.       for i := 0 to FCustomColors.Count - 1 do
  1155.          AddToAllColors(FCustomColors.Names[i],fcGetValuesFromStringList(FCustomColors,i));
  1156.    for i := 0 to FTempColors.Count - 1 do
  1157.       AddToAllColors(FTempColors.Names[i],fcGetValuesFromStringList(FTempColors,i));
  1158.    if ccoShowGreyScale in Options then begin
  1159.       i:= 0;
  1160.       count :=1;
  1161.       while i <= 255 do begin
  1162.         if AddToAllColors('Grey'+IntToStr(Count),fcRGBToHexString(i,i,i)) then
  1163.            count:=count+1;
  1164.         i := i+GreyScaleIncrement;
  1165.       end;
  1166.    end;
  1167. {  k:=0;          //Code to add Standard 255 Colors
  1168.    count:=0;
  1169.    while k<=255 do begin
  1170.       j:=0;
  1171.       while j<=255 do begin
  1172.          i:=0;
  1173.          while i<=255 do begin
  1174.             if (ValueInList(RGBToHexString(i,j,k),FAllColors)=-1) then begin
  1175.                count := count+1;
  1176.                FAllColors.Add('MyColor'+IntToStr(Count)+'='+RGBToHexString(i,j,k));
  1177.             end;
  1178.             i:=i+51;
  1179.          end;
  1180.          j:=j+51;
  1181.       end;
  1182.       k:=k+51;
  1183.    end;}
  1184.    SortList;
  1185. end;
  1186. {function TfcCustomColorList.MapItemID(val: integer): integer;
  1187. begin
  1188.    result:= integer(ItemIDMap[val]);
  1189. end;
  1190. }
  1191. // 3/1/99 - Make sure that colorlist invalidates when resizing.
  1192. procedure TfcCustomColorList.WMSize(var Message: TWMSize);
  1193. begin
  1194.   inherited;
  1195.   if not (csDesigning in ComponentState) then exit;
  1196.   if not (Owner is TfcCustomColorCombo) then invalidate;
  1197. end;
  1198. procedure TfcCustomColorList.CNDrawItem(var Message: TWMDrawItem);
  1199. var
  1200.   State: TOwnerDrawState;
  1201.   cwidth:Integer;
  1202.   AName:String;
  1203.   AColor:TColor;
  1204.   function GetOwnerDrawStates(AState: DWORD): TOwnerDrawState;
  1205.   begin
  1206.     result := [];
  1207.     if (ODS_CHECKED and AState) = ODS_CHECKED then result := result + [odChecked];
  1208.     if (ODS_DISABLED and AState) = ODS_DISABLED then result := result + [odDisabled];
  1209.     if (ODS_FOCUS and AState) = ODS_FOCUS then result := result + [odFocused];
  1210.     if (ODS_GRAYED and AState) = ODS_GRAYED then result := result + [odGrayed];
  1211.     if (ODS_SELECTED and AState) = ODS_SELECTED then result := result + [odSelected];
  1212.   end;
  1213. begin
  1214. //  inherited;   //(This causes control to flicker, removed) -ksw
  1215.   with Message.DrawItemStruct^ do
  1216.   begin
  1217.     if Integer(ItemID) < 0 then begin
  1218.        inherited;
  1219.        exit;
  1220.     end;
  1221.     State := GetOwnerDrawStates(itemState);
  1222.     Canvas.Handle := hDC;
  1223.     Canvas.Font := Font;
  1224.     Canvas.Brush := Brush;
  1225.     if ColorWidth = 0 then
  1226.        cwidth := ItemHeight-(2*ColorMargin)
  1227.     else cwidth := ColorWidth;
  1228.     AName := '';
  1229.     AColor := clWindow;
  1230.     if (ItemId <> $FFFFFFFF) then  // Changed from -1 to avoid compiler warning. -ksw (9/18/98)
  1231.     begin
  1232.       AName := Items.Names[ItemId];
  1233.       AColor := StringToColor('$'+Items.Values[AName]);
  1234.     end;
  1235. {    if (cslbuttondown in controlstate) and not PtInRect(ClientRect,ScreenToClient(fcGetCursorPos)) then
  1236.     begin
  1237.         State := State - [odfocused];
  1238.     end;}
  1239.     DoDrawItem(Canvas, itemID, cwidth, ItemHeight-2*ColorMargin, rcItem, State, AName, AColor);
  1240.     Canvas.Handle := 0;
  1241.   end;
  1242. end;
  1243. function TfcCustomColorList.GetItemIndex: integer;
  1244. begin
  1245.    if MultiSelect then
  1246.       Result := SendMessage(Handle, LB_GETCARETINDEX, 0, 0)
  1247.    else Result := SendMessage(Handle, LB_GETCURSEL, 0, 0);
  1248. end;
  1249. Procedure TfcCustomColorList.SetItemIndex(Value: integer);
  1250. begin
  1251.    if MultiSelect then
  1252.       SendMessage(Handle, LB_SETCARETINDEX, Value, 0)
  1253.    else SendMessage(Handle, LB_SETCURSEL, Value, 0);
  1254.    if Value <> ItemIndex then
  1255.       inherited ItemIndex:= value;
  1256.    if (Value < Items.Count) and (Value <> -1) then
  1257.       FSelectedColor := StringToColor('$'+Items.Values[Items.Names[Value]])
  1258.       //fcGetColorFromList(FAllColors,Value)
  1259.    else FSelectedColor := clNullColor;
  1260. end;
  1261. procedure TfcCustomColorList.SetSortBy(Value: TfcSortByOption);
  1262. begin
  1263.   if FSortByOption <> Value then
  1264.   begin
  1265.     FSortByOption := Value;
  1266.     //2/26/99 - Set Sorted only when byname.
  1267.     //3/2/99 - Sort Only when byName and not Grouping System Colors.
  1268.     inherited Sorted := (FSortByOption = csoByName) and not (ccoGroupSystemColors in Options);
  1269.     SortList;
  1270.   end;
  1271. end;
  1272. procedure TfcCustomColorList.SetGreyScaleIncrement(Value: Integer);
  1273. begin
  1274.   if (FGreyScaleIncrement <> Value) and
  1275.       (Value > 0) and (Value <=255) then begin
  1276.      FGreyScaleIncrement := Value;
  1277.      if not (csLoading in ComponentState) then InitColorList;
  1278.   end;
  1279. end;
  1280. procedure TfcCustomColorList.SetNoneString(Value: String);
  1281. begin
  1282.   if (FNoneString <> Value) then begin
  1283.      FNoneString := Value;
  1284.      if not (csLoading in ComponentState) then InitColorList;
  1285.   end;
  1286. end;
  1287. procedure TfcCustomColorList.SetSelectedColor(Value: TColor);
  1288. var i: integer;
  1289. begin
  1290.   if Value <> SelectedColor then
  1291.   begin
  1292.      FSelectedColor := Value;
  1293.      { 4/11/99 - RSW - Used to be before  Value <> SelectedColor comparison,
  1294.        which prevented internal value from being updated during streaming}
  1295.      if FAllColors.Count = 0 then Exit;
  1296.      i := fcValueInList(IntToHex(Value,6), FAllColors);
  1297.      if i<> -1 then i := Items.indexofname(allcolors.Names[i]);
  1298.      if i >= 0 then ItemIndex := i
  1299.      else begin
  1300.        if Value <> clNullColor then begin    //3/1/99 - Check for NullColor
  1301.          AddToAllColors(fcColorToRGBString(Value),IntToHex(Value,6));
  1302.          //3/3/99 -PYW- Don't add twice and don't reset itemindex to wrong value. 
  1303. {         if AddToAllColors(fcColorToRGBString(Value),IntToHex(Value,6)) then
  1304.          begin
  1305.             Items.Add(fcColorToRGBString(Value));
  1306.             ItemIndex := Items.Count - 1;
  1307.             SortList;
  1308.          end;        }
  1309.        end
  1310.        else begin
  1311.          ItemIndex := -1;
  1312.        end;
  1313.      end;
  1314.   end;
  1315. end;
  1316. function TfcCustomColorList.GetSelectedColor: TColor;
  1317. begin
  1318.   if ItemIndex = -1 then
  1319.      result := clNullColor
  1320.   else result := FSelectedColor;
  1321. end;
  1322. //Returns whether or not Color was added to the list...
  1323. function TfcCustomColorList.AddToAllColors(AName,AValue:String) : Boolean;
  1324. var curColor:TColor;
  1325.     ColorNotInList,accept,IsCustomColor: Boolean;
  1326. begin
  1327.   result := False;
  1328.   accept := True;
  1329.   ColorNotInList := False;
  1330.   if (fcValueInList(AValue,FAllColors)=-1) then
  1331.      ColorNotInList := True;
  1332.   curColor:=  StringToColor('$'+AValue);
  1333.   IsCustomColor := (Pos('RGB:',AName)=1);
  1334.   //3/4/99 - Don't call onaddnewcolors for non customcolors.
  1335.   if IsCustomColor and Assigned(FOnAddNewColor) then FOnAddNewColor(self, curColor, AName, accept);
  1336.   if not accept then exit;
  1337.   if (fcNameInList(AName,FAllColors)=-1) and (ColorNotInList) then begin
  1338.      result := True;
  1339.      FAllColors.Add(AName+'='+AValue);
  1340.      if IsCustomColor then begin
  1341.         FTempColors.Add(AName+'='+AValue);
  1342.         SortList;
  1343.      end;
  1344.   end;
  1345. end;
  1346. procedure TfcCustomColorList.SetCustomColors(Value: TStringList);
  1347. var dup:String;
  1348. begin
  1349.   FCustomColors.Assign(Value);
  1350.   if not (csLoading in ComponentState) then InitColorList;
  1351.   if HasDuplicateNames(dup) then
  1352.      MessageDlg('Duplicate Color Name Not Allowed: '+dup, mtWarning, [mbok], 0);
  1353. end;
  1354. procedure TfcCustomColorList.SetAlignment(Value: TLeftRight);
  1355. begin
  1356.   if FAlignment <> Value then
  1357.   begin
  1358.     FAlignment := Value;
  1359.     Invalidate;
  1360. //    RecreateWnd;
  1361.   end;
  1362. end;
  1363. procedure TfcCustomColorList.SetColorAlignment(Value: TLeftRight);
  1364. begin
  1365.   if FColorAlignment <> Value then
  1366.   begin
  1367.     FColorAlignment := Value;
  1368.     RecreateWnd;
  1369.   end;
  1370. end;
  1371. procedure TfcCustomColorList.SetColorWidth(Value: Integer);
  1372. begin
  1373.   if FColorWidth <> Value then
  1374.   begin
  1375.     FColorWidth := Value;
  1376.     Invalidate;
  1377.   end;
  1378. end;
  1379. procedure TfcCustomColorList.SetColorMargin(Value: Integer);
  1380. begin
  1381.   if FColorMargin <> Value then
  1382.   begin
  1383.     if Value >= 0 then begin
  1384.        FColorMargin := Value;
  1385.        Invalidate;
  1386.     end;
  1387.   end;
  1388. end;
  1389. function TfcCustomColorList.GetEditRectHeight: Integer;
  1390. var
  1391.   DC: HDC;
  1392.   SaveFont: HFont;
  1393.   I: Integer;
  1394.   SysMetrics, Metrics: TTextMetric;
  1395. begin
  1396.   DC := GetDC(0);
  1397.   GetTextMetrics(DC, SysMetrics);
  1398.   SaveFont := SelectObject(DC, Font.Handle);
  1399.   GetTextMetrics(DC, Metrics);
  1400.   SelectObject(DC, SaveFont);
  1401.   ReleaseDC(0, DC);
  1402.   I := SysMetrics.tmHeight;
  1403.   if I > Metrics.tmHeight then I := Metrics.tmHeight;
  1404.   result := I;
  1405. end;
  1406. // Custom Color Combo
  1407. procedure TfcCustomColorCombo.SetAlignment(Value: TLeftRight);
  1408. begin
  1409.   if FAlignment <> Value then FAlignment := Value;
  1410. end;
  1411. {
  1412. procedure TfcCustomColorCombo.SetAlignmentVertical(Value: TfcAlignVertical);
  1413. begin
  1414.   if FAlignmentVertical <> Value then begin
  1415.      FAlignmentVertical := Value;
  1416.      Invalidate;
  1417.   end;
  1418. end;
  1419. }
  1420. procedure TfcCustomColorCombo.SetColorAlignment(Value: TLeftRight);
  1421. begin
  1422.   if FColorAlignment <> Value then begin
  1423.      FColorAlignment := Value;
  1424.      if FListBox <> nil then
  1425.         FListBox.ColorAlignment := Value;
  1426.      SetEditRect;
  1427.      Invalidate;
  1428.   end;
  1429. end;
  1430. procedure TfcCustomColorCombo.SetCustomColors(Value: TStringList);
  1431. begin
  1432.   FCustomColors.Assign(Value);
  1433.   if FListbox <> nil then
  1434.   begin
  1435.      FListBox.CustomColors.Assign(Value);
  1436.      FListBox.InitColorList;
  1437.   end
  1438. end;
  1439. procedure TfcCustomColorCombo.SetItemIndex(Value: integer);
  1440. begin
  1441.    if Value < -1 then Value := -1;
  1442.    ListBoxNeeded;
  1443.    if Value >= Listbox.Items.Count then Value := FListBox.Items.Count - 1;
  1444.    if FItemIndex <> Value then begin
  1445.       FItemIndex := Value;
  1446.       FListBox.ItemIndex := Value;
  1447.       if FItemIndex <> -1 then
  1448.          FSelectedColor := StringToColor('$'+Listbox.Items.Values[Listbox.Items.Names[FItemIndex]])
  1449. //         fcGetColorFromList(FListBox.AllColors,FItemIndex)
  1450.       else FSelectedColor := clNullColor;
  1451.       if FItemIndex <> -1 then
  1452.          Text := Listbox.Items.Names[FItemIndex];
  1453.          //fcGetNamesFromStringList(ListBox.AllColors,Fitemindex);
  1454.       invalidate;
  1455.    end;
  1456. end;
  1457. { RSW }
  1458. procedure TfcCustomColorCombo.UpdateSelectedColor;
  1459. var AName:String;
  1460.     i:integer;
  1461.     Value: integer;
  1462. begin
  1463.      Value:= SelectedColor;
  1464.      if Value=clNullColor then begin //3/1/99 - Check for SelectedColor.
  1465.        FListBox.SelectedColor := clNullColor;
  1466.        Text:= '';
  1467.        invalidate;
  1468.        exit;
  1469.      end;
  1470.      i := fcValueInList(IntToHex(Value,6),FListBox.AllColors);
  1471.      if i = -1 then
  1472.      begin
  1473.         AName := fcColorToRGBString(Value);
  1474.         FListBox.AddToAllColors(AName,IntToHex(Value,6));
  1475.         if fcValueInList(IntToHex(Value,6),FListBox.AllColors) = -1 then exit;
  1476.      end;
  1477.      FListBox.SelectedColor := Value;
  1478.      i := fcValueInList(IntToHex(Value,6),FListBox.AllColors);
  1479.      if i<> -1 then i := Listbox.Items.indexofname(Listbox.Allcolors.Names[i]);
  1480.      if i<> -1 then SetComboText(Listbox.items.names[i])
  1481.      else SetComboText('');
  1482.      Invalidate;
  1483. end;
  1484. procedure TfcCustomColorCombo.SetSelectedColor(Value: TColor);
  1485. begin
  1486.   if FSelectedColor <> Value then
  1487.   begin
  1488.      FSelectedColor := Value;
  1489.      if not HandleAllocated then exit;
  1490.      ListBoxNeeded;
  1491.      UpdateSelectedColor; { RSW }
  1492. //     if csLoading in ComponentState then Exit;   // Causes a resource leak if ListBoxNeeded called here -ksw (2/18/99)
  1493. (*     ListBoxNeeded;
  1494.      i := fcValueInList(IntToHex(Value,6),FListBox.AllColors);
  1495.      if i = -1 then
  1496.      begin
  1497.         AName := fcColorToRGBString(Value);
  1498.         FListBox.AddToAllColors(AName,IntToHex(Value,6));
  1499.         if fcValueInList(IntToHex(Value,6),FListBox.AllColors) = -1 then exit;
  1500.      end;
  1501.      FListBox.SelectedColor := Value;
  1502.      i := fcValueInList(IntToHex(Value,6),FListBox.AllColors);
  1503.      if i<> -1 then i := Listbox.Items.indexofname(Listbox.Allcolors.Names[i]);
  1504.      if i<> -1 then SetComboText(Listbox.items.names[i])
  1505.      else SetComboText('');
  1506.      Invalidate;
  1507. *)
  1508.   end;
  1509. end;
  1510. procedure TfcCustomColorCombo.CustomColorsChangeEvent(Sender: TObject);
  1511. begin
  1512.    ListBoxNeeded;
  1513.    FListBox.CustomColors.Assign(CustomColors);
  1514.    FListBox.SelectedColor := SelectedColor;
  1515. end;
  1516. procedure TfcCustomColorCombo.AddNewColorEvent(Sender: TObject; AColor:TColor;
  1517.   var AColorName:String; var Accept: Boolean);
  1518. begin
  1519.   if Assigned(FOnAddNewColor) then FOnAddNewColor(Sender, AColor, AColorName, Accept);
  1520. end;
  1521. procedure TfcCustomColorCombo.OnFilterColorEvent(Sender: TObject; AColor:TColor;
  1522.   AColorName:String; var Accept: Boolean);
  1523. begin
  1524.   if Assigned(FOnFilterColor) then FOnFilterColor(Sender, AColor, AColorName, Accept);
  1525. end;
  1526. procedure TfcCustomColorCombo.ListMouseDown(Sender: TObject; Button: TMouseButton;
  1527.   Shift: TShiftState; X, Y: Integer);
  1528. begin
  1529.   FCloseOnUp := False;
  1530.   if PtInRect(FListBox.ClientRect, Point(X,Y)) then
  1531.      FCloseOnUp := True;
  1532.   FSelectedItemIndex := FListBox.ItemIndex;
  1533.   inherited;
  1534. end;
  1535. procedure TfcCustomColorCombo.ListMouseUp(Sender: TObject; Button: TMouseButton;
  1536.   Shift: TShiftState; X, Y: Integer);
  1537. begin
  1538.   inherited;
  1539.   if (Button = mbLeft) and FCloseOnUp then begin
  1540.     if not PtInRect(FListBox.ClientRect, Point(X,Y)) then begin
  1541.        FListBox.ItemIndex := FSelectedItemIndex;
  1542.        FSelectedColor := Listbox.OldSelectedColor;
  1543.     end;
  1544.     CloseUp(True);
  1545.   end;
  1546.   FCloseOnUp := False;
  1547. end;
  1548. procedure TfcCustomColorCombo.CMExit(var Message: TCMExit);
  1549. begin
  1550.   // 2/23/99 - Not necessary anymore.
  1551. {  if (Style = csDropDownList) then
  1552.      if (ItemIndex = -1) and (Text <> '')  then begin
  1553.         EditCanModify;
  1554.         SetModified(True);
  1555.         Text := ''
  1556.      end
  1557.      else if (ItemIndex <> -1) and (Text <> Listbox.Items.Names[ItemIndex]) then
  1558.      begin
  1559.         EditCanModify;
  1560.         SetModified(True);
  1561.         Text := Listbox.Items.Names[ItemIndex];
  1562.      end;}
  1563.   inherited;
  1564. //  if not Editable then Invalidate;
  1565. end;
  1566. procedure TfcCustomColorCombo.CMTextChanged(var Message: TMessage);
  1567. var s:String;
  1568. begin
  1569.   inherited;
  1570.   if skipTextChange then exit;
  1571.   if (DataLink.Field = nil) then exit;
  1572.   if {(GetComboDataType=ccdColor) and }(fcisinwwgrid(self)) then begin
  1573.      s:= inherited text;
  1574.      SkipTextChange := True;
  1575.      if (StrToIntDef(s,-1) <> -1) then
  1576.         Text := GetComboDisplayText(StrToIntDef(s,-1));
  1577.      SkipTextChange := False;
  1578.   end;
  1579. end;
  1580. procedure TfcCustomColorCombo.CNCommand(var Message: TWMCommand);
  1581. begin
  1582.   if Message.NotifyCode <> CBN_DBLCLK then inherited;
  1583. end;
  1584. procedure TfcCustomColorCombo.CNKeyDown(var Message: TWMKeyDown);
  1585. begin
  1586.   inherited;
  1587. end;
  1588. procedure TfcCustomColorCombo.WMLButtonDblClk(var Message: TWMLButtonDblClk);
  1589. begin
  1590.   skipDropDown:=True;  //3/4/99-PYW-SkipDropDown when double clicking.
  1591.   try
  1592.     inherited;
  1593.     if (cdoEnabled in FColorDialogOptions) then begin
  1594.        ListBox.UpdateItems;
  1595.        ExecuteColorDialog;
  1596.     end;
  1597.   finally
  1598.     skipDropDown:=False;
  1599.   end;
  1600. end;
  1601. procedure TfcCustomColorCombo.WMPaste(var Message: TMessage);
  1602. begin
  1603.   inherited;
  1604.   ItemIndex := fcNameinList(Text,ListBox.AllColors); //!!
  1605. end;
  1606. procedure TfcCustomColorCombo.WMSetFocus(var Message: TWMSetFocus);
  1607. begin
  1608.   inherited;
  1609. {  if ItemIndex <> -1 then
  1610.      ListBox.SelectedColor := fcGetColorFromList(ListBox.FAllColors,ItemIndex)
  1611.   else ListBox.SelectedColor := clNullColor;
  1612.   invalidate;}
  1613. //  if not Editable then
  1614. //     HideCaret(Handle);
  1615. end;
  1616. procedure TfcCustomColorCombo.CloseUp(Accept: Boolean);
  1617. var IsDroppedDown: Boolean;
  1618.     ListValue: String;
  1619.     i:integer;
  1620. begin
  1621.    IsDroppedDown := self.IsDroppedDown;
  1622.    inherited;
  1623.    if IsDroppedDown then begin
  1624.      if Accept and (FListBox.SelectedColor<>FOriginalSelectedColor) and EditCanModify {2/11/99 - RSW } then
  1625.      begin
  1626.         if (FListbox.ItemIndex <> -1) then begin
  1627.            ListValue := Listbox.Items.Names[Listbox.ItemIndex];
  1628.            if (ListValue <> '') then
  1629. //           if {((FListBox.ItemIndex <> ItemIndex) or (ListValue<>Text)) and }EditCanModify then
  1630. //           begin
  1631.               FItemIndex:= FListBox.itemIndex;
  1632.               SetModifiedInChangeEvent:=true;
  1633.               SelectedColor := ListBox.SelectedColor;
  1634.               if ListValue<>'' then Text:= ListValue;
  1635.               SetModifiedInChangeEvent:=false;
  1636.               SetModified(True);
  1637. //           end;
  1638.         end;
  1639.      end
  1640.      else begin
  1641.         i := fcValueInList(IntToHex(FOriginalSelectedColor,6),Listbox.AllColors);
  1642.         if i<> -1 then i := Listbox.Items.indexofname(Listbox.allcolors.Names[i]);
  1643.         ItemIndex := i;
  1644.         SelectedColor := FOriginalSelectedColor;
  1645.        //2/17/99 - Update Text if Text doesn't match
  1646.         if (ItemIndex <> -1) and
  1647.            (Text <> FListbox.Items.Names[ItemIndex]) then
  1648.               Text := FListbox.Items.Names[ItemIndex]
  1649.      end;
  1650.      DoCloseUp(Accept);
  1651.    end;
  1652.    SelectAll;
  1653. end;
  1654. procedure TfcCustomColorCombo.CreateWnd;
  1655. begin
  1656.   inherited CreateWnd;
  1657.   if not (csDesigning in ComponentState) then begin
  1658.      ListBoxNeeded;
  1659.   end;
  1660. end;
  1661. procedure TfcCustomColorCombo.DataChange(Sender: TObject);
  1662. begin
  1663.   //3/25/99-PYW-Exit if Combo is being destroyed.
  1664.   if (csDestroying in ComponentState) then exit;
  1665.   if SkipDataChange then exit;
  1666.   if DataLink.Field <> nil then
  1667.   begin
  1668.     if FAlignment <> DataLink.Field.Alignment then
  1669.     begin
  1670. //      Text := '';  {forces update}
  1671. //      FAlignment := DataLink.Field.Alignment;
  1672.     end;
  1673.     if not (csDesigning in ComponentState) then
  1674.     begin
  1675.       if (DataLink.Field.DataType = ftString) and (MaxLength = 0) then
  1676.         MaxLength := DataLink.Field.Size;
  1677.     end;
  1678.     if Focused and DataLink.CanModify then begin
  1679.       if GetComboDataType=ccdColor then
  1680.          // 10/12/2000 - PYW - Check for Null to initialize to blank.
  1681.          if (Not Datalink.Field.IsNull) then
  1682.             Text := GetComboDisplayText(Datalink.Field.AsInteger)
  1683.          else Text :=''
  1684.       else Text := DataLink.Field.Text;
  1685.     end
  1686.     else begin
  1687.       if GetComboDataType=ccdColor then begin
  1688.          if Datalink.Field.DisplayText <> '' then begin
  1689.             if StrToIntDef(Datalink.Field.DisplayText,-1) <> -1 then
  1690.                Text := GetComboDisplayText(StrToIntDef(Datalink.Field.DisplayText,-1));
  1691.          end else Text := '';
  1692.       end
  1693.       else Text := DataLink.Field.DisplayText;
  1694.       if DataLink.Editing then
  1695.         Modified := True;
  1696.     end;
  1697.   end else
  1698.   begin
  1699.     if csDesigning in ComponentState then
  1700.       Text := Name else
  1701.       Text := '';
  1702.   end;
  1703.   if (FListBox <> nil) then begin
  1704.      itemindex := Listbox.Items.IndexOfName(Text);
  1705.    //     fcNameInList(Text,ListBox.AllColors);
  1706.      invalidate;
  1707.      if ItemIndex < 0 then ShowCaret;
  1708.   end;
  1709. end;
  1710. function TfcCustomColorCombo.Editable: Boolean;
  1711. begin
  1712.    Result := (Style <> csDropDownList) or isDroppedDown or ShowMatchText;
  1713. end;
  1714. {Function TfcCustomColorCombo.Editable: boolean;
  1715. begin
  1716.    Result := True;//isDroppedDown;
  1717. //   if Result then HideCaret(Handle);
  1718. end;}
  1719. function TfcCustomColorCombo.GetComboColor(Index:Integer):TColor;
  1720. var AColor:TColor;
  1721.     AName:String;
  1722. begin
  1723.   AColor := clNullColor;
  1724.   AName:=Text;
  1725.   if Index <> -1 then
  1726.      AColor := StringToColor('$'+Listbox.Items.Values[Listbox.Items.Names[Index]])
  1727. //     fcGetColorFromList(ListBox.AllColors,Index)
  1728.   else begin
  1729.       if not GetColorFromRGBString(AName, AColor) then
  1730.          AColor := SelectedColor;
  1731.   end;
  1732.   Result := AColor;
  1733. end;
  1734. function TfcCustomColorCombo.GetComboDataType:TfcColorComboDataType;
  1735. begin
  1736.    if Datalink.Field <> nil then begin
  1737.       if Datalink.Field.datatype = ftInteger then
  1738.          result := ccdColor
  1739.       else result := ccdColorName;
  1740.    end
  1741.    else result := ccdColorName
  1742. end;
  1743. //Display the mapped text value for a given color.  Will return blank if
  1744. //Color is not in list or Value is null.
  1745. function TfcCustomColorCombo.GetComboDisplayText(Value:integer): String;
  1746. var Index:integer;
  1747. begin
  1748.   result := '';
  1749.   if Listbox = nil then exit;  //4/19/2000 PYW In certain cases Listbox can be nil.  Let CreateWnd create the listbox and update the color.
  1750.   if (csDesigning in ComponentState) then ListBoxNeeded;
  1751.   Index:= fcValueInList(IntToHex(Value,6),ListBox.AllColors);
  1752.   if Index <> -1 then Index := Listbox.Items.indexofname(Listbox.allcolors.Names[Index]);
  1753.   if (Value<>clNullColor) and (Index<>-1) then
  1754.      result := ListBox.Items.Names[Index]
  1755.   else if (Index = -1) and (Value <> clNullColor) then
  1756.      result := fcColorToRGBString(Value);
  1757. end;
  1758. function TfcCustomColorCombo.GetDropDownControl: TWinControl;
  1759. begin
  1760.   result := FListBox;
  1761. end;
  1762. function TfcCustomColorCombo.GetDropDownContainer: TWinControl;
  1763. begin
  1764.   result := FListBox;
  1765. end;
  1766. function TfcCustomColorCombo.GetItemCount: Integer;
  1767. begin
  1768.   result := FListBox.Items.Count;
  1769. end;
  1770. function TfcCustomColorCombo.GetItemSize: TSize;
  1771. begin
  1772.   result := fcSize(DropDownWidth, ListBox.ItemHeight);
  1773. //  if result.cx = 0 then result.cx := Width;
  1774. end;
  1775. procedure TfcCustomColorCombo.HideCaret;
  1776. begin
  1777.   if (not showMatchText)
  1778.      {2/11/99 - PYW  - Commented the following line out
  1779.       Caret being hidden no matter what when Colornames are shown }
  1780.      { or (Style <> csDropDownList) or (ccoShowColorNames in ColorListOptions.Options) }
  1781.      then inherited;
  1782. end;
  1783. Function TfcCustomColorCombo.isDroppedDown: boolean;
  1784. begin
  1785.   result := False;
  1786.   if (FListBox <> nil) then result := FListBox.Visible;
  1787. end;
  1788. procedure TfcCustomColorCombo.KeyDown(var Key: Word; Shift: TShiftState);
  1789.   Function wwIsValidChar(key: word): boolean;
  1790.   begin
  1791.     result:= (key = VK_BACK) or (key=VK_SPACE) or (key=VK_DELETE) or
  1792.              ((key >= ord('0')) and (key<=VK_DIVIDE)) or
  1793.              (key>VK_SCROLL);
  1794.   end;
  1795. begin
  1796.   //3/4/99 - Added check to make sure when buttonstyle is ellipsis that the dialog will not auto pop up.
  1797.   if (not DroppedDown) and wwIsValidChar(Key) and
  1798.      (ButtonStyle <> cbsEllipsis) and AutoDropDown and
  1799.      (not (key in [VK_DELETE,VK_BACK])) and
  1800.      not (ssAlt in Shift) then begin { 9/25/97 - Don't auto-drop down if alt key is pressed }
  1801.      InAutoDropDown:= True;
  1802.      DropDown;
  1803.      InAutoDropDown:= False;
  1804.   end;
  1805.   inherited KeyDown(Key,Shift);
  1806.   case Key of
  1807.     VK_BACK, VK_DELETE:
  1808.        if (Style=csDropDownList){ and (not isDroppedDown) }then
  1809.        begin
  1810.          if (AllowClearKey) and ((selText=Text) or (key=vk_delete)) then
  1811.          begin
  1812.             if EditCanModify then begin
  1813.                Text:= '';
  1814.                ItemIndex := -1;
  1815.                SetModified(True);
  1816.                if FSelectedColor<>clNullColor then
  1817.                begin
  1818.                   FSelectedColor := clNullColor;
  1819.                   invalidate;
  1820.                end;
  1821.             end;
  1822.          end
  1823.          else begin
  1824.             if (selStart>0) and ShowMatchText then
  1825.             begin
  1826.                SendMessage(Handle, EM_SETSEL, length(Text), selStart-1);
  1827.                SendMessage(Handle, EM_SCROLLCARET, 0,0);
  1828.             end;
  1829.             key:= 0;
  1830.          end;
  1831.        end;
  1832.      VK_UP, VK_DOWN, VK_HOME, VK_END, VK_PRIOR, VK_NEXT:
  1833.         if (Listbox.Allcolors.Count > 0) then begin
  1834. //          if (Style = csdropdownlist) then begin { RSW - allow csdropdown to selectall when scrolling }
  1835.              if (not (ssShift in Shift) and not
  1836.                 ((not isdroppeddown) and (key in [VK_HOME,VK_END]))) then begin
  1837.                 SelectAll;
  1838.                 if not (ShowMatchText) then
  1839.                   HideCaret;
  1840.                 Key := 0;
  1841.              end;
  1842. //          end;
  1843.         end;
  1844.   end;
  1845. end;
  1846. procedure TfcCustomColorCombo.KeyPress(var Key: Char);
  1847. var TextLen:Integer;
  1848. //    curIndex,
  1849.     nextcolorindex:integer;
  1850.     prevText:string;
  1851. //    prevselstart,prevsellength:Integer;
  1852.   function NewText: string;
  1853.   var CurStr,tempstr: string;
  1854.   begin
  1855.     CurStr:= Text;
  1856.     tempstr := Text;
  1857.     result:= Copy(CurStr, 1, SelStart) + Char(Key)+
  1858.       Copy(TempStr, SelStart + 1 + Length(SelText), 32767);
  1859.   end;
  1860.   function FindColorIndex: integer;
  1861.   var InitialIndex: Integer;
  1862.   begin
  1863.     InitialIndex := Itemindex;
  1864.     if InitialIndex < 0 then InitialIndex := 0;
  1865.     result := InitialIndex;
  1866.     repeat
  1867.       if UpperCase(Copy(ListBox.items.Names[result], 1, Length(NewText))) = UpperCase(NewText) then Exit;
  1868.       result:=result+1;
  1869.       if result >= Listbox.items.count then result := 0;
  1870.     until result = InitialIndex;
  1871.     result := -1;
  1872.   end;
  1873. begin
  1874.    inherited;
  1875.    if not showmatchtext then begin
  1876.       Key := #0;
  1877.       exit;
  1878.    end;
  1879.    if (key=#8) and (Style=csDropDownList) then
  1880.    begin
  1881.       key:= #0;
  1882.       if key=#0 then exit;
  1883.    end;
  1884. //   if (Listbox.AllColors.Count > 0) and not (Key in [#8,#13]) then
  1885.    if (Listbox.AllColors.Count > 0) and (Key in [#32..#254]) then
  1886.    begin
  1887. //     Listbox.SortList; //2/22/99 - SortList First.  RSW (commented out - causes flicker }
  1888.      prevText := Text;
  1889.      nextcolorindex := FindColorIndex;
  1890.      //If newcolor name is not in list then...
  1891.      if (nextcolorindex <> -1) and EditCanModify then begin
  1892.         FSelectedColor := StringToColor('$'+Listbox.Items.Values[Listbox.Items.Names[nextcolorindex]]);
  1893.         if Itemindex <> nextcolorindex then
  1894.            Listbox.ItemIndex := nextcolorindex;
  1895.         Text := Newtext;
  1896.         TextLen := Length(Text);
  1897.         self.Text := flistbox.items.names[nextcolorindex];
  1898.         SelStart := Length(Text);
  1899.         SelLength := - (Length(Text) - TextLen);
  1900.         SetModified(True); { RSW }
  1901.         Key := #0;
  1902.      end
  1903. {     else if (Style = csDropDownList) then begin
  1904.         Key := #0;
  1905.      end}
  1906.      else if Style = csDropDownList then begin
  1907.         //2/17/99 - Commented out following line.
  1908. //        Text := NewText;
  1909. {        Text := prevText;
  1910.         selstart := prevSelStart;
  1911.         sellength := prevSelLength;}
  1912.         Key := #0;
  1913.      end
  1914.      else if EditCanModify then begin { RSW - 3/27/99 -
  1915.                                         Avoid assigning text as this prevents horizontal scrolling }
  1916.         ItemIndex := -1;
  1917.         SetModified(True);
  1918.         if FSelectedColor<>clNullColor then
  1919.         begin
  1920.            FSelectedColor := clNullColor;
  1921.            invalidate;
  1922.         end;
  1923.      end
  1924.      else Key := #0;
  1925.    end;
  1926.    if Key = #13 then Key := #0;
  1927. //   showcaret(handle);
  1928. end;
  1929. procedure TfcCustomColorCombo.KeyUp(var Key: Word; Shift: TShiftState);
  1930. begin
  1931.   if (Text = '') or (not showmatchtext) and ((key=vk_delete) or (key=vk_back)) then
  1932.   begin
  1933.      EditCanModify;
  1934.      ItemIndex:= -1;
  1935.      FListbox.itemindex := -1;
  1936.      Text:= '';
  1937.      FSelectedColor := clNullColor;
  1938.      Change;
  1939.      SetModified(True);
  1940.      invalidate;
  1941.   end;
  1942.   inherited KeyUp(Key, Shift);
  1943.   if not showmatchtext then begin
  1944.     Key := 0;
  1945.   end;
  1946. end;
  1947. procedure TfcCustomColorCombo.ListboxNeeded;
  1948. begin
  1949.   if FListbox<>Nil then exit;
  1950.   FListbox:= TfcColorList.create(self);
  1951.   with FListBox do begin
  1952.     {4/13/99 - PYW - Make sure events are set before adding all of the colors}
  1953.     OnFilterColor := OnFilterColorEvent;
  1954.     OnAddNewColor := AddNewColorEvent;
  1955.     ControlStyle := ControlStyle + [csNoDesignVisible];
  1956.     Visible:= False;
  1957.     FListBox.Parent:= self;
  1958.     ItemHeight := 16;
  1959.     SetWindowPos(FListbox.Handle, 0, 0, 0, 0, 0, SWP_NOZORDER or
  1960.        SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE or SWP_HIDEWINDOW);
  1961.     Visible:= False;
  1962.     OnMouseUp := ListMouseUp;
  1963.     OnMouseDown := ListMouseDown;
  1964.     NoneString := ColorListOptions.NoneString;
  1965.     Options := ColorListOptions.Options;
  1966.     CustomColors.Assign(CustomColors);
  1967.   end;
  1968.   UpdateSelectedColor; { RSW - 2/28/99 in case listbox was created after selectedcolor was streamed in}
  1969. end;
  1970. procedure TfcCustomColorCombo.Notification(AComponent: TComponent; Operation: TOperation);
  1971. begin
  1972.   inherited;
  1973.   if (AComponent = ColorDialog) and (Operation = opRemove) then ColorDialog := nil;
  1974. end;
  1975. Procedure TfcCustomColorCombo.SelectAll;
  1976. begin
  1977.    {2/11/99 - PYW - Need to not SelectAll when dropdownlist and not showmatchtext,
  1978.                     may need to retest in a grid.}
  1979.    if not showmatchtext and(style=csdropdownlist) then exit;
  1980.    if InAutoDropDown and (showmatchtext and (Style=csDropDown)) then exit;
  1981. //   if Editable then inherited;
  1982.    inherited;
  1983. end;
  1984. //!!!!Reduce this code.
  1985. procedure TfcCustomColorCombo.SetComboText(Value:String);
  1986. var i:integer;
  1987. begin
  1988.   inherited;
  1989.   i:= Listbox.Items.IndexOfName(Value);
  1990. //  fcNameInList(Value,FListBox.Items);
  1991.   if i<>-1 then ItemIndex := i;
  1992.   Text := Value;
  1993. end;
  1994. procedure TfcCustomColorCombo.SetEditRect;
  1995. var
  1996.   r: TRect;
  1997. begin
  1998.   r:= GetEditRect;
  1999.   if fcIsInwwGrid(self) and (ColorAlignment=taRightJustify) then
  2000.      inc(r.Left, GetIndentLeft(r)-1)
  2001.   else
  2002.      inc(r.Left, GetIndentLeft(r));
  2003.   if ShowButton then begin
  2004.      if ListBox = nil then
  2005.         r.Right := GetRightIndent(r) - GetIconIndent - ColorRectMargin
  2006.      else r.Right := GetRightIndent(r) - GetIconIndent - ListBox.ColorMargin;
  2007.   end
  2008.   else begin
  2009.      if ListBox = nil then
  2010.        r.Right := GetRightIndent(r) - ColorRectMargin
  2011.      else r.Right := GetRightIndent(r) - ListBox.ColorMargin;
  2012.   end;
  2013.   if r.Right<=r.Left+10 then r.Right:= r.Left + 10; // 5/3/99 - RSW - Ensure edit rectangle is at least 10 pixels wide
  2014.   SendMessage(Handle, EM_SETRECTNP, 0, LPARAM(@r));
  2015. end;
  2016. procedure TfcCustomColorCombo.ShowCaret;
  2017. begin
  2018.    inherited;
  2019. end;
  2020. procedure TfcCustomColorCombo.UpdateData(Sender: TObject);
  2021. var aColor:TColor;
  2022. begin
  2023. //!!!!!!add condition so not done when no change.
  2024.   if GetComboDataType = ccdColor then begin
  2025.      if GetColorFromRGBString(Text, AColor) then begin
  2026.         if AColor <> Datalink.Field.AsInteger then
  2027.            if (AColor <> clNullColor) then
  2028.               Datalink.Field.Text := IntToStr(AColor)
  2029.            else Datalink.Field.Clear; //3/1/99 - PYW - Clear Field if NullColor
  2030.      end
  2031.      else if Datalink.Field.Text <> IntToStr(SelectedColor) then begin
  2032.            if (SelectedColor <> clNullColor) then
  2033.               DataLink.Field.Text := IntToStr(SelectedColor)
  2034.            else Datalink.Field.Clear;//3/1/99- PYW - Clear Field if NullColor
  2035.      end;
  2036.   end
  2037.   else if Datalink.Field.Text <> Text then
  2038.      if (Text <> '') then
  2039.         DataLink.Field.Text := Text
  2040.      else Datalink.Field.Clear;     //3/1/99- PYW - Clear Field if NullColor
  2041. end;
  2042. procedure TfcCustomColorCombo.WndProc(var Message: TMessage);
  2043. var i:integer;
  2044. begin
  2045.   case Message.Msg of
  2046.     WM_KEYDOWN, WM_SYSKEYDOWN, WM_CHAR:
  2047.        with TWMKey(Message) do begin
  2048.          if not (ssShift in fcGetShiftState) and (not EffectiveReadOnly) then begin
  2049.             if (Message.Msg = wm_keydown) and (charcode=vk_f4) or
  2050.                (charcode<>vk_f4) then
  2051.                HandleDropDownKeys(CharCode, KeyDataToShiftState(KeyData));
  2052.             if not (isdroppeddown) and not showmatchtext and not (fcIsInwwGrid(Self)) then
  2053.             begin
  2054.                if (itemindex = listbox.allcolors.Count-1) then
  2055.                begin  //!!!! Probably should call OnKeyDown for these keys.
  2056.                   if charcode in [vk_end,VK_DOWN] then exit
  2057.                end
  2058.                else if (itemindex=0) then
  2059.                begin
  2060.                   if charcode in [vk_HOME,VK_UP] then exit
  2061.                end;
  2062.             end;
  2063.             if not (IsDroppedDown and (CharCode in [VK_LEFT, VK_RIGHT])) then
  2064.             begin
  2065.                if (CharCode <> 0) and (not (CharCode in [VK_DELETE, VK_BACK])) and
  2066.                   not ((CharCode in [VK_LEFT, VK_RIGHT{, VK_NEXT, VK_PRIOR}]) and
  2067.                         fcIsInwwGrid(Self)) then
  2068. //                        fcIsInGrid(Self)) then
  2069.                begin
  2070.                   // Don't send the keys to the list if this is an up/down character and the list is not dropped down
  2071.                   // 2/5/01 - Add vk_prior and vk_next to the list of non-processing keys hwen not dropped down
  2072.                    if not ((CharCode in [VK_UP, VK_DOWN, VK_HOME, VK_END, VK_PRIOR, VK_NEXT]) and not isDroppedDown and fcIsInwwGrid(Self)) then
  2073.                    begin
  2074.                       i:=FListBox.ItemIndex;
  2075.                       if (not showmatchtext) or
  2076.                         (showmatchtext and (CharCode in [VK_UP, VK_DOWN, VK_PRIOR, VK_NEXT])) or
  2077.                         (showmatchtext and (CharCode in [VK_HOME,VK_END]) and isDroppedDown)then
  2078.                         with Message do SendMessage(FListBox.Handle, Msg, WParam, LParam);
  2079.                       if i <> FListBox.ItemIndex then
  2080.                       begin
  2081.                         if EditCanModify then begin
  2082.                            ItemIndex := FListBox.ItemIndex;
  2083.                            SetModified(True);
  2084.                         end;
  2085.                       end;
  2086.                    end;
  2087.                    if  (isDroppedDown and { rsw }
  2088.                       (CharCode in [VK_UP, VK_DOWN, VK_NEXT, VK_PRIOR, VK_HOME, VK_END])) then
  2089.                    begin
  2090.                       SelectAll;
  2091.                       exit;
  2092.                    end;
  2093.                 end;
  2094.              end;
  2095.           end
  2096.        end
  2097.   end;
  2098. (*
  2099.   case Message.Msg of { RSW - 2/22/99 - Support vk_up/vk_down in dropdown container }
  2100.     wm_KeyDown, wm_SysKeyDown, wm_Char:
  2101.       with TWMKey(Message) do
  2102.       begin
  2103.          { 4/29/98 - skip code if shift key pressed }
  2104.          if not (ssShift in fcGetShiftState) and (not EffectiveReadOnly) then
  2105.          begin
  2106.              if not (isDroppedDown and
  2107.                (CharCode in [VK_LEFT, VK_RIGHT]) and
  2108.                (Message.Msg=wm_KeyDown)) then
  2109.              begin
  2110.                HandleDropDownKeys(CharCode, KeyDataToShiftState(KeyData));
  2111.                i:=FListBox.ItemIndex;
  2112.                if (CharCode <> 0) and IsDroppedDown then
  2113.                begin
  2114.                  with TMessage(Message) do
  2115.                     SendMessage(DropDownContainer.Handle, Msg, WParam, LParam);
  2116.                end;
  2117.                if i <> FListBox.ItemIndex then ItemIndex := FListBox.ItemIndex;
  2118.             end;
  2119.             if  (isDroppedDown and
  2120.                (CharCode in [VK_UP, VK_DOWN, VK_NEXT, VK_PRIOR, VK_HOME, VK_END])) then exit;
  2121.          end
  2122.       end
  2123.   end;
  2124. *)
  2125.   inherited WndProc(Message);
  2126. end;
  2127. Procedure TfcCustomColorCombo.DrawColorRect(ACanvas:TCanvas;Rect:TRect;curColor:TColor;Highlight: Boolean);
  2128. var ColorRect:TRect;
  2129.     AHeight,AWidth:Integer;
  2130.     OldPenColor,OldBrushColor:TColor;
  2131.     Left,Right,Top,Bottom:Integer;
  2132.     EffectiveMargin:integer;
  2133. begin
  2134.   if ListBox = nil then
  2135.     EffectiveMargin := 2
  2136.   else EffectiveMargin := ListBox.ColorMargin;
  2137.   OldPenColor:=ACanvas.Pen.Color;
  2138.   OldBrushColor:= ACanvas.Brush.Color;
  2139.   if (csDesigning in ComponentState) then ListBoxNeeded;
  2140.   GetColorRectInfo(Rect,AWidth,AHeight);
  2141.   Left := Rect.Left+EffectiveMargin;
  2142.   Right := Rect.Left+EffectiveMargin + AWidth;
  2143.   Top := Rect.Top + EffectiveMargin;
  2144.   Bottom := Rect.Top +EffectiveMargin + AHeight;
  2145.   if fcIsInwwObjectView(self) and (csPaintCopy in ControlState) then begin { 7/8/99 }
  2146.      Top:= Top;
  2147.      Bottom:= Bottom;
  2148. //     Left:= left + 1;
  2149.      Right:= Right + 1;
  2150.   end;
  2151.   if Frame.IsFrameEffective then
  2152.   begin
  2153.       if FFocused and (efLeftBorder in Frame.FocusBorders) then
  2154.          Left:= Left +  1;
  2155.       if FFocused and (efTopBorder in Frame.FocusBorders) then
  2156.          Top:= Top +  1;
  2157.       if not FFocused and (efLeftBorder in Frame.NonFocusBorders) then
  2158.          Left:= Left +  1;
  2159.       if not FFocused and (efTopBorder in Frame.NonFocusBorders) then
  2160.          Top:= Top +  1;
  2161.   end;
  2162.   if (AlignmentVertical = fcavCenter) then begin
  2163.      Top := Rect.Top + ((Rect.Bottom-Rect.Top-AHeight) div 2);
  2164.      Bottom := Rect.Bottom - ((Rect.Bottom-Rect.Top-AHeight) div 2);
  2165.   end;
  2166.   if ccoShowColorNames in FColorListOptions.Options then
  2167.   begin
  2168.     if ColorAlignment = taRightJustify then begin
  2169.           Left := fcmax(Rect.Right-EffectiveMargin-AWidth,
  2170.                         GetIndentLeft(Rect)+ACanvas.TextWidth(Text)+2*EffectiveMargin);
  2171.           Right := fcmin(Left+AWidth+EffectiveMargin,Rect.Right - EffectiveMargin);
  2172.     end;
  2173.   end
  2174.   else //if not ShowButton or (not Highlight) then
  2175.     Right := fcmin(Left+AWidth+EffectiveMargin,Rect.Right - EffectiveMargin);
  2176. //    Right :=    Rect.Right - fcColorRectMargin;
  2177. //  else Right :=    Rect.Right - fcColorRectMargin - GetIconIndent;
  2178.   if ColorAlignment = taRightJustify then { 5/3/99 - RSW - Move color rect 1 pixel to the left (Looks better) }
  2179.      ColorRect := Classes.Rect(Left-1,Top,Right-1,Bottom)
  2180.   else ColorRect := Classes.Rect(Left,Top,Right,Bottom);
  2181.   if curColor <> clNullColor then begin
  2182.                   //10/13/2000 - PYW - Not painting clNone correctly when focused and dropped down.
  2183.       if fcIsInwwGrid(self) and (curColor = clNone) and
  2184.          ((not ffocused) and (Highlight)) then begin
  2185.             ACanvas.Pen.Color := clWhite;
  2186.             ACanvas.Brush.Color := clHighlight;
  2187.       end
  2188.       else begin
  2189.          if (Highlight) and not isDroppedDown then ACanvas.Pen.Color := clWhite
  2190.          else ACanvas.Pen.Color := clBlack;
  2191.          if curColor<>clNone then   //10/13/2000 - PYW - Make sure this paints correctly when it doesn't have the focus.
  2192.             ACanvas.Brush.Color := curColor;
  2193.       end;
  2194.       ACanvas.FillRect(ColorRect);
  2195.       ACanvas.Rectangle(ColorRect.Left, ColorRect.Top, ColorRect.Right, ColorRect.Bottom);
  2196.       if (CurColor = clNone) or (CurColor = clNullColor) then
  2197.        if ccoShowColorNames in FListBox.Options then begin
  2198.          ACanvas.Polyline([Point(ColorRect.TopLeft.X,ColorRect.TopLeft.Y),
  2199.                            Point(ColorRect.BottomRight.X,ColorRect.BottomRight.Y)]);
  2200.          ACanvas.Polyline([Point(ColorRect.TopLeft.X,ColorRect.BottomRight.Y-1),
  2201.                            Point(ColorRect.BottomRight.X,ColorRect.TopLeft.Y-1)]);
  2202.       end;
  2203.       ACanvas.Pen.Color := OldPenColor;
  2204.       ACanvas.Brush.Color := OldBrushColor;
  2205.   end;
  2206. end;
  2207. procedure TfcCustomColorCombo.DrawInGridCell(ACanvas:TCanvas;Rect:TRect;
  2208.    State:TGridDrawState);
  2209. var s:String;
  2210. begin
  2211.    if GetComboDatatype = ccdColor then begin
  2212.       if Datalink.Field.isnull then s:=''
  2213.       else s:=GetComboDisplayText(Datalink.Field.AsInteger);
  2214.    end
  2215.    else s:= Datalink.Field.Text;
  2216.    PaintToCanvas(ACanvas, Rect,(gdSelected in State), True, s);
  2217. end;
  2218. procedure TfcCustomColorCombo.DropDown;
  2219. var Itemid:integer;
  2220. begin
  2221.   if SkipDropDown then exit;
  2222.   ListBox.FClickedInControl := False;
  2223.   Listbox.FIgnoreMouseScroll := False;
  2224.   Listbox.FLastPoint := Point(0,0);
  2225.   FOriginalIndex := ItemIndex;
  2226.   FOriginalSelectedColor:= SelectedColor;
  2227.   {if ((ItemIndex = -1) and (Text <> '')) or
  2228.       ((ItemIndex<>-1) and (AnsiPos(Text,ListBox.AllColors.Names[ItemIndex])<>1)) then
  2229.       FOriginalIndex := -1;}
  2230.   if (Datalink.field=nil) and ((datasource<>nil) or (datafield<>'')) then exit;
  2231.   if (ButtonStyle = cbsEllipsis) then
  2232.   begin
  2233.     DoDropDown;
  2234.     FListBox.UpdateItems;   //3/4/99 - Call UpdateItems instead.
  2235.     //FListBox.SortList;
  2236.     ExecuteColorDialog;
  2237.   end
  2238.   else begin
  2239.     with FListBox do
  2240.     begin
  2241.       Alignment:= GetEffectiveAlignment;
  2242.       Color:= ColorListOptions.Color;
  2243.       ColorAlignment := self.ColorAlignment;
  2244.       ItemHeight := ColorListOptions.ItemHeight;
  2245.       IntegralHeight := FColorListOptions.IntegralHeight;
  2246.       if FColorListOptions.ColorWidth <> 0 then
  2247.         ColorWidth := FColorListOptions.ColorWidth
  2248.       else ColorWidth := ItemHeight - 2 * ColorMargin;
  2249.       Font := FColorListOptions.Font;
  2250.       Options := FColorListOptions.Options;
  2251.       SortBy := FColorListOptions.SortBy;
  2252. // (2/9/99) Removed following line, appears to be redundant, as FListBox.CustomColors gets updated in this controls CustomColors.OnChange event
  2253. //      FListbox.FCustomColors.Assign(self.FCustomColors);
  2254.       UpdateItems;
  2255.       // 3/4/99 -PYW- Call UpdateItems instead so that the OnFilterColor event will always be fired.
  2256.       //if not FListBoxUpdated then SortList;
  2257.       ItemId := Listbox.Items.IndexOfName(Self.text);
  2258. //      fcNameInList(self.Text, AllColors);
  2259.       self.FItemIndex := ItemId;
  2260.       ItemIndex:= ItemID; { 2/11/99 - RSW }
  2261.       if (ItemId <> -1) and
  2262.          (self.FItemIndex <> -1) and (self.FSelectedColor <> clNullColor) then
  2263.         SelectedColor := self.SelectedColor
  2264.       else ItemIndex := -1;
  2265.     end;
  2266.     // 3/4/99 - Why invalidate?  Causes Flicker - PYW
  2267.     //    if Style = csDropDownList then Invalidate;
  2268.     inherited;
  2269.   end;
  2270.   Update; //2/25/99 - Prevent Flicker when selecting all on DropDown.
  2271.   SelectAll;
  2272.   HideCaret;
  2273. end;
  2274. Function TfcCustomColorCombo.ExecuteColorDialog: boolean;
  2275. var AColorDialog: TColorDialog;
  2276.     accept:boolean;
  2277.     MResult:TModalResult;
  2278.     procedure FillCustomColors;
  2279.     var i,index:integer;
  2280.     begin
  2281.        AColorDialog.CustomColors.Clear;
  2282.        for i:= ord('A') to ord('P') do
  2283.        begin
  2284.           index := i-ord('A');
  2285.           if index > CustomColors.count-1 then exit;
  2286.           AColorDialog.CustomColors.Add('Color'+char(i)+'='+
  2287.               fcGetValuesFromStringList(FCustomColors,index));
  2288.        end;
  2289.     end;
  2290. begin
  2291.   if FColorDialog <> nil then
  2292.      AColorDialog := FColorDialog
  2293.   else begin
  2294.      AColorDialog := TColorDialog.Create(self);
  2295.      with AColorDialog do begin
  2296.         CustomColors.Assign(CustomColors);
  2297.         if (cdoPreventFullOpen in ColorDialogOptions) then
  2298.            Options := Options + [cdPreventFullOpen];
  2299.         if (cdoFullOpen in ColorDialogOptions) then
  2300.            Options := Options + [cdFullOpen];
  2301.         if (cdoSolidColor in ColorDialogOptions) then
  2302.            Options := Options + [cdSolidColor];
  2303.         if (cdoAnyColor in ColorDialogOptions) then
  2304.            Options := Options + [cdAnyColor];
  2305.      end;
  2306.      FillCustomColors;
  2307.   end;
  2308.   AColorDialog.Color := SelectedColor;
  2309.   if Assigned(FOnInitColorDialog) then FOnInitColorDialog(self, AColorDialog);
  2310.   if AColorDialog.Execute then begin
  2311.      accept := True;
  2312.      mResult := mrOk;
  2313.   end
  2314.   else mResult := mrCancel;
  2315.   result:= (mResult = mrOK);
  2316.   if Assigned(FOnCloseColorDialog) then
  2317.      FOnCloseColorDialog(self, AColorDialog, MResult, accept);
  2318.   if accept and (mResult = mrOK) then begin
  2319.      //3/4/99 -PYW- Only call SetModified if the combo can be modified.
  2320.      if EditCanModify then begin           //May only want to do this if color changed.
  2321.         SetModified(True);
  2322.         SelectedColor := AColorDialog.Color;
  2323.      end;
  2324.   end;
  2325.   invalidate;
  2326.   if AColorDialog.Owner = Self then AColorDialog.Free;
  2327. end;
  2328. function TfcCustomColorCombo.GetColorFromRGBString(RGBString:String; var AColor:TColor):boolean;
  2329. var Red,Green,Blue:Byte;
  2330.     ColorStr: string;
  2331.     Startpos,i:Integer;
  2332.     function GetNextColor(RGBStr:String;var index:Integer;var Value:Byte):Boolean;
  2333.     var tempstr:String;
  2334.         tempInt:Integer;
  2335.        function IsNumber(ch: Char): Boolean;
  2336.        begin
  2337.          result:= (ch>='0') and (ch<='9');
  2338.        end;
  2339.     begin
  2340.        tempstr := '';
  2341.        result := False;
  2342.        if index > length(RGBStr) then exit;
  2343.        while not IsNumber(RGBStr[Index]) do begin
  2344.           Index:=Index+1;
  2345.        end;
  2346.        while (RGBStr[index]<>',') and (index <= length(RGBStr)) do begin
  2347.          tempstr :=  tempstr+RGBStr[index];
  2348.          index:=index+1;
  2349.        end;
  2350.        fcStripWhiteSpace(tempstr);
  2351.        TempInt := StrToIntDef(tempstr,-1);
  2352.        if (TempInt = -1) or (TempInt > 255) then exit;
  2353.        result := True;
  2354.        Value := TempInt;
  2355.        index := index+1;
  2356.     end;
  2357. begin
  2358.    Result := False;
  2359.    AColor := clNullColor;
  2360.    Startpos := Pos('RGB:',RGBString);
  2361.    if Startpos <> 1 then exit;
  2362.    i:=5;     //!!!! Assumes RGB format....
  2363.    if not GetNextColor(RGBString,i,Red) then exit;
  2364.    if not GetNextColor(RGBString,i,Green) then exit;
  2365.    if not GetNextColor(RGBString,i,Blue) then exit;
  2366.    ColorStr := '$'+fcRGBToHexString(Blue,Green,Red);
  2367.    AColor := StringToColor(ColorStr);
  2368.    Result := True;
  2369. end;
  2370. Procedure TfcCustomColorCombo.GetColorRectInfo(Rect:TRect;var AWidth:Integer;var AHeight:Integer);
  2371. var margin:integer;
  2372. begin
  2373.   margin := ColorRectMargin;
  2374.   if ListBox <> nil then margin := ListBox.ColorMargin;
  2375.   if FColorListOptions.ItemHeight < (Rect.Bottom-Rect.Top) then
  2376.      Aheight := FColorListOptions.ItemHeight - 2*margin
  2377.   else
  2378.      Aheight := (Rect.Bottom-Rect.Top) - 2*margin;
  2379.   if FColorListOptions.ColorWidth = 0 then begin
  2380.      if FColorListOptions.ItemHeight > (Rect.Bottom-Rect.Top) then
  2381.         AWidth := AHeight
  2382.      else AWidth := (FColorListOptions.ItemHeight)-2*margin
  2383.   end
  2384.   else Awidth :=FColorListOptions.ColorWidth;
  2385. end;
  2386. function TfcCustomColorCombo.GetIndentLeft(Rect:TRect): Integer;
  2387. var AWidth,AHeight:Integer;
  2388. begin
  2389.   if fcIsInwwGrid(self) and (ColorAlignment=taRightJustify) then
  2390.     result := 1
  2391.   else
  2392.     result := 2;
  2393.   if (ColorAlignment <> taLeftJustify) then exit;
  2394.   if FColorListOptions = nil then exit;
  2395.   GetColorRectInfo(Rect,AWidth,AHeight);
  2396.   if (AWidth <> 0) then
  2397.      inc(result, AWidth + 2);
  2398. end;
  2399. function TfcCustomColorCombo.GetRightIndent(Rect:TRect): Integer;
  2400. var AWidth,AHeight:Integer;
  2401. begin
  2402. //  result := GetIndentLeft(Rect);
  2403.   result := Width-2;
  2404.   if (ColorAlignment <> taRightJustify) then exit;
  2405.   if FColorListOptions = nil then exit;
  2406.   GetColorRectInfo(Rect,AWidth,AHeight);
  2407.   if (Awidth <> 0) then
  2408.      inc(result, -AWidth);
  2409. end;
  2410. function TfcCustomColorCombo.GetTopIndent: Integer;
  2411. begin
  2412.   result:= inherited GetTopIndent;
  2413. end;
  2414. function TfcCustomColorCombo.GetTextRect(ARect:TRect; Highlight:Boolean): TRect;
  2415. var AWidth,AHeight:Integer;
  2416.     margin:integer;
  2417. begin
  2418.    margin := ColorRectMargin;
  2419.    if ListBox <> nil then margin := ListBox.ColorMargin;
  2420.    result:=ARect;
  2421.    if FColorListOptions = nil then exit;
  2422.    GetColorRectInfo(ARect,AWidth,AHeight);
  2423.    if (ColorAlignment = taRightJustify) then
  2424.       result := Classes.Rect(ARect.Left + GetIndentLeft(ARect)+1,
  2425.                              ARect.Top + GetTopIndent,
  2426.                              ARect.Right-2*margin-AWidth,
  2427.                              ARect.Bottom)
  2428.    else
  2429.       result := Classes.Rect(ARect.Left + GetIndentLeft(ARect)+1,
  2430.                            ARect.Top + GetTopIndent,
  2431.                            ARect.Right -margin,
  2432.                            ARect.Bottom);
  2433.    if BorderStyle=bsSingle then result.Top:=result.Top + 1
  2434.    else if fcIsInwwObjectView(self) then result.Top:= result.Top -1;
  2435. {   if fcIsClass(parent.classtype, 'TwwDBGrid') then
  2436.    begin
  2437.       if not (dgRowLines in fcGetGridOptions(self)) then result.Top:= result.Top -1;
  2438.    end
  2439.    else }if (not fcIsInwwObjectView(self)) and
  2440.       Frame.IsFrameEffective then
  2441.    begin
  2442.       Frame.GetFrameTextPosition(result.Left, result.top, FFocused);
  2443.       result.left:= result.Left + GetIndentLeft(ARect) + 1;
  2444. //      if AlignmentVertical = fcavCENTER then result.top:= result.Top -1;
  2445.    end
  2446. end;
  2447. procedure TfcCustomColorCombo.Paint;
  2448. begin
  2449. //  with ClientRect do
  2450. //     PaintToCanvas(Canvas, Rect(0, 0, Right - Left, Bottom - Top), True, False, Text)
  2451.   PaintToCanvas(Canvas, GetClientEditRect, True, False, Text);
  2452. end;
  2453. function TfcCustomColorCombo.GetEffectiveAlignment: TLeftRight;
  2454. begin
  2455.    if (DataLink=Nil) or (DataLink.Field=nil) then result:= FAlignment
  2456.    else if DataLink.Field is TStringField then result:= DataLink.Field.Alignment
  2457.    else result:= taLeftJustify;
  2458. end;
  2459. procedure TfcCustomColorCombo.PaintToCanvas(ACanvas: TCanvas; Rect: TRect;
  2460.   Highlight, GridPaint: Boolean; Text: string);
  2461. var Index: integer;
  2462. //    TempRight: Integer;
  2463.     s: String;
  2464.     tempcolor:TColor;
  2465.     SaveBkColor,SaveTextColor:TColor;
  2466.     SaveOldBrushColor,SaveOldFontColor:TColor;
  2467.     SaveBKMode:Integer;
  2468.     flags:UINT;
  2469.     TempRect:TRect;
  2470.   function DrawHighlight:boolean;
  2471.   begin
  2472.      result := ((not Editable and Focused) or fcParentGridFocused(Self)) and
  2473.               not (csPaintCopy in ControlState);
  2474.   end;
  2475. {  Function DoPaint: boolean;
  2476.   begin
  2477.     result:= (csPaintCopy in ComponentState) or (not Focused);
  2478.   end;
  2479. }
  2480.   //3/1/2002-Added new function to handle painting in a TDBCtrlGrid
  2481.   function PaintCopyOutsideGrid: boolean;
  2482.   begin
  2483.      result:= not
  2484.        ((not fcIsInwwGrid(self)) and (not (csPaintcopy in ControlState)))
  2485.   end;
  2486. begin
  2487.   SaveBkColor := GetBkColor(ACanvas.Handle);
  2488.   SaveTextColor:= GetTextColor(ACanvas.Handle);
  2489.   SaveBkMode := GetBkMode(ACanvas.Handle);
  2490.   SaveOldBrushColor := ACanvas.Brush.Color;
  2491.   SaveOldFontColor := ACanvas.Font.Color;
  2492.   ACanvas.Font := Font; { 5/3/99 - RSW (Fixes problem where font's style not being used }
  2493.   if (not enabled) and (color<>clGrayText) then { 3/7/00 - Use disablec color }
  2494.      ACanvas.font.color:= clGrayText;
  2495.   try
  2496.   if (csDesigning in ComponentState) then ListboxNeeded;
  2497.    //9/27/2001- Respect value storing for csPaintcopy - Allows to paint correctly in grid
  2498.    if (csPaintCopy in ControlState) and (GetComboDatatype = ccdColor) then begin
  2499.       if Datalink.Field.isnull then s:=''
  2500.       else s:=GetComboDisplayText(Datalink.Field.AsInteger);
  2501.    end
  2502.    else s:= Text;
  2503. //  s := Text;
  2504.   if s <> '' then
  2505.      Index := fcNameInList(s,ListBox.AllColors)
  2506.   else Index := -1;
  2507.   if (csPaintCopy in ControlState) or // 1/31/01
  2508.      (fcIsInwwGrid(self) and (not Focused or not Highlight)) or
  2509.      ((Style = csDropDownList) and Focused and not IsDroppedDown and not showmatchtext) then
  2510.   begin
  2511.      if (not fcIsInwwGrid(Self)) then InflateRect(Rect,-1,-1);
  2512.      { 7/8/99 - RSW - Use color of control }
  2513.      if (not fcIsInwwGrid(self)) or (not GridPaint) then
  2514.        ACanvas.Brush.Color :=
  2515.           fcThisThat(Highlight and (DrawHighlight or not PaintcopyOutsidegrid), clHighlight, self.Color);
  2516.     if (not IsTransparentEffective) and not fcIsInwwGridPaint(self) then
  2517.        ACanvas.FillRect(Rect);
  2518.     if (not GridPaint) and Highlight and DrawHighlight then//((Focused) or fcParentGridFocused(Self) or (not fcIsInwwGrid(Self))) then
  2519.     begin
  2520.       SetBkColor(ACanvas.Handle, ColorToRGB(clHighlightText));
  2521.       SetTextColor(ACanvas.Handle, ColorToRGB(clHighlight));
  2522.       ACanvas.DrawFocusRect(Rect);
  2523.     end;
  2524.     //10/13/2000 - PYW - Make sure that the text is painted correctly even in when Row is Selected.
  2525.     if (not fcIsInwwGrid(Self)) or ((not GridPaint) and not (Highlight and not DrawHighlight)) or GridPaint then
  2526.     begin
  2527.        SetBkMode(ACanvas.Handle, TRANSPARENT);
  2528.        SetBkColor(ACanvas.Handle, ColorToRGB(fcThisThat(Highlight and (DrawHighlight or Not PaintCopyOutsideGrid), clHighlight, clWindow)));
  2529.        SetTextColor(ACanvas.Handle, ColorToRGB(fcThisThat(Highlight and (DrawHighlight or Not PaintCopyOutsideGrid), clWindow, clWindowText)));
  2530.     end;
  2531.     if (not fcIsInwwGrid(Self)) then InflateRect(Rect,1,1);
  2532.     TempRect := GetTextRect(Rect,Highlight);
  2533.     flags := 0;
  2534.     if AlignmentVertical = fcavCENTER then flags := Flags or DT_VCENTER
  2535.     else flags := Flags or DT_TOP;
  2536.     if UnBoundAlignment = taRightJustify then flags := Flags or DT_RIGHT
  2537.     else flags := Flags or DT_LEFT;
  2538.     if fcIsInwwGridPaint(self) or IsTransparentEffective then
  2539.     begin
  2540.        SetBkMode(ACanvas.Handle, TRANSPARENT);
  2541.        try
  2542.           DrawText(ACanvas.Handle,PChar(s),Length(s),TempRect,flags);
  2543.        finally
  2544.           SetBkMode(ACanvas.Handle, OPAQUE);
  2545.        end
  2546.     end
  2547.     else DrawText(ACanvas.Handle,PChar(s),Length(s),TempRect,flags);
  2548.   end
  2549.   else if not fcisinwwGrid(Self) and not Focused then begin
  2550.     if not IsTransparentEffective then
  2551.     begin
  2552.       // 8/1/02
  2553.       if (Frame.Enabled) and (Frame.NonFocusColor<>clNone) then
  2554.          ACanvas.Brush.Color:= Frame.NonFocusColor
  2555.       else
  2556.          ACanvas.Brush.Color:= Color; { 5/3/99 - RSW - Previuosly Brush.Color not set }
  2557.       ACanvas.FillRect(Rect);
  2558.     end;
  2559.     //3/19/99 -PYW- Rect is already correct now, so do not use GetIconIndent.
  2560.     Rect.Right := Rect.Right{ - GetIconIndent }+ ListBox.ColorMargin;
  2561.     flags := 0;
  2562.     if AlignmentVertical = fcavCENTER then flags := Flags or DT_VCENTER
  2563.     else flags := Flags or DT_TOP;
  2564.     if UnboundAlignment = taRightJustify then begin
  2565.        flags := Flags or DT_RIGHT;
  2566.        Rect.Right:= Rect.Right - 2; { 4/10/99 - Too close to right edge before }
  2567.     end
  2568.     else flags := Flags or DT_LEFT;
  2569.     TempRect := GetTextRect(Rect,Highlight);
  2570.     // 6/23/01 - Check FFocused so text is not painted twice when switch to different window like notepad
  2571.     if IsTransparentEffective and (not FFocused) then
  2572.     begin
  2573.        if (not FFocused) and IsTransparentEffective and
  2574.          (Frame.NonFocusTransparentFontColor<>clNone) then
  2575.          ACanvas.Font.Color:= Frame.NonFocusTransparentFontColor;
  2576.        SetBkMode(ACanvas.Handle, TRANSPARENT);
  2577.        try
  2578.           DrawText(ACanvas.Handle,PChar(s),Length(s),TempRect,flags);
  2579.        finally
  2580.           SetBkMode(ACanvas.Handle, OPAQUE);
  2581.        end
  2582.     end
  2583.     else DrawText(ACanvas.Handle,PChar(s),Length(s),TempRect,flags);
  2584. //    ACanvas.TextOut(Rect.Left + GetIndentLeft(Rect), Rect.Top + GetTopIndent(Rect), s);
  2585.   end
  2586.   else if fcisinwwGrid(Self) then
  2587.      Rect.Right := Rect.Right {- GetIconIndent }
  2588.   else Rect.Right := Rect.Right {- GetIconIndent} + ListBox.ColorMargin; { 5/3/99 - RSW (Fix for AlignRight) }
  2589.   if (not GridPaint) or ((not Focused) and not fcParentGridFocused(Self) )then
  2590.      Highlight := DrawHighlight;
  2591.   if (Index = -1) then begin
  2592.      if GetColorFromRGBString(s, tempColor) then
  2593.         DrawColorRect(ACanvas,Rect,tempColor,Highlight)
  2594.      else if (s='') then DrawColorRect(ACanvas,Rect,clNullColor,Highlight)
  2595.      {2/17/99 - Don't DrawColorRect if the color is null}
  2596.      else if ((not fcIsInwwGrid(self)) or (tempColor <> clNullColor)) and
  2597.          (not (csPaintCopy in ControlState)) then
  2598. //        DrawColorRect(ACanvas,Rect,ListBox.SelectedColor,Highlight)
  2599.            DrawColorRect(ACanvas,Rect,SelectedColor,Highlight) { 2/22/99 - RSW - Use combo's selectedcoor instead }
  2600.   end
  2601.   else DrawColorRect(ACanvas,Rect,fcGetColorFromList(FListBox.FAllColors,Index),Highlight);
  2602.   if Frame.IsFrameEffective then
  2603.   begin
  2604.     DrawFrame(Canvas);
  2605.   end;
  2606.   //Restore Canvas Colors.
  2607.   finally
  2608.      SetBkColor(ACanvas.Handle, savebkColor);
  2609.      SetTextColor(ACanvas.Handle,savetextcolor);
  2610.      SetBkMode(ACanvas.Handle,savebkmode);
  2611.      ACanvas.Brush.Color := SaveOldBrushColor;
  2612.      ACanvas.Font.Color := SaveOldFontColor;
  2613.   end;
  2614. end;
  2615. procedure TfcCustomColorCombo.RefreshList;
  2616. //var BeforeText:String;
  2617. begin  //!!!! Need to handle when initcolorlist will lose current selected color.
  2618. {   BeforeText := '';
  2619.    if ItemIndex <> -1 then BeforeText := ListBox.AllColors.Names[ItemIndex];}
  2620.    ListBox.InitColorList;
  2621. {   if fcNameinList(BeforeText,ListBox.AllColors) = -1 then begin
  2622.      ItemIndex := -1;
  2623.      Text := '';
  2624.      invalidate;
  2625.    end;}
  2626. end;
  2627. constructor TfcCustomColorCombo.Create(AOwner: TComponent);
  2628. begin
  2629.   inherited Create(AOwner);
  2630.   ControlStyle := ControlStyle + [csReplicatable];
  2631.   ButtonStyle := cbsDownArrow;
  2632.   FCustomColors := TStringList.Create;
  2633.   DropDownCount:= 8;
  2634.   FColorListOptions := TfcColorListOptions.Create(Self);
  2635.   FAlignment := taLeftJustify;
  2636. //  FAlignmentVertical := fcavTop;
  2637.   FColorAlignment := taLeftJustify;
  2638.   FColorDialogOptions := [cdoPreventFullOpen];
  2639.   FCustomColors.OnChange := CustomColorsChangeEvent;
  2640.   FSelectedColor := clNullColor;
  2641.   FItemIndex := -1;
  2642.   ShowMatchText := True;
  2643.   Style := csDropDownList;
  2644. end;
  2645. destructor TfcCustomColorCombo.Destroy;
  2646. begin
  2647.   FColorListOptions.Free;
  2648.   FCustomColors.Free;
  2649.   FListbox.Free;
  2650.   FListbox:= nil;
  2651. //  FCanvas.Free;
  2652.   inherited Destroy;
  2653. end;
  2654. {************************************* TfcColorListOptions **************************************}
  2655. destructor TfcColorListOptions.Destroy;
  2656. begin
  2657.   FFont.Free;
  2658.   inherited destroy;
  2659. end;
  2660. constructor TfcColorListOptions.Create(AOwner: TfcCustomColorCombo);
  2661. begin
  2662.   inherited Create;
  2663.   FCombo := AOwner;
  2664.   FOptions:= [ccoShowStandardColors,ccoShowColorNames];
  2665.   FNoneString := 'None';
  2666.   FColor := clWindow;
  2667.   FFont := TFont.Create;
  2668.   FGreyScaleIncrement := 10;
  2669.   FIntegralHeight := True;
  2670.   FItemHeight := 16;
  2671. end;
  2672. procedure TfcColorListOptions.SetGreyScaleIncrement(Value: Integer);
  2673. begin
  2674.   if (FGreyScaleIncrement <> Value) and
  2675.       (Value > 0) and (Value <=255) then begin
  2676.      FGreyScaleIncrement := Value;
  2677.   end;
  2678. end;
  2679. procedure TfcColorListOptions.SetColor(Value: TColor);
  2680. begin
  2681.   if FColor <> Value then FColor := Value;
  2682. end;
  2683. procedure TfcColorListOptions.SetColorWidth(Value: Integer);
  2684. begin
  2685.   if FColorWidth <> Value then begin
  2686.      FColorWidth := Value;
  2687.      FCombo.SetEditRect;
  2688.      FCombo.Invalidate;
  2689.   end;
  2690. end;
  2691. procedure TfcColorListOptions.SetFont(Value: TFont);
  2692. begin
  2693.   if FFont <> Value then FFont.Assign(Value);
  2694. end;
  2695. procedure TfcColorListOptions.SetIntegralHeight(Value: Boolean);
  2696. begin
  2697.   if FIntegralHeight <> Value then FIntegralHeight := Value;
  2698. end;
  2699. procedure TfcColorListOptions.SetItemHeight(Value: Integer);
  2700. begin
  2701.   if FItemHeight <> Value then FItemHeight := Value;
  2702. end;
  2703. procedure TfcColorListOptions.SetNoneString(Value: String);
  2704. begin
  2705.   if (FNoneString <> Value) then FNoneString := Value;
  2706. end;
  2707. procedure TfcColorListOptions.SetOptions(Value:TfcColorListBoxOptions);
  2708. begin
  2709.   if FOptions <> Value then begin
  2710.      FOptions := Value;
  2711.      if FCombo.ListBox <> nil then FCombo.ListBox.Options := FOptions;
  2712.   end;
  2713. end;
  2714. procedure TfcColorListOptions.SetSortBy(Value: TfcSortByOption);
  2715. begin
  2716.   if FSortByOption <> Value then
  2717.      FSortByOption := Value;
  2718. end;
  2719. function TfcColorListOptions.StoreNoneString: boolean;
  2720. begin
  2721.    if FNoneString = 'None' then result := False
  2722.    else result := True;
  2723. end;
  2724. function TfcCustomColorList.GetHighlightColor: TColor;
  2725. begin
  2726.   if FHighlightColor = clNone then
  2727.   begin
  2728.     if Focused or (Owner is TfcCustomColorCombo) then result := clHighlight
  2729.     else begin
  2730.     //4/9/99 -PYW- When multiselect is true don't paint in the inactive focus color
  2731.     //             because there is no selection.
  2732.        if (not MultiSelect) then result := clBtnFace
  2733.        else result := clHighlight;
  2734.     end
  2735.   end else result := FHighlightColor;
  2736. end;
  2737. function TfcCustomColorList.GetHighlightTextColor: TColor;
  2738. begin
  2739.   if FHighlightTextColor = clNone then
  2740.   begin
  2741.     if fcHighestRGBVal(GetHighlightColor) > 128 then result := clWindowText
  2742.     else begin
  2743.        result := clHighlightText;
  2744.     end;
  2745.   end else result := FHighlightTextColor;
  2746. end;
  2747. procedure TfcCustomColorList.WMLButtonDown(var Message: TWMLButtonDown);
  2748. begin
  2749.   inherited;
  2750.   // 2/7/01 - Close drop-down (message sent by hook)
  2751.   if (Owner <> nil) and (Owner is TfcColorCombo) then TfcColorCombo(Owner).CheckCancelMode;
  2752.   FClickedInControl := True;  // Added so initial buttonclick of the dropdown button won't close up listbox. -ksw (2/19/99)
  2753. end;
  2754. { When going into edit mode, don't reload control }
  2755. function TfcCustomColorCombo.EditCanModify: Boolean;
  2756. var OrigSkipDataChange: boolean;
  2757. begin
  2758.    OrigSkipDataChange:= SkipDataChange;
  2759.    SkipDataChange:= True;
  2760.    try
  2761.      result:= inherited EditCanModify;
  2762.    finally
  2763.      SkipDataChange:= OrigSkipDataChange;
  2764.    end;
  2765. end;
  2766. function TfcCustomColorCombo.IsCustomColor(s: string): Boolean;
  2767. begin
  2768.   result := (CustomColors.IndexOfName(s) <> -1) or
  2769.     ((Copy(s, 1, Length('Grey')) = 'Grey') and
  2770.      (StrToIntDef(Copy(s, Length('Grey') + 1, Length(s)), -1) <> -1)) or
  2771.     (s = 'clNullColor');
  2772. end;
  2773. function TfcCustomColorCombo.ColorString(s: string): string;
  2774. begin
  2775.   result := s;
  2776.   if not IsCustomColor(result) then result := 'cl' + result;
  2777. end;
  2778. function TfcCustomColorCombo.GetSelectedColorString: string;
  2779. var i: Integer;
  2780. begin
  2781.   result := 'clNullColor';
  2782.   ListBox.InitColorList;
  2783.   i := fcValueInList(IntToHex(SelectedColor, 6), ListBox.AllColors);
  2784.   if i <> -1 then result := ColorString(ListBox.AllColors.Names[i]);
  2785. end;
  2786. procedure TfcCustomColorCombo.SetSelectedColorString(Value: string);
  2787. var AColor: TColor;
  2788.     AStr: string;
  2789. begin
  2790.   ListBox.InitColorList;
  2791.   AColor := clNullColor;
  2792.   if (Copy(Value, 1, 2) = 'cl') and not IsCustomColor(Copy(Value, 3, Length(Value))) then
  2793.     Value := Copy(Value, 3, Length(Value));
  2794.   AStr := ListBox.AllColors.Values[Value];
  2795.   if AStr <> '' then AColor := StringToColor('$' + AStr);
  2796.   SelectedColor := AColor;
  2797. end;
  2798. procedure TfcCustomColorCombo.Change;
  2799. begin
  2800.   if SetModifiedInChangeEvent then modified:=true;
  2801.   inherited;
  2802. end;
  2803. end.