IEListView.pas 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. unit IEListView;
  2. {==================================================================
  3. Component TIEListView / Version 1.0, September 1999
  4. ==================================================================
  5. Description:
  6. ============
  7. Basic component for TDirView.
  8. Author:
  9. =======
  10. (c) Ingo Eckel 1999
  11. Sodener Weg 38
  12. 65812 Bad Soden
  13. Germany
  14. (c) Martin Prikryl 2001 - 2003
  15. For detailed documentation see the documentation of TDirView.
  16. ==================================================================}
  17. {Required compiler options for TIEListView:}
  18. {$A+,B-,X+,H+,P+}
  19. interface
  20. uses
  21. Windows, Messages, SysUtils, Classes, Graphics, Controls,
  22. Forms, ActiveX, CommCtrl, Extctrls, ImgList, BaseUtils,
  23. ComCtrls, NortonLikeListView;
  24. type
  25. TDateTimeDisplay = (dtdDateTimeSec, dtdDateTime, dtdDate);
  26. type
  27. TIEListView = class(TCustomNortonLikeListView)
  28. private
  29. FSortColumn: Integer;
  30. FSortAscending: Boolean;
  31. FColumnIconPainted: Boolean;
  32. FShowColumnIcon: Boolean;
  33. FHeaderHandle: HWND;
  34. FParentForm: TCustomForm;
  35. FMask: string;
  36. FOnHeaderEndDrag: TNotifyEvent;
  37. FOnHeaderEndTrack: TNotifyEvent;
  38. FDateTimeFormatStr: string;
  39. FDateFormatStr: string;
  40. FDateTimeDisplay: TDateTimeDisplay;
  41. FDragImageList: TDragImageList;
  42. FHeaderImages: TImageList;
  43. protected
  44. procedure ColPropertiesChange(Sender: TObject); virtual;
  45. procedure SetShowColumnIcon(Value: Boolean); virtual;
  46. procedure SetSortColumn(Value: Integer); virtual;
  47. procedure SetSortAscending(Value: Boolean); virtual;
  48. procedure SortItems; virtual;
  49. procedure SetViewStyle(Value: TViewStyle); override; // CLEAN virtual
  50. procedure SetDateTimeDisplay(Value: TDateTimeDisplay); virtual;
  51. procedure SetDateTimeFormatString; virtual;
  52. procedure HeaderEndDrag(Sender: TObject); virtual;
  53. procedure SetMask(Value: string); virtual;
  54. procedure SetHeaderImages(Value: TImageList); virtual;
  55. procedure CreateWnd; override;
  56. procedure ColClick(Column: TListColumn); override;
  57. procedure Loaded; override;
  58. procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
  59. procedure WMNotify(var Msg: TWMNotify); message WM_NOTIFY;
  60. public
  61. constructor Create(AOwner: TComponent); override;
  62. destructor Destroy; override;
  63. procedure SetColumnImages; virtual;
  64. function NormalizeMask(Mask: string): string; dynamic;
  65. property HeaderImages: TImageList read FHeaderImages write SetHeaderImages;
  66. property DragImageList: TDragImageList read FDragImageList;
  67. property ColumnIconPainted: Boolean
  68. read FColumnIconPainted write FColumnIconPainted stored False;
  69. property HeaderHandle: HWND read FHeaderHandle;
  70. property ParentForm: TCustomForm read FParentForm;
  71. property DateTimeFormatStr: string
  72. read FDateTimeFormatStr write FDateTimeFormatStr stored False;
  73. property DateFormatStr: string read FDateFormatStr;
  74. {filemask, multiple filters are possible: '*.pas;*.dfm'}
  75. property Mask: string read FMask write SetMask;
  76. {Set the sort column of the listview}
  77. property SortColumn: Integer read FSortColumn write SetSortColumn;
  78. {Show the sorting symbol in the listview's header:}
  79. property ShowColumnIcon: Boolean
  80. read FShowColumnIcon write SetShowColumnIcon default True;
  81. {Sortorder of actual sort column}
  82. property SortAscending: Boolean
  83. read FSortAscending write SetSortAscending default True;
  84. published
  85. {Display format of the date/time of the files:}
  86. property DateTimeDisplay: TDateTimeDisplay
  87. read FDateTimeDisplay write SetDateTimeDisplay default dtdDateTimeSec;
  88. property OnHeaderEndDrag: TNotifyEvent
  89. read FOnHeaderEndDrag write FOnHeaderEndDrag;
  90. property OnHeaderEndTrack: TNotifyEvent
  91. read FOnHeaderEndTrack write FOnHeaderEndTrack;
  92. property Align;
  93. property AllocBy;
  94. property Anchors;
  95. property BiDiMode;
  96. property BorderStyle;
  97. property BorderWidth;
  98. property Checkboxes;
  99. property Color;
  100. property ColumnClick default True;
  101. property Constraints;
  102. property Ctl3D;
  103. property Enabled;
  104. property Font;
  105. property FlatScrollBars;
  106. property FullDrag;
  107. property GridLines;
  108. property HideSelection;
  109. property HotTrack;
  110. property HotTrackStyles;
  111. property IconOptions;
  112. property ReadOnly default False;
  113. Property RowSelect;
  114. property ParentBiDiMode;
  115. property ParentColor default False;
  116. property ParentFont;
  117. property ParentShowHint;
  118. property PopupMenu;
  119. property ShowColumnHeaders;
  120. property ShowHint;
  121. property TabOrder;
  122. property TabStop default True;
  123. property ViewStyle {CLEAN write SetViewStyle};
  124. property Visible;
  125. property OnChange;
  126. property OnChanging;
  127. property OnClick;
  128. property OnColumnClick;
  129. property OnColumnRightClick;
  130. property OnCustomDraw;
  131. property OwnerDraw;
  132. {Used for internal purposes:}
  133. property OnCustomDrawItem;
  134. property OnCustomDrawSubItem;
  135. property OnDblClick;
  136. property OnDeletion;
  137. property OnDrawItem;
  138. property OnEdited;
  139. property OnEditing;
  140. property OnEndDock;
  141. property OnEnter;
  142. property OnExit;
  143. property OnInsert;
  144. property OnKeyDown;
  145. property OnKeyPress;
  146. property OnKeyUp;
  147. property OnMouseDown;
  148. property OnMouseMove;
  149. property OnMouseUp;
  150. property OnResize;
  151. property OnStartDock;
  152. property NortonLike;
  153. property OnSelectByMask;
  154. end; {Type TIEListView}
  155. var
  156. GlobalDragImageList: TDragImageList;
  157. implementation
  158. { TIEListView }
  159. constructor TIEListView.Create(AOwner: TComponent);
  160. begin
  161. inherited;
  162. ColProperties.OnChange := ColPropertiesChange;
  163. FHeaderImages := nil;
  164. FShowColumnIcon := True;
  165. FSortColumn := 0;
  166. FSortAscending := True;
  167. FMask := '*.*';
  168. SetDateTimeFormatString;
  169. end; {Create}
  170. procedure TIEListView.SetSortColumn(Value: Integer);
  171. begin
  172. if Value <> SortColumn then
  173. begin
  174. FSortColumn := Value;
  175. FSortAscending := True;
  176. if Items.Count > 0 then
  177. SortItems;
  178. SetColumnImages;
  179. end;
  180. end; {SetSortColumn}
  181. procedure TIEListView.SetViewStyle(Value: TViewStyle);
  182. begin
  183. if Value <> ViewStyle then
  184. begin
  185. inherited SetViewStyle(Value);
  186. if ViewStyle = vsReport then
  187. SetColumnImages;
  188. end;
  189. end; {SetViewStyle}
  190. procedure TIEListView.SetSortAscending(Value: Boolean);
  191. begin
  192. if SortAscending <> Value then
  193. begin
  194. FSortAscending := Value;
  195. if Items.Count > 0 then
  196. SortItems;
  197. SetColumnImages;
  198. end;
  199. end; {SetSortAscending}
  200. procedure TIEListView.SetHeaderImages(Value: TImageList);
  201. begin
  202. if FHeaderImages <> Value then
  203. begin
  204. FHeaderImages := Value;
  205. if FHeaderHandle <> 0 then
  206. Header_SetImageList(FHeaderHandle, FHeaderImages.Handle);
  207. end;
  208. end;
  209. procedure TIEListView.SetColumnImages;
  210. var
  211. HdItem: THdItem;
  212. Index: Integer;
  213. begin
  214. if ShowColumnHeaders and HandleAllocated then
  215. begin
  216. for Index := 0 to Columns.Count-1 do
  217. begin
  218. HdItem.Mask := HDI_FORMAT;
  219. Header_GetItem(GetDlgItem(Self.Handle,0), Index, HdItem);
  220. if (HeaderImages <> nil) and FShowColumnIcon and (Index = SortColumn) then
  221. begin
  222. HdItem.Mask := HDI_FORMAT or HDI_IMAGE;
  223. HdItem.fmt := Hditem.fmt or HDF_IMAGE;
  224. if SortAscending then HdItem.iImage := 0
  225. else HdItem.iImage := 1;
  226. if Columns[Index].Alignment = taLeftJustify then
  227. HdItem.fmt := HdItem.fmt or HDF_BITMAP_ON_RIGHT;
  228. end
  229. else HdItem.fmt := HdItem.fmt and (not HDF_IMAGE);
  230. Header_SetItem(GetDlgItem(Self.Handle, 0), Index, HDItem);
  231. end;
  232. FColumnIconPainted := True;
  233. end;
  234. end; {SetColumnImage}
  235. procedure TIEListView.SetShowColumnIcon(Value: Boolean);
  236. begin
  237. if Value <> ShowColumnIcon then
  238. begin
  239. FShowColumnIcon := Value;
  240. SetColumnImages;
  241. end;
  242. end; {SetShowColumnIcon}
  243. procedure TIEListView.ColClick(Column: TListColumn);
  244. begin
  245. if Column.Index = SortColumn then FSortAscending := not FSortAscending
  246. else
  247. begin
  248. FSortColumn := Column.Index;
  249. FSortAscending := True;
  250. end;
  251. if Items.Count > 0 then SortItems;
  252. SetColumnImages;
  253. inherited;
  254. end; {ColClick}
  255. procedure TIEListView.WMPaint(var Msg: TWMPaint);
  256. begin
  257. Inherited;
  258. if (ViewStyle = vsReport) and not ColumnIconPainted and
  259. ShowColumnHeaders then SetColumnImages;
  260. end; {WMPaint}
  261. procedure TIEListView.WMNotify(var Msg: TWMNotify);
  262. {Repaint header icons, if columns are resized:}
  263. begin
  264. if (FHeaderHandle <> 0) and (Msg.NMHdr^.hWndFrom = FHeaderHandle) then
  265. case Msg.NMHdr.code of
  266. HDN_BEGINDRAG:
  267. {Due to a bug in D4 (until Update Pack 3) we should eat this message!};
  268. HDN_ENDDRAG:
  269. begin
  270. {Due to a bug in D4 (until Update Pack 3) we should eat this message!}
  271. HeaderEndDrag(Self);
  272. Invalidate;
  273. Exit;
  274. end;
  275. HDN_ENDTRACK, HDN_ENDTRACKW:
  276. begin
  277. SetColumnImages;
  278. FColumnIconPainted := False;
  279. Invalidate;
  280. inherited;
  281. if Assigned(FOnHeaderEndTrack) then
  282. FOnHeaderEndTrack(Self);
  283. Exit;
  284. end;
  285. HDN_DIVIDERDBLCLICK, HDN_DIVIDERDBLCLICKW:
  286. {Due to a bug in D4 (until Update Pack 3) the column property is
  287. not updated by this message:}
  288. begin
  289. inherited;
  290. with PHDNotify(Pointer(Msg.NMHdr))^ do
  291. if Columns.Count > Item then
  292. Columns[Item].Width := ListView_GetColumnWidth(Self.Handle, Item);
  293. if Assigned(FOnHeaderEndTrack) then
  294. FOnHeaderEndTrack(Self);
  295. SetColumnImages;
  296. FColumnIconPainted := False;
  297. Exit;
  298. end;
  299. end; {Case}
  300. inherited;
  301. end; { TIElistView.WMNotify }
  302. procedure TIEListView.HeaderEndDrag(Sender : TObject);
  303. begin
  304. if Assigned(FOnHeaderEndDrag) then
  305. FOnHeaderEndDrag(Self);
  306. end; {HeaderEndDrag}
  307. procedure TIEListView.Loaded;
  308. begin
  309. inherited;
  310. FHeaderHandle := ListView_GetHeader(Self.Handle);
  311. if (FHeaderImages <> nil) and (FHeaderHandle <> 0) then
  312. Header_SetImageList(FHeaderHandle, FHeaderImages.Handle);
  313. end; {Loaded}
  314. procedure TIEListView.ColPropertiesChange(Sender: TObject);
  315. begin
  316. SetColumnImages;
  317. end;
  318. procedure TIEListView.CreateWnd;
  319. begin
  320. inherited;
  321. FParentForm := GetParentForm(Self);
  322. if not (csDesigning in ComponentState) then
  323. FDragImageList := TDragImageList.Create(Self);
  324. if not Assigned(GlobalDragImageList) then
  325. GlobalDragImageList := DragImageList;
  326. end; {CreateWnd}
  327. destructor TIEListView.Destroy;
  328. begin
  329. if Assigned(FDragImageList) then
  330. begin
  331. if GlobalDragImageList = FDragImageList then
  332. GlobalDragImageList := nil;
  333. FDragImageList.Free;
  334. end;
  335. inherited;
  336. end; {Destroy}
  337. procedure TIEListView.SetDateTimeDisplay(Value: TDateTimeDisplay);
  338. begin
  339. if Value <> FDateTimeDisplay then
  340. begin
  341. FDateTimeDisplay := Value;
  342. SetDateTimeFormatString;
  343. Invalidate;
  344. end;
  345. end; {SetDateTimeDisplay}
  346. procedure TIEListView.SetDateTimeFormatString;
  347. var
  348. ShortDate: string;
  349. begin
  350. ShortDate := UpperCase(ShortDateFormat);
  351. {Create DateTime format string:}
  352. if Pos('YYYY', UpperCase(ShortDate)) = 0 then
  353. begin
  354. if Copy(UpperCase(ShortDate), Length(ShortDate) - 1, 2) = 'YY' then
  355. FDateTimeFormatStr := ShortDateFormat + 'yy'
  356. else
  357. if Copy(UpperCase(ShortDate), 1, 2) = 'YY' then
  358. FDateTimeFormatStr := 'yy' + ShortDateFormat;
  359. end
  360. else FDateTimeFormatStr := ShortDateFormat;
  361. FDateFormatStr := FDateTimeFormatStr;
  362. if FDateTimeDisplay = dtdDateTimeSec then
  363. FDateTimeFormatStr := FDateTimeFormatStr + ' ' + LongTimeFormat
  364. else
  365. if fDateTimeDisplay = dtdDateTime then
  366. FDateTimeFormatStr := FDateTimeFormatStr + ' ' + ShortTimeFormat;
  367. end; {SetDateTimeFormatString}
  368. procedure TIEListView.SetMask(Value: string);
  369. begin
  370. Value := NormalizeMask(Value);
  371. FMask := Value;
  372. end;{SetMask}
  373. function TIEListView.NormalizeMask(Mask: string): string;
  374. begin
  375. Mask := Trim(Mask);
  376. if Length(Mask) = 0 then Mask := '*.*';
  377. StrTranslate(Mask, ' ;,;');
  378. while Pos(';;', Mask) <> 0 do
  379. System.Delete(Mask, Pos(';;', Mask), 1);
  380. Result := LowerCase(Mask);
  381. end; {NormalizeMask}
  382. procedure TIEListView.SortItems;
  383. begin
  384. end;
  385. end.