Subversion Repositories stackman

Rev

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

  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.
  519.