Main.pas 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. unit Main;
  2. interface
  3. uses
  4. Windows, SysUtils, Classes, Graphics, Controls, Forms,
  5. Dialogs, StrUtils, Menus, ImgList, ExtCtrls, ComCtrls, GLVfsPAK;
  6. type
  7. TForm1 = class(TForm)
  8. MainMenu1: TMainMenu;
  9. TreeView: TTreeView;
  10. OpenDialog1: TOpenDialog;
  11. SaveDialog1: TSaveDialog;
  12. ImageList1: TImageList;
  13. ListView: TListView;
  14. File1: TMenuItem;
  15. New1: TMenuItem;
  16. Open1: TMenuItem;
  17. N1: TMenuItem;
  18. Exit1: TMenuItem;
  19. Bevel1: TBevel;
  20. Edit1: TMenuItem;
  21. Createfolder1: TMenuItem;
  22. Addfiles1: TMenuItem;
  23. Deleteselectedfile1: TMenuItem;
  24. Deleteselectedfolder1: TMenuItem;
  25. N2: TMenuItem;
  26. Extractselectedfiles1: TMenuItem;
  27. N3: TMenuItem;
  28. N4: TMenuItem;
  29. Compression1: TMenuItem;
  30. Pak: TGLVfsPAK;
  31. procedure FormCreate(Sender: TObject);
  32. procedure TreeViewRefresh;
  33. procedure FileListRefresh;
  34. procedure AddNode(text: string; node: TTreeNode);
  35. function TreeIndexOf(s: string; node: TTreeNode): integer;
  36. function ListIndexOf(s: string): integer;
  37. procedure TreeViewCollapsing(Sender: TObject; Node: TTreeNode;
  38. var AllowCollapse: Boolean);
  39. procedure ListViewClick(Sender: TObject);
  40. procedure ListViewDblClick(Sender: TObject);
  41. procedure TreeViewChange(Sender: TObject; Node: TTreeNode);
  42. procedure ListViewKeyDown(Sender: TObject; var Key: Word;
  43. Shift: TShiftState);
  44. procedure ListViewChange(Sender: TObject; Item: TListItem;
  45. Change: TItemChange);
  46. procedure New1Click(Sender: TObject);
  47. procedure Open1Click(Sender: TObject);
  48. procedure Createfolder1Click(Sender: TObject);
  49. procedure Addfiles1Click(Sender: TObject);
  50. procedure Deleteselectedfile1Click(Sender: TObject);
  51. procedure Deleteselectedfolder1Click(Sender: TObject);
  52. procedure TreeViewKeyDown(Sender: TObject; var Key: Word;
  53. Shift: TShiftState);
  54. procedure Extractselectedfiles1Click(Sender: TObject);
  55. procedure Exit1Click(Sender: TObject);
  56. private
  57. { Private declarations }
  58. public
  59. { Public declarations }
  60. end;
  61. var
  62. Form1: TForm1;
  63. CurPath,
  64. Selection: string;
  65. Pak: TGLVfsPak;
  66. implementation
  67. uses FolderDialog, FolderSelect;
  68. {$R *.dfm}
  69. {$R icons.res}
  70. procedure TForm1.AddNode(text: string; node: TTreeNode);
  71. var
  72. s: string;
  73. c: integer;
  74. begin
  75. c:=Pos('/',Text);
  76. if c=0 then exit;
  77. s:=Copy(text,1,c-1);
  78. Delete(text,1,c);
  79. if TreeIndexOf(s,node)=-1 then
  80. AddNode(text, TreeView.Items.AddChild(node,s)) else
  81. AddNode(text, node[TreeIndexOf(s,node)]);
  82. end;
  83. function TForm1.TreeIndexOf(s: string; node: TTreeNode): integer;
  84. var
  85. i: integer;
  86. begin
  87. Result:=-1;
  88. for i:=0 to node.Count-1 do
  89. if node[i].Text=s then Result:=i;
  90. end;
  91. function TForm1.ListIndexOf(s: string): integer;
  92. var
  93. i: integer;
  94. begin
  95. Result:=-1;
  96. for i:=0 to ListView.Items.Count-1 do
  97. if ListView.Items[i].Caption=s then Result:=i;
  98. end;
  99. procedure TForm1.TreeViewRefresh;
  100. var
  101. i: integer;
  102. begin
  103. with TreeView do begin
  104. Items.Clear;
  105. Items.AddChild(Items.GetFirstNode,ExtractFileName(Pak.PakFileName));
  106. for i:=0 to Pak.Files.Count-1 do
  107. AddNode(Pak.Files[i],Items.GetFirstNode);
  108. Items[0].Expanded:=True;
  109. Items[0].SelectedIndex:=1;
  110. Items[0].ImageIndex:=1;
  111. end;
  112. TreeView.Selected:=TreeView.Items.GetFirstNode;
  113. end;
  114. function MakeMemSize(size: integer): string;
  115. const
  116. kb=1024;
  117. mb=kb*kb;
  118. gb=mb*kb;
  119. begin
  120. case size of
  121. 0..kb-1:Result:=IntToStr(size)+' B';
  122. kb..mb-1:Result:=Format('%.2f KB',[size/kb]);
  123. mb..gb-1:Result:=Format('%.2f MB',[size/mb]);
  124. else
  125. Result:=Format('%.2f GB',[size/gb]);
  126. end;
  127. end;
  128. procedure TForm1.FileListRefresh;
  129. var
  130. i, j: integer;
  131. s, name: string;
  132. n: TTreeNode;
  133. dir: boolean;
  134. begin
  135. n:=TreeView.Selected;
  136. s:=n.Text;
  137. if s=ExtractFileName(Pak.PakFileName) then s:='';
  138. while Assigned(n.parent) do begin
  139. n:=n.Parent;
  140. if n.AbsoluteIndex<>0 then
  141. s:=n.Text+'/'+s;
  142. end;
  143. if s<>'' then s:=s+'/';
  144. CurPath:=s;
  145. ListView.Clear;
  146. for i:=0 to Pak.Files.Count-1 do
  147. if Copy(Pak.Files[i],1,Length(s))=s then begin
  148. name:=RightStr(Pak.Files[i],Length(Pak.Files[i])-Length(s));
  149. j:=Pos('/',name);
  150. if j=0 then
  151. Dir:=False else
  152. Dir:=True;
  153. if Dir=True then
  154. name:=Copy(name,1,j-1);
  155. if ListIndexOf(name)=-1 then
  156. with ListView.Items.Add do begin
  157. Caption:=Name;
  158. if Dir=True then begin
  159. SubItems.Add('-');
  160. SubItems.Add('-')
  161. end else begin
  162. SubItems.Add(MakeMemSize(Pak.GetFileSize(i)));
  163. SubItems.Add(MakeMemSize(Pak.GetFileSize(i)))
  164. end;
  165. if Dir=True then
  166. ImageIndex:=0 else
  167. ImageIndex:=2;
  168. end;
  169. end;
  170. end;
  171. procedure TForm1.FormCreate(Sender: TObject);
  172. var
  173. Bmp: TBitmap;
  174. begin
  175. Bmp:=TBitmap.Create;
  176. Bmp.LoadFromResourceName(HInstance, 'ICONS');
  177. ImageList1.AddMasked(Bmp,clWhite);
  178. Bmp.Free;
  179. end;
  180. procedure TForm1.TreeViewCollapsing(Sender: TObject; Node: TTreeNode;
  181. var AllowCollapse: Boolean);
  182. begin
  183. if Node.AbsoluteIndex=0 then
  184. AllowCollapse:=False else
  185. AllowCollapse:=True;
  186. end;
  187. procedure TForm1.ListViewClick(Sender: TObject);
  188. var
  189. s: string;
  190. begin
  191. if not Assigned(ListView.Selected) then Exit;
  192. s:=ListView.Selected.Caption;
  193. Selection:=CurPath+s;
  194. end;
  195. procedure TForm1.ListViewDblClick(Sender: TObject);
  196. var
  197. s: string;
  198. n: TTreeNode;
  199. begin
  200. if not Assigned(ListView.Selected) then Exit;
  201. if ListView.Selected.ImageIndex=2 then Exit;
  202. s:=ListView.Selected.Caption;
  203. n:=TreeView.Selected;
  204. TreeView.Selected:=n[TreeIndexOf(s,n)];
  205. end;
  206. procedure TForm1.TreeViewChange(Sender: TObject; Node: TTreeNode);
  207. begin
  208. FileListRefresh;
  209. end;
  210. procedure TForm1.ListViewKeyDown(Sender: TObject; var Key: Word;
  211. Shift: TShiftState);
  212. begin
  213. if ListView.Enabled=False then Exit;
  214. ListViewClick(Sender);
  215. if Key=VK_RETURN then ListViewDblClick(Sender);
  216. if Key=VK_DELETE then Deleteselectedfile1Click(Self);
  217. end;
  218. procedure TForm1.ListViewChange(Sender: TObject; Item: TListItem;
  219. Change: TItemChange);
  220. begin
  221. ListViewClick(Sender);
  222. end;
  223. procedure TForm1.New1Click(Sender: TObject);
  224. begin
  225. if SaveDialog1.Execute then begin
  226. Pak.ClearPakFiles;
  227. Pak.LoadFromFile(SaveDialog1.FileName, fmCreate or fmShareDenyWrite);
  228. TreeViewRefresh;
  229. ListView.Enabled:=True;
  230. end;
  231. end;
  232. procedure TForm1.Open1Click(Sender: TObject);
  233. begin
  234. OpenDialog1.DefaultExt:=SaveDialog1.DefaultExt;
  235. OpenDialog1.Filter:=SaveDialog1.Filter;
  236. OpenDialog1.Options:=OpenDialog1.Options-[ofAllowMultiSelect];
  237. if OpenDialog1.Execute then begin
  238. Pak.ClearPakFiles;
  239. Pak.LoadFromFile(OpenDialog1.FileName, fmOpenReadWrite or fmShareDenyWrite);
  240. TreeViewRefresh;
  241. ListView.Enabled:=True;
  242. end;
  243. end;
  244. procedure TForm1.Createfolder1Click(Sender: TObject);
  245. begin
  246. if not Assigned(Pak) then Exit;
  247. if FDialog.ShowModal=mrOk then begin
  248. Pak.AddEmptyFile('temp.tmp',CurPath+FDialog.Edit1.Text+'/');
  249. TreeViewRefresh;
  250. end;
  251. end;
  252. procedure TForm1.Addfiles1Click(Sender: TObject);
  253. var
  254. i: integer;
  255. begin
  256. if not Assigned(Pak) then Exit;
  257. OpenDialog1.DefaultExt:='';
  258. OpenDialog1.Filter:='All Files|*.*';
  259. OpenDialog1.Options:=OpenDialog1.Options+[ofAllowMultiSelect];
  260. if OpenDialog1.Execute then begin
  261. for i:=0 to OpenDialog1.Files.Count-1 do
  262. if ExtractFileName(OpenDialog1.Files[i])<>'' then
  263. Pak.AddFromFile(OpenDialog1.Files[i],CurPath);
  264. TreeViewRefresh;
  265. end;
  266. end;
  267. procedure TForm1.Deleteselectedfile1Click(Sender: TObject);
  268. var
  269. i: integer;
  270. S: TStrings;
  271. begin
  272. if ListView.SelCount=0 then Exit;
  273. S:=TStringList.Create;
  274. for i:=0 to ListView.Items.Count-1 do
  275. if ListView.Items[i].Selected then S.Add(CurPath+ListView.Items[i].Caption);
  276. for i:=0 to S.Count-1 do
  277. Pak.RemoveFile(S[i]);
  278. S.Free;
  279. FileListRefresh;
  280. if ListView.Items.Count=0 then TreeViewRefresh;
  281. end;
  282. procedure TForm1.Deleteselectedfolder1Click(Sender: TObject);
  283. var
  284. i, l: integer;
  285. S: TStrings;
  286. begin
  287. s:=TStringList.Create;
  288. s.AddStrings(Pak.Files);
  289. l:=Length(CurPath);
  290. for i:=0 to S.Count-1 do
  291. if Copy(S[i],1,l)=CurPath then
  292. Pak.RemoveFile(S[i]);
  293. s.Free;
  294. TreeViewRefresh;
  295. end;
  296. procedure TForm1.TreeViewKeyDown(Sender: TObject; var Key: Word;
  297. Shift: TShiftState);
  298. begin
  299. if ListView.Enabled=False then Exit;
  300. if Key=VK_DELETE then Deleteselectedfolder1Click(Self);
  301. end;
  302. procedure TForm1.Extractselectedfiles1Click(Sender: TObject);
  303. var
  304. i: integer;
  305. begin
  306. if ListView.SelCount=0 then Exit;
  307. if FolderSel.ShowModal=mrOK then begin
  308. for i:=0 to ListView.Items.Count-1 do
  309. if ListView.Items[i].Selected then
  310. Pak.Extract(CurPath+ListView.Items[i].Caption, FolderSel.ShellView.Path+'\'+ListView.Items[i].Caption);
  311. end;
  312. end;
  313. procedure TForm1.Exit1Click(Sender: TObject);
  314. begin
  315. Application.Terminate;
  316. end;
  317. end.