unit rDBGrid;

{
  rDBGrid
  =======  
  Date: Sep 2002
  Author: Rosi (http://sweb.cz/rosisoft)

  Description:
  rDBGrid is enhanced DBGrid component which provides following functionality:
  - shows checkboxes for boolean fields (in font color)
  - shows glyphs for memo fields and graphics fields (in font color)
  - provides build-in editor for memo fields and long string fields
  - provides build-in browser for graphics fields
  - shows complete text as hint for truncated text in cell and for memo field
  - shows sort markers in title row (including multicolumn sorting)
  - provides multiline title row with automatic word wrapping
  - can show odd rows by diferent color
  - can show focus rectangle on whole active row
  - provides automatic changing of columns width after resizing of grid
  - provides enhanced functionality for choosing value in lookup fields
  - provides lookup functionality for non editing grid
  - provides mousewheel functionality
  - introduces events for change sorting and click on title cells
    or fixed collumn cell
  - introduces events for drawing on active row

  Note:
  Splash screen in demo version
{}

interface

uses
  Windows, Messages, SysUtils, Graphics, Classes, Controls, Grids, DBGrids,
  DB, DBCtrls, Forms, Dialogs, PropSaveMain, ExtCtrls;

const
  MaxBmpArr=9;

type
  TOptionEx = (dgTitleExBtn, dgTitleBtn, dgFixColBtn,
               dgBool, dgMemo, dgGraphic,
               dgDrawRowFocus, dgDrawColoredRow);
  TOptionsEx = set of TOptionEx;
    {Defines ehnanced Option properties}

  TColumnWidth = (cwNone, cwDefaultWidth, cwSameWidth, cwAutoWidth,
                  cwDataWidth, cwLabelWidth);
    {Defines type of automatic changing of columns width}

  TOnChangeSort = procedure (Sender: TObject; DataSet: TDataSet;
    SortFieldName: string; SortDesc: boolean; var Accept: boolean) of object;
    {Procedure is called after click on title row, application should provide
     sorting; if "Accept" remains true, "SortFieldName" and "SortDesc" is
     changed and sort marker is shown, in other case nothing is changed}

  TrDBGrid = class(TDBGrid)
  private
    isPushing: boolean;
    isDblClick: boolean;
    isMoved: boolean;
    MoveCoord, DownCoord: TGridCoord;
    ShiftState: TShiftState;
    BmpArr: array [0..MaxBmpArr] of TBitmap;
    ActBmp: integer;
    oldWidth: integer;
    isActiveRow: boolean;
    FTitleLines: Integer;
    FOptionsEx: TOptionsEx;
    FSortFieldName: string;
    FSortDesc: boolean;
    FTextAsMemoSize: integer;
    FPropSaveFile: TPropSaveFile;
    FColumnWidth: TColumnWidth;
    FColorOddRow: TColor;
    FOnChangeSort: TOnChangeSort;
    FOnTitleExClick: TNotifyEvent;
    FOnFixColClick: TNotifyEvent;
    FOnDrawActiveRowFocus: TDrawColumnCellEvent;
    FOnRefreshData: TNotifyEvent;
    FTimer: TTimer;
    FLookupText: string;
    oldHintPause: integer;
    procedure FOnTimer(Sender: TObject);
    function CheckCoord(Coord: TGridCoord; X,Y: integer): boolean;
    function TitleRow: integer;
    function FixCol: integer;
    function IsLinked: boolean;
    function CanEdit: boolean;
    function IsBoolEx(F: TField): boolean;
    function IsMemoEx(F: TField; TextAsMemo: boolean): boolean;
    function IsGraphicEx(F: TField): boolean;
    function ChangeBool: boolean;
    procedure ShowMemo;
    procedure ShowGraphic;
    procedure DrawBmpCenter(R: TRect; Bmp: TBitmap);
    function TrimSortField(ASortFieldName: string): string;
    procedure SetOptionsEx(const Value: TOptionsEx);
    procedure SetSortFieldName(const Value: string);
    procedure SetSortDesc(const Value: boolean);
    procedure SetFColumnWidth(const Value: TColumnWidth);
    procedure SetTitleLines(const Value: integer);
    procedure WMSize(var Message: TWMSize); message WM_SIZE;
    procedure CMHintShow(var Message: TMessage); message CM_HINTSHOW;
  protected
    procedure SetPropSaveFile(Value: TPropSaveFile);
    procedure SetColorOddRow(Value: TColor);
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    function  CanEditShow: Boolean; override;
    procedure LayoutChanged; override;
    procedure ColExit; override;
    procedure ColumnMoved(FromIndex, ToIndex: Longint); override;
    procedure DrawCell(ACol, ARow: Longint; ARect: TRect;
                       AState: TGridDrawState); override;
    procedure DrawColumnCell(const Rect: TRect; DataCol: Integer;
      Column: TColumn; State: TGridDrawState); override;
    procedure CellClick(Column: TColumn); override;
    procedure TitleClick(Column: TColumn); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure DblClick; override;
    procedure KeyPress(var Key: Char); override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    function DoMouseWheel(Shift: TShiftState; WheelDelta: Integer;
                          MousePos: TPoint): Boolean; override;
    procedure Scroll(Distance: Integer); override;
  public
    function ReSort: boolean;
      {Function calls OnChangeSort procedure}
    function ChangeSort(NewSortFieldName: string; NewSortDesc: boolean): boolean;
      {Function changes sort properties and call OnChangeSort procedure}
    procedure SetColumnWidth(ColumnWidth: TColumnWidth);
      {Procedure changes column width according ColumnWidth parameter}
    function PosInSortField(SelFldName: string): integer;
      {Procedure return position of SelFldName in SortFieldName (0=not found)}
  published
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property OptionsEx: TOptionsEx
      read FOptionsEx write SetOptionsEx;
    property SortFieldName: string
      read FSortFieldName write SetSortFieldName;
      {Defines which columns has sort marker}
    property SortDesc: boolean
      read FSortDesc write SetSortDesc;
      {Defines direction of sort marker}
    property TextAsMemoSize: integer
      read FTextAsMemoSize write FTextAsMemoSize;
      {Defines minimum size of string field for using a memo editor}
    property ColumnWidth: TColumnWidth
      read FColumnWidth write SetFColumnWidth;
      {Defines type of automatic changing of column width}
    property ColorOddRow: TColor
      read FColorOddRow write SetColorOddRow;
      {Defines color of each odd row}
    property TitleLines: integer
      read FTitleLines write SetTitleLines;
      {Defines number of lines in title row}
    property PropSaveFile: TPropSaveFile
      read FPropSaveFile write SetPropSaveFile;
    property OnChangeSort: TOnChangeSort
      read FOnChangeSort write FOnChangeSort;
    property OnTitleExClick: TNotifyEvent
      read FOnTitleExClick write FOnTitleExClick;
    property OnFixColClick: TNotifyEvent
      read FOnFixColClick write FOnFixColClick;
    property OnDrawActiveRowFocus: TDrawColumnCellEvent
      read FOnDrawActiveRowFocus write FOnDrawActiveRowFocus;
    property OnRefreshData: TNotifyEvent
      read FOnRefreshData write FOnRefreshData;
  end;

procedure Register;

implementation
