Subversion Repositories userdetect2

Rev

Rev 81 | Rev 83 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 81 Rev 82
1
unit UD2_Main;
1
unit UD2_Main;
2
 
2
 
3
interface
3
interface
4
 
4
 
5
{$IF CompilerVersion >= 25.0}
5
{$IF CompilerVersion >= 25.0}
6
{$LEGACYIFEND ON}
6
{$LEGACYIFEND ON}
7
{$IFEND}
7
{$IFEND}
8
 
8
 
9
{$INCLUDE 'UserDetect2.inc'}
9
{$INCLUDE 'UserDetect2.inc'}
10
 
10
 
11
{$WARN UNSAFE_CODE OFF}
-
 
12
{$WARN UNSAFE_TYPE OFF}
-
 
13
{$WARN UNSAFE_CAST OFF}
-
 
14
 
-
 
15
uses
11
uses
16
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
12
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
17
  Dialogs, StdCtrls, Grids, ValEdit, UD2_Obj, ComCtrls, ImgList, ExtCtrls,
13
  Dialogs, StdCtrls, Grids, ValEdit, UD2_Obj, ComCtrls, ImgList, ExtCtrls,
18
  CommCtrl, Menus, VTSListView, VTSCompat;
14
  CommCtrl, Menus, VTSListView, VTSCompat;
19
 
15
 
20
const
16
const
21
  DefaultIniFile = 'UserDetect2.ini';
17
  DefaultIniFile = 'UserDetect2.ini';
22
  DefaultWarnIfNothingMatches = 'false';
18
  DefaultWarnIfNothingMatches = 'false';
23
  TagWarnIfNothingMatches = 'WarnIfNothingMatches';
19
  TagWarnIfNothingMatches = 'WarnIfNothingMatches';
24
  DefaultCloseAfterLaunching = 'false';
20
  DefaultCloseAfterLaunching = 'false';
25
  TagCloseAfterLaunching = 'CloseAfterLaunching';
21
  TagCloseAfterLaunching = 'CloseAfterLaunching';
26
  TagIcon = 'Icon';
22
  TagIcon = 'Icon';
27
 
23
 
28
type
24
type
29
  TUD2MainForm = class(TForm)
25
  TUD2MainForm = class(TForm)
30
    OpenDialog1: TOpenDialog;
26
    OpenDialog1: TOpenDialog;
31
    PageControl1: TPageControl;
27
    PageControl1: TPageControl;
32
    TasksTabSheet: TTabSheet;
28
    TasksTabSheet: TTabSheet;
33
    TabSheet2: TTabSheet;
29
    TabSheet2: TTabSheet;
34
    TabSheet3: TTabSheet;
30
    TabSheet3: TTabSheet;
35
    IniTemplateMemo: TMemo;
31
    IniTemplateMemo: TMemo;
36
    TabSheet4: TTabSheet;
32
    TabSheet4: TTabSheet;
37
    TasksListView: TVTSListView;
33
    TasksListView: TVTSListView;
38
    TasksImageList: TImageList;
34
    TasksImageList: TImageList;
39
    SaveDialog1: TSaveDialog;
35
    SaveDialog1: TSaveDialog;
40
    TabSheet5: TTabSheet;
36
    TabSheet5: TTabSheet;
41
    Image1: TImage;
37
    Image1: TImage;
42
    Label1: TLabel;
38
    Label1: TLabel;
43
    Label2: TLabel;
39
    Label2: TLabel;
44
    Label3: TLabel;
40
    Label3: TLabel;
45
    Label4: TLabel;
41
    Label4: TLabel;
46
    Label5: TLabel;
42
    Label5: TLabel;
47
    Label6: TLabel;
43
    Label6: TLabel;
48
    Label7: TLabel;
44
    Label7: TLabel;
49
    Label8: TLabel;
45
    Label8: TLabel;
50
    LoadedPluginsListView: TVTSListView;
46
    LoadedPluginsListView: TVTSListView;
51
    IdentificationsListView: TVTSListView;
47
    IdentificationsListView: TVTSListView;
52
    ErrorsTabSheet: TTabSheet;
48
    ErrorsTabSheet: TTabSheet;
53
    ErrorsMemo: TMemo;
49
    ErrorsMemo: TMemo;
54
    Memo1: TMemo;
50
    Memo1: TMemo;
55
    Panel1: TPanel;
51
    Panel1: TPanel;
56
    Button1: TButton;
52
    Button1: TButton;
57
    Button2: TButton;
53
    Button2: TButton;
58
    TasksPopupMenu: TPopupMenu;
54
    TasksPopupMenu: TPopupMenu;
59
    Run1: TMenuItem;
55
    Run1: TMenuItem;
60
    Properties1: TMenuItem;
56
    Properties1: TMenuItem;
61
    IdentificationsPopupMenu: TPopupMenu;
57
    IdentificationsPopupMenu: TPopupMenu;
62
    CopyTaskDefinitionExample1: TMenuItem;
58
    CopyTaskDefinitionExample1: TMenuItem;
63
    Button3: TButton;
59
    Button3: TButton;
64
    VersionLabel: TLabel;
60
    VersionLabel: TLabel;
65
    LoadedPluginsPopupMenu: TPopupMenu;
61
    LoadedPluginsPopupMenu: TPopupMenu;
66
    MenuItem1: TMenuItem;
62
    MenuItem1: TMenuItem;
67
    Panel2: TPanel;
63
    Panel2: TPanel;
68
    Image2: TImage;
64
    Image2: TImage;
69
    procedure FormDestroy(Sender: TObject);
65
    procedure FormDestroy(Sender: TObject);
70
    procedure FormShow(Sender: TObject);
-
 
71
    procedure TasksListViewDblClick(Sender: TObject);
66
    procedure TasksListViewDblClick(Sender: TObject);
72
    procedure TasksListViewKeyPress(Sender: TObject; var Key: Char);
67
    procedure TasksListViewKeyPress(Sender: TObject; var Key: Char);
73
    procedure Button1Click(Sender: TObject);
68
    procedure Button1Click(Sender: TObject);
74
    procedure Button2Click(Sender: TObject);
69
    procedure Button2Click(Sender: TObject);
75
    procedure URLLabelClick(Sender: TObject);
70
    procedure URLLabelClick(Sender: TObject);
76
    procedure TasksPopupMenuPopup(Sender: TObject);
71
    procedure TasksPopupMenuPopup(Sender: TObject);
77
    procedure Run1Click(Sender: TObject);
72
    procedure Run1Click(Sender: TObject);
78
    procedure Properties1Click(Sender: TObject);
73
    procedure Properties1Click(Sender: TObject);
79
    procedure IdentificationsPopupMenuPopup(Sender: TObject);
74
    procedure IdentificationsPopupMenuPopup(Sender: TObject);
80
    procedure CopyTaskDefinitionExample1Click(Sender: TObject);
75
    procedure CopyTaskDefinitionExample1Click(Sender: TObject);
81
    procedure ListViewCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
76
    procedure ListViewCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
82
    procedure Button3Click(Sender: TObject);
77
    procedure Button3Click(Sender: TObject);
83
    procedure LoadedPluginsPopupMenuPopup(Sender: TObject);
78
    procedure LoadedPluginsPopupMenuPopup(Sender: TObject);
84
    procedure MenuItem1Click(Sender: TObject);
79
    procedure MenuItem1Click(Sender: TObject);
-
 
80
    procedure FormCreate(Sender: TObject);
85
  protected
81
  protected
86
    ud2: TUD2;
82
    ud2: TUD2;
87
    procedure LoadTaskList;
83
    procedure LoadTaskList;
88
    procedure LoadDetectedIDs;
84
    procedure LoadDetectedIDs;
89
    procedure LoadINITemplate;
85
    procedure LoadINITemplate;
90
    procedure LoadLoadedPluginList;
86
    procedure LoadLoadedPluginList;
91
    function GetIniFileName: string;
87
    function GetIniFileName: string;
92
    procedure DoRun(ShortTaskName: string);
88
    procedure DoRun(ShortTaskName: string);
93
    procedure CheckForErrors;
89
    procedure CheckForErrors;
94
  public
90
  public
95
    procedure Run;
91
    procedure Run;
96
  end;
92
  end;
97
 
93
 
98
var
94
var
99
  UD2MainForm: TUD2MainForm;
95
  UD2MainForm: TUD2MainForm;
100
 
96
 
101
implementation
97
implementation
102
 
98
 
103
{$R *.dfm}
99
{$R *.dfm}
104
 
100
 
105
uses
101
uses
106
  ShellAPI, Clipbrd, Math, AlphaNumSort, UD2_Utils, UD2_TaskProperties;
102
  ShellAPI, Clipbrd, Math, AlphaNumSort, UD2_Utils, UD2_TaskProperties;
107
 
103
 
108
type
104
type
109
  TUD2ListViewEntry = class(TObject)
105
  TUD2ListViewEntry = class(TObject)
110
    ShortTaskName: string;
106
    ShortTaskName: string;
111
    CloseAfterLaunching: boolean;
107
    CloseAfterLaunching: boolean;
112
    TaskPropertiesForm: TForm;
108
    TaskPropertiesForm: TForm;
113
  end;
109
  end;
114
 
110
 
115
function AddIconRecToImageList(rec: TIconFileIdx; ImageList: TImageList): integer;
111
function AddIconRecToImageList(rec: TIconFileIdx; ImageList: TImageList): integer;
116
var
112
var
117
  icon: TIcon;
113
  icon: TIcon;
118
begin
114
begin
119
  icon := TIcon.Create;
115
  icon := TIcon.Create;
120
  try
116
  try
121
    icon.Handle := ExtractIcon(Application.Handle, PChar(rec.FileName), rec.IconIndex);
117
    icon.Handle := ExtractIcon(Application.Handle, PChar(rec.FileName), rec.IconIndex);
122
 
118
 
123
    // result := ImageList.AddIcon(ico);
119
    // result := ImageList.AddIcon(ico);
124
    result := AddTransparentIconToImageList(ImageList, icon);
120
    result := AddTransparentIconToImageList(ImageList, icon);
125
  finally
121
  finally
126
    icon.Free;
122
    icon.Free;
127
  end;
123
  end;
128
end;
124
end;
129
 
125
 
130
{ TUD2MainForm }
126
{ TUD2MainForm }
131
 
127
 
132
function TUD2MainForm.GetIniFileName: string;
128
function TUD2MainForm.GetIniFileName: string;
133
resourcestring
129
resourcestring
134
  LNG_FILE_NOT_FOUND = 'File "%s" not found.';
130
  LNG_FILE_NOT_FOUND = 'File "%s" not found.';
135
begin
131
begin
136
  if (ParamCount >= 1) and not CheckBoolParam(1, 'C') then
132
  if (ParamCount >= 1) and not CheckBoolParam(1, 'C') then
137
  begin
133
  begin
138
    if FileExists(ParamStr(1)) then
134
    if FileExists(ParamStr(1)) then
139
    begin
135
    begin
140
      result := ParamStr(1);
136
      result := ParamStr(1);
141
    end
137
    end
142
    else
138
    else
143
    begin
139
    begin
144
      ExitCode := EXITCODE_INI_NOT_FOUND;
140
      ExitCode := EXITCODE_INI_NOT_FOUND;
145
      MessageDlg(Format(LNG_FILE_NOT_FOUND, [ParamStr(1)]), mtError, [mbOK], 0);
141
      MessageDlg(Format(LNG_FILE_NOT_FOUND, [ParamStr(1)]), mtError, [mbOK], 0);
146
      result := '';
142
      result := '';
147
    end;
143
    end;
148
    Exit;
144
    Exit;
149
  end
145
  end
150
  else
146
  else
151
  begin
147
  begin
152
    if FileExists(DefaultIniFile) then
148
    if FileExists(DefaultIniFile) then
153
    begin
149
    begin
154
      result := DefaultIniFile;
150
      result := DefaultIniFile;
155
      Exit;
151
      Exit;
156
    end;
152
    end;
157
 
153
 
158
    if FileExists(GetOwnCmdName + '.ini') then
154
    if FileExists(GetOwnCmdName + '.ini') then
159
    begin
155
    begin
160
      result := GetOwnCmdName + '.ini';
156
      result := GetOwnCmdName + '.ini';
161
      Exit;
157
      Exit;
162
    end;
158
    end;
163
 
159
 
164
    if CompatOpenDialogExecute(OpenDialog1) then
160
    if CompatOpenDialogExecute(OpenDialog1) then
165
    begin
161
    begin
166
      result := OpenDialog1.FileName;
162
      result := OpenDialog1.FileName;
167
      Exit;
163
      Exit;
168
    end;
164
    end;
169
 
165
 
170
    result := '';
166
    result := '';
171
    Exit;
167
    Exit;
172
  end;
168
  end;
173
end;
169
end;
174
 
170
 
175
procedure TUD2MainForm.LoadTaskList;
171
procedure TUD2MainForm.LoadTaskList;
176
var
172
var
177
  sl: TStringList;
173
  sl: TStringList;
178
  i: integer;
174
  i: integer;
179
  ShortTaskName, iconString: string;
175
  ShortTaskName, iconString: string;
180
  iconIndex: integer;
176
  iconIndex: integer;
181
  obj: TUD2ListViewEntry;
177
  obj: TUD2ListViewEntry;
182
begin
178
begin
183
  TasksListView.Clear;
179
  TasksListView.Clear;
184
  sl := TStringList.Create;
180
  sl := TStringList.Create;
185
  try
181
  try
186
    ud2.GetTaskListing(sl);
182
    ud2.GetTaskListing(sl);
187
    for i := 0 to sl.Count-1 do
183
    for i := 0 to sl.Count-1 do
188
    begin
184
    begin
189
      ShortTaskName := sl.Names[i];
185
      ShortTaskName := sl.Names[i];
190
 
186
 
191
      Obj := TUD2ListViewEntry.Create;
187
      Obj := TUD2ListViewEntry.Create;
192
      Obj.ShortTaskName := ShortTaskName;
188
      Obj.ShortTaskName := ShortTaskName;
193
      Obj.CloseAfterLaunching := ud2.ReadMetatagBool(ShortTaskName, TagCloseAfterLaunching, DefaultCloseAfterLaunching);
189
      Obj.CloseAfterLaunching := ud2.ReadMetatagBool(ShortTaskName, TagCloseAfterLaunching, DefaultCloseAfterLaunching);
194
 
190
 
195
      TasksListView.AddItem(sl.Values[ShortTaskName], TObject(Obj));
191
      TasksListView.AddItem(sl.Values[ShortTaskName], TObject(Obj));
196
 
192
 
197
      iconString := ud2.ReadMetatagString(ShortTaskName, TagIcon, '');
193
      iconString := ud2.ReadMetatagString(ShortTaskName, TagIcon, '');
198
      if iconString <> '' then
194
      if iconString <> '' then
199
      begin
195
      begin
200
        iconIndex := AddIconRecToImageList(SplitIconString(iconString), TasksImageList);
196
        iconIndex := AddIconRecToImageList(SplitIconString(iconString), TasksImageList);
201
        if iconIndex <> -1 then
197
        if iconIndex <> -1 then
202
        begin
198
        begin
203
          TasksListView.Items.Item[TasksListView.Items.Count-1].ImageIndex := iconIndex;
199
          TasksListView.Items.Item[TasksListView.Items.Count-1].ImageIndex := iconIndex;
204
        end;
200
        end;
205
      end;
201
      end;
206
    end;
202
    end;
207
  finally
203
  finally
208
    sl.Free;
204
    sl.Free;
209
  end;
205
  end;
210
end;
206
end;
211
 
207
 
212
procedure TUD2MainForm.DoRun(ShortTaskName: string);
208
procedure TUD2MainForm.DoRun(ShortTaskName: string);
213
resourcestring
209
resourcestring
214
  LNG_TASK_NOT_EXISTS = 'The task "%s" does not exist in the INI file.';
210
  LNG_TASK_NOT_EXISTS = 'The task "%s" does not exist in the INI file.';
215
  LNG_NOTHING_MATCHES = 'No identification string matches to your environment. No application was launched. Please check the Task Definition File.';
211
  LNG_NOTHING_MATCHES = 'No identification string matches to your environment. No application was launched. Please check the Task Definition File.';
216
var
212
var
217
  slCmds: TStringList;
213
  slCmds: TStringList;
218
  i: integer;
214
  i: integer;
219
  cmd: string;
215
  cmd: string;
220
begin
216
begin
221
  if not ud2.TaskExists(ShortTaskName) then
217
  if not ud2.TaskExists(ShortTaskName) then
222
  begin
218
  begin
223
    // This can happen if the task name is taken from command line
219
    // This can happen if the task name is taken from command line
224
    MessageDlg(Format(LNG_TASK_NOT_EXISTS, [ShortTaskName]), mtError, [mbOK], 0);
220
    MessageDlg(Format(LNG_TASK_NOT_EXISTS, [ShortTaskName]), mtError, [mbOK], 0);
225
    ExitCode := EXITCODE_TASK_NOT_EXISTS;
221
    ExitCode := EXITCODE_TASK_NOT_EXISTS;
226
    Exit;
222
    Exit;
227
  end;
223
  end;
228
 
224
 
229
  slCmds := TStringList.Create;
225
  slCmds := TStringList.Create;
230
  try
226
  try
231
    ud2.GetCommandList(ShortTaskName, slCmds);
227
    ud2.GetCommandList(ShortTaskName, slCmds);
232
 
228
 
233
    if (slCmds.Count = 0) and ud2.ReadMetatagBool(ShortTaskName, TagWarnIfNothingMatches, DefaultWarnIfNothingMatches) then
229
    if (slCmds.Count = 0) and ud2.ReadMetatagBool(ShortTaskName, TagWarnIfNothingMatches, DefaultWarnIfNothingMatches) then
234
    begin
230
    begin
235
      MessageDlg(LNG_NOTHING_MATCHES, mtWarning, [mbOK], 0);
231
      MessageDlg(LNG_NOTHING_MATCHES, mtWarning, [mbOK], 0);
236
      ExitCode := EXITCODE_TASK_NOTHING_MATCHES;
232
      ExitCode := EXITCODE_TASK_NOTHING_MATCHES;
237
    end;
233
    end;
238
 
234
 
239
    for i := 0 to slCmds.Count-1 do
235
    for i := 0 to slCmds.Count-1 do
240
    begin
236
    begin
241
      cmd := slCmds.Strings[i];
237
      cmd := slCmds.Strings[i];
242
      if cmd = '' then continue;
238
      if cmd = '' then continue;
243
      UD2_RunCMD(cmd, SW_NORMAL); // Idea: Let SW_NORMAL be configurable by the user?
239
      UD2_RunCMD(cmd, SW_NORMAL); // Idea: Let SW_NORMAL be configurable by the user?
244
    end;
240
    end;
245
  finally
241
  finally
246
    slCmds.Free;
242
    slCmds.Free;
247
  end;
243
  end;
248
end;
244
end;
249
 
245
 
250
procedure TUD2MainForm.FormDestroy(Sender: TObject);
246
procedure TUD2MainForm.FormDestroy(Sender: TObject);
251
var
247
var
252
  i: integer;
248
  i: integer;
253
begin
249
begin
254
  if Assigned(ud2) then ud2.Free;
250
  if Assigned(ud2) then ud2.Free;
255
  for i := 0 to TasksListView.Items.Count-1 do
251
  for i := 0 to TasksListView.Items.Count-1 do
256
  begin
252
  begin
257
    TUD2ListViewEntry(TasksListView.Items.Item[i].Data).Free;
253
    TUD2ListViewEntry(TasksListView.Items.Item[i].Data).Free;
258
  end;
254
  end;
259
end;
255
end;
260
 
256
 
261
procedure TUD2MainForm.CheckForErrors;
257
procedure TUD2MainForm.CheckForErrors;
262
begin
258
begin
263
  ErrorsTabSheet.TabVisible := ud2.Errors.Count > 0;
259
  ErrorsTabSheet.TabVisible := ud2.Errors.Count > 0;
264
  if ErrorsTabSheet.TabVisible then
260
  if ErrorsTabSheet.TabVisible then
265
  begin
261
  begin
266
    ErrorsMemo.Lines.Assign(ud2.Errors);
262
    ErrorsMemo.Lines.Assign(ud2.Errors);
267
    PageControl1.ActivePage := ErrorsTabSheet;
263
    PageControl1.ActivePage := ErrorsTabSheet;
268
  end;
264
  end;
269
end;
265
end;
270
 
266
 
271
procedure TUD2MainForm.LoadDetectedIDs;
267
procedure TUD2MainForm.LoadDetectedIDs;
272
var
268
var
273
  i, j: integer;
269
  i, j: integer;
274
  pl: TUD2Plugin;
270
  pl: TUD2Plugin;
275
  ude: TUD2IdentificationEntry;
271
  ude: TUD2IdentificationEntry;
276
begin
272
begin
277
  IdentificationsListView.Clear;
273
  IdentificationsListView.Clear;
278
  for i := 0 to ud2.LoadedPlugins.Count-1 do
274
  for i := 0 to ud2.LoadedPlugins.Count-1 do
279
  begin
275
  begin
280
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
276
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
281
    for j := 0 to pl.DetectedIdentifications.Count-1 do
277
    for j := 0 to pl.DetectedIdentifications.Count-1 do
282
    begin
278
    begin
283
      ude := pl.DetectedIdentifications.Items[j] as TUD2IdentificationEntry;
279
      ude := pl.DetectedIdentifications.Items[j] as TUD2IdentificationEntry;
284
      with IdentificationsListView.Items.Add do
280
      with IdentificationsListView.Items.Add do
285
      begin
281
      begin
286
        Caption := pl.PluginName;
282
        Caption := pl.PluginName;
287
        SubItems.Add(pl.IdentificationMethodName);
283
        SubItems.Add(pl.IdentificationMethodName);
288
        SubItems.Add(ude.IdentificationString);
284
        SubItems.Add(ude.IdentificationString);
289
        SubItems.Add(GUIDToString(pl.PluginGUID));
285
        SubItems.Add(GUIDToString(pl.PluginGUID));
290
      end;
286
      end;
291
    end;
287
    end;
292
  end;
288
  end;
293
 
289
 
294
  for i := 0 to IdentificationsListView.Columns.Count-1 do
290
  for i := 0 to IdentificationsListView.Columns.Count-1 do
295
  begin
291
  begin
296
    IdentificationsListView.Columns.Items[i].Width := LVSCW_AUTOSIZE_USEHEADER;
292
    IdentificationsListView.Columns.Items[i].Width := LVSCW_AUTOSIZE_USEHEADER;
297
  end;
293
  end;
298
end;
294
end;
299
 
295
 
300
procedure TUD2MainForm.LoadINITemplate;
296
procedure TUD2MainForm.LoadINITemplate;
301
var
297
var
302
  i, j: integer;
298
  i, j: integer;
303
  pl: TUD2Plugin;
299
  pl: TUD2Plugin;
304
  ude: TUD2IdentificationEntry;
300
  ude: TUD2IdentificationEntry;
305
begin
301
begin
306
  IniTemplateMemo.Clear;
302
  IniTemplateMemo.Clear;
307
  IniTemplateMemo.Lines.Add('[ExampleTask1]');
303
  IniTemplateMemo.Lines.Add('[ExampleTask1]');
308
  IniTemplateMemo.Lines.Add('; Description: Optional but recommended');
304
  IniTemplateMemo.Lines.Add('; Description: Optional but recommended');
309
  IniTemplateMemo.Lines.Add('Description=Run Task #1');
305
  IniTemplateMemo.Lines.Add('Description=Run Task #1');
310
  IniTemplateMemo.Lines.Add('; WarnIfNothingMatches: Warns when no application was launched. Default: false.');
306
  IniTemplateMemo.Lines.Add('; WarnIfNothingMatches: Warns when no application was launched. Default: false.');
311
  IniTemplateMemo.Lines.Add('WarnIfNothingMatches=false');
307
  IniTemplateMemo.Lines.Add('WarnIfNothingMatches=false');
312
  IniTemplateMemo.Lines.Add('; Optional: IconDLL + IconIndex');
308
  IniTemplateMemo.Lines.Add('; Optional: IconDLL + IconIndex');
313
  IniTemplateMemo.Lines.Add('Icon=%SystemRoot%\system32\Shell32.dll,3');
309
  IniTemplateMemo.Lines.Add('Icon=%SystemRoot%\system32\Shell32.dll,3');
314
  IniTemplateMemo.Lines.Add('; Optional: Can be true or false');
310
  IniTemplateMemo.Lines.Add('; Optional: Can be true or false');
315
  IniTemplateMemo.Lines.Add(TagCloseAfterLaunching+'=true');
311
  IniTemplateMemo.Lines.Add(TagCloseAfterLaunching+'=true');
316
 
312
 
317
  for i := 0 to ud2.LoadedPlugins.Count-1 do
313
  for i := 0 to ud2.LoadedPlugins.Count-1 do
318
  begin
314
  begin
319
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
315
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
320
    for j := 0 to pl.DetectedIdentifications.Count-1 do
316
    for j := 0 to pl.DetectedIdentifications.Count-1 do
321
    begin
317
    begin
322
      ude := pl.DetectedIdentifications.Items[j] as TUD2IdentificationEntry;
318
      ude := pl.DetectedIdentifications.Items[j] as TUD2IdentificationEntry;
323
      IniTemplateMemo.Lines.Add(Format('; %s', [ude.Plugin.PluginName]));
319
      IniTemplateMemo.Lines.Add(Format('; %s', [ude.Plugin.PluginName]));
324
      IniTemplateMemo.Lines.Add(ude.GetPrimaryIdName+'=calc.exe');
320
      IniTemplateMemo.Lines.Add(ude.GetPrimaryIdName+'=calc.exe');
325
    end;
321
    end;
326
  end;
322
  end;
327
end;
323
end;
328
 
324
 
329
procedure TUD2MainForm.LoadLoadedPluginList;
325
procedure TUD2MainForm.LoadLoadedPluginList;
330
resourcestring
326
resourcestring
331
  LNG_MS = '%dms';
327
  LNG_MS = '%dms';
332
var
328
var
333
  i: integer;
329
  i: integer;
334
  pl: TUD2Plugin;
330
  pl: TUD2Plugin;
335
begin
331
begin
336
  LoadedPluginsListView.Clear;
332
  LoadedPluginsListView.Clear;
337
  for i := 0 to ud2.LoadedPlugins.Count-1 do
333
  for i := 0 to ud2.LoadedPlugins.Count-1 do
338
  begin
334
  begin
339
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
335
    pl := ud2.LoadedPlugins.Items[i] as TUD2Plugin;
340
    with LoadedPluginsListView.Items.Add do
336
    with LoadedPluginsListView.Items.Add do
341
    begin
337
    begin
342
      Caption := pl.PluginDLL;
338
      Caption := pl.PluginDLL;
343
      SubItems.Add(pl.PluginVendor);
339
      SubItems.Add(pl.PluginVendor);
344
      SubItems.Add(pl.PluginName);
340
      SubItems.Add(pl.PluginName);
345
      SubItems.Add(pl.PluginVersion);
341
      SubItems.Add(pl.PluginVersion);
346
      SubItems.Add(pl.IdentificationMethodName);
342
      SubItems.Add(pl.IdentificationMethodName);
347
      SubItems.Add(IntToStr(pl.DetectedIdentifications.Count));
343
      SubItems.Add(IntToStr(pl.DetectedIdentifications.Count));
348
      SubItems.Add(Format(LNG_MS, [Max(1,pl.time)])); // at least show 1ms, otherwise it would be unloggical
344
      SubItems.Add(Format(LNG_MS, [Max(1,pl.time)])); // at least show 1ms, otherwise it would be unloggical
349
      SubItems.Add(pl.IdentificationProcedureStatusCodeDescribed);
345
      SubItems.Add(pl.IdentificationProcedureStatusCodeDescribed);
350
      SubItems.Add(pl.PluginGUIDString);
346
      SubItems.Add(pl.PluginGUIDString);
351
    end;
347
    end;
352
  end;
348
  end;
353
 
349
 
354
  for i := 0 to LoadedPluginsListView.Columns.Count-1 do
350
  for i := 0 to LoadedPluginsListView.Columns.Count-1 do
355
  begin
351
  begin
356
    LoadedPluginsListView.Columns.Items[i].Width := LVSCW_AUTOSIZE_USEHEADER;
352
    LoadedPluginsListView.Columns.Items[i].Width := LVSCW_AUTOSIZE_USEHEADER;
357
  end;
353
  end;
358
end;
354
end;
359
 
355
 
360
procedure TUD2MainForm.FormShow(Sender: TObject);
-
 
361
begin
-
 
362
  // To avoid accidental change of the default tab from the IDE VCL Designer
-
 
363
  PageControl1.ActivePage := TasksTabSheet;
-
 
364
end;
-
 
365
 
-
 
366
procedure TUD2MainForm.TasksListViewDblClick(Sender: TObject);
356
procedure TUD2MainForm.TasksListViewDblClick(Sender: TObject);
367
var
357
var
368
  obj: TUD2ListViewEntry;
358
  obj: TUD2ListViewEntry;
369
begin
359
begin
370
  if TasksListView.ItemIndex = -1 then exit;
360
  if TasksListView.ItemIndex = -1 then exit;
371
  obj := TUD2ListViewEntry(TasksListView.Selected.Data);
361
  obj := TUD2ListViewEntry(TasksListView.Selected.Data);
372
  DoRun(obj.ShortTaskName);
362
  DoRun(obj.ShortTaskName);
373
  if obj.CloseAfterLaunching then Close;
363
  if obj.CloseAfterLaunching then Close;
374
end;
364
end;
375
 
365
 
376
procedure TUD2MainForm.TasksListViewKeyPress(Sender: TObject; var Key: Char);
366
procedure TUD2MainForm.TasksListViewKeyPress(Sender: TObject; var Key: Char);
377
begin
367
begin
378
  if Key = #13 then
368
  if Key = #13 then
379
  begin
369
  begin
380
    TasksListViewDblClick(Sender);
370
    TasksListViewDblClick(Sender);
381
  end;
371
  end;
382
end;
372
end;
383
 
373
 
384
procedure TUD2MainForm.Button1Click(Sender: TObject);
374
procedure TUD2MainForm.Button1Click(Sender: TObject);
385
begin
375
begin
386
  UD2_RunCMD(ud2.IniFileName, SW_NORMAL);
376
  UD2_RunCMD(ud2.IniFileName, SW_NORMAL);
387
end;
377
end;
388
 
378
 
389
procedure TUD2MainForm.Button2Click(Sender: TObject);
379
procedure TUD2MainForm.Button2Click(Sender: TObject);
390
begin
380
begin
391
  if CompatSaveDialogExecute(SaveDialog1) then
381
  if CompatSaveDialogExecute(SaveDialog1) then
392
  begin
382
  begin
393
    IniTemplateMemo.Lines.SaveToFile(SaveDialog1.FileName);
383
    IniTemplateMemo.Lines.SaveToFile(SaveDialog1.FileName);
394
  end;
384
  end;
395
end;
385
end;
396
 
386
 
397
procedure TUD2MainForm.URLLabelClick(Sender: TObject);
387
procedure TUD2MainForm.URLLabelClick(Sender: TObject);
398
var
388
var
399
  s: string;
389
  s: string;
400
begin
390
begin
401
  s := TLabel(Sender).Caption;
391
  s := TLabel(Sender).Caption;
402
  if Pos('@', s) > 0 then
392
  if Pos('@', s) > 0 then
403
    s := 'mailto:' + s
393
    s := 'mailto:' + s
404
  else
394
  else
405
    s := 'http://' + s;
395
    s := 'http://' + s;
406
  UD2_RunCMD(s, SW_NORMAL);
396
  UD2_RunCMD(s, SW_NORMAL);
407
end;
397
end;
408
 
398
 
409
procedure TUD2MainForm.TasksPopupMenuPopup(Sender: TObject);
399
procedure TUD2MainForm.TasksPopupMenuPopup(Sender: TObject);
410
begin
400
begin
411
  Run1.Enabled := TasksListView.ItemIndex <> -1;
401
  Run1.Enabled := TasksListView.ItemIndex <> -1;
412
  Properties1.Enabled := TasksListView.ItemIndex <> -1;
402
  Properties1.Enabled := TasksListView.ItemIndex <> -1;
413
end;
403
end;
414
 
404
 
415
procedure TUD2MainForm.Run1Click(Sender: TObject);
405
procedure TUD2MainForm.Run1Click(Sender: TObject);
416
begin
406
begin
417
  TasksListViewDblClick(Sender);
407
  TasksListViewDblClick(Sender);
418
end;
408
end;
419
 
409
 
420
procedure TUD2MainForm.Properties1Click(Sender: TObject);
410
procedure TUD2MainForm.Properties1Click(Sender: TObject);
421
var
411
var
422
  obj: TUD2ListViewEntry;
412
  obj: TUD2ListViewEntry;
423
begin
413
begin
424
  if TasksListView.ItemIndex = -1 then exit;
414
  if TasksListView.ItemIndex = -1 then exit;
425
  obj := TUD2ListViewEntry(TasksListView.Selected.Data);
415
  obj := TUD2ListViewEntry(TasksListView.Selected.Data);
426
  if obj.TaskPropertiesForm = nil then
416
  if obj.TaskPropertiesForm = nil then
427
  begin
417
  begin
428
    obj.TaskPropertiesForm := TUD2TaskPropertiesForm.Create(Self, ud2, obj.ShortTaskName);
418
    obj.TaskPropertiesForm := TUD2TaskPropertiesForm.Create(Self, ud2, obj.ShortTaskName);
429
  end;
419
  end;
430
  obj.TaskPropertiesForm.Show;
420
  obj.TaskPropertiesForm.Show;
431
end;
421
end;
432
 
422
 
433
procedure TUD2MainForm.IdentificationsPopupMenuPopup(Sender: TObject);
423
procedure TUD2MainForm.IdentificationsPopupMenuPopup(Sender: TObject);
434
begin
424
begin
435
  CopyTaskDefinitionExample1.Enabled := IdentificationsListView.ItemIndex <> -1;
425
  CopyTaskDefinitionExample1.Enabled := IdentificationsListView.ItemIndex <> -1;
436
end;
426
end;
437
 
427
 
438
procedure TUD2MainForm.CopyTaskDefinitionExample1Click(Sender: TObject);
428
procedure TUD2MainForm.CopyTaskDefinitionExample1Click(Sender: TObject);
439
var
429
var
440
  s: string;
430
  s: string;
441
begin
431
begin
442
  s := '; '+IdentificationsListView.Selected.Caption+#13#10+
432
  s := '; '+IdentificationsListView.Selected.Caption+#13#10+
443
       IdentificationsListView.Selected.SubItems[0] + ':' + IdentificationsListView.Selected.SubItems[1] + '=calc.exe'+#13#10+
433
       IdentificationsListView.Selected.SubItems[0] + ':' + IdentificationsListView.Selected.SubItems[1] + '=calc.exe'+#13#10+
444
       #13#10+
434
       #13#10+
445
       '; Alternatively:'+#13#10+
435
       '; Alternatively:'+#13#10+
446
       IdentificationsListView.Selected.SubItems[2] + ':' + IdentificationsListView.Selected.SubItems[1] + '=calc.exe'+#13#10;
436
       IdentificationsListView.Selected.SubItems[2] + ':' + IdentificationsListView.Selected.SubItems[1] + '=calc.exe'+#13#10;
447
  Clipboard.AsText := s;
437
  Clipboard.AsText := s;
448
end;
438
end;
449
 
439
 
450
procedure TUD2MainForm.ListViewCompare(Sender: TObject; Item1,
440
procedure TUD2MainForm.ListViewCompare(Sender: TObject; Item1,
451
  Item2: TListItem; Data: Integer; var Compare: Integer);
441
  Item2: TListItem; Data: Integer; var Compare: Integer);
452
var
442
var
453
  ListView: TVTSListView;
443
  ListView: TVTSListView;
454
begin
444
begin
455
  ListView := Sender as TVTSListView;
445
  ListView := Sender as TVTSListView;
456
  if ListView.CurSortedColumn = 0 then
446
  if ListView.CurSortedColumn = 0 then
457
  begin
447
  begin
458
    Compare := AlphaNumCompare(Item1.Caption, Item2.Caption);
448
    Compare := AlphaNumCompare(Item1.Caption, Item2.Caption);
459
  end
449
  end
460
  else
450
  else
461
  begin
451
  begin
462
    Compare := AlphaNumCompare(Item1.SubItems[ListView.CurSortedColumn-1],
452
    Compare := AlphaNumCompare(Item1.SubItems[ListView.CurSortedColumn-1],
463
                               Item2.SubItems[ListView.CurSortedColumn-1]);
453
                               Item2.SubItems[ListView.CurSortedColumn-1]);
464
  end;
454
  end;
465
  if ListView.CurSortedDesc then Compare := -Compare;
455
  if ListView.CurSortedDesc then Compare := -Compare;
466
end;
456
end;
467
 
457
 
468
procedure TUD2MainForm.Button3Click(Sender: TObject);
458
procedure TUD2MainForm.Button3Click(Sender: TObject);
469
begin
459
begin
470
  VTS_CheckUpdates('userdetect2', VersionLabel.Caption);
460
  VTS_CheckUpdates('userdetect2', VersionLabel.Caption);
471
end;
461
end;
472
 
462
 
473
procedure TUD2MainForm.LoadedPluginsPopupMenuPopup(Sender: TObject);
463
procedure TUD2MainForm.LoadedPluginsPopupMenuPopup(Sender: TObject);
474
begin
464
begin
475
  MenuItem1.Enabled := LoadedPluginsListView.ItemIndex <> -1;
465
  MenuItem1.Enabled := LoadedPluginsListView.ItemIndex <> -1;
476
end;
466
end;
477
 
467
 
478
procedure TUD2MainForm.MenuItem1Click(Sender: TObject);
468
procedure TUD2MainForm.MenuItem1Click(Sender: TObject);
479
var
469
var
480
  s: string;
470
  s: string;
481
begin
471
begin
482
  s := '; ' + LoadedPluginsListView.Selected.SubItems.Strings[6];
472
  s := '; ' + LoadedPluginsListView.Selected.SubItems.Strings[6];
483
  Clipboard.AsText := s;
473
  Clipboard.AsText := s;
484
end;
474
end;
485
 
475
 
486
procedure TUD2MainForm.Run;
476
procedure TUD2MainForm.Run;
487
resourcestring
477
resourcestring
488
  LNG_SYNTAX = 'Syntax: %s [TaskDefinitionFile [/T TaskName] | /C IdentificationTerm [Command] | /?]';
478
  LNG_SYNTAX = 'Syntax: %s [TaskDefinitionFile [/T TaskName] | /C IdentificationTerm [Command] | /?]';
489
var
479
var
490
  LoadedIniFile: string;
480
  LoadedIniFile: string;
491
begin
481
begin
492
  ExitCode := EXITCODE_OK;
482
  ExitCode := EXITCODE_OK;
493
 
483
 
494
  if ((ParamCount = 1) and CheckBoolParam(1, '?')) or
484
  if ((ParamCount = 1) and CheckBoolParam(1, '?')) or
495
     (CheckBoolParam(2, 'T') and (ParamCount > 3)) or
485
     (CheckBoolParam(2, 'T') and (ParamCount > 3)) or
496
     (CheckBoolParam(1, 'C') and (ParamCount > 3)) or
486
     (CheckBoolParam(1, 'C') and (ParamCount > 3)) or
497
     (not CheckBoolParam(2, 'T') and not CheckBoolParam(1, 'C') and (ParamCount > 1)) then
487
     (not CheckBoolParam(2, 'T') and not CheckBoolParam(1, 'C') and (ParamCount > 1)) then
498
  begin
488
  begin
499
    ExitCode := EXITCODE_SYNTAX_ERROR;
489
    ExitCode := EXITCODE_SYNTAX_ERROR;
500
    MessageDlg(Format(LNG_SYNTAX, [GetOwnCmdName]), mtInformation, [mbOK], 0);
490
    MessageDlg(Format(LNG_SYNTAX, [GetOwnCmdName]), mtInformation, [mbOK], 0);
501
 
491
 
502
    Visible := false;
492
    Visible := false;
503
    Close;
493
    Close;
504
    Exit;
494
    Exit;
505
  end;
495
  end;
506
 
496
 
507
  LoadedIniFile := GetIniFileName;
497
  LoadedIniFile := GetIniFileName;
508
  if LoadedIniFile = '' then
498
  if LoadedIniFile = '' then
509
  begin
499
  begin
510
    Visible := false;
500
    Visible := false;
511
    Close;
501
    Close;
512
    Exit;
502
    Exit;
513
  end;
503
  end;
514
  ud2 := TUD2.Create(LoadedIniFile);
504
  ud2 := TUD2.Create(LoadedIniFile);
515
 
505
 
516
  ud2.HandlePluginDir('',        '*.smp');
506
  ud2.HandlePluginDir('',        '*.udp');
517
  ud2.HandlePluginDir('Plugins', '*.smp');
507
  ud2.HandlePluginDir('Plugins', '*.udp');
518
  ud2.HandlePluginDir('Plugins', '*.dll');
508
  ud2.HandlePluginDir('Plugins', '*.dll');
519
 
509
 
520
  if CheckBoolParam(1, 'C') then
510
  if CheckBoolParam(1, 'C') then
521
  begin
511
  begin
522
    if ud2.FulfilsEverySubterm(ParamStr(2)) then
512
    if ud2.FulfilsEverySubterm(ParamStr(2)) then
523
    begin
513
    begin
524
      ExitCode := EXITCODE_OK;
514
      ExitCode := EXITCODE_OK;
525
 
515
 
526
      if ParamStr(3) <> '' then UD2_RunCMD(ParamStr(3), SW_NORMAL); // Idea: SW_NORMAL changeable via parameter
516
      if ParamStr(3) <> '' then UD2_RunCMD(ParamStr(3), SW_NORMAL); // Idea: SW_NORMAL changeable via parameter
527
    end
517
    end
528
    else
518
    else
529
    begin
519
    begin
530
      ExitCode := EXITCODE_TASK_NOTHING_MATCHES;
520
      ExitCode := EXITCODE_TASK_NOTHING_MATCHES;
531
    end;
521
    end;
532
 
522
 
533
    Visible := false;
523
    Visible := false;
534
    Close;
524
    Close;
535
    Exit;
525
    Exit;
536
  end
526
  end
537
  else if CheckBoolParam(2, 'T') then
527
  else if CheckBoolParam(2, 'T') then
538
  begin
528
  begin
539
    DoRun(ParamStr(3));
529
    DoRun(ParamStr(3));
540
 
530
 
541
    Visible := false;
531
    Visible := false;
542
    Close;
532
    Close;
543
    Exit;
533
    Exit;
544
  end
534
  end
545
  else
535
  else
546
  begin
536
  begin
547
    LoadTaskList;
537
    LoadTaskList;
548
    LoadDetectedIDs;
538
    LoadDetectedIDs;
549
    LoadINITemplate;
539
    LoadINITemplate;
550
    LoadLoadedPluginList;
540
    LoadLoadedPluginList;
551
    CheckForErrors;
541
    CheckForErrors;
552
 
542
 
553
    Visible := true;
543
    Visible := true;
554
    Exit;
544
    Exit;
555
  end;
545
  end;
556
end;
546
end;
-
 
547
 
-
 
548
procedure TUD2MainForm.FormCreate(Sender: TObject);
-
 
549
begin
-
 
550
  // To avoid accidental change of the default tab from the IDE VCL Designer
-
 
551
  PageControl1.ActivePage := TasksTabSheet;
-
 
552
end;
557
 
553
 
558
end.
554
end.
559
 
555