frmmain.pp 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. unit frmmain;
  2. {$mode objfpc}
  3. Interface
  4. Uses gtk,gdk,glib,sysutils,classes;
  5. Type
  6. TMainWindow = Record
  7. FDir,
  8. FMask : String;
  9. Window : PGtkWindow;
  10. Menu : PGtkMenuBar;
  11. Toolbar : PGtkToolBar;
  12. DirTree : PGtkTree;
  13. FileList : PGtkClist;
  14. Pane : PGtkPaned;
  15. StatusBar : PGtkStatusBar;
  16. FilesHeader,DirHeader : PGtkLabel;
  17. // helper objects - Menu
  18. Accel : PGtkAccelGroup;
  19. MFile,
  20. MView,
  21. MColumns,
  22. MHelp,
  23. // Main menu items
  24. PMFiles : PGtkMenu;
  25. MIFile,
  26. MIFileProperties,
  27. MIFileDelete,
  28. MIExit,
  29. MIColumns,
  30. MIMask,
  31. MIAbout,
  32. MIHelp : PGtkMenuItem;
  33. MIShowTitles,
  34. MIShowExt,
  35. MIShowSize,
  36. MiShowDate,
  37. MIShowAttrs : PGtkCheckMenuItem;
  38. // Files PopupMenu Items:
  39. PMIFileProperties,
  40. PMIFileDelete : PGtkMenuItem;
  41. // Packing boxes
  42. VBox,
  43. LeftBox,
  44. RightBox : PGtkBox;
  45. // Scroll boxes
  46. TreeScrollWindow,
  47. ListScrollWindow : PGtkScrolledWindow;
  48. // Tree root node.
  49. RootNode : PGtkTreeItem;
  50. end;
  51. PMainWindow = ^TMainWindow;
  52. Function NewMainForm : PMainWindow;
  53. Function NewMainMenu(MainWindow : PMainWindow) : PGtkMenuBar;
  54. Function NewToolbar(MainWindow : PMainWindow) : PGtkToolbar;
  55. Function NewDirtree(MainWindow : PMainWindow) : PGtkTree;
  56. Function NewFileList(MainWindow : PMainWindow) : PGtkClist;
  57. Procedure ShowDir (Window : PMainWindow; Dir : String);
  58. Function NewFilePopupMenu (MainWindow : PMainWindow) : PGtkMenu;
  59. Implementation
  60. uses menus,futils,frmabout,fxbitmaps,frmprops,frmmask;
  61. Const
  62. SFileExplorer : PChar = 'File explorer';
  63. SFilesindir = 'Files in directory %s';
  64. SDirTree : Pchar = 'Directory tree';
  65. {$i filelist.inc}
  66. {$i dirlist.inc}
  67. {$i factions.inc}
  68. procedure destroy(widget : pGtkWidget ; Window : PMainWindow); cdecl;
  69. begin
  70. gtk_clist_clear(Window^.FileList);
  71. dispose(Window);
  72. gtk_main_quit();
  73. end;
  74. procedure DoAbout(widget : pGtkWidget ; data: pgpointer ); cdecl;
  75. begin
  76. ShowAboutForm(NewAboutform);
  77. end;
  78. Procedure ApplyMask(Mask : String; Data : Pointer);
  79. begin
  80. PMainWindow(data)^.FMask:=Mask;
  81. RefreshFileView(PMainWindow(Data));
  82. end;
  83. procedure DoMask(Widget : PGtkWidget ; MainForm : PMainWindow ); cdecl;
  84. Var
  85. S : AnsiString;
  86. begin
  87. With NewMaskForm^ do
  88. begin
  89. S:=MainForm^.FMask;
  90. gtk_entry_set_text(EMask,PChar(S));
  91. CallBack:=@ApplyMask;
  92. CallBackData:=MainForm;
  93. gtk_widget_show_all(PgtkWidget(Window));
  94. end;
  95. end;
  96. Function NewMainForm : PMainWindow;
  97. begin
  98. Result:=New(PMainWindow);
  99. With Result^ do
  100. begin
  101. FMask:='*.*';
  102. Window:=PgtkWindow(gtk_window_new(GTK_WINDOW_TOPLEVEL));
  103. gtk_window_set_title(Window,SFileExplorer);
  104. gtk_widget_set_usize(PgtkWidget(Window),640,480);
  105. gtk_signal_connect (PGTKOBJECT (window), 'destroy',
  106. GTK_SIGNAL_FUNC (@destroy), Result);
  107. gtk_widget_realize(PgtkWidget(window));
  108. Menu:=NewMainMenu(Result);
  109. ToolBar:=NewToolbar(Result);
  110. Pane:=PgtkPaned(gtk_hpaned_new);
  111. StatusBar:=PgtkStatusBar(gtk_statusbar_new);
  112. FileList:=NewFileList(Result);
  113. DirTree:=NewDirtree(Result);
  114. PMFiles:=NewFilePopupMenu(Result);
  115. FilesHeader:=PgtkLabel(gtk_label_new(pchar(SFilesInDir)));
  116. DirHeader:=PgtkLabel(gtk_label_new(pchar(SDirTree)));
  117. LeftBox:=PGtkBox(gtk_vbox_new(false,0));
  118. gtk_box_pack_start(Leftbox,PGtkWidget(DirHeader),False,False,0);
  119. gtk_box_pack_start(Leftbox,PgtkWidget(TreeScrollWindow),true,True,0);
  120. gtk_paned_add1(pane,PGtkWidget(Leftbox));
  121. RightBox:=PGtkBox(gtk_vbox_new(false,0));
  122. gtk_box_pack_start(Rightbox,PGtkWidget(FilesHeader),False,False,0);
  123. gtk_box_pack_start(Rightbox,PGtkWidget(ListScrollWindow),true,True,0);
  124. gtk_paned_add2(pane,PGtkWidget(Rightbox));
  125. VBox:=PGtkBox(gtk_vbox_new(false,0));
  126. gtk_container_add(PGtkContainer(Window),PgtkWidget(VBox));
  127. gtk_box_pack_start(vbox,PGtkWidget(Menu),False,False,0);
  128. gtk_widget_show_all(PGtkWidget(vbox));
  129. gtk_box_pack_start(vbox,PGtkWidget(ToolBar),False,False,0);
  130. gtk_box_pack_start(vbox,PGtkWidget(Pane),true,true,0);
  131. gtk_box_pack_start(vbox,PGtkWidget(StatusBar),false,false,0);
  132. end;
  133. end;
  134. Function NewMainMenu(MainWindow : PMainWindow) : PGtkMenuBar;
  135. begin
  136. With MainWindow^ do
  137. begin
  138. Result:=pgtkmenubar(gtk_menu_bar_new);
  139. Accel:=gtk_accel_group_new;
  140. gtk_window_add_accel_group(Window,accel);
  141. MFile:=AddMenuToMenuBar(Result,accel,'_File',Nil,Nil,False,MIFile);
  142. MIFileProperties:=AddItemToMenu(MFile,accel,'_Properties','<alt>p',TgtkSignalFunc(@DoProperties),MainWindow);
  143. MIFileDelete:=AddItemToMenu(MFile,accel,'_Delete','',TgtkSignalFunc(@DeleteFile),MainWindow);
  144. AddSeparatorToMenu(MFile);
  145. MIExit:=AddItemToMenu(MFile,accel,'E_xit','<alt>x',TgtkSignalFunc(@destroy),MainWindow);
  146. MView:=AddMenuToMenuBar(Result,accel,'_View',Nil,Nil,False,MIFile);
  147. MIShowTitles:=AddCheckItemToMenu(MView,accel,'Hide titles','',TgtkSignalFunc(@ToggleFileListTitles),MainWindow);
  148. MIColumns:=AddItemToMenu(MView,accel,'Hide columns','',Nil,MainWindow);
  149. MIMask:=AddItemToMenu(MView,accel,'File Mask','',TGtkSignalFunc(@DoMask),MainWindow);
  150. MColumns:=PgtkMenu(gtk_menu_new);
  151. gtk_menu_item_set_submenu(MIColumns, PgtkWidget(MColumns));
  152. MIShowExt:=AddCheckItemToMenu(MColumns,accel,'Extension','',TgtkSignalFunc(@ToggleFileListColumns),MainWindow);
  153. MIShowSize:=AddCheckItemToMenu(MColumns,accel,'Size','',TgtkSignalFunc(@ToggleFileListColumns),MainWindow);
  154. MIShowDate:=AddCheckItemToMenu(MColumns,accel,'Date','',TgtkSignalFunc(@ToggleFileListColumns),MainWindow);
  155. MIShowAttrs:=AddCheckItemToMenu(MColumns,accel,'Attributes','',TgtkSignalFunc(@ToggleFileListColumns),MainWindow);
  156. MHelp:=AddMenuToMenuBar(Result,accel,'_Help',Nil,Nil,True,MIHelp);
  157. MIAbout:=AddItemToMenu(MHelp,accel,'_About','',TgtkSignalFunc(@DoAbout),Nil);
  158. gtk_widget_show(PgtkWidget(result));
  159. end;
  160. end;
  161. Function NewToolbar (MainWindow : PMainWindow) : PGtkToolbar;
  162. begin
  163. Result:=pGtkToolBar(gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL,GTK_TOOLBAR_ICONS));
  164. gtk_toolbar_append_item(result,
  165. Nil,
  166. 'File Properties',
  167. nil,
  168. CreateWidgetFromXPm(PgtkWidget(MainWindow^.Window),@PropertiesXPM),
  169. TgtkSignalFunc(@DoProperties),
  170. MainWindow);
  171. gtk_toolbar_append_item(result,
  172. Nil,
  173. 'Delete File',
  174. Nil,
  175. CreateWidgetFromXPm(PgtkWidget(MainWindow^.Window),@DeleteXPM),
  176. TgtkSignalFunc(@DeleteFile),
  177. MainWindow);
  178. end;
  179. Procedure ShowDir (Window : PMainWindow; Dir : String);
  180. begin
  181. With Window^ do
  182. begin
  183. FDir:=Dir;
  184. FillList(FileList,Dir,FMask);
  185. gtk_label_set_text(FilesHeader,pchar(Format(SFilesInDir,[Dir])));
  186. end;
  187. end;
  188. Procedure PMFilesActivate(Widget : PGtkWidget; Window : PMainWindow); cdecl;
  189. Var State : TGtkStateType;
  190. begin
  191. if GetFileSelectionCount(Window^.FileList)>1 then
  192. State:=GTK_STATE_INSENSITIVE
  193. else
  194. State:=GTK_STATE_Normal;
  195. gtk_widget_set_state(PgtkWidget(Window^.PMIFileProperties),State);
  196. end;
  197. Function NewFilePopupMenu (MainWindow : PMainWindow) : PGtkMenu;
  198. begin
  199. result:=PGtkMenu(gtk_menu_new);
  200. gtk_signal_connect(PGtkObject(result),'show',
  201. TGtkSignalFunc(@PMFilesActivate),MainWindow);
  202. With MainWindow^ do
  203. begin
  204. PMIFileProperties:=AddItemToMenu(Result,Accel,'_Properties','',TgtkSignalFunc(@DoProperties),MainWindow);
  205. PMIFileDelete:=AddItemToMenu(Result,Accel,'_Delete','<ctrl>d',TgtkSignalFunc(@DeleteFile),MainWindow);
  206. end;
  207. end;
  208. end.