Class TCustomEnhListView (unit EnhListView)

Inherits from

TCustomListView

The new class

Constructors


constructor Create(AOwner: TComponent);

Override constructor to "zero out" our internal variable.


Functions

procedure BeginUpdate;

Use these as replacements for Items.

procedure DefaultSort(ColumnIndex:integer; Descending: boolean);


destructor Destroy;

inhibit sorting until finished creating.

procedure EndUpdate;


function LoadSettings: boolean;


procedure ResizeColumns(ResizeMethod: TResizeMethod);

Resize all columns.

procedure Resort;


function StoreSettings: boolean;


function ActualColumnIndex(Index: integer): integer;

Can't do this above because FLastColumnClicked is used to paint the arrow

procedure AfterDrawItem(var Canvas: TCanvas; Index: Integer; Rect: TRect; State: TOwnerDrawState);


procedure ColClick(Column: TListColumn);

Overriden ancestor methods

procedure CreateParams(var Params: TCreateParams);


procedure CreateSortBmps(var UpBmp, DownBmp: TBitmap);


procedure CreateWnd;


procedure DefaultDrawHeader(var Canvas: TCanvas; Index: Integer; var Rect: TRect; Selected: boolean);


procedure DefaultDrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState; FullRowSelect: boolean);


procedure DefaultDrawSubItem(Index, SubItem: integer; Rect: TRect; State: TOwnerDrawState);


procedure DestroyWnd;

Don't ask about the drawing.

procedure DoSort(ColumnIndex:integer; Descending: boolean);


procedure DrawHeader(var Canvas: TCanvas; Index: Integer; var Rect: TRect; Selected: boolean; var DefaultDrawing: boolean);


procedure DrawItem(var Canvas: TCanvas; Index: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing, FullRowSelect: boolean);

Call this last so resort happens before screen redraw is re-enabled.

procedure DrawSubItem(Index, SubItem: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing: boolean);

SubItem is -1 for Caption item

procedure Edit(const Item: TLVItem);

Check if the sort order should be toggled

procedure EditCanceled(const Item: TLVItem);


function GetActualColumn(Index: integer): TListColumn;

CNDrawItem

function GetSubItemText(Index, SubItem: integer): string;

Delphi 2 and C++B 1 have a bug in TListColumn.

function GetVersion: TDFSVersion;


procedure InvalidateColumnHeader(Index: integer);


procedure Loaded;

If we are loading object from stream (form file), we have to wait until everything is loaded before populating the list.

procedure MeasureItem(var Height: Integer);


procedure ProcessDrawHeaderMsg(Index: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing: boolean);

CNDrawItem

procedure ProcessDrawItemMsg(Index: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing, FullRowSelect: boolean);

Hidden item

procedure SetAutoColumnSort(Value: TAutoColumnSort);

Property methods

procedure SetAutoResort(Value: boolean);


procedure SetAutoSortAscending(Value: boolean);


procedure SetAutoSortStyle(Value: TAutoSortStyle);


procedure SetColumnsOwnerDrawFlag(OwnerDrawn: boolean);


procedure SetCurrentSortAscending(Value: boolean);


procedure SetLastColumnClicked(Value: integer);


procedure SetOnDrawHeader(Value: TLVHDrawItemEvent);

taLeftJustify, taCenter Only draw if we have enough room

procedure SetReverseSortArrows(Value: boolean);


procedure SetShowSortArrows(Value: boolean);


procedure SetStyle(Value: TLVStyle);

Don't let it go past first column width

procedure SetVersion(const Val: TDFSVersion);


procedure SortBegin(ColumnIndex: integer; Ascending: boolean);

The only way to get in here is if FOnSortItems is assigned, so don't bother checking for NIL

procedure SortFinished(ColumnIndex: integer; Ascending: boolean);


procedure SortItems(const Item1, Item2: TListItem; SortColumn: integer; var CompResult: integer);

Check if the sort order should be toggled

procedure CMSysColorChange(var Message: TWMSysColorChange);

Message handlers

procedure CNDrawItem(var Message: TWMDrawItem);


procedure CNMeasureItem(var Message: TWMMeasureItem);

Need to recreate the sort arrow bmps to use the new system colors

procedure CNNotify(var Message: TWMNotify);


procedure WMDestroy(var Message: TWMDestroy);

Something flaky going on.

procedure WMDrawHeader(var Message: TWMDrawItem);

old way.

procedure WMNotify(var Message: TWMNotify);


procedure WMOwnerDrawColumns(var Message: TMessage);

Adjust for shadow

Properties

property Version : TDFSVersion


property ActualColumn : TListColumn

Accounts for re-ordered columns

property AutoColumnSort : TAutoColumnSort


property AutoResort : boolean


property AutoSortAscending : boolean


property AutoSortStyle : TAutoSortStyle


property CurrentSortAscending : boolean


property HeaderHandle : HWnd

Should be published by descendants as needed

property LastColumnClicked : Integer

Should be made public by descendants as needed

property ReverseSortArrows : boolean


property SaveSettings : TEnhLVSaveSettings


property ShowSortArrows : boolean


property SortDownBmp : TBitmap


property SortUpBmp : TBitmap

Should probably remain protected

property Style : TLVStyle


Events

event OnAfterDefaultDrawItem : TLVAfterDrawItemEvent


event OnDrawHeader : TLVHDrawItemEvent

Events

event OnDrawItem : TLVDrawItemEvent


event OnDrawSubItem : TLVDrawSubItemEvent


event OnEditCanceled : TLVEditCanceled


event OnMeasureItem : TLVMeasureItemEvent


event OnSortBegin : TLVSortStatusEvent


event OnSortFinished : TLVSortStatusEvent


event OnSortItems : TLVSortItemsEvent


Variables

FCanvas : TCanvas;

USE WITH CARE.

FHeaderHandle : HWND;


FAutoColumnSort : TAutoColumnSort;


FAutoResort : boolean;


FAutoSortAscending : boolean;


FAutoSortStyle : TAutoSortStyle;


FLastColumnClicked : Integer;


FOnAfterDefaultDrawItem : TLVAfterDrawItemEvent;


FOnDrawHeader : TLVHDrawItemEvent;


FOnDrawItem : TLVDrawItemEvent;


FOnDrawSubItem : TLVDrawSubItemEvent;


FOnEditCanceled : TLVEditCanceled;


FOnMeasureItem : TLVMeasureItemEvent;


FOnSortBegin : TLVSortStatusEvent;


FOnSortFinished : TLVSortStatusEvent;


FOnSortItems : TLVSortItemsEvent;


FReverseSortArrows : boolean;


FSaveSettings : TEnhLVSaveSettings;


FShowSortArrows : boolean;


FSortDirty : boolean;


FSortDownBmp : TBitmap;


FSortUpBmp : TBitmap;


FStyle : TLVStyle;


FTmpAutoSortAscending : boolean;


FUpdateCount : integer;



Constructors


constructor Create(AOwner: TComponent);

Override constructor to "zero out" our internal variable.


Functions


procedure BeginUpdate;

Use these as replacements for Items.BeginUpdate and EndUpdate. They call those methods, but they also inhibit autosorting until after the last EndUpdate.


procedure DefaultSort(ColumnIndex:integer; Descending: boolean);


destructor Destroy;

inhibit sorting until finished creating.


procedure EndUpdate;


function LoadSettings: boolean;


procedure ResizeColumns(ResizeMethod: TResizeMethod);

Resize all columns.

empty write method, just needed to get it to show up in Object Inspector


procedure Resort;


function StoreSettings: boolean;


function ActualColumnIndex(Index: integer): integer;

Can't do this above because FLastColumnClicked is used to paint the arrow


procedure AfterDrawItem(var Canvas: TCanvas; Index: Integer; Rect: TRect; State: TOwnerDrawState);


procedure ColClick(Column: TListColumn);

Overriden ancestor methods


procedure CreateParams(var Params: TCreateParams);


procedure CreateSortBmps(var UpBmp, DownBmp: TBitmap);


procedure CreateWnd;


procedure DefaultDrawHeader(var Canvas: TCanvas; Index: Integer; var Rect: TRect; Selected: boolean);


procedure DefaultDrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState; FullRowSelect: boolean);


procedure DefaultDrawSubItem(Index, SubItem: integer; Rect: TRect; State: TOwnerDrawState);


procedure DestroyWnd;

Don't ask about the drawing. I just fooled around until I got something I liked.


procedure DoSort(ColumnIndex:integer; Descending: boolean);


procedure DrawHeader(var Canvas: TCanvas; Index: Integer; var Rect: TRect; Selected: boolean; var DefaultDrawing: boolean);


procedure DrawItem(var Canvas: TCanvas; Index: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing, FullRowSelect: boolean);

Call this last so resort happens before screen redraw is re-enabled.


procedure DrawSubItem(Index, SubItem: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing: boolean);

SubItem is -1 for Caption item


procedure Edit(const Item: TLVItem);

Check if the sort order should be toggled


procedure EditCanceled(const Item: TLVItem);


function GetActualColumn(Index: integer): TListColumn;

CNDrawItem


function GetSubItemText(Index, SubItem: integer): string;

Delphi 2 and C++B 1 have a bug in TListColumn.GetWidth. It returns zero for the width if the handle hasn't been allocated yet instead of returning the value of the internal storage variable like Delphi 3 does. I've also had some problems similar under Delphi 3, so I'm just always requiring the handle to be valid.


function GetVersion: TDFSVersion;


procedure InvalidateColumnHeader(Index: integer);


procedure Loaded;

If we are loading object from stream (form file), we have to wait until everything is loaded before populating the list. If we are not loading, i.e. the component was created dynamically or was just dropped on a form, we need to reset the flag now.


procedure MeasureItem(var Height: Integer);


procedure ProcessDrawHeaderMsg(Index: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing: boolean);

CNDrawItem


procedure ProcessDrawItemMsg(Index: Integer; Rect: TRect; State: TOwnerDrawState; var DefaultDrawing, FullRowSelect: boolean);

Hidden item


procedure SetAutoColumnSort(Value: TAutoColumnSort);

Property methods


procedure SetAutoResort(Value: boolean);


procedure SetAutoSortAscending(Value: boolean);


procedure SetAutoSortStyle(Value: TAutoSortStyle);


procedure SetColumnsOwnerDrawFlag(OwnerDrawn: boolean);


procedure SetCurrentSortAscending(Value: boolean);


procedure SetLastColumnClicked(Value: integer);


procedure SetOnDrawHeader(Value: TLVHDrawItemEvent);

taLeftJustify, taCenter Only draw if we have enough room


procedure SetReverseSortArrows(Value: boolean);


procedure SetShowSortArrows(Value: boolean);


procedure SetStyle(Value: TLVStyle);

Don't let it go past first column width


procedure SetVersion(const Val: TDFSVersion);


procedure SortBegin(ColumnIndex: integer; Ascending: boolean);

The only way to get in here is if FOnSortItems is assigned, so don't bother checking for NIL


procedure SortFinished(ColumnIndex: integer; Ascending: boolean);


procedure SortItems(const Item1, Item2: TListItem; SortColumn: integer; var CompResult: integer);

Check if the sort order should be toggled


procedure CMSysColorChange(var Message: TWMSysColorChange);

Message handlers


procedure CNDrawItem(var Message: TWMDrawItem);


procedure CNMeasureItem(var Message: TWMMeasureItem);

Need to recreate the sort arrow bmps to use the new system colors


procedure CNNotify(var Message: TWMNotify);


procedure WMDestroy(var Message: TWMDestroy);

Something flaky going on. Hard to explain, but this clears it up.


procedure WMDrawHeader(var Message: TWMDrawItem);

old way. had some performance problems when used in conjunction with TToolbar97 component. No idea why that would cause it, though. // For some reason, the SECOND time you drag a header width, it toasts the // column index in the draw item message. Also seems to reset owner draw // info at times, too. Anyway, the best fix I could come up with was to // always watch for a change in the header handle, and always reset the owner // draw flag. Note the recursion flag. This is needed since the // SetColumnsOwnerDrawFlag will cause some HDN_xxx notification messages. // Best way that I can find to snag the real header handle. Kludgy at best, // but what else are you gonna do? case Message.NMHdr.code of HDN_LAST..HDN_FIRST: begin if Message.NMHdr.hwndFrom <> FHeaderHandle then FHeaderHandle := Message.NMHdr^.hwndFrom; if RECURSE_FLAG or (FUpdateCount > 0) then exit; RECURSE_FLAG := TRUE; try SetColumnsOwnerDrawFlag(assigned(FOnDrawHeader) or FShowSortArrows); finally RECURSE_FLAG := FALSE; end; end; end;


procedure WMNotify(var Message: TWMNotify);


procedure WMOwnerDrawColumns(var Message: TMessage);

Adjust for shadow


Properties


property Version : TDFSVersion


property ActualColumn : TListColumn

Accounts for re-ordered columns


property AutoColumnSort : TAutoColumnSort


property AutoResort : boolean


property AutoSortAscending : boolean


property AutoSortStyle : TAutoSortStyle


property CurrentSortAscending : boolean


property HeaderHandle : HWnd

Should be published by descendants as needed


property LastColumnClicked : Integer

Should be made public by descendants as needed


property ReverseSortArrows : boolean


property SaveSettings : TEnhLVSaveSettings


property ShowSortArrows : boolean


property SortDownBmp : TBitmap


property SortUpBmp : TBitmap

Should probably remain protected


property Style : TLVStyle


Events


event OnAfterDefaultDrawItem : TLVAfterDrawItemEvent


event OnDrawHeader : TLVHDrawItemEvent

Events


event OnDrawItem : TLVDrawItemEvent


event OnDrawSubItem : TLVDrawSubItemEvent


event OnEditCanceled : TLVEditCanceled


event OnMeasureItem : TLVMeasureItemEvent


event OnSortBegin : TLVSortStatusEvent


event OnSortFinished : TLVSortStatusEvent


event OnSortItems : TLVSortItemsEvent


Variables


FCanvas : TCanvas;

USE WITH CARE. This can be NIL


FHeaderHandle : HWND;


FAutoColumnSort : TAutoColumnSort;


FAutoResort : boolean;


FAutoSortAscending : boolean;


FAutoSortStyle : TAutoSortStyle;


FLastColumnClicked : Integer;


FOnAfterDefaultDrawItem : TLVAfterDrawItemEvent;


FOnDrawHeader : TLVHDrawItemEvent;


FOnDrawItem : TLVDrawItemEvent;


FOnDrawSubItem : TLVDrawSubItemEvent;


FOnEditCanceled : TLVEditCanceled;


FOnMeasureItem : TLVMeasureItemEvent;


FOnSortBegin : TLVSortStatusEvent;


FOnSortFinished : TLVSortStatusEvent;


FOnSortItems : TLVSortItemsEvent;


FReverseSortArrows : boolean;


FSaveSettings : TEnhLVSaveSettings;


FShowSortArrows : boolean;


FSortDirty : boolean;


FSortDownBmp : TBitmap;


FSortUpBmp : TBitmap;


FStyle : TLVStyle;


FTmpAutoSortAscending : boolean;


FUpdateCount : integer;