frmInfo.pas
上传用户:youjie821
上传日期:2013-01-27
资源大小:459k
文件大小:16k
源码类别:

PlugIns编程

开发平台:

Delphi

  1. unit frmInfo;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, RzButton, ExtCtrls, RzPanel, RzBtnEdt, StdCtrls, Mask, RzEdit,
  6.   RzLabel, ActnList, FileCtrl, ComCtrls, RzTreeVw, RzSplit, RzListVw,
  7.   ImgList, Menus, hxSysUtils, hxFileRes, hxClasses, hxUpdate, RzSpnEdt, ShellApi,
  8.   hxVersion;
  9. type
  10.   TInfoForm = class(TForm)
  11.     ActionList1: TActionList;
  12.     actOK: TAction;
  13.     actCancel: TAction;
  14.     RzPanel3: TRzPanel;
  15.     RzLabel4: TRzLabel;
  16.     edtProjectName: TRzEdit;
  17.     edtRootDir: TRzButtonEdit;
  18.     RzLabel2: TRzLabel;
  19.     lvFiles: TRzListView;
  20.     RzSizePanel1: TRzSizePanel;
  21.     tvDirectory: TRzTreeView;
  22.     ImageList1: TImageList;
  23.     actSelectRoot: TAction;
  24.     actAddFile: TAction;
  25.     pmnuDirectory: TPopupMenu;
  26.     N1: TMenuItem;
  27.     RzPanel2: TRzPanel;
  28.     RzLabel3: TRzLabel;
  29.     actDeleteDirectory: TAction;
  30.     N3: TMenuItem;
  31.     pmnuFiles: TPopupMenu;
  32.     N4: TMenuItem;
  33.     N2: TMenuItem;
  34.     N5: TMenuItem;
  35.     N6: TMenuItem;
  36.     actDeleteFile: TAction;
  37.     actRefreshFiles: TAction;
  38.     actRefreshDirectory: TAction;
  39.     N7: TMenuItem;
  40.     N8: TMenuItem;
  41.     RzPanel1: TRzPanel;
  42.     RzButton1: TRzButton;
  43.     RzButton2: TRzButton;
  44.     dlgOpen: TOpenDialog;
  45.     ImageList2: TImageList;
  46.     actIncVersion: TAction;
  47.     actDecVersion: TAction;
  48.     N9: TMenuItem;
  49.     N10: TMenuItem;
  50.     actAddDirectory: TAction;
  51.     A1: TMenuItem;
  52.     N11: TMenuItem;
  53.     edtDescription: TRzEdit;
  54.     edtFloat: TRzEdit;
  55.     actBrowseFiles: TAction;
  56.     B1: TMenuItem;
  57.     actRefreshVersion: TAction;
  58.     N12: TMenuItem;
  59.     procedure actOKExecute(Sender: TObject);
  60.     procedure actCancelExecute(Sender: TObject);
  61.     procedure lvFilesSelectItem(Sender: TObject; Item: TListItem;
  62.       Selected: Boolean);
  63.     procedure edtPathKeyDown(Sender: TObject; var Key: Word;
  64.       Shift: TShiftState);
  65.     procedure edtRootDirButtonClick(Sender: TObject);
  66.     procedure actSelectRootExecute(Sender: TObject);
  67.     procedure FormShow(Sender: TObject);
  68.     procedure actDeleteDirectoryExecute(Sender: TObject);
  69.     procedure actRefreshFilesExecute(Sender: TObject);
  70.     procedure tvDirectoryChange(Sender: TObject; TreeNode: TTreeNode);
  71.     procedure actRefreshDirectoryExecute(Sender: TObject);
  72.     procedure actDeleteFileExecute(Sender: TObject);
  73.     procedure actDeleteFileUpdate(Sender: TObject);
  74.     procedure actAddFileExecute(Sender: TObject);
  75.     procedure actAddFileUpdate(Sender: TObject);
  76.     procedure edtFloatKeyDown(Sender: TObject; var Key: Word;
  77.       Shift: TShiftState);
  78.     procedure lvFilesClick(Sender: TObject);
  79.     procedure lvFilesGetImageIndex(Sender: TObject; Item: TListItem);
  80.     procedure actDeleteDirectoryUpdate(Sender: TObject);
  81.     procedure lvFilesColumnClick(Sender: TObject; Column: TListColumn);
  82.     procedure lvFilesCompare(Sender: TObject; Item1, Item2: TListItem;
  83.       Data: Integer; var Compare: Integer);
  84.     procedure actAddDirectoryExecute(Sender: TObject);
  85.     procedure actAddDirectoryUpdate(Sender: TObject);
  86.     procedure actBrowseFilesUpdate(Sender: TObject);
  87.     procedure actBrowseFilesExecute(Sender: TObject);
  88.     procedure actRefreshVersionExecute(Sender: TObject);
  89.     procedure actRefreshVersionUpdate(Sender: TObject);
  90.   private
  91.     FResTree: TResTree;
  92.     FSortIndex: Integer;
  93.     FSortAsc: Integer;
  94.     FDescription: string;
  95.     FProjectName: string;
  96.     FRootDir: string;
  97.     function GetTreeNodeByResNode(ResNode: TResNode): TTreeNode;
  98.     procedure RefreshTreeView(TreeNodes: TTreeNodes);
  99.     procedure AddFileToListView(TreeNode: TTreeNode; FileName: string);
  100.     procedure AddNodeToListView(ResNode: TResNode);
  101.     procedure RefreshListView(ParentNode: TResNode);
  102.     procedure SetDescription(const Value: string);
  103.     procedure SetProjectName(const Value: string);
  104.     procedure SetRootDir(const Value: string);
  105.     function GetDescription: string;
  106.     function GetProjectName: string;
  107.     function GetRootDir: string;
  108.   protected
  109.     procedure DropFiles(var Msg: TMessage); message WM_DROPFILES;
  110.   public
  111.     constructor Create(AOwner: TComponent; AProjectItem: TProjectItem); reintroduce;
  112.     destructor Destroy; override;
  113.     property ProjectName: string read GetProjectName write SetProjectName;
  114.     property RootDir: string read GetRootDir write SetRootDir;
  115.     property Description: string read GetDescription write SetDescription;
  116.     property ResTree: TResTree read FResTree;
  117.   end;
  118.   function ShowInfoForm(var AProjectName, ARootDir, ADescription: string): Boolean;
  119. implementation
  120. uses Math;
  121. {$R *.dfm}
  122. function ShowInfoForm(var AProjectName, ARootDir, ADescription: string): Boolean;
  123. var
  124.   Index: Integer;
  125.   ProjectItem: TProjectItem;
  126. begin
  127.   Index:= GetProjectCollection.IndexOf(AProjectName);
  128.   if Index <> -1 then // 修改
  129.     ProjectItem:= GetProjectCollection.Items[Index]
  130.   else  // 添加
  131.     ProjectItem:= GetProjectCollection.Add('', '', '');
  132.   with TInfoForm.Create(nil, ProjectItem) do
  133.   try
  134.     Result:= (ShowModal = mrOk);
  135.     if Result then
  136.     begin
  137.       ProjectItem.RemoveResTree;
  138.       ProjectItem.ProjectName:= ProjectName;
  139.       ProjectItem.RootDir:= RootDir;
  140.       ProjectItem.Description:= Description;
  141.       ProjectItem.ResTree.Assign(ResTree);
  142.       ProjectItem.SaveResTree;
  143.       AProjectName:= ProjectName;
  144.       ARootDir:= RootDir;
  145.       ADescription:= Description;
  146.     end
  147.     else
  148.     begin
  149.       Index:= GetProjectCollection.IndexOf('');
  150.       if Index <> -1 then GetProjectCollection.Delete(Index);
  151.     end;
  152.   finally
  153.     Free;
  154.   end;
  155. end;
  156. procedure TInfoForm.actOKExecute(Sender: TObject);
  157. begin
  158.   ModalResult:= mrOk;
  159. end;
  160. procedure TInfoForm.actCancelExecute(Sender: TObject);
  161. begin
  162.   ModalResult:= mrCancel;
  163. end;
  164. procedure TInfoForm.lvFilesSelectItem(Sender: TObject; Item: TListItem;
  165.   Selected: Boolean);
  166. begin
  167.   if Selected then
  168.   begin
  169.     with lvFiles do
  170.     begin
  171.       edtFloat.Left:= Left + Column[0].Width + Column[1].Width + Item.Left;
  172.       edtFloat.Top:= lvFiles.Top + Item.Top;
  173.       edtFloat.Width:= lvFiles.Column[2].Width;
  174.       edtFloat.Height:= 16;
  175.       edtFloat.Text:= Item.SubItems[1];
  176.     end;
  177.     edtFloat.Visible:= True;
  178.   end
  179.   else
  180.     edtFloat.Visible:= False;
  181. end;
  182. procedure TInfoForm.edtPathKeyDown(Sender: TObject; var Key: Word;
  183.   Shift: TShiftState);
  184. begin
  185.   if Key = VK_RETURN then
  186.   begin
  187.     lvFiles.Selected.SubItems[1]:= edtFloat.Text;
  188.     edtFloat.Visible:= False;
  189.   end;
  190. end;
  191. procedure TInfoForm.edtRootDirButtonClick(Sender: TObject);
  192. begin
  193.   actSelectRoot.Execute;
  194. end;
  195. procedure TInfoForm.actSelectRootExecute(Sender: TObject);
  196. var
  197.   szDir: string;
  198. begin
  199.   if SelectDirectory('选择目录', '', szDir) then
  200.   begin
  201.     RootDir:= szDir;
  202.     FResTree.LoadFiles(szDir);
  203.     RefreshTreeView(tvDirectory.Items);
  204.   end;
  205. end;
  206. procedure TInfoForm.RefreshTreeView(TreeNodes: TTreeNodes);
  207.   procedure TravelTree(ResNode: TResNode; TreeNode: TTreeNode);
  208.   var
  209.     I: Integer;
  210.   begin
  211.     Assert(ResNode <> nil);
  212.     if PResInfo(ResNode.Data)^.ResType = rtDirectory then
  213.     begin
  214.       TreeNode:= TreeNodes.AddChild(TreeNode, ResNode.Text);
  215.       TreeNode.Data:= ResNode;
  216.     end;
  217.     for I:= 0 to ResNode.Count - 1 do
  218.       TravelTree(TResNode(ResNode.Children[I]), TreeNode);
  219.   end;
  220. var
  221.   I: Integer;
  222.   RootNode: TResNode;
  223.   TreeNode: TTreeNode;
  224. begin
  225.   TreeNodes.BeginUpdate;
  226.   try
  227.     TreeNodes.Clear;
  228.     RootNode:= TResNode(FResTree.RootNode);
  229.     TreeNode:= TreeNodes.AddChild(nil, RootNode.Text);
  230.     TreeNode.Data:= RootNode;
  231.     for I:= 0 to RootNode.Count - 1 do
  232.       TravelTree(TResNode(RootNode.Children[I]), TreeNode);
  233.   finally
  234.     TreeNodes.EndUpdate;
  235.   end;
  236. end;
  237. procedure TInfoForm.actDeleteDirectoryExecute(Sender: TObject);
  238. begin
  239.   if tvDirectory.Selected <> nil then
  240.   begin
  241.     FResTree.RemoveNode(TResNode(tvDirectory.Selected.Data));
  242.     tvDirectory.Items.Delete(tvDirectory.Selected);
  243.   end;
  244. end;
  245. procedure TInfoForm.RefreshListView(ParentNode: TResNode);
  246. var
  247.   I: Integer;
  248.   ResNode: TResNode;
  249. begin
  250.   lvFiles.Clear;
  251.   if ParentNode = nil then Exit;
  252.   for I:= 0 to ParentNode.Count - 1 do
  253.   begin
  254.     ResNode:= TResNode(ParentNode.Children[I]);
  255.     if ResNode.Data = nil then Continue;
  256.     AddNodeToListView(ResNode);
  257.   end;
  258. end;
  259. procedure TInfoForm.actRefreshFilesExecute(Sender: TObject);
  260. begin
  261.   RefreshListView(TResNode(tvDirectory.Selected.Data));
  262. end;
  263. procedure TInfoForm.tvDirectoryChange(Sender: TObject; TreeNode: TTreeNode);
  264. begin
  265.   RefreshListView(TResNode(TreeNode.Data));
  266. end;
  267. procedure TInfoForm.actRefreshDirectoryExecute(Sender: TObject);
  268. begin
  269.   RefreshTreeView(tvDirectory.Items);
  270. end;
  271. procedure TInfoForm.FormShow(Sender: TObject);
  272. begin
  273.   RefreshTreeView(tvDirectory.Items);
  274.   RefreshListView(nil);
  275. end;
  276. procedure TInfoForm.actDeleteFileExecute(Sender: TObject);
  277. begin
  278.   FResTree.RemoveNode(TResNode(lvFiles.Selected.Data));
  279.   lvFiles.DeleteSelected;
  280. end;
  281. procedure TInfoForm.actDeleteFileUpdate(Sender: TObject);
  282. begin
  283.   (Sender as TAction).Enabled:= lvFiles.Selected <> nil;
  284. end;
  285. procedure TInfoForm.actAddFileExecute(Sender: TObject);
  286. var
  287.   ParentNode: TResNode;
  288.   CurrentDir: string;
  289. begin
  290.   ParentNode:= TResNode(tvDirectory.Selected.Data);
  291.   dlgOpen.Filter:= '所有文件(*.*)|*.*';
  292.   dlgOpen.InitialDir:= FormatDirectoryName(FRootDir) + PResInfo(ParentNode.Data)^.DownloadURL;
  293.   dlgOpen.FileEditStyle:= fsEdit;
  294.   if dlgOpen.Execute then
  295.     AddFileToListView(tvDirectory.Selected, dlgOpen.FileName);
  296. end;
  297. procedure TInfoForm.actAddFileUpdate(Sender: TObject);
  298. begin
  299.   (Sender as TAction).Enabled:= tvDirectory.Selected <> nil;
  300. end;
  301. procedure TInfoForm.edtFloatKeyDown(Sender: TObject; var Key: Word;
  302.   Shift: TShiftState);
  303. begin
  304.   if Key = VK_RETURN then
  305.   begin
  306.     lvFiles.Selected.SubItems[1]:= edtFloat.Text;
  307.     edtFloat.Visible:= False;
  308.     with PResInfo(TResNode(lvFiles.Selected.Data).Data)^ do
  309.     begin
  310.       ModifyTime:= StrToDateTime(lvFiles.Selected.SubItems[0]);
  311.       Version:= edtFloat.Text;
  312.     end;
  313.   end;
  314. end;
  315. procedure TInfoForm.lvFilesClick(Sender: TObject);
  316. begin
  317.   if lvFiles.Selected <> nil then
  318.   begin
  319.     edtFloat.Visible:= True;
  320.     edtFloat.SetFocus;
  321.   end;
  322. end;
  323. procedure TInfoForm.lvFilesGetImageIndex(Sender: TObject; Item: TListItem);
  324. var
  325.   szOldTime: string;
  326. begin
  327.   szOldTime:= DateTimeToStr(PResInfo(TResNode(Item.Data).Data)^.ModifyTime);
  328.   if SameText(Item.SubItems[0], szOldTime) then
  329.     Item.ImageIndex:= 0
  330.   else
  331.     Item.ImageIndex:= -1;
  332. end;
  333. procedure TInfoForm.actDeleteDirectoryUpdate(Sender: TObject);
  334. begin
  335.   (Sender as TAction).Enabled:= (tvDirectory.Selected <> nil) and (tvDirectory.Selected.AbsoluteIndex <> 0);
  336. end;
  337. procedure TInfoForm.lvFilesColumnClick(Sender: TObject; Column: TListColumn);
  338. begin
  339.   FSortIndex := Column.Index;
  340.   FSortAsc := FSortAsc * -1;
  341.   (Sender as TCustomListView).AlphaSort;
  342. end;
  343. procedure TInfoForm.lvFilesCompare(Sender: TObject; Item1, Item2: TListItem;
  344.   Data: Integer; var Compare: Integer);
  345. var
  346.   ix: Integer;
  347. begin
  348.   if FSortIndex = 0 then
  349.     Compare := CompareText(Item1.Caption,Item2.Caption) * FSortAsc
  350.   else begin
  351.    ix := FSortIndex - 1;
  352.    Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]) * FSortAsc;
  353.   end;
  354. end;
  355. procedure TInfoForm.actAddDirectoryExecute(Sender: TObject);
  356. var
  357.   szRoot, szDir: string;
  358.   ResNode: TResNode;
  359. begin
  360.   if tvDirectory.Selected.AbsoluteIndex = 0 then
  361.     szRoot:= FormatDirectoryName(FRootDir)
  362.   else
  363.     szRoot:= FormatDirectoryName(FRootDir) + PResInfo(TResNode(tvDirectory.Selected.Data).Data)^.DownloadURL;
  364.   if SelectDirectory('选择目录', szRoot, szDir) then
  365.   begin
  366.     ResNode:= FResTree.AddDirectory(TResNode(tvDirectory.Selected.Data), szDir);
  367.     RefreshTreeView(tvDirectory.Items);
  368.     GetTreeNodeByResNode(ResNode).Selected:= True;
  369.   end;
  370. end;
  371. procedure TInfoForm.SetDescription(const Value: string);
  372. begin
  373.   FDescription := Value;
  374.   edtDescription.Text:= FDescription;
  375. end;
  376. procedure TInfoForm.SetProjectName(const Value: string);
  377. begin
  378.   FProjectName := Value;
  379.   edtProjectName.Text:= FProjectName;
  380. end;
  381. procedure TInfoForm.SetRootDir(const Value: string);
  382. begin
  383.   FRootDir := Value;
  384.   edtRootDir.Text:= FRootDir;
  385. end;
  386. function TInfoForm.GetDescription: string;
  387. begin
  388.   Result:= edtDescription.Text;
  389. end;
  390. function TInfoForm.GetProjectName: string;
  391. begin
  392.   Result:= edtProjectName.Text;
  393. end;
  394. function TInfoForm.GetRootDir: string;
  395. begin
  396.   Result:= edtRootDir.Text;
  397. end;
  398. procedure TInfoForm.actAddDirectoryUpdate(Sender: TObject);
  399. begin
  400.   (Sender as TAction).Enabled:= tvDirectory.Selected <> nil;
  401. end;
  402. procedure TInfoForm.AddNodeToListView(ResNode: TResNode);
  403. var
  404.   pInfo: PResInfo;
  405. begin
  406.   pInfo:= PResInfo(ResNode.Data);
  407.   if pInfo^.ResType = rtFile then
  408.     with lvFiles.Items.Add do
  409.     begin
  410.       Caption:= pInfo^.FileName;
  411.       SubItems.Add(FormatDateTime('YYYY-MM-DD HH:MM:SS', FileDateToDateTime(FileAge(FResTree.RootNode.Text +
  412.         pInfo^.DownloadURL))));
  413.       SubItems.Add(pInfo.Version);
  414.       SubItems.Add(pInfo^.DownloadURL);
  415.       Data:= ResNode;
  416.     end;
  417. end;
  418. constructor TInfoForm.Create(AOwner: TComponent; AProjectItem: TProjectItem);
  419. var
  420.   Index: Integer;
  421. begin
  422.   inherited Create(AOwner);
  423.   // 接受拖放
  424.   DragAcceptFiles(lvFiles.Handle, True);
  425.   FResTree:= TResTree.Create;
  426.   ProjectName:= AProjectItem.ProjectName;
  427.   RootDir:= AProjectItem.RootDir;
  428.   Description:= AProjectItem.Description;
  429.   AProjectItem.LoadResTree;
  430.   FResTree.Assign(AProjectItem.ResTree);
  431.   FSortAsc:= 1;
  432.   RefreshTreeView(tvDirectory.Items);
  433.   RefreshListView(nil);
  434. end;
  435. destructor TInfoForm.Destroy;
  436. begin
  437.   FResTree.Free;
  438.   inherited Destroy;
  439. end;
  440. function TInfoForm.GetTreeNodeByResNode(ResNode: TResNode): TTreeNode;
  441. var
  442.   I: Integer;
  443. begin
  444.   if ResNode = nil then
  445.     Result:= tvDirectory.Items.GetFirstNode
  446.   else
  447.     for I:= 1 to tvDirectory.Items.Count - 1 do
  448.       if tvDirectory.Items[I].Data = ResNode then
  449.       begin
  450.         Result:= tvDirectory.Items[I];
  451.         Break;
  452.       end;
  453. end;
  454. procedure TInfoForm.DropFiles(var Msg: TMessage);
  455. var
  456.   I, C: Integer;
  457.   Buffer: array[0..1023] of char;
  458. begin
  459.   inherited;
  460.   // Todo:RzListView截断了WM_DROPFILES消息,以下代码执行不到!!
  461.   C:= DragQueryFile(Msg.WParam, $FFFFFFFF, nil, 0);
  462.   for I:= 0 to C - 1 do
  463.   begin
  464.     FillChar(Buffer, SizeOf(Buffer), #0);
  465.     DragQueryFile(Msg.WParam, I, Buffer, SizeOf(Buffer));
  466.     Caption:= Buffer;
  467.     AddFileToListView(tvDirectory.Selected, Buffer);
  468.   end;
  469. end;
  470. procedure TInfoForm.AddFileToListView(TreeNode: TTreeNode; FileName: string);
  471. var
  472.   ParentNode: TResNode;
  473.   CurrentDir, NewFileName: string;
  474. begin
  475.   ParentNode:= TResNode(TreeNode.Data);
  476.   CurrentDir:= FormatDirectoryName(FRootDir) + FormatDirectoryName(PResInfo(ParentNode.Data)^.DownloadURL);
  477.   NewFileName:= FileName;
  478.   if not SameText(CurrentDir, ExtractFilePath(FileName)) then
  479.   begin
  480.     if MessageBox(0, '所选文件与不在当前目录,是否将其拷贝到当前目录?', '提示',
  481.       MB_YESNO + MB_ICONINFORMATION) = IDYES then
  482.     begin
  483.       NewFileName:= CurrentDir + ExtractFileName(FileName);
  484.       CopyFile(PAnsiChar(FileName), PAnsiChar(NewFileName), True);
  485.     end
  486.     else
  487.       Exit;
  488.   end;
  489.   AddNodeToListView(FResTree.AddFile(ParentNode, NewFileName));
  490. end;
  491. procedure TInfoForm.actBrowseFilesUpdate(Sender: TObject);
  492. begin
  493.   (Sender as TAction).Enabled:= tvDirectory.Selected <> nil;
  494. end;
  495. procedure TInfoForm.actBrowseFilesExecute(Sender: TObject);
  496. var
  497.   CurrentDir: string;
  498. begin
  499.   if tvDirectory.Selected.AbsoluteIndex = 0 then
  500.     CurrentDir:= FRootDir
  501.   else
  502.     CurrentDir:= FormatDirectoryName(FRootDir) + PResInfo(TResNode(tvDirectory.Selected.Data).Data)^.DownloadURL;
  503.   ShellExecute(0, 'open', PChar(CurrentDir), '', '', SW_NORMAL);
  504. end;
  505. procedure TInfoForm.actRefreshVersionExecute(Sender: TObject);
  506. begin
  507.   lvFiles.Selected.SubItems[1]:= GetFileVersion(FormatDirectoryName(RootDir) +
  508.     PResInfo(TResNode(lvFiles.Selected.Data).Data)^.DownloadURL);
  509.   //edtFloat.Perform(WM_KEYDOWN, VK_RETURN, 0);
  510. end;
  511. procedure TInfoForm.actRefreshVersionUpdate(Sender: TObject);
  512. begin
  513.   (Sender as TAction).Enabled:= lvFiles.Selected <> nil;
  514. end;
  515. end.