Subversion Repositories stackman

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 daniel-mar 1
unit categories;
2
 
3
interface
4
 
5
uses
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
7
  Dialogs, StdCtrls, ComCtrls, ImgList, Menus, ShellAPI, global;
8
 
9
type
10
  TMDICategories = class(TForm)
11
    ImageList1: TImageList;
12
    MainMenu1: TMainMenu;
13
    Kategorie1: TMenuItem;
14
    KategorieDelete1: TMenuItem;
15
    EditorOpen: TMenuItem;
16
    N2: TMenuItem;
17
    KategorieRefresh1: TMenuItem;
18
    KategorieClose1: TMenuItem;
19
    PopupMenu1: TPopupMenu;
20
    PEditor: TMenuItem;
21
    PDelete: TMenuItem;
22
    PExternal: TMenuItem;
23
    N4: TMenuItem;
24
    ExternalOpen: TMenuItem;
25
    N5: TMenuItem;
26
    PUmbenennen: TMenuItem;
27
    KategorieUmbenennen1: TMenuItem;
28
    TreeView1: TTreeView;
29
    PNeu: TMenuItem;
30
    N1: TMenuItem;
31
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
32
    procedure FormShow(Sender: TObject);
33
    procedure TreeView1DblClick(Sender: TObject);
34
    procedure TreeView1KeyDown(Sender: TObject; var Key: Word;
35
      Shift: TShiftState);
36
    procedure KategorieDelete1Click(Sender: TObject);
37
    procedure EditorOpenClick(Sender: TObject);
38
    procedure KategorieClose1Click(Sender: TObject);
39
    procedure KategorieRefresh1Click(Sender: TObject);
40
    procedure ExternalOpenClick(Sender: TObject);
41
    procedure PopupMenu1Popup(Sender: TObject);
42
    procedure KategorieUmbenennen1Click(Sender: TObject);
43
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
44
    procedure PNeuClick(Sender: TObject);
45
    procedure TreeView1KeyPress(Sender: TObject; var Key: Char);
46
  private
47
    procedure recursiveItemListing(folder: string; parentnode: TTreeNode);
48
  public
49
    procedure DeleteNode(folder, cat: string);
50
    procedure InsertNode(folder, cat: string; em: TAMode);
51
    procedure RefreshList;
52
    procedure DoNew;
53
  end;
54
 
55
var
56
  MDICategories: TMDICategories;
57
 
58
implementation
59
 
60
{$R *.dfm}
61
 
62
uses
63
  main;
64
 
65
procedure TMDICategories.FormClose(Sender: TObject; var Action: TCloseAction);
66
begin
67
  Action := caFree;
68
end;
69
 
70
procedure TMDICategories.FormShow(Sender: TObject);
71
begin
72
  RefreshList;
73
  TreeView1.SetFocus;
74
end;
75
 
76
procedure TMDICategories.TreeView1Change(Sender: TObject; Node: TTreeNode);
77
begin
78
  // if Change = ctState then
79
  // begin
80
    PNeu.Visible := true;
81
    N1.Visible := true;
82
    PEditor.Visible := true;
83
    PExternal.Visible := true;
84
    N2.Visible := true;
85
    PDelete.Visible := true;
86
 
87
    PNeu.Default := false;
88
    PEditor.Default := true;
89
 
90
    //PNeu.Enabled := (TreeView1.SelectionCount = 1) and
91
    //  ((IsFolderNode(TreeView1.Selected)) or
92
    //   (IsRootNode(TreeView1.Selected)));
93
    PNeu.Enabled := true;
94
 
95
    EditorOpen.Enabled := (TreeView1.SelectionCount = 1) and
96
      ((IsAppenderNode(TreeView1.Selected)) or
97
       (IsForeignNode(TreeView1.Selected)) or
98
       (IsTextNode(TreeView1.Selected)));
99
    ExternalOpen.Enabled := (TreeView1.SelectionCount = 1) and
100
      ((IsAppenderNode(TreeView1.Selected)) or
101
       (IsRootNode(TreeView1.Selected)) or
102
       (IsFolderNode(TreeView1.Selected)) or
103
       (IsForeignNode(TreeView1.Selected)) or
104
       (IsTextNode(TreeView1.Selected)));
105
    KategorieDelete1.Enabled := (TreeView1.SelectionCount = 1) and
106
      ((IsAppenderNode(TreeView1.Selected)) or
107
       (IsFolderNode(TreeView1.Selected)) or
108
       (IsForeignNode(TreeView1.Selected)) or
109
       (IsTextNode(TreeView1.Selected)));
110
    KategorieUmbenennen1.Enabled := (TreeView1.SelectionCount = 1) and
111
      ((IsAppenderNode(TreeView1.Selected)) or
112
       (IsFolderNode(TreeView1.Selected)) or
113
       (IsForeignNode(TreeView1.Selected)) or
114
       (IsTextNode(TreeView1.Selected)));
115
 
116
    PEditor.Enabled := EditorOpen.Enabled;
117
    PExternal.Enabled := ExternalOpen.Enabled;
118
    PDelete.Enabled := KategorieDelete1.Enabled;
119
    PUmbenennen.Enabled := KategorieUmbenennen1.Enabled;
120
  // end;
121
end;
122
 
123
procedure TMDICategories.TreeView1DblClick(Sender: TObject);
124
begin
125
  if TreeView1.SelectionCount = 1 then
126
  begin
127
    EditorOpen.Click;
128
  end;
129
end;
130
 
131
procedure TMDICategories.TreeView1KeyDown(Sender: TObject; var Key: Word;
132
  Shift: TShiftState);
133
begin
134
  if Key = VK_RETURN then
135
  begin
136
    Key := 0;
137
    if TreeView1.SelectionCount = 1 then
138
    begin
139
      if TreeView1.Selected.HasChildren then
140
      begin
141
        if TreeView1.Selected.Expanded then
142
          TreeView1.Selected.Collapse(false)
143
        else
144
          TreeView1.Selected.Expand(false);
145
      end
146
      else
147
      begin
148
        EditorOpen.Click;
149
      end;
150
    end;
151
  end;
152
end;
153
 
154
procedure TMDICategories.RefreshList;
155
var
156
  root: TTreeNode;
157
begin
158
  TreeView1.Visible := false;
159
  TreeView1.Items.Clear;
160
  TreeView1.Visible := true;
161
 
162
  root := TreeView1.Items.Add(nil, lng_root);
163
  root.ImageIndex := II_ROOT;
164
  root.SelectedIndex := II_ROOT;
165
  recursiveItemListing('', root);
166
  root.Expand(false);
167
end;
168
 
169
procedure TMDICategories.KategorieDelete1Click(Sender: TObject);
170
var
171
  fn: string;
172
begin
173
  if TreeView1.SelectionCount = 1 then
174
  begin
175
    fn := GetFileNameFromNode(TreeView1.Selected);
176
    if commonDelete(fn) then
177
    begin
178
       // TODO: Eigentlich sollte das innerhalb von commonDelete() stattfinden
179
      TreeView1.Selected.Delete;
180
    end;
181
  end;
182
end;
183
 
184
procedure TMDICategories.DeleteNode(folder, cat: string);
185
 
186
  procedure Rec(folder, cat: string; t: TTreeNode);
187
  var
188
    i: integer;
189
  begin
190
    if (folder = GetFolderFromNode(t)) and
191
       (cat = GetCatFromNode(t)) then
192
    begin
193
      t.Delete;
194
      exit;
195
    end;
196
 
197
    for i := t.Count - 1 downto 0 do
198
    begin
199
      Rec(folder, cat, t.Item[i]);
200
    end;
201
  end;
202
 
203
begin
204
  Rec(folder, cat, treeview1.Items.Item[0]);
205
end;
206
 
207
procedure TMDICategories.InsertNode(folder, cat: string; em: TAMode);
208
 
209
  procedure Rec(folder, cat: string; em: TAMode; t: TTreeNode);
210
  var
211
    i: integer;
212
    n: TTreeNode;
213
  begin
214
    if (folder = GetFolderFromNode(t)) and
215
       (IsFolderNode(t) or IsRootNode(t)) then
216
    begin
217
      n := treeview1.Items.AddChild(t, cat);
218
      t.Expand(false); // Ordner aufklappen
219
      with n do
220
      begin
221
        if em = emFolder then
222
        begin
223
          ImageIndex := II_FOLDER;
224
          SelectedIndex := II_FOLDER;
225
          recursiveItemListing(folder + cat, n);
226
        end
227
        else
228
        begin
229
          if em = emText then
230
          begin
231
            ImageIndex := II_TEXT;
232
            SelectedIndex := II_TEXT;
233
          end
234
          else if em = emAppender then
235
          begin
236
            ImageIndex := II_APPENDER;
237
            SelectedIndex := II_APPENDER;
238
          end
239
          else if em = emForeign then
240
          begin
241
            ImageIndex := II_FOREIGN;
242
            SelectedIndex := II_FOREIGN;
243
          end;
244
        end;
245
      end;
246
 
247
      exit;
248
    end;
249
 
250
    for i := t.Count - 1 downto 0 do
251
    begin
252
      Rec(folder, cat, em, t.Item[i]);
253
    end;
254
  end;
255
 
256
  procedure NodeForceDir(folder: string);
257
 
258
    function CreateIfExists(foldername: string; node: TTreeNode): TTreeNode;
259
    var
260
      i: integer;
261
      somethingfound: boolean;
262
    begin
263
      result := nil;
264
 
265
      somethingfound := false;
266
      for i := 0 to node.Count - 1 do
267
      begin
268
        if (node.Item[i].Text = foldername) and
269
           (IsFolderNode(node.Item[i]) or IsRootNode(node.Item[i])) then
270
        begin
271
          somethingfound := true;
272
          result := node.Item[i];
273
          break;
274
        end;
275
      end;
276
 
277
      if not somethingfound then
278
      begin
279
        result := treeview1.Items.AddChild(node, foldername);
280
        node.Expand(false);
281
 
282
        with result do
283
        begin
284
          ImageIndex := II_FOLDER;
285
          SelectedIndex := II_FOLDER;
286
        end;
287
      end;
288
    end;
289
 
290
  var
291
    x: tstringlist;
292
    i: Integer;
293
    node: TTreeNode;
294
  begin
295
    x := TStringList.Create;
296
    try
297
      Explode(PathDelim, folder, x);
298
      node := treeview1.Items.Item[0];
299
      for i := 0 to x.count - 1 do
300
      begin
301
        if x.Strings[i] <> '' then
302
        begin
303
          node := CreateIfExists(x.Strings[i], node);
304
        end;
305
      end;
306
    finally
307
      x.Free;
308
    end;
309
  end;
310
 
311
var
312
  sl: TStringList;
313
  i: integer;
314
begin
315
  if (em = emFolder) and (cat = '') then
316
  begin
317
    sl := TStringList.Create;
318
    try
319
      explode(PathDelim, folder, sl);
320
      cat := sl.Strings[sl.Count-2];
321
      folder := '';
322
      for i := 0 to sl.Count - 3 do
323
      begin
324
        folder := folder + sl.Strings[i] + PathDelim;
325
      end;
326
    finally
327
      sl.Free;
328
    end;
329
  end;
330
 
331
  NodeForceDir(folder);
332
  Rec(folder, cat, em, treeview1.Items.Item[0]);
333
end;
334
 
335
procedure TMDICategories.DoNew;
336
var
337
  folder: string;
338
  pnode: TTreeNode;
339
begin
340
  if TreeView1.SelectionCount = 1 then
341
  begin
342
    if IsFolderNode(TreeView1.Selected) or
343
       IsRootNode(TreeView1.Selected) then
344
    begin
345
      pnode := TreeView1.Selected;
346
    end
347
    else
348
    begin
349
      pnode := TreeView1.Selected.Parent;
350
    end;
351
    folder := GetFolderFromNode(pnode);
352
    newDialog(folder);
353
  end
354
  else
355
  begin
356
    newDialog(''); // In der Wurzel erstellen
357
    TreeView1.Items.Item[0];
358
  end;
359
end;
360
 
361
procedure TMDICategories.EditorOpenClick(Sender: TObject);
362
var
363
  cat, folder: string;
364
begin
365
  if TreeView1.SelectionCount = 1 then
366
  begin
367
    cat := TreeView1.Selected.Text;
368
    folder := GetFolderFromNode(TreeView1.Selected);
369
 
370
    if (IsForeignNode(TreeView1.Selected)) then
371
    begin
372
      ExternalOpen.Click;
373
    end
374
    else if (IsAppenderNode(TreeView1.Selected)) or
375
            (IsTextNode(TreeView1.Selected)) then
376
    begin
377
      if not FileExists(GetFileNameFromNode(TreeView1.Selected)) then
378
      begin
379
        ShowMessage(lng_filenotfound);
380
        Exit;
381
      end;
382
 
383
      if IsAppenderNode(TreeView1.Selected) then
384
      begin
385
        OpenAppenderEditor(folder, cat);
386
      end
387
      else
388
      begin
389
        OpenTextEditor(folder, cat);
390
      end;
391
    end;
392
  end;
393
end;
394
 
395
procedure TMDICategories.KategorieClose1Click(Sender: TObject);
396
begin
397
  Close;
398
end;
399
 
400
procedure TMDICategories.KategorieRefresh1Click(Sender: TObject);
401
begin
402
  RefreshList;
403
 
404
  TreeView1.SetFocus;
405
end;
406
 
407
procedure TMDICategories.KategorieUmbenennen1Click(Sender: TObject);
408
begin
409
  renameDialog(TreeView1.Selected);
410
end;
411
 
412
procedure TMDICategories.PNeuClick(Sender: TObject);
413
begin
414
  DoNew();
415
end;
416
 
417
procedure TMDICategories.ExternalOpenClick(Sender: TObject);
418
var
419
  fn: string;
420
begin
421
  if TreeView1.SelectionCount = 1 then
422
  begin
423
    fn := GetFileNameFromNode(TreeView1.Selected);
424
    commonExternalOpen(fn);
425
  end;
426
end;
427
 
428
procedure TMDICategories.PopupMenu1Popup(Sender: TObject);
429
begin
430
  if TreeView1.SelectionCount = 1 then
431
  begin
432
    PNeu.Visible := isFolderNode(TreeView1.Selected) or IsRootNode(TreeView1.Selected);
433
    N1.Visible := isFolderNode(TreeView1.Selected) or IsRootNode(TreeView1.Selected);
434
    PEditor.Visible := true;
435
    PExternal.Visible := true;
436
    N2.Visible := true;
437
    PDelete.Visible := true;
438
    PUmbenennen.Visible := true;
439
 
440
    PNeu.Default := false;
441
    PEditor.Default := true;
442
  end
443
  else
444
  begin
445
    PNeu.Visible := true;
446
    N1.Visible := false;
447
    PEditor.Visible := false;
448
    PExternal.Visible := false;
449
    N2.Visible := false;
450
    PDelete.Visible := false;
451
    PUmbenennen.Visible := false;
452
 
453
    PNeu.Default := true;
454
    PEditor.Default := false;
455
  end;
456
end;
457
 
458
procedure TMDICategories.recursiveItemListing(folder: string;
459
  parentnode: TTreeNode);
460
var
461
  tmp_sr: TSearchRec;
462
  i_folder: TTreeNode;
463
begin
464
  folder := MyAddTrailingPathDelimiter(folder);
465
  if FindFirst(allFiles(folder), faAnyFile, tmp_sr) = 0 then
466
  begin
467
    repeat
468
      if (tmp_sr.Name <> '.') and (tmp_sr.Name <> '..') then
469
      begin
470
        if directoryExists(getFolderName(folder, tmp_sr.Name)) then
471
        begin
472
          i_folder := TreeView1.Items.AddChild(parentnode, tmp_sr.Name);
473
          if CfgExpandNodesAtBeginning then parentnode.Expand(false);
474
          i_folder.ImageIndex := II_FOLDER;
475
          i_folder.SelectedIndex := II_FOLDER;
476
          recursiveItemListing(folder + tmp_sr.Name, i_folder);
477
        end
478
        else if (folder + tmp_sr.Name) = GetRelativeFileName(getAppenderFileName(folder, FilenameToCatname(tmp_sr.Name))) then
479
        begin
480
          with TreeView1.Items.AddChild(parentnode, FilenameToCatname(tmp_sr.Name)) do
481
          begin
482
            ImageIndex := II_APPENDER;
483
            SelectedIndex := II_APPENDER;
484
          end;
485
          if CfgExpandNodesAtBeginning then parentnode.Expand(false);
486
        end
487
        else if (folder + tmp_sr.Name) = GetRelativeFileName(getTextFileName(folder, FilenameToCatname(tmp_sr.Name))) then
488
        begin
489
          with TreeView1.Items.AddChild(parentnode, FilenameToCatname(tmp_sr.Name)) do
490
          begin
491
            ImageIndex := II_TEXT;
492
            SelectedIndex := II_TEXT;
493
          end;
494
          if CfgExpandNodesAtBeginning then parentnode.Expand(false);
495
        end
496
        else if getFolderName(folder, tmp_sr.Name) <> getJournalFileName() then
497
        begin
498
          with TreeView1.Items.AddChild(parentnode, tmp_sr.Name) do
499
          begin
500
            ImageIndex := II_FOREIGN;
501
            SelectedIndex := II_FOREIGN;
502
          end;
503
          if CfgExpandNodesAtBeginning then parentnode.Expand(false);
504
        end;
505
      end;
506
    until FindNext(tmp_sr) <> 0;
507
    FindClose(tmp_sr);
508
  end;
509
end;
510
 
511
procedure TMDICategories.TreeView1KeyPress(Sender: TObject; var Key: Char);
512
begin
513
  // Verhindert einen Windows-Sound beim Drücken von Enter
514
  if key = #13 then key := #0;
515
  if key = #10 then key := #0;
516
end;
517
 
518
end.