Subversion Repositories recyclebinunit

Rev

Rev 99 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit RecyclerListingMain;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls, ComCtrls, ExtCtrls, ImgList;
  8.  
  9. type
  10.   TRecyclerListingMainForm = class(TForm)
  11.     TreeView1: TTreeView;
  12.     Panel1: TPanel;
  13.     Button1: TButton;
  14.     CheckBox1: TCheckBox;
  15.     Button2: TButton;
  16.     OpenDialog1: TOpenDialog;
  17.     LabeledEdit1: TLabeledEdit;
  18.     ImageList1: TImageList;
  19.     CheckBox2: TCheckBox;
  20.     Button3: TButton;
  21.     Button4: TButton;
  22.     SaveDialog1: TSaveDialog;
  23.     procedure Button1Click(Sender: TObject);
  24.     procedure Button2Click(Sender: TObject);
  25.     procedure FormShow(Sender: TObject);
  26.     procedure TreeView1DblClick(Sender: TObject);
  27.     procedure Button3Click(Sender: TObject);
  28.     procedure Button4Click(Sender: TObject);
  29.   private
  30.     localRecyclersNode: TTreeNode;
  31.     individualRecyclersNode: TTreeNode;
  32.   end;
  33.  
  34. var
  35.   RecyclerListingMainForm: TRecyclerListingMainForm;
  36.  
  37. implementation
  38.  
  39. {$R *.dfm}
  40.  
  41. uses
  42.   RecBinUnit2, ContNrs, SIDUnit, ShellAPI;
  43.  
  44. // TODO: SID Namen auflösen und dementsprechend anzeigen
  45. // TODO: zu jedem element mehr informationen anzeigen, nicht nur den ursprungsnamen
  46. // TODO: Einstellungen usw anzeigen, so wie im alten Demo
  47.  
  48. const
  49.   ICON_FILE = 0;
  50.   ICON_TREEVIEW = 2;
  51.   ICON_BIN = 4;
  52.   ICON_DRIVE = 6;
  53.   ICON_UNKNOWN = 8;
  54.   ICON_FOLDER = 10;
  55.  
  56. resourcestring
  57.   S_PLEASE_WAIT = 'Please wait';
  58.  
  59. procedure TRecyclerListingMainForm.Button1Click(Sender: TObject);
  60. var
  61.   drives: TObjectList{TRbDrive};
  62.   iDrive: integer;
  63.   drive: TRbDrive;
  64.   nDrive: TTreeNode;
  65.  
  66.   bins: TObjectList{TRbRecycleBin};
  67.   iBin: integer;
  68.   bin: TRbRecycleBin;
  69.   nBin: TTreeNode;
  70.  
  71.   items: TObjectList{TRbRecycleBinItem};
  72.   iItem: integer;
  73.   item: TRbRecycleBinItem;
  74.   nItem: TTreeNode;
  75.   sCaption: string;
  76.  
  77.   bakCaption: string;
  78. resourcestring
  79.   S_DRIVE = 'Drive %s';
  80. begin
  81.   bakCaption := Button1.Caption;
  82.   Button1.Caption := S_PLEASE_WAIT;
  83.   try
  84.     localRecyclersNode.DeleteChildren; // TODO: Will the objects be freed? This is important to avoid memory leaks.
  85.  
  86.     TreeView1.Items.BeginUpdate;
  87.     drives := TObjectList.Create(false);
  88.     bins := TObjectList.Create(false);
  89.     items := TObjectList.Create(false);
  90.     try
  91.       drives.Clear;
  92.       TRecycleBinManager.ListDrives(drives);
  93.       for iDrive := 0 to drives.Count - 1 do
  94.       begin
  95.         drive := drives.Items[iDrive] as TRbDrive;
  96.  
  97.         if drive.VolumeGUIDAvailable then
  98.           nDrive := TreeView1.Items.AddChildObject(localRecyclersNode, Format(S_DRIVE, [drive.DriveLetter])+': ' + GUIDToString(drive.VolumeGUID), drive)
  99.         else
  100.           nDrive := TreeView1.Items.AddChildObject(localRecyclersNode, Format(S_DRIVE, [drive.DriveLetter])+':', drive);
  101.         nDrive.ImageIndex := ICON_DRIVE;
  102.         nDrive.SelectedIndex := nDrive.ImageIndex;
  103.  
  104.         bins.Clear;
  105.         if CheckBox1.Checked then
  106.           drive.ListRecycleBins(bins, GetMySID)
  107.         else
  108.           drive.ListRecycleBins(bins);
  109.         for iBin := 0 to bins.Count - 1 do
  110.         begin
  111.           bin := bins.Items[iBin] as TRbRecycleBin;
  112.  
  113.           nBin := TreeView1.Items.AddChildObject(nDrive, bin.FileOrDirectory, bin);
  114.           nBin.ImageIndex := ICON_BIN;
  115.           nBin.SelectedIndex := nBin.ImageIndex;
  116.  
  117.           items.Clear;
  118.           bin.ListItems(items);
  119.           for iItem := 0 to items.Count - 1 do
  120.           begin
  121.             item := items.Items[iItem] as TRbRecycleBinItem;
  122.  
  123.             if not FileExists(item.PhysicalFile) and
  124.                not DirectoryExists(item.PhysicalFile) and
  125.                CheckBox2.Checked then continue;
  126.  
  127.             sCaption := item.Source;
  128.             if item is TRbVistaItem (*item.IndexFile <> ''*) then sCaption := sCaption + ' ('+ExtractFileName(item.IndexFile)+')';
  129.             nItem := TreeView1.Items.AddChildObject(nBin, sCaption, item);
  130.  
  131.             if FileExists(item.PhysicalFile) then
  132.               nItem.ImageIndex := ICON_FILE
  133.             else if DirectoryExists(item.PhysicalFile) then
  134.               nItem.ImageIndex := ICON_FOLDER // TODO: Feature: Read folder contents and display them in this treeview. (Also change icon to "open folder")
  135.             else
  136.               nItem.ImageIndex := ICON_UNKNOWN;
  137.             nItem.SelectedIndex := nItem.ImageIndex;
  138.           end;
  139.         end;
  140.       end;
  141.     finally
  142.       drives.Free;
  143.       bins.Free;
  144.       items.Free;
  145.       TreeView1.Items.EndUpdate;
  146.     end;
  147.  
  148.     localRecyclersNode.Expand(false);
  149.   finally
  150.     Button1.Caption := bakCaption;
  151.   end;
  152. end;
  153.  
  154. procedure TRecyclerListingMainForm.Button2Click(Sender: TObject);
  155. var
  156.   bin: TRbRecycleBin;
  157.   nBin: TTreeNode;
  158.  
  159.   items: TObjectList{TRbRecycleBinItem};
  160.   iItem: integer;
  161.   item: TRbRecycleBinItem;
  162.   nItem: TTreeNode;
  163.   sCaption: string;
  164.   bakCaption: string;
  165. begin
  166.   bakCaption := Button2.Caption;
  167.   Button2.Caption := S_PLEASE_WAIT;
  168.   try
  169.     bin := TRbRecycleBin.Create(LabeledEdit1.Text);
  170.  
  171.     nBin := TreeView1.Items.AddChildObject(individualRecyclersNode, bin.FileOrDirectory, bin);
  172.     nBin.ImageIndex := ICON_BIN;
  173.     nBin.SelectedIndex := nBin.ImageIndex;
  174.     individualRecyclersNode.Expand(false);
  175.  
  176.     items := TObjectList.Create(false);
  177.     try
  178.       items.Clear;
  179.       bin.ListItems(items);
  180.       for iItem := 0 to items.Count - 1 do
  181.       begin
  182.         item := items.Items[iItem] as TRbRecycleBinItem;
  183.  
  184.         if not FileExists(item.PhysicalFile) and
  185.            not DirectoryExists(item.PhysicalFile) and
  186.            CheckBox2.Checked then continue;
  187.  
  188.         sCaption := item.Source;
  189.         if item is TRbVistaItem (*item.IndexFile <> ''*) then sCaption := sCaption + ' ('+ExtractFileName(item.IndexFile)+')';
  190.         nItem := TreeView1.Items.AddChildObject(nBin, sCaption, item);
  191.  
  192.         if FileExists(item.PhysicalFile) then
  193.           nItem.ImageIndex := ICON_FILE
  194.         else if DirectoryExists(item.PhysicalFile) then
  195.           nItem.ImageIndex := ICON_FOLDER // TODO: Feature: Read folder contents and display them in this treeview. (Also change icon to "open folder")
  196.         else
  197.           nItem.ImageIndex := ICON_UNKNOWN;
  198.         nItem.SelectedIndex := nItem.ImageIndex;
  199.       end;
  200.     finally
  201.       items.Free;
  202.     end;
  203.  
  204.     nBin.Expand(false);
  205.   finally
  206.     Button2.Caption := bakCaption;
  207.   end;
  208. end;
  209.  
  210. procedure TRecyclerListingMainForm.Button3Click(Sender: TObject);
  211. begin
  212.   if OpenDialog1.Execute then
  213.     LabeledEdit1.Text := OpenDialog1.FileName;
  214. end;
  215.  
  216. procedure TRecyclerListingMainForm.Button4Click(Sender: TObject);
  217. begin
  218.   if SaveDialog1.Execute then
  219.   begin
  220.     TreeView1.SaveToFile(SaveDialog1.FileName);
  221.   end;
  222. end;
  223.  
  224. procedure TRecyclerListingMainForm.FormShow(Sender: TObject);
  225. resourcestring
  226.   S_LOCAL_RECYCLE_BINS = 'Local recycle bins';
  227.   S_MANUAL_RECYCLE_BINS ='Manually added recycle bins';
  228. begin
  229.   localRecyclersNode := TreeView1.Items.Add(nil, S_LOCAL_RECYCLE_BINS);
  230.   localRecyclersNode.ImageIndex := ICON_TREEVIEW;
  231.   localRecyclersNode.SelectedIndex := localRecyclersNode.ImageIndex;
  232.  
  233.   individualRecyclersNode := TreeView1.Items.Add(nil, S_MANUAL_RECYCLE_BINS);
  234.   individualRecyclersNode.ImageIndex := ICON_TREEVIEW;
  235.   individualRecyclersNode.SelectedIndex := individualRecyclersNode.ImageIndex;
  236. end;
  237.  
  238. procedure TRecyclerListingMainForm.TreeView1DblClick(Sender: TObject);
  239. var
  240.   item: TRbRecycleBinItem;
  241. begin
  242.   if TreeView1.Selected.ImageIndex = ICON_FILE then
  243.   begin
  244.     // File
  245.     item := TRbRecycleBinItem(TreeView1.Selected.Data);
  246.     // TODO: Does not work if the file type is unknown
  247.     // TODO: Maybe we should add a feature to drag'n'drop a file/folder out of RecycleBinUnit into the explorer (With options copy or move, depending on the ShiftState)
  248.     ShellExecute(Handle, 'open', PChar(item.PhysicalFile), '', '', SW_NORMAL);
  249.   end;
  250.   if TreeView1.Selected.ImageIndex = ICON_FOLDER then
  251.   begin
  252.     // Folder
  253.     item := TRbRecycleBinItem(TreeView1.Selected.Data);
  254.     ShellExecute(Handle, 'open', PChar(item.PhysicalFile), '', '', SW_NORMAL);
  255.   end;
  256. end;
  257.  
  258. end.
  259.