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