123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587 |
- unit IEListView;
- {==================================================================
- Component TCustomIEListView / Version 1.0, September 1999
- ==================================================================
- Description:
- ============
- Basic component for TDirView.
- Author:
- =======
- (c) Ingo Eckel 1999
- Sodener Weg 38
- 65812 Bad Soden
- Germany
- (c) Martin Prikryl 2001 - 2003
- For detailed documentation see the documentation of TDirView.
- ==================================================================}
- {Required compiler options for TCustomIEListView:}
- {$A+,B-,X+,H+,P+}
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls,
- Forms, ActiveX, CommCtrl, Extctrls, ImgList,
- ComCtrls, NortonLikeListView, ListViewColProperties;
- type
- TIEListViewColProperties = class(TCustomListViewColProperties)
- protected
- function GetSortAscending: Boolean;
- procedure SetSortColumn(Value: Integer);
- function GetSortColumn: Integer;
- function GetSortStr: string; virtual;
- procedure SetSortAscending(Value: Boolean);
- procedure SetSortStr(Value: string); virtual;
- function GetParamsStr: string; override;
- procedure SetParamsStr(Value: string); override;
- public
- constructor Create(ListView: TCustomListView; ColCount: Integer);
- property SortAscending: Boolean read GetSortAscending write SetSortAscending default True;
- property SortColumn: Integer read GetSortColumn write SetSortColumn;
- property SortStr: string read GetSortStr write SetSortStr stored False;
- end;
- type
- TCustomIEListView = class;
- TListViewSecondaryColumnHeaderEvent =
- procedure(Sender: TCustomIEListView; Index: Integer; var SecondaryColumn: Integer) of object;
- TCustomIEListView = class(TCustomNortonLikeListView)
- private
- FSortColumn: Integer;
- FSortAscending: Boolean;
- FShowColumnIcon: Boolean;
- FParentForm: TCustomForm;
- FOnHeaderEndDrag: TNotifyEvent;
- FOnHeaderEndTrack: TNotifyEvent;
- FOnRecreate: TNotifyEvent;
- FOnSecondaryColumnHeader: TListViewSecondaryColumnHeaderEvent;
- FDragImageList: TDragImageList;
- protected
- procedure ColPropertiesChange(Sender: TObject); virtual;
- procedure SetShowColumnIcon(Value: Boolean); virtual;
- procedure SetSortColumn(Value: Integer); virtual;
- procedure SetSortAscending(Value: Boolean); virtual;
- procedure SortItems; virtual;
- procedure SetViewStyle(Value: TViewStyle); override; // CLEAN virtual
- procedure HeaderEndDrag(Sender: TObject); virtual;
- function SecondaryColumnHeader(Index: Integer): Integer;
- function NewColProperties: TCustomListViewColProperties; override;
- function SortAscendingByDefault(Index: Integer): Boolean; virtual;
- procedure CreateWnd; override;
- procedure ColClick(Column: TListColumn); override;
- procedure SetSort(Column: Integer; Ascending: Boolean);
- procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
- procedure CMRecreateWnd(var Message: TMessage); message CM_RECREATEWND;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- procedure SetColumnImages; virtual;
- procedure SortBy(Column: Integer);
- property DragImageList: TDragImageList read FDragImageList;
- property ParentForm: TCustomForm read FParentForm;
- {Set the sort column of the listview}
- property SortColumn: Integer read FSortColumn write SetSortColumn;
- {Sortorder of actual sort column}
- property SortAscending: Boolean
- read FSortAscending write SetSortAscending default True;
- property OnSecondaryColumnHeader: TListViewSecondaryColumnHeaderEvent
- read FOnSecondaryColumnHeader write FOnSecondaryColumnHeader;
- published
- property OnHeaderEndDrag: TNotifyEvent
- read FOnHeaderEndDrag write FOnHeaderEndDrag;
- property OnHeaderEndTrack: TNotifyEvent
- read FOnHeaderEndTrack write FOnHeaderEndTrack;
- property OnRecreate: TNotifyEvent
- read FOnRecreate write FOnRecreate;
- {Show the sorting symbol in the listview's header:}
- property ShowColumnIcon: Boolean
- read FShowColumnIcon write SetShowColumnIcon default True;
- property Align;
- property AllocBy;
- property Anchors;
- property BiDiMode;
- property BorderStyle;
- property BorderWidth;
- property Checkboxes;
- property Color;
- property ColumnClick default True;
- property Constraints;
- property Ctl3D;
- property DoubleBuffered;
- property Enabled;
- property Font;
- property FlatScrollBars;
- property FullDrag;
- property GridLines;
- property HideSelection;
- property HotTrack;
- property HotTrackStyles;
- property IconOptions;
- property ReadOnly default False;
- property RowSelect;
- property ParentBiDiMode;
- property ParentColor default False;
- property ParentDoubleBuffered;
- property ParentFont;
- property ParentShowHint;
- property PopupMenu;
- property ShowColumnHeaders;
- property ShowHint;
- property TabOrder;
- property TabStop default True;
- property Visible;
- property OnChange;
- property OnChanging;
- property OnClick;
- property OnColumnClick;
- property OnColumnRightClick;
- property OnCustomDraw;
- property OwnerDraw;
- {Used for internal purposes:}
- property OnCustomDrawItem;
- property OnCustomDrawSubItem;
- property OnDblClick;
- property OnDeletion;
- property OnDrawItem;
- property OnEdited;
- property OnEditing;
- property OnEndDock;
- property OnEnter;
- property OnExit;
- property OnInsert;
- property OnKeyDown;
- property OnKeyPress;
- property OnKeyUp;
- property OnMouseDown;
- property OnMouseMove;
- property OnMouseUp;
- property OnResize;
- property OnStartDock;
- property NortonLike;
- end; {Type TCustomIEListView}
- type
- TIEListView = class(TCustomIEListView)
- published
- // copy from TListView, except for marked items
- property Action;
- property Align;
- property AllocBy;
- property Anchors;
- property BevelEdges;
- property BevelInner;
- property BevelOuter;
- property BevelKind default bkNone;
- property BevelWidth;
- property BiDiMode;
- property BorderStyle;
- property BorderWidth;
- property Checkboxes;
- property Color;
- property Columns;
- property ColumnClick;
- property Constraints;
- property Ctl3D;
- property DragCursor;
- property DragKind;
- property DragMode;
- property Enabled;
- property Font;
- property FlatScrollBars;
- property FullDrag;
- property GridLines;
- property HideSelection;
- property HotTrack;
- property HotTrackStyles;
- property HoverTime;
- property IconOptions;
- property Items;
- property LargeImages;
- property MultiSelect;
- property OwnerData;
- property OwnerDraw;
- property ReadOnly default False;
- property RowSelect;
- property ParentBiDiMode;
- property ParentColor default False;
- property ParentFont;
- property ParentShowHint;
- property PopupMenu;
- property ShowColumnHeaders;
- property ShowWorkAreas;
- property ShowHint;
- property SmallImages;
- property SortType;
- property StateImages;
- property TabOrder;
- property TabStop default True;
- property ViewStyle;
- property Visible;
- property OnAdvancedCustomDraw;
- property OnAdvancedCustomDrawItem;
- property OnAdvancedCustomDrawSubItem;
- property OnChange;
- property OnChanging;
- property OnClick;
- property OnColumnClick;
- property OnColumnDragged;
- property OnColumnRightClick;
- property OnCompare;
- property OnContextPopup;
- property OnCustomDraw;
- property OnCustomDrawItem;
- property OnCustomDrawSubItem;
- property OnData;
- property OnDataFind;
- property OnDataHint;
- property OnDataStateChange;
- property OnDblClick;
- property OnDeletion;
- property OnDrawItem;
- property OnEdited;
- property OnEditing;
- property OnEndDock;
- property OnEndDrag;
- property OnEnter;
- property OnExit;
- property OnGetImageIndex;
- property OnGetSubItemImage;
- property OnDragDrop;
- property OnDragOver;
- property OnInfoTip;
- property OnInsert;
- property OnKeyDown;
- property OnKeyPress;
- property OnKeyUp;
- property OnMouseDown;
- property OnMouseMove;
- property OnMouseUp;
- property OnResize;
- property OnSelectItem;
- property OnStartDock;
- property OnStartDrag;
- property OnSecondaryColumnHeader; // TCustomIEListView
- end;
- var
- GlobalDragImageList: TDragImageList;
- procedure Register;
- implementation
- uses
- PasTools, Types;
- procedure Register;
- begin
- RegisterComponents('Martin', [TIEListView]);
- end;
- { TIEListViewColProperties }
- constructor TIEListViewColProperties.Create(ListView: TCustomListView; ColCount: Integer);
- begin
- inherited;
- end;
- procedure TIEListViewColProperties.SetParamsStr(Value: string);
- begin
- SortStr := CutToChar(Value, '|', True);
- inherited SetParamsStr(Value);
- end;
- procedure TIEListViewColProperties.SetSortAscending(Value: Boolean);
- begin
- TCustomIEListView(FListView).SortAscending := Value;
- end;
- procedure TIEListViewColProperties.SetSortColumn(Value: Integer);
- begin
- if SortColumn <> Value then
- begin
- TCustomIEListView(FListView).SortColumn := Value;
- Changed;
- end;
- end;
- function TIEListViewColProperties.GetParamsStr: string;
- begin
- Result := Format('%s|%s', [SortStr, inherited GetParamsStr]);
- end;
- function TIEListViewColProperties.GetSortAscending: Boolean;
- begin
- Result := TCustomIEListView(FListView).SortAscending;
- end;
- function TIEListViewColProperties.GetSortColumn: Integer;
- begin
- Result := TCustomIEListView(FListView).SortColumn;
- end;
- procedure TIEListViewColProperties.SetSortStr(Value: string);
- var
- ASortColumn: Integer;
- begin
- ASortColumn := StrToIntDef(CutToChar(Value, ';', True), SortColumn);
- if ASortColumn < Count then SortColumn := ASortColumn;
- SortAscending := Boolean(StrToIntDef(CutToChar(Value, ';', True), Integer(SortAscending)));
- end;
- function TIEListViewColProperties.GetSortStr: string;
- begin
- Result := Format('%d;%d', [SortColumn, Integer(SortAscending)]);
- end;
- { TCustomIEListView }
- constructor TCustomIEListView.Create(AOwner: TComponent);
- begin
- inherited;
- ColProperties.OnChange := ColPropertiesChange;
- FShowColumnIcon := True;
- FSortColumn := 0;
- FSortAscending := True;
- end; {Create}
- procedure TCustomIEListView.SetSort(Column: Integer; Ascending: Boolean);
- begin
- if (SortColumn <> Column) or (SortAscending <> Ascending) then
- begin
- FSortColumn := Column;
- FSortAscending := Ascending;
- if Items.Count > 0 then SortItems;
- SetColumnImages;
- end;
- end;
- procedure TCustomIEListView.SortBy(Column: Integer);
- begin
- if Column = SortColumn then SetSort(SortColumn, not SortAscending)
- else SetSort(Column, SortAscendingByDefault(Column));
- end;
- procedure TCustomIEListView.SetSortColumn(Value: Integer);
- begin
- SetSort(Value, True);
- end; {SetSortColumn}
- procedure TCustomIEListView.SetViewStyle(Value: TViewStyle);
- begin
- if Value <> ViewStyle then
- begin
- inherited SetViewStyle(Value);
- if ViewStyle = vsReport then
- SetColumnImages;
- end;
- end; {SetViewStyle}
- procedure TCustomIEListView.SetSortAscending(Value: Boolean);
- begin
- SetSort(SortColumn, Value);
- end; {SetSortAscending}
- procedure TCustomIEListView.SetColumnImages;
- var
- HdItem: THdItem;
- Index: Integer;
- SecondaryColumn: Integer;
- ShowImage: Boolean;
- NewFmt: Integer;
- begin
- if ShowColumnHeaders and HandleAllocated then
- begin
- for Index := 0 to Columns.Count-1 do
- begin
- HdItem.Mask := HDI_FORMAT;
- Header_GetItem(FHeaderHandle, Index, HdItem);
- SecondaryColumn := SecondaryColumnHeader(Index);
- ShowImage := False;
- if FShowColumnIcon then
- begin
- if (Index = SortColumn) or
- ((SecondaryColumn >= 0) and (SecondaryColumn = SortColumn)) then
- begin
- ShowImage := True;
- end;
- end;
- // for hidden columns, do not show the icon
- // as on some systems it is still drawn, but on neighboring columns
- if ShowImage and (Columns[Index].Width > 0) then
- begin
- if SortAscending then
- begin
- NewFmt := (Hditem.fmt or HDF_SORTUP) and (not HDF_SORTDOWN);
- end
- else
- begin
- NewFmt := (Hditem.fmt or HDF_SORTDOWN) and (not HDF_SORTUP);
- end;
- end
- else
- begin
- NewFmt := HdItem.fmt and (not (HDF_SORTUP or HDF_SORTDOWN));
- end;
- if NewFmt <> HdItem.fmt then
- begin
- HdItem.Mask := HDI_FORMAT;
- HdItem.fmt := NewFmt;
- Header_SetItem(FHeaderHandle, Index, HDItem);
- end;
- end;
- end;
- end; {SetColumnImage}
- procedure TCustomIEListView.SetShowColumnIcon(Value: Boolean);
- begin
- if Value <> ShowColumnIcon then
- begin
- FShowColumnIcon := Value;
- SetColumnImages;
- end;
- end; {SetShowColumnIcon}
- function TCustomIEListView.SecondaryColumnHeader(Index: Integer): Integer;
- begin
- if Assigned(OnSecondaryColumnHeader) then
- begin
- OnSecondaryColumnHeader(Self, Index, Result);
- end
- else
- begin
- Result := -1;
- end;
- end;
- function TCustomIEListView.NewColProperties: TCustomListViewColProperties;
- begin
- Result := TIEListViewColProperties.Create(Self, 0);
- end;
- function TCustomIEListView.SortAscendingByDefault(Index: Integer): Boolean;
- begin
- Result := True;
- end;
- procedure TCustomIEListView.ColClick(Column: TListColumn);
- begin
- SortBy(Column.Index);
- inherited;
- end; {ColClick}
- procedure TCustomIEListView.WMNotify(var Msg: TWMNotify);
- begin
- if (FHeaderHandle <> 0) and (Msg.NMHdr^.hWndFrom = FHeaderHandle) then
- case Msg.NMHdr.code of
- HDN_BEGINDRAG:
- begin
- // We probably do not need to eat this message anymore,
- // we let's keep it in sync with HDN_ENDDRAG (see comment there)
- end;
- HDN_ENDDRAG:
- begin
- // Originally the code to eat this message was here to
- // workaround bug in D4 (until Update Pack 3).
- // But when we pass the message to VCL, it reorders
- // columns in Columns collection, what our code does not handle.
- // See also comment in TCustomListViewColProperties.UpdateListViewOrder
- HeaderEndDrag(Self);
- Invalidate;
- Exit;
- end;
- HDN_ENDTRACKA, HDN_ENDTRACKW:
- begin
- SetColumnImages;
- Invalidate;
- inherited;
- if Assigned(FOnHeaderEndTrack) then
- FOnHeaderEndTrack(Self);
- Exit;
- end;
- HDN_DIVIDERDBLCLICKA, HDN_DIVIDERDBLCLICKW:
- begin
- inherited;
- if Assigned(FOnHeaderEndTrack) then
- FOnHeaderEndTrack(Self);
- SetColumnImages;
- end;
- end;
- inherited;
- end; { TCustomIEListView.WMNotify }
- // Might not be always called, see comment in TDriveView.DestroyWnd
- procedure TCustomIEListView.CMRecreateWnd(var Message: TMessage);
- begin
- inherited;
- if Assigned(OnRecreate) then OnRecreate(Self);
- end;
- procedure TCustomIEListView.HeaderEndDrag(Sender : TObject);
- begin
- if Assigned(FOnHeaderEndDrag) then
- FOnHeaderEndDrag(Self);
- end; {HeaderEndDrag}
- procedure TCustomIEListView.ColPropertiesChange(Sender: TObject);
- begin
- SetColumnImages;
- end;
- procedure TCustomIEListView.CreateWnd;
- begin
- inherited;
- FParentForm := GetParentForm(Self);
- if not (csDesigning in ComponentState) then
- FDragImageList := TDragImageList.Create(Self);
- if not Assigned(GlobalDragImageList) then
- GlobalDragImageList := DragImageList;
- SetColumnImages;
- end; {CreateWnd}
- destructor TCustomIEListView.Destroy;
- begin
- if Assigned(FDragImageList) then
- begin
- if GlobalDragImageList = FDragImageList then
- GlobalDragImageList := nil;
- FDragImageList.Free;
- end;
- inherited;
- end; {Destroy}
- procedure TCustomIEListView.SortItems;
- begin
- AlphaSort;
- ItemsReordered;
- end;
- end.
|