📄 mainform.cpp
字号:
/********************************************** ** 文件名: MainForm.cpp ** 建立日期: 2002年7月20日 ** 作者: 何林强 ** 描述: ***********************************************/#include "stdglo.h"Shftp_connect_info ftp_Connection_info[5]={{NULL,0},{NULL,0},{NULL,0},{NULL,0},{NULL,0}};Shftp_pixmap filestyle[5]; //标示列表框中五种不同类型文件的五个图标./***************************************类 Chftp_Form部分***************************************//********************************************** ** 类Chftp_Form的构造函数,用于完成整个图形 ** 界面的初始化工作. *********************************************/Chftp_Form::Chftp_Form(gint argc, gchar **argv){ gnome_init("hFTP", "0.0.1", argc, argv); hftp_Build_Form("hFTP 0.0.1", GTK_WIN_POS_CENTER); //建立主窗口框架. hftp_init_pixmap(); hftp_View=new Chftp_View(TheWindow); //初始化客户区. gtk_signal_connect(GTK_OBJECT(TheWindow),"destroy", GTK_SIGNAL_FUNC(CloseTheApp),NULL); gtk_widget_show_all(TheWindow); //显示整个窗口. gtk_main();}void Chftp_Form::CloseTheApp(){ exit(0);}/****************************************** ** 初始化图标. *****************************************/void Chftp_Form::hftp_init_pixmap(){ GtkStyle *style; style=gtk_widget_get_style(TheWindow); filestyle[0].pixmap=gdk_pixmap_create_from_xpm(TheWindow->window, &(filestyle[0].mask),&style->bg[GTK_STATE_NORMAL], "/usr/local/share/pixmaps/dir.xpm"); filestyle[1].pixmap=gdk_pixmap_create_from_xpm(TheWindow->window, &(filestyle[1].mask),&style->bg[GTK_STATE_NORMAL], "/usr/local/share/pixmaps/dotdot.xpm"); filestyle[2].pixmap=gdk_pixmap_create_from_xpm(TheWindow->window, &(filestyle[2].mask),&style->bg[GTK_STATE_NORMAL], "/usr/local/share/pixmaps/open_dir.xpm"); filestyle[3].pixmap=gdk_pixmap_create_from_xpm(TheWindow->window, &(filestyle[3].mask),&style->bg[GTK_STATE_NORMAL], "/usr/local/share/pixmaps/exe.xpm"); filestyle[4].pixmap=gdk_pixmap_create_from_xpm(TheWindow->window, &(filestyle[4].mask),&style->bg[GTK_STATE_NORMAL], "/usr/local/share/pixmaps/linkdir.xpm");}void Chftp_Form::hftp_Build_Form(const gchar *title,GtkWindowPosition position){ TheWindow=gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW (TheWindow), "hFTP 测试版"); gtk_container_set_border_width(GTK_CONTAINER(TheWindow),2); gtk_window_set_wmclass(GTK_WINDOW(TheWindow), "main", "hFTP"); gtk_widget_set_name(TheWindow, "hFTP 0.0.1"); gtk_window_set_policy(GTK_WINDOW (TheWindow), TRUE, TRUE, TRUE); //设置窗口显示时的一些属性. gtk_widget_realize(TheWindow); gtk_window_set_position(GTK_WINDOW(TheWindow),position); gtk_window_set_default_size(GTK_WINDOW(TheWindow),800,600);}Chftp_Form::~Chftp_Form(){ if(hftp_View) delete hftp_View;}/*****************************************类Chftp_View部分************************************/Chftp_Table *Chftp_View::hftp_Table; Chftp_Toolbar *Chftp_View::hftp_Toolbar;/******************************************** ** 该函数完成整个窗口界面的初始化工作 *******************************************/Chftp_View::Chftp_View(GtkWidget *TheWindow){ try{ TheView=gtk_vbox_new(FALSE,0); //创建主容器. gtk_widget_show(TheView); gtk_container_add(GTK_CONTAINER(TheWindow),TheView); if(!(hftp_Menu=new Chftp_Menu(TheView))) //创建菜单. throw Chftp_error("菜单创建失败,如若多次出现此类情况,请联系作者."); if(!(hftp_Toolbar=new Chftp_Toolbar(TheView))) //创建信息输入区域. throw Chftp_error("工具栏创建失败,如若多次出现此类情况,请联系作者."); if(!(hftp_Table=new Chftp_Table(TheView)))//主界面接下来的所有部分(全部在一个包装表中). throw Chftp_error("界面初始化失败,如若多次出现此类情况,请联系作者."); hftp_Connect_Signal(); } catch(Chftp_error& UIerror){ UIerror.messagebox(); }}/************************************************ ** 输入栏中,在四个输入框任何一个按下回车均引发** 系统连接。*************************************************/void Chftp_View::hftp_Connect_Signal(){ gtk_signal_connect (GTK_OBJECT(GTK_ENTRY(GTK_COMBO(hftp_Toolbar->hftp_GetHostname())->entry)), "activate", GTK_SIGNAL_FUNC (hftp_start_connect),NULL); gtk_signal_connect (GTK_OBJECT(GTK_ENTRY(hftp_Toolbar->hftp_GetHostport())), "activate", GTK_SIGNAL_FUNC (hftp_start_connect),NULL); gtk_signal_connect (GTK_OBJECT(GTK_ENTRY(hftp_Toolbar->hftp_GetUser())), "activate", GTK_SIGNAL_FUNC (hftp_start_connect),NULL); gtk_signal_connect (GTK_OBJECT(GTK_ENTRY(hftp_Toolbar->hftp_GetPasswd())), "activate", GTK_SIGNAL_FUNC (hftp_start_connect),NULL); gtk_signal_connect (GTK_OBJECT(GTK_BUTTON(hftp_Toolbar->hftp_Getbutton())), "clicked", GTK_SIGNAL_FUNC (hftp_start_connect),NULL); gtk_signal_connect(GTK_OBJECT(hftp_Table->Local->marklist),"button_press_event", GTK_SIGNAL_FUNC(quick_connect),(gpointer)this);}/***************************************************** ** 创建一个连接,为一个连接分配一个单独的完整ftp协议** 类,最大允许连接数设置为5。*******************************************************/void Chftp_View::hftp_start_connect(){ gint i; GtkWidget *dialog; for(i=0;i<5;i++) if(0!=ftp_Connection_info[i].state){ if(ftp_Connection_info[i].ftp_Connection) delete ftp_Connection_info[i].ftp_Connection; ftp_Connection_info[i].ftp_Connection=NULL; ftp_Connection_info[i].state=0; } for(i=0;i<5;i++) if(NULL==ftp_Connection_info[i].ftp_Connection) break; if(5==i){ dialog=gnome_message_box_new("您已建立了过多的连接,无法建立新连接!", GNOME_MESSAGE_BOX_WARNING,GNOME_STOCK_BUTTON_OK,NULL); gtk_widget_show(dialog); return; } try{ ftp_Connection_info[i].ftp_Connection=new Chftp_transfer(hftp_Table->Remote->hftp_Getnotebox(), hftp_Table->Local->Local_Filelist, hftp_Toolbar,hftp_Table->StateBox, hftp_Table->Local->GetLocaldata(),i); if(!ftp_Connection_info[i].ftp_Connection) throw Chftp_error("系统错误导致建立连接失败!"); } catch(Chftp_error& UIerror){ UIerror.messagebox(); } return;}void Chftp_View::quick_connect(GtkWidget *widget, GdkEventButton *event,gpointer data){ gint row,column; gchar *temp; guint8 for_pix; Shftp_Address *Apointer=hftp_Table->Local->bookmark->address; if(GDK_2BUTTON_PRESS==event->type && 1==event->button){ //鼠标双击事件. gtk_clist_get_selection_info(GTK_CLIST(widget),(int)event->x,(int)event->y,&row,&column); if(0==gtk_clist_get_pixtext(GTK_CLIST(widget),row,0,&temp,&for_pix,NULL,NULL)) return; while(0!=strcmp(Apointer->title,temp) && Apointer!=NULL) Apointer=Apointer->next; if(!Apointer) return; gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(hftp_Toolbar->hftp_GetHostname())->entry),Apointer->sever_name); gtk_entry_set_text(GTK_ENTRY(hftp_Toolbar->hftp_GetHostport()),Apointer->sever_port); gtk_entry_set_text(GTK_ENTRY(hftp_Toolbar->hftp_GetUser()),Apointer->user_name); gtk_entry_set_text(GTK_ENTRY(hftp_Toolbar->hftp_GetPasswd()),Apointer->passwd); hftp_start_connect(); }}Chftp_View::~Chftp_View(){ if(hftp_Menu) delete hftp_Menu; if(hftp_Toolbar) delete hftp_Toolbar; if(hftp_Table) delete hftp_Table; for(int i=0;i<5;i++) if(ftp_Connection_info[i].ftp_Connection) delete ftp_Connection_info[i].ftp_Connection;}/*****************************************类Chftp_Menu部分*********************************//************************************** **初始化菜单内容 *************************************/GtkItemFactoryEntry Chftp_Menu::MenuItems[5]={{"/_FTP",NULL,0,0,"<Branch>"}, {"/FTP/dash",NULL,0,0,"<Separator>"}, {"/FTP/退出","<control>Q",ExitApp,0}, {"/_帮助",NULL,0,0,"<Branch>"}, {"/帮助/关于hFTP...","<control>H",AboutDialog,0}};/*******创建菜单*******************/Chftp_Menu::Chftp_Menu(GtkWidget *TheView){ GtkAccelGroup *Accel=NULL; GtkItemFactory *ItemFactory=NULL; Accel=gtk_accel_group_new(); ItemFactory=gtk_item_factory_new(GTK_TYPE_MENU_BAR,"<menu>",Accel); gtk_item_factory_create_items(ItemFactory, sizeof(MenuItems)/sizeof(MenuItems[0]),MenuItems,NULL); gtk_accel_group_attach(Accel,GTK_OBJECT(TheView)); gtk_box_pack_start(GTK_BOX(TheView), gtk_item_factory_get_widget(ItemFactory,"<menu>"),FALSE,FALSE,0);}/********************************* ** 以下两个为菜单项的回调函数 ********************************/void Chftp_Menu::AboutDialog(){ GtkWidget *About_dialog=NULL; const gchar *author[]={"何林强",NULL}; About_dialog = gnome_about_new("hFTP","0.0.1","Copyright (c) 2002",(const gchar **)author, "Email: helinqiang@163.net",NULL); gtk_widget_show(About_dialog);}void Chftp_Menu::ExitApp(){ exit(0);}/************************************类Chftp_Toolbar部分*****************************************//********************************************** ** 建立输入工具栏,放在一个frame里面,frame风格 ** 为向上突起. *********************************************/Chftp_Toolbar::Chftp_Toolbar(GtkWidget *TheView){ GtkWidget *frame, *pixmapwid; GdkBitmap *mask; GtkStyle *style; GdkPixmap *pixmap; frame=gtk_frame_new(NULL); gtk_widget_show(frame); gtk_frame_set_shadow_type(GTK_FRAME(frame),GTK_SHADOW_OUT); gtk_box_pack_start(GTK_BOX(TheView),frame,FALSE,FALSE,0); InputBar=gtk_hbox_new(FALSE,2); gtk_widget_show(InputBar); gtk_container_add(GTK_CONTAINER(frame),InputBar); style=gtk_widget_get_style(InputBar); pixmap=gdk_pixmap_create_from_xpm(InputBar->window, &mask,&style->bg[GTK_STATE_NORMAL], "/usr/local/share/pixmaps/connect.xpm"); pixmapwid=gtk_pixmap_new(pixmap,mask); //连接用的一个图形化按钮. gtk_widget_show(pixmapwid); connect_button=gtk_button_new(); gtk_container_add(GTK_CONTAINER(connect_button),pixmapwid); gtk_widget_show(connect_button); gtk_box_pack_start(GTK_BOX(InputBar),connect_button,FALSE,FALSE,0); Hostname=sub_Build_InputBar("主机:",180,1); Hostport=sub_Build_InputBar("端口:",50,0); User=sub_Build_InputBar("用户名:",120,0); Passwd=sub_Build_InputBar("密码:",120,2);}GtkWidget *Chftp_Toolbar::sub_Build_InputBar(gchar *label_name,gint width,gint como){ GtkWidget *window=NULL,*label=NULL; label=gtk_label_new(label_name); gtk_widget_show(label); gtk_box_pack_start(GTK_BOX(InputBar),label,FALSE,FALSE,0); if(1==como){ window=gtk_combo_new(); //对于主机名,要建组合框, gtk_combo_disable_activate(GTK_COMBO(window));} else if(0==como) window=gtk_entry_new(); //其他建立输入框. else{ window=gtk_entry_new(); gtk_entry_set_visibility (GTK_ENTRY(window),FALSE); //密码输入不可见. } gtk_widget_set_usize(window,width,-1); gtk_box_pack_start(GTK_BOX(InputBar),window,FALSE,FALSE,0); return window;}/***********************************************类Chftp_Table部分**********************************/Chftp_Table::Chftp_Table(GtkWidget *TheView){ hpanel=gtk_hpaned_new(); gtk_widget_show(hpanel); table=gtk_table_new(5,280,TRUE); gtk_widget_show(table); gtk_table_attach_defaults(GTK_TABLE(table),hpanel,0,280,0,4); gtk_box_pack_start(GTK_BOX(TheView),table,TRUE,TRUE,0); try{ if(!(Local=new Chftp_Local(hpanel,0,100)) || //建立远程和本地两个文件列表框. !(Remote=new Chftp_Remote(hpanel,101,280)) || !(StateBox=new Chftp_State(table))) throw Chftp_error("界面初始化失败,程序即将被关闭!"); } catch(Chftp_error& UIerror){ UIerror.messagebox(); }}Chftp_Table::~Chftp_Table(){ if(Local) delete Local; if(Remote) delete Remote; if(StateBox) delete StateBox;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -