⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.cpp

📁 这个是LINUX下的HFTP测试版本
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/********************************************** **   文件名:   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 + -