dirlist.inc 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. Procedure Scandirs(Path: String; Tree : PgtkTree;
  2. Node: PGtkTreeItem ; SubSub : Boolean;
  3. Window : PMainWindow); forward;
  4. Function GetPathName(Item : PGtkTreeItem) : String;
  5. Var P : PChar;
  6. PTree : PGtkTree;
  7. begin
  8. gtk_label_get(PgtkLabel(PGtkBin(Item)^.Child),@P);
  9. Result:=StrPas(P);
  10. If (PGtkWidget(item)^.Parent<>Nil) then
  11. begin
  12. PTree:=PGtkTree(PgtkWidget(Item)^.Parent);
  13. If (Ptree^.Level<>0) Then
  14. Result:=AddTrailingSeparator(GetPathName(PgtkTreeItem(PTree^.Tree_Owner)))+Result
  15. end;
  16. end;
  17. Procedure DirSelect(Item : PGtkTreeItem; Window : PMainWindow);cdecl;
  18. begin
  19. ShowDir(Window,GetPathName(Item));
  20. end;
  21. Procedure DirExpand(Item : PGtkTreeItem; Window : PMainWindow);cdecl;
  22. Var
  23. Dir : String;
  24. SubTree : PGtkTree;
  25. SubNodes : PGList;
  26. Node : PGtkTreeItem;
  27. begin
  28. SubTree:=PgtkTree(Item^.SubTree);
  29. SubNodes:=gtk_container_children(PGtkContainer(SubTree));
  30. While SubNodes<>Nil do
  31. begin
  32. Node:=PgtkTreeItem(SubNodes^.Data);
  33. If (Node^.SubTree<>Nil) then
  34. gtk_tree_item_remove_subtree(Node);
  35. Scandirs(GetPathName(Node),Nil,Node,False,Window);
  36. SubNodes:=g_list_remove_link(SubNodes,SubNodes);
  37. end;
  38. end;
  39. Procedure Scandirs(Path: String; Tree : PgtkTree;
  40. Node: PGtkTreeItem ; SubSub : Boolean;
  41. Window : PMainWindow);
  42. Var
  43. NewTree : PGtkTree;
  44. NewNode : PGtkTreeItem;
  45. Info : TSearchRec;
  46. S,FP : AnsiString;
  47. begin
  48. NewTree:=Nil;
  49. FP:=AddTrailingSeparator(Path);
  50. If FindFirst(FP+'*.*',faAnyfile,Info)=0 then
  51. Try
  52. repeat
  53. If ((Info.Attr and faDirectory)=faDirectory) then
  54. begin
  55. S:=Info.Name;
  56. If (S<>'.') and (S<>'..') then
  57. begin
  58. If (Node<>Nil) then
  59. begin
  60. If (NewTree=Nil) and (node<>Nil) then
  61. begin
  62. NewTree:=PGtkTree(gtk_tree_new);
  63. gtk_tree_item_set_subtree(Node,PGtkWidget(NewTree));
  64. end
  65. end
  66. else
  67. NewTree:=Tree;
  68. NewNode:=PGtkTreeItem(gtk_tree_item_new_with_label(Pchar(S)));
  69. gtk_tree_append(NewTree,PgtkWidget(NewNode));
  70. gtk_signal_connect(PGtkObject(NewNode),'select',
  71. TGtkSignalFunc(@DirSelect),Window);
  72. gtk_signal_connect(PGtkObject(NewNode),'expand',
  73. TGtkSignalFunc(@DirExpand),Window);
  74. If SubSub then
  75. ScanDirs(FP+S,Tree,NewNode,False,Window);
  76. gtk_widget_show(PGtkWidget(NewNode));
  77. end;
  78. end;
  79. until FindNext(Info)<>0;
  80. Finally
  81. FindClose(Info);
  82. end;
  83. gtk_widget_show(PGtkWidget(Node));
  84. end;
  85. Function NewDirtree (MainWindow : PMainWindow) : PGtkTree;
  86. begin
  87. Result:=PGtkTree(gtk_tree_new());
  88. With MainWindow^ do
  89. begin
  90. TreeScrollWindow:=PGtkScrolledWindow(gtk_scrolled_window_new(Nil,Nil));
  91. gtk_widget_show(PGtkWidget(TreeScrollWindow));
  92. gtk_scrolled_window_set_policy(TreeScrollWindow,
  93. GTK_POLICY_AUTOMATIC,
  94. GTK_POLICY_AUTOMATIC);
  95. gtk_scrolled_window_add_with_viewport(TreeScrollWindow,PGtkWidget(Result));
  96. RootNode:=PGtkTreeItem(gtk_tree_Item_new_with_label(Pchar(PathSeparator)));
  97. gtk_tree_append(Result,PgtkWidget(RootNode));
  98. scandirs(PathSeparator,Result, RootNode,True,MainWindow);
  99. gtk_tree_item_expand(rootnode);
  100. end;
  101. end;