home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue32 / listview / LISTVIEW.ZIP / VMFileListView.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1998-01-12  |  7.0 KB  |  282 lines

  1. unit VMFileListView;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   CommCtrl, ComCtrls, EnhListView, ExtListView, SHellAPI, fileHolder;
  8.  
  9. type
  10.   TVMFileListView = class(TExtListView)
  11.   private
  12.     { Private declarations }
  13.     FFolder: string;
  14.     FOnFolderChange: TNotifyEvent;
  15.     FCurrentSortType: TFileSortType;
  16.     FCurrentSortAscend: Boolean;
  17.     FFoldersToo: Boolean;
  18.     FSmallIcons, FLargeIcons: TImageList;
  19.     fh: TFileHolder;
  20.     procedure setFolder(value: string);
  21.     procedure setFoldersToo(value: Boolean);
  22.     procedure ColumnClick(Sender: TObject; Column: TListColumn);
  23.     procedure VMGetItemInfo(Sender: TObject; Item,
  24.       SubItem: Integer; Mask: TLVVMMaskItems; var Image, Param, State,
  25.       Indent: Integer; var Text: String);
  26.     function  GetParentFolder( fldr: string ): string;
  27.     procedure DoubleClick(Sender: TObject);
  28.   protected
  29.     { Protected declarations }
  30.     procedure CreateWnd; override;
  31.     procedure Loaded; override;
  32.   public
  33.     { Public declarations }
  34.     function    ItemIndex: integer;
  35.     constructor Create(AOwner: TComponent); override;
  36.     destructor  Destroy; override;
  37.     function    ClimbDown: Boolean;
  38.     property    Folder: string read FFolder write setFolder;
  39.     property    FoldersToo: Boolean read FFoldersToo write setFoldersToo;
  40.   published
  41.     { Published declarations }
  42.     property OnFolderChange: TNotifyEvent read FOnFolderChange write FOnFolderChange;
  43.   end;
  44.  
  45. procedure Register;
  46.  
  47. implementation
  48.  
  49. procedure Register;
  50. begin
  51.   RegisterComponents('Samples', [TVMFileListView]);
  52. end;
  53.  
  54. //---------------------------------------------------------------------
  55.  
  56. constructor TVMFileListView.Create(AOwner: TComponent);
  57. var
  58.   fi: TSHFileInfo;
  59. begin
  60.  
  61.   inherited Create(AOwner);
  62.  
  63.   FSmallIcons := TImageList.Create( Self );
  64.   with FSmallIcons do begin
  65.     Handle := ShGetFileInfo('',0,fi, SizeOf(TShFileInfo),
  66.                             SHGFI_SYSICONINDEX or SHGFI_SMALLICON );
  67.     ShareImages:= True;
  68.   end;
  69.   SmallImages := FSmallIcons;
  70.  
  71.   FLargeIcons := TImageList.Create( Self );
  72.   with FLargeIcons do begin
  73.     Handle := ShGetFileInfo('',0,fi, SizeOf(TShFileInfo),
  74.                             SHGFI_SYSICONINDEX or SHGFI_LARGEICON );
  75.     ShareImages:= True;
  76.   end;
  77.   LargeImages := FLargeIcons;
  78.   ViewStyle := vsReport;
  79.   FFolder := '';
  80.   fh := TFileHolder.Create;
  81.   fh.FoldersToo := True;
  82.   FCurrentSortType := sbName;
  83.   FCurrentSortAscend := True;
  84.  
  85. end;
  86.  
  87. //---------------------------------------------------------------------
  88.  
  89. destructor TVMFileListView.Destroy;
  90. begin
  91.  
  92.   FSmallIcons.Free;
  93.   FLargeIcons.Free;
  94.   fh.Free;
  95.   inherited Destroy;
  96.  
  97. end;
  98.  
  99. //---------------------------------------------------------------------
  100.  
  101. procedure TVMFileListView.Loaded;
  102. begin
  103.   VirtualMode := True;
  104.   OnColumnClick := ColumnClick;
  105.   OnVMGetItemInfo := VMGetItemInfo;
  106.   OnDblClick := DoubleClick;
  107. end;
  108.  
  109. //---------------------------------------------------------------------
  110.  
  111. procedure TVMFileListView.CreateWnd;
  112. begin
  113.  
  114.   inherited CreateWnd;
  115.  
  116.   Columns.Clear;
  117.   with Columns.Add do begin
  118.     Caption := 'Name';
  119.     Width := Trunc(0.30*Self.Width);
  120.   end;
  121.   with Columns.Add do begin
  122.     Caption := 'Size';
  123.     Alignment := taRightJustify;
  124.     Width := Trunc(0.15*Self.Width);
  125.   end;
  126.   with Columns.Add do begin
  127.     Caption := 'Modified';
  128.     Width := Trunc(0.25*Self.Width)
  129.   end;
  130.   with Columns.Add do begin
  131.     Caption := 'Type';
  132.     Width := Trunc(0.25*Self.Width);
  133.   end;
  134.   with Columns.Add do begin
  135.     Caption := 'Attr';
  136.     Width := 0; //Trunc(0.25*Self.Width);
  137.   end;
  138.  
  139. end;
  140.  
  141. //---------------------------------------------------------------------
  142.  
  143. procedure TVMFileListView.setFolder(value: string);
  144. begin
  145.  
  146.   if fh.Folder <> value then begin
  147.     fh.Folder := value;
  148.     FFolder := LowerCase(fh.Folder);
  149.     FFolder[1] := chr(ord(FFolder[1]) and $DF);
  150.     if Assigned(FOnFolderChange) then
  151.       FOnFolderChange(Self);
  152.     fh.readFiles;
  153.     fh.sortFiles( FCurrentSortType, FCurrentSortAscend );
  154.     SetItemCountEx( fh.Count, [lvsicfNoScroll] );
  155.   end;
  156.  
  157. end;
  158.  
  159. //---------------------------------------------------------------------
  160.  
  161. procedure TVMFileListView.setFoldersToo(value: Boolean);
  162. begin
  163.  
  164.   if fh.FoldersToo <> value then begin
  165.     fh.FoldersToo := value;
  166.     FFoldersToo := value;
  167.   end;  
  168.  
  169. end;
  170.  
  171. //---------------------------------------------------------------------
  172.  
  173. procedure TVMFileListView.ColumnClick(Sender: TObject; Column: TListColumn);
  174. const
  175.   LastColumnClicked: integer = 0;
  176. begin
  177.  
  178.   if Column.Index = LastColumnClicked then
  179.     FCurrentSortAscend := not FCurrentSortAscend
  180.   else
  181.     FCurrentSortAscend := True;  
  182.  
  183.   with fh do begin
  184.     Case Column.index of
  185.       0: sortFiles(sbName,FCurrentSortAscend);
  186.       1: sortFiles(sbSize,FCurrentSortAscend);
  187.       2: sortFiles(sbDate,FCurrentSortAscend);
  188.       3: sortFiles(sbType,FCurrentSortAscend);
  189.       4: sortFiles(sbAttr,FCurrentSortAscend);
  190.     end;
  191.     SetItemCountEx(Count, [lvsicfNoScroll]);
  192.   end;
  193.  
  194.   LastColumnClicked := Column.Index;
  195.   
  196. end;
  197.  
  198. //---------------------------------------------------------------------
  199.  
  200. procedure TVMFileListView.VMGetItemInfo(Sender: TObject; Item,
  201.   SubItem: Integer; Mask: TLVVMMaskItems; var Image, Param, State,
  202.   Indent: Integer; var Text: String);
  203. begin
  204.  
  205.   with fh do begin
  206.     if item < Count then begin
  207.       if lvifImage in Mask then begin
  208.         image := Files[item].Icon;
  209.       end;
  210.  
  211.       if lvifText in Mask then begin
  212.         case SubItem of
  213.           0: Text := Files[item].Name;
  214.           1: Text := Files[item].Size;
  215.           2: Text := DateTimeToStr(Files[item].Date);
  216.           3: Text := Files[item].Hint;
  217.           4: Text := Files[item].Attr;
  218.         else
  219.           Text := '';
  220.         end;
  221.       end;
  222.     end;
  223.   end;    
  224.  
  225. end;
  226.  
  227. //---------------------------------------------------------------------
  228.  
  229. procedure TVMFileListView.DoubleClick(Sender: TObject);
  230. begin
  231.  
  232.   with fh do
  233.     if (ItemIndex > -1) and (ItemIndex < Count) then
  234.       if fh.Files[ItemIndex].Fldr then begin
  235.         setFolder( FFolder + fh.Files[ItemIndex].Name );
  236.       end;
  237.  
  238.   inherited;
  239.  
  240. end;
  241.  
  242. //---------------------------------------------------------------------
  243.  
  244. function TVMFileListView.ItemIndex: integer;
  245. begin
  246.  
  247.   Result := ListView_GetNextItem(Handle, -1, LVNI_FOCUSED);
  248.  
  249. end;
  250.  
  251. //---------------------------------------------------------------------
  252.  
  253. function TVMFileListView.GetParentFolder( fldr: string ): string;
  254. var
  255.   i: integer;
  256. begin
  257.  
  258.   Result := fldr;
  259.   i := Length( fldr )-1;
  260.   while i > 0 do begin
  261.     if fldr[i] = '\' then begin
  262.       Result := Copy( fldr, 1, i );
  263.       break;
  264.     end;
  265.     Dec(i);
  266.   end;
  267.  
  268. end;
  269.  
  270. //---------------------------------------------------------------------
  271.  
  272. function TVMFileListView.ClimbDown: Boolean;
  273. begin
  274.  
  275.   Result := not (GetParentFolder( FFolder ) = FFolder );
  276.   if Result then
  277.     setFolder( GetParentFolder( FFolder ) );
  278.     
  279. end;
  280.  
  281. end.
  282.