Subversion Repositories stackman

Compare Revisions

Problem with comparison.

Regard whitespace Rev HEAD → Rev 1

/trunk/categories.pas
0,0 → 1,518
unit categories;
 
interface
 
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, ImgList, Menus, ShellAPI, global;
 
type
TMDICategories = class(TForm)
ImageList1: TImageList;
MainMenu1: TMainMenu;
Kategorie1: TMenuItem;
KategorieDelete1: TMenuItem;
EditorOpen: TMenuItem;
N2: TMenuItem;
KategorieRefresh1: TMenuItem;
KategorieClose1: TMenuItem;
PopupMenu1: TPopupMenu;
PEditor: TMenuItem;
PDelete: TMenuItem;
PExternal: TMenuItem;
N4: TMenuItem;
ExternalOpen: TMenuItem;
N5: TMenuItem;
PUmbenennen: TMenuItem;
KategorieUmbenennen1: TMenuItem;
TreeView1: TTreeView;
PNeu: TMenuItem;
N1: TMenuItem;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormShow(Sender: TObject);
procedure TreeView1DblClick(Sender: TObject);
procedure TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure KategorieDelete1Click(Sender: TObject);
procedure EditorOpenClick(Sender: TObject);
procedure KategorieClose1Click(Sender: TObject);
procedure KategorieRefresh1Click(Sender: TObject);
procedure ExternalOpenClick(Sender: TObject);
procedure PopupMenu1Popup(Sender: TObject);
procedure KategorieUmbenennen1Click(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure PNeuClick(Sender: TObject);
procedure TreeView1KeyPress(Sender: TObject; var Key: Char);
private
procedure recursiveItemListing(folder: string; parentnode: TTreeNode);
public
procedure DeleteNode(folder, cat: string);
procedure InsertNode(folder, cat: string; em: TAMode);
procedure RefreshList;
procedure DoNew;
end;
 
var
MDICategories: TMDICategories;
 
implementation
 
{$R *.dfm}
 
uses
main;
 
procedure TMDICategories.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
 
procedure TMDICategories.FormShow(Sender: TObject);
begin
RefreshList;
TreeView1.SetFocus;
end;
 
procedure TMDICategories.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
// if Change = ctState then
// begin
PNeu.Visible := true;
N1.Visible := true;
PEditor.Visible := true;
PExternal.Visible := true;
N2.Visible := true;
PDelete.Visible := true;
 
PNeu.Default := false;
PEditor.Default := true;
 
//PNeu.Enabled := (TreeView1.SelectionCount = 1) and
// ((IsFolderNode(TreeView1.Selected)) or
// (IsRootNode(TreeView1.Selected)));
PNeu.Enabled := true;
 
EditorOpen.Enabled := (TreeView1.SelectionCount = 1) and
((IsAppenderNode(TreeView1.Selected)) or
(IsForeignNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)));
ExternalOpen.Enabled := (TreeView1.SelectionCount = 1) and
((IsAppenderNode(TreeView1.Selected)) or
(IsRootNode(TreeView1.Selected)) or
(IsFolderNode(TreeView1.Selected)) or
(IsForeignNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)));
KategorieDelete1.Enabled := (TreeView1.SelectionCount = 1) and
((IsAppenderNode(TreeView1.Selected)) or
(IsFolderNode(TreeView1.Selected)) or
(IsForeignNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)));
KategorieUmbenennen1.Enabled := (TreeView1.SelectionCount = 1) and
((IsAppenderNode(TreeView1.Selected)) or
(IsFolderNode(TreeView1.Selected)) or
(IsForeignNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)));
 
PEditor.Enabled := EditorOpen.Enabled;
PExternal.Enabled := ExternalOpen.Enabled;
PDelete.Enabled := KategorieDelete1.Enabled;
PUmbenennen.Enabled := KategorieUmbenennen1.Enabled;
// end;
end;
 
procedure TMDICategories.TreeView1DblClick(Sender: TObject);
begin
if TreeView1.SelectionCount = 1 then
begin
EditorOpen.Click;
end;
end;
 
procedure TMDICategories.TreeView1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
begin
Key := 0;
if TreeView1.SelectionCount = 1 then
begin
if TreeView1.Selected.HasChildren then
begin
if TreeView1.Selected.Expanded then
TreeView1.Selected.Collapse(false)
else
TreeView1.Selected.Expand(false);
end
else
begin
EditorOpen.Click;
end;
end;
end;
end;
 
procedure TMDICategories.RefreshList;
var
root: TTreeNode;
begin
TreeView1.Visible := false;
TreeView1.Items.Clear;
TreeView1.Visible := true;
 
root := TreeView1.Items.Add(nil, lng_root);
root.ImageIndex := II_ROOT;
root.SelectedIndex := II_ROOT;
recursiveItemListing('', root);
root.Expand(false);
end;
 
procedure TMDICategories.KategorieDelete1Click(Sender: TObject);
var
fn: string;
begin
if TreeView1.SelectionCount = 1 then
begin
fn := GetFileNameFromNode(TreeView1.Selected);
if commonDelete(fn) then
begin
// TODO: Eigentlich sollte das innerhalb von commonDelete() stattfinden
TreeView1.Selected.Delete;
end;
end;
end;
 
procedure TMDICategories.DeleteNode(folder, cat: string);
 
procedure Rec(folder, cat: string; t: TTreeNode);
var
i: integer;
begin
if (folder = GetFolderFromNode(t)) and
(cat = GetCatFromNode(t)) then
begin
t.Delete;
exit;
end;
 
for i := t.Count - 1 downto 0 do
begin
Rec(folder, cat, t.Item[i]);
end;
end;
 
begin
Rec(folder, cat, treeview1.Items.Item[0]);
end;
 
procedure TMDICategories.InsertNode(folder, cat: string; em: TAMode);
 
procedure Rec(folder, cat: string; em: TAMode; t: TTreeNode);
var
i: integer;
n: TTreeNode;
begin
if (folder = GetFolderFromNode(t)) and
(IsFolderNode(t) or IsRootNode(t)) then
begin
n := treeview1.Items.AddChild(t, cat);
t.Expand(false); // Ordner aufklappen
with n do
begin
if em = emFolder then
begin
ImageIndex := II_FOLDER;
SelectedIndex := II_FOLDER;
recursiveItemListing(folder + cat, n);
end
else
begin
if em = emText then
begin
ImageIndex := II_TEXT;
SelectedIndex := II_TEXT;
end
else if em = emAppender then
begin
ImageIndex := II_APPENDER;
SelectedIndex := II_APPENDER;
end
else if em = emForeign then
begin
ImageIndex := II_FOREIGN;
SelectedIndex := II_FOREIGN;
end;
end;
end;
 
exit;
end;
 
for i := t.Count - 1 downto 0 do
begin
Rec(folder, cat, em, t.Item[i]);
end;
end;
 
procedure NodeForceDir(folder: string);
 
function CreateIfExists(foldername: string; node: TTreeNode): TTreeNode;
var
i: integer;
somethingfound: boolean;
begin
result := nil;
 
somethingfound := false;
for i := 0 to node.Count - 1 do
begin
if (node.Item[i].Text = foldername) and
(IsFolderNode(node.Item[i]) or IsRootNode(node.Item[i])) then
begin
somethingfound := true;
result := node.Item[i];
break;
end;
end;
 
if not somethingfound then
begin
result := treeview1.Items.AddChild(node, foldername);
node.Expand(false);
 
with result do
begin
ImageIndex := II_FOLDER;
SelectedIndex := II_FOLDER;
end;
end;
end;
 
var
x: tstringlist;
i: Integer;
node: TTreeNode;
begin
x := TStringList.Create;
try
Explode(PathDelim, folder, x);
node := treeview1.Items.Item[0];
for i := 0 to x.count - 1 do
begin
if x.Strings[i] <> '' then
begin
node := CreateIfExists(x.Strings[i], node);
end;
end;
finally
x.Free;
end;
end;
 
var
sl: TStringList;
i: integer;
begin
if (em = emFolder) and (cat = '') then
begin
sl := TStringList.Create;
try
explode(PathDelim, folder, sl);
cat := sl.Strings[sl.Count-2];
folder := '';
for i := 0 to sl.Count - 3 do
begin
folder := folder + sl.Strings[i] + PathDelim;
end;
finally
sl.Free;
end;
end;
 
NodeForceDir(folder);
Rec(folder, cat, em, treeview1.Items.Item[0]);
end;
 
procedure TMDICategories.DoNew;
var
folder: string;
pnode: TTreeNode;
begin
if TreeView1.SelectionCount = 1 then
begin
if IsFolderNode(TreeView1.Selected) or
IsRootNode(TreeView1.Selected) then
begin
pnode := TreeView1.Selected;
end
else
begin
pnode := TreeView1.Selected.Parent;
end;
folder := GetFolderFromNode(pnode);
newDialog(folder);
end
else
begin
newDialog(''); // In der Wurzel erstellen
TreeView1.Items.Item[0];
end;
end;
 
procedure TMDICategories.EditorOpenClick(Sender: TObject);
var
cat, folder: string;
begin
if TreeView1.SelectionCount = 1 then
begin
cat := TreeView1.Selected.Text;
folder := GetFolderFromNode(TreeView1.Selected);
 
if (IsForeignNode(TreeView1.Selected)) then
begin
ExternalOpen.Click;
end
else if (IsAppenderNode(TreeView1.Selected)) or
(IsTextNode(TreeView1.Selected)) then
begin
if not FileExists(GetFileNameFromNode(TreeView1.Selected)) then
begin
ShowMessage(lng_filenotfound);
Exit;
end;
 
if IsAppenderNode(TreeView1.Selected) then
begin
OpenAppenderEditor(folder, cat);
end
else
begin
OpenTextEditor(folder, cat);
end;
end;
end;
end;
 
procedure TMDICategories.KategorieClose1Click(Sender: TObject);
begin
Close;
end;
 
procedure TMDICategories.KategorieRefresh1Click(Sender: TObject);
begin
RefreshList;
 
TreeView1.SetFocus;
end;
 
procedure TMDICategories.KategorieUmbenennen1Click(Sender: TObject);
begin
renameDialog(TreeView1.Selected);
end;
 
procedure TMDICategories.PNeuClick(Sender: TObject);
begin
DoNew();
end;
 
procedure TMDICategories.ExternalOpenClick(Sender: TObject);
var
fn: string;
begin
if TreeView1.SelectionCount = 1 then
begin
fn := GetFileNameFromNode(TreeView1.Selected);
commonExternalOpen(fn);
end;
end;
 
procedure TMDICategories.PopupMenu1Popup(Sender: TObject);
begin
if TreeView1.SelectionCount = 1 then
begin
PNeu.Visible := isFolderNode(TreeView1.Selected) or IsRootNode(TreeView1.Selected);
N1.Visible := isFolderNode(TreeView1.Selected) or IsRootNode(TreeView1.Selected);
PEditor.Visible := true;
PExternal.Visible := true;
N2.Visible := true;
PDelete.Visible := true;
PUmbenennen.Visible := true;
 
PNeu.Default := false;
PEditor.Default := true;
end
else
begin
PNeu.Visible := true;
N1.Visible := false;
PEditor.Visible := false;
PExternal.Visible := false;
N2.Visible := false;
PDelete.Visible := false;
PUmbenennen.Visible := false;
 
PNeu.Default := true;
PEditor.Default := false;
end;
end;
 
procedure TMDICategories.recursiveItemListing(folder: string;
parentnode: TTreeNode);
var
tmp_sr: TSearchRec;
i_folder: TTreeNode;
begin
folder := MyAddTrailingPathDelimiter(folder);
if FindFirst(allFiles(folder), faAnyFile, tmp_sr) = 0 then
begin
repeat
if (tmp_sr.Name <> '.') and (tmp_sr.Name <> '..') then
begin
if directoryExists(getFolderName(folder, tmp_sr.Name)) then
begin
i_folder := TreeView1.Items.AddChild(parentnode, tmp_sr.Name);
if CfgExpandNodesAtBeginning then parentnode.Expand(false);
i_folder.ImageIndex := II_FOLDER;
i_folder.SelectedIndex := II_FOLDER;
recursiveItemListing(folder + tmp_sr.Name, i_folder);
end
else if (folder + tmp_sr.Name) = GetRelativeFileName(getAppenderFileName(folder, FilenameToCatname(tmp_sr.Name))) then
begin
with TreeView1.Items.AddChild(parentnode, FilenameToCatname(tmp_sr.Name)) do
begin
ImageIndex := II_APPENDER;
SelectedIndex := II_APPENDER;
end;
if CfgExpandNodesAtBeginning then parentnode.Expand(false);
end
else if (folder + tmp_sr.Name) = GetRelativeFileName(getTextFileName(folder, FilenameToCatname(tmp_sr.Name))) then
begin
with TreeView1.Items.AddChild(parentnode, FilenameToCatname(tmp_sr.Name)) do
begin
ImageIndex := II_TEXT;
SelectedIndex := II_TEXT;
end;
if CfgExpandNodesAtBeginning then parentnode.Expand(false);
end
else if getFolderName(folder, tmp_sr.Name) <> getJournalFileName() then
begin
with TreeView1.Items.AddChild(parentnode, tmp_sr.Name) do
begin
ImageIndex := II_FOREIGN;
SelectedIndex := II_FOREIGN;
end;
if CfgExpandNodesAtBeginning then parentnode.Expand(false);
end;
end;
until FindNext(tmp_sr) <> 0;
FindClose(tmp_sr);
end;
end;
 
procedure TMDICategories.TreeView1KeyPress(Sender: TObject; var Key: Char);
begin
// Verhindert einen Windows-Sound beim Drücken von Enter
if key = #13 then key := #0;
if key = #10 then key := #0;
end;
 
end.