OSDN Git Service

TEditor、TTaskTrayの配布先変更に追従
[winbottle/winbottle.git] / bottleclient / FMOExplorer.pas
1 unit FMOExplorer;
2
3 interface
4
5 uses
6   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
7   Dialogs, ComCtrls, ImgList, ToolWin, ActnList,
8   SakuraSeekerInstance, DirectSstp, Menus, Clipbrd;
9
10 type
11   TfrmFMOExplorer = class(TForm)
12     lvwList: TListView;
13     ToolBar: TToolBar;
14     ImageList: TImageList;
15     tbtnRestoreSurface: TToolButton;
16     ToolButton2: TToolButton;
17     tbtnKillFMO: TToolButton;
18     tbtnRefresh: TToolButton;
19     ActionList: TActionList;
20     actKillFMO: TAction;
21     actRestoreSurface: TAction;
22     actRefresh: TAction;
23     StatusBar: TStatusBar;
24     DirectSstp: TDirectSstp;
25     PopupMenu: TPopupMenu;
26     mnKillFMO: TMenuItem;
27     mnRestoreSurface: TMenuItem;
28     ToolButton1: TToolButton;
29     tbtnCopyInformation: TToolButton;
30     actCopyInformation: TAction;
31     mnSeparator: TMenuItem;
32     mnCopyInformation: TMenuItem;
33     procedure FormShow(Sender: TObject);
34     procedure actRefreshExecute(Sender: TObject);
35     procedure lvwListChange(Sender: TObject; Item: TListItem;
36       Change: TItemChange);
37     procedure actKillFMOExecute(Sender: TObject);
38     procedure lvwListDblClick(Sender: TObject);
39     procedure actCopyInformationExecute(Sender: TObject);
40   private
41     { Private \90é\8c¾ }
42   public
43     { Public \90é\8c¾ }
44     procedure UpdateList;
45   end;
46
47 var
48   frmFMOExplorer: TfrmFMOExplorer;
49
50 implementation
51
52 const
53   IconFMOEntry = 3;
54   IconBrokenFMO = 4;
55
56 {$R *.dfm}
57
58 procedure TfrmFMOExplorer.FormShow(Sender: TObject);
59 begin
60   UpdateList;
61 end;
62
63 procedure TfrmFMOExplorer.UpdateList;
64 var i, j: integer;
65     valid: boolean;
66     HwndToVer, TmpStr: TStringList;
67     s: String;
68 begin
69   lvwList.Clear;
70   SakuraSeeker.BeginDetect;
71   lvwList.Items.BeginUpdate;
72   for i := 0 to SakuraSeeker.Count-1 do begin
73     with lvwList.Items.Add do begin
74       Caption := SakuraSeeker[i].SetName;
75       SubItems.Add(SakuraSeeker[i].FMOName);
76       SubItems.Add(SakuraSeeker[i].ProcessID);
77       SubItems.Add(IntToStr(SakuraSeeker[i].HWnd));
78       SubItems.Add('');
79       SubItems.Add('?');
80
81       valid := (SakuraSeeker[i].Hwnd <> 0) and (SakuraSeeker[i].Name <> '')
82         and (SakuraSeeker[i].KeroName <> '');
83       if valid then
84         ImageIndex := IconFMOEntry
85       else
86         ImageIndex := IconBrokenFMO;
87         SubItems[4] := '\94j\91¹FMO';
88     end;
89   end;
90   lvwList.Items.EndUpdate;
91   StatusBar.Panels[0].Text := Format('%d\8c\8f', [SakuraSeeker.Count]);
92
93   HwndToVer := TStringList.Create;
94   s := '';
95   try
96     for i := 0 to SakuraSeeker.Count-1 do begin
97       s := HwndToVer.Values[IntToStr(SakuraSeeker[i].HWnd)];
98       if s <> '' then begin
99         lvwList.Items[i].SubItems[3] := s;
100         lvwList.Items[i].SubItems[4] := '\90³\8fí';
101       end else begin
102         DirectSSTP.TargetHWnd := SakuraSeeker[i].HWnd;
103         DirectSSTP.SstpSender := Application.Title;
104         s := DirectSSTP.SstpEXECUTE('GetVersion');
105         TmpStr := TStringList.Create;
106         try
107           TmpStr.Text := s;
108           for j := 0 to TmpStr.Count-1 do
109             if TmpStr[j] <> '' then begin
110               s := TmpStr[j];
111               Break;
112             end;
113         finally
114           TmpStr.Free;
115         end;
116         if s <> '' then begin
117           HwndToVer.Values[IntToStr(SakuraSeeker[i].HWnd)] := s;
118           lvwList.Items[i].SubItems[3] := s;
119           lvwList.Items[i].SubItems[4] := '\90³\8fí';
120         end else begin
121           lvwList.Items[i].SubItems[4] := '\89\9e\93\9a\82È\82µ';
122           lvwList.Items[i].ImageIndex := IconBrokenFMO;
123         end;
124       end;
125     end;
126   finally
127     HwndToVer.Free;
128   end;
129 end;
130
131 procedure TfrmFMOExplorer.actRefreshExecute(Sender: TObject);
132 begin
133   UpdateList;
134 end;
135
136 procedure TfrmFMOExplorer.lvwListChange(Sender: TObject; Item: TListItem;
137   Change: TItemChange);
138 begin
139   if Change <> ctState then Exit;
140   actKillFMO.Enabled := lvwList.Selected <> nil;
141   actCopyInformation.Enabled := lvwList.Selected <> nil;
142 end;
143
144 procedure TfrmFMOExplorer.actKillFMOExecute(Sender: TObject);
145 var i: integer;
146 begin
147   if lvwList.Selected = nil then Exit;
148   for i := lvwList.Items.Count-1 downto 0 do
149     if lvwList.Items[i].Selected and (SakuraSeeker.Process[i] <> nil) then begin
150       SakuraSeeker.KillFMO(SakuraSeeker.Process[i].FMOName, SakuraSeeker.Process[i].ProcessID);
151       lvwList.Items.Delete(i);
152     end;
153 end;
154
155 procedure TfrmFMOExplorer.lvwListDblClick(Sender: TObject);
156 var i, index: integer;
157     str: String;
158 begin
159   if lvwList.Selected = nil then Exit;
160   index := lvwList.Selected.Index;
161   for i := 0 to SakuraSeeker[index].Count-1 do begin
162     if i > 0 then str := str + #13#10;
163     str := str + SakuraSeeker[index].KeyAt[i] + ': ' + SakuraSeeker[index].DataAt[i];
164   end;
165   ShowMessage(str);
166 end;
167
168 procedure TfrmFMOExplorer.actCopyInformationExecute(Sender: TObject);
169 var
170   Clip: TClipBoard;
171   str: String;
172   i, index: integer;
173 begin
174   if lvwList.Selected = nil then
175     Exit;
176   index := lvwList.Selected.Index;
177   for i := 0 to SakuraSeeker[index].Count-1 do
178   begin
179     if i > 0 then str := str + #13#10;
180     str := str + SakuraSeeker[index].KeyAt[i] + ': ' + SakuraSeeker[index].DataAt[i];
181   end;
182   Clip := ClipBoard();
183   Clip.SetTextBuf(PChar(str));
184 end;
185
186 initialization
187
188 frmFMOExplorer := nil;
189
190 end.