123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- unit frmmain;
- {$mode objfpc}
- Interface
- Uses gtk,gdk,glib,sysutils,classes;
- Type
- TMainWindow = Record
- FDir,
- FMask : String;
- Window : PGtkWindow;
- Menu : PGtkMenuBar;
- Toolbar : PGtkToolBar;
- DirTree : PGtkTree;
- FileList : PGtkClist;
- Pane : PGtkPaned;
- StatusBar : PGtkStatusBar;
- FilesHeader,DirHeader : PGtkLabel;
- // helper objects - Menu
- Accel : PGtkAccelGroup;
- MFile,
- MView,
- MColumns,
- MHelp,
- // Main menu items
- PMFiles : PGtkMenu;
- MIFile,
- MIFileProperties,
- MIFileDelete,
- MIExit,
- MIColumns,
- MIMask,
- MIAbout,
- MIHelp : PGtkMenuItem;
- MIShowTitles,
- MIShowExt,
- MIShowSize,
- MiShowDate,
- MIShowAttrs : PGtkCheckMenuItem;
- // Files PopupMenu Items:
- PMIFileProperties,
- PMIFileDelete : PGtkMenuItem;
- // Packing boxes
- VBox,
- LeftBox,
- RightBox : PGtkBox;
- // Scroll boxes
- TreeScrollWindow,
- ListScrollWindow : PGtkScrolledWindow;
- // Tree root node.
- RootNode : PGtkTreeItem;
-
- end;
- PMainWindow = ^TMainWindow;
- Function NewMainForm : PMainWindow;
- Function NewMainMenu(MainWindow : PMainWindow) : PGtkMenuBar;
- Function NewToolbar(MainWindow : PMainWindow) : PGtkToolbar;
- Function NewDirtree(MainWindow : PMainWindow) : PGtkTree;
- Function NewFileList(MainWindow : PMainWindow) : PGtkClist;
- Procedure ShowDir (Window : PMainWindow; Dir : String);
- Function NewFilePopupMenu (MainWindow : PMainWindow) : PGtkMenu;
- Implementation
- uses menus,futils,frmabout,fxbitmaps,frmprops,frmmask;
- Const
- SFileExplorer : PChar = 'File explorer';
- SFilesindir = 'Files in directory %s';
- SDirTree : Pchar = 'Directory tree';
- {$i filelist.inc}
- {$i dirlist.inc}
- {$i factions.inc}
- procedure destroy(widget : pGtkWidget ; Window : PMainWindow); cdecl;
- begin
- gtk_clist_clear(Window^.FileList);
- dispose(Window);
- gtk_main_quit();
- end;
- procedure DoAbout(widget : pGtkWidget ; data: pgpointer ); cdecl;
- begin
- ShowAboutForm(NewAboutform);
- end;
- Procedure ApplyMask(Mask : String; Data : Pointer);
- begin
- PMainWindow(data)^.FMask:=Mask;
- RefreshFileView(PMainWindow(Data));
- end;
- procedure DoMask(Widget : PGtkWidget ; MainForm : PMainWindow ); cdecl;
- Var
- S : AnsiString;
-
- begin
- With NewMaskForm^ do
- begin
- S:=MainForm^.FMask;
- gtk_entry_set_text(EMask,PChar(S));
- CallBack:=@ApplyMask;
- CallBackData:=MainForm;
- gtk_widget_show_all(PgtkWidget(Window));
- end;
- end;
- Function NewMainForm : PMainWindow;
- begin
- Result:=New(PMainWindow);
- With Result^ do
- begin
- FMask:='*.*';
- Window:=PgtkWindow(gtk_window_new(GTK_WINDOW_TOPLEVEL));
- gtk_window_set_title(Window,SFileExplorer);
- gtk_widget_set_usize(PgtkWidget(Window),640,480);
- gtk_signal_connect (PGTKOBJECT (window), 'destroy',
- GTK_SIGNAL_FUNC (@destroy), Result);
- gtk_widget_realize(PgtkWidget(window));
- Menu:=NewMainMenu(Result);
- ToolBar:=NewToolbar(Result);
- Pane:=PgtkPaned(gtk_hpaned_new);
- StatusBar:=PgtkStatusBar(gtk_statusbar_new);
- FileList:=NewFileList(Result);
- DirTree:=NewDirtree(Result);
- PMFiles:=NewFilePopupMenu(Result);
- FilesHeader:=PgtkLabel(gtk_label_new(pchar(SFilesInDir)));
- DirHeader:=PgtkLabel(gtk_label_new(pchar(SDirTree)));
- LeftBox:=PGtkBox(gtk_vbox_new(false,0));
- gtk_box_pack_start(Leftbox,PGtkWidget(DirHeader),False,False,0);
- gtk_box_pack_start(Leftbox,PgtkWidget(TreeScrollWindow),true,True,0);
- gtk_paned_add1(pane,PGtkWidget(Leftbox));
- RightBox:=PGtkBox(gtk_vbox_new(false,0));
- gtk_box_pack_start(Rightbox,PGtkWidget(FilesHeader),False,False,0);
- gtk_box_pack_start(Rightbox,PGtkWidget(ListScrollWindow),true,True,0);
- gtk_paned_add2(pane,PGtkWidget(Rightbox));
- VBox:=PGtkBox(gtk_vbox_new(false,0));
- gtk_container_add(PGtkContainer(Window),PgtkWidget(VBox));
- gtk_box_pack_start(vbox,PGtkWidget(Menu),False,False,0);
- gtk_widget_show_all(PGtkWidget(vbox));
- gtk_box_pack_start(vbox,PGtkWidget(ToolBar),False,False,0);
- gtk_box_pack_start(vbox,PGtkWidget(Pane),true,true,0);
- gtk_box_pack_start(vbox,PGtkWidget(StatusBar),false,false,0);
- end;
- end;
- Function NewMainMenu(MainWindow : PMainWindow) : PGtkMenuBar;
- begin
- With MainWindow^ do
- begin
- Result:=pgtkmenubar(gtk_menu_bar_new);
- Accel:=gtk_accel_group_new;
- gtk_window_add_accel_group(Window,accel);
- MFile:=AddMenuToMenuBar(Result,accel,'_File',Nil,Nil,False,MIFile);
- MIFileProperties:=AddItemToMenu(MFile,accel,'_Properties','<alt>p',TgtkSignalFunc(@DoProperties),MainWindow);
- MIFileDelete:=AddItemToMenu(MFile,accel,'_Delete','',TgtkSignalFunc(@DeleteFile),MainWindow);
- AddSeparatorToMenu(MFile);
- MIExit:=AddItemToMenu(MFile,accel,'E_xit','<alt>x',TgtkSignalFunc(@destroy),MainWindow);
- MView:=AddMenuToMenuBar(Result,accel,'_View',Nil,Nil,False,MIFile);
- MIShowTitles:=AddCheckItemToMenu(MView,accel,'Hide titles','',TgtkSignalFunc(@ToggleFileListTitles),MainWindow);
- MIColumns:=AddItemToMenu(MView,accel,'Hide columns','',Nil,MainWindow);
- MIMask:=AddItemToMenu(MView,accel,'File Mask','',TGtkSignalFunc(@DoMask),MainWindow);
- MColumns:=PgtkMenu(gtk_menu_new);
- gtk_menu_item_set_submenu(MIColumns, PgtkWidget(MColumns));
- MIShowExt:=AddCheckItemToMenu(MColumns,accel,'Extension','',TgtkSignalFunc(@ToggleFileListColumns),MainWindow);
- MIShowSize:=AddCheckItemToMenu(MColumns,accel,'Size','',TgtkSignalFunc(@ToggleFileListColumns),MainWindow);
- MIShowDate:=AddCheckItemToMenu(MColumns,accel,'Date','',TgtkSignalFunc(@ToggleFileListColumns),MainWindow);
- MIShowAttrs:=AddCheckItemToMenu(MColumns,accel,'Attributes','',TgtkSignalFunc(@ToggleFileListColumns),MainWindow);
- MHelp:=AddMenuToMenuBar(Result,accel,'_Help',Nil,Nil,True,MIHelp);
- MIAbout:=AddItemToMenu(MHelp,accel,'_About','',TgtkSignalFunc(@DoAbout),Nil);
- gtk_widget_show(PgtkWidget(result));
- end;
- end;
- Function NewToolbar (MainWindow : PMainWindow) : PGtkToolbar;
- begin
- Result:=pGtkToolBar(gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL,GTK_TOOLBAR_ICONS));
- gtk_toolbar_append_item(result,
- Nil,
- 'File Properties',
- nil,
- CreateWidgetFromXPm(PgtkWidget(MainWindow^.Window),@PropertiesXPM),
- TgtkSignalFunc(@DoProperties),
- MainWindow);
- gtk_toolbar_append_item(result,
- Nil,
- 'Delete File',
- Nil,
- CreateWidgetFromXPm(PgtkWidget(MainWindow^.Window),@DeleteXPM),
- TgtkSignalFunc(@DeleteFile),
- MainWindow);
- end;
- Procedure ShowDir (Window : PMainWindow; Dir : String);
- begin
- With Window^ do
- begin
- FDir:=Dir;
- FillList(FileList,Dir,FMask);
- gtk_label_set_text(FilesHeader,pchar(Format(SFilesInDir,[Dir])));
- end;
- end;
- Procedure PMFilesActivate(Widget : PGtkWidget; Window : PMainWindow); cdecl;
- Var State : TGtkStateType;
- begin
- if GetFileSelectionCount(Window^.FileList)>1 then
- State:=GTK_STATE_INSENSITIVE
- else
- State:=GTK_STATE_Normal;
- gtk_widget_set_state(PgtkWidget(Window^.PMIFileProperties),State);
- end;
- Function NewFilePopupMenu (MainWindow : PMainWindow) : PGtkMenu;
- begin
- result:=PGtkMenu(gtk_menu_new);
- gtk_signal_connect(PGtkObject(result),'show',
- TGtkSignalFunc(@PMFilesActivate),MainWindow);
- With MainWindow^ do
- begin
- PMIFileProperties:=AddItemToMenu(Result,Accel,'_Properties','',TgtkSignalFunc(@DoProperties),MainWindow);
- PMIFileDelete:=AddItemToMenu(Result,Accel,'_Delete','<ctrl>d',TgtkSignalFunc(@DeleteFile),MainWindow);
- end;
- end;
- end.
|