linux gtk IDE 程序设计(五)

来源:互联网 发布:证券从业考试题库软件 编辑:程序博客网 时间:2024/06/05 05:24
   
     过几天女朋友就要来绵阳了,我希望能在女朋友来之前实现这个软件的基本功能,应为珠珠答应要给我设计软件的logo以及软件中其他的所有图片,这可能是我和她合作的第一个东东,所以我还是相当重视的哈
     已经有几天没有发布新版本了,并不是我这几天没做,而是程序遇到了很大的困难,虽然上一次的成果已经能够进行但文档编译了,但是要将其转化为多文档编译可不是一件简单的事情,即使到了现在我也都还没有完成,不过初步的多文档编辑已经搞定了哈,

在这段时间的程序设计中,代码越来越长,我实在是人受不了这么几千行的程序在一个文件下的编辑了,于是我终于将其划分开,变成了多文件。。。
现发个图片哈,这个是我的成果了,已经可以进行多文件编辑了,并且实现了初步的人性话设计~


以下是文件代码,这次比较新的东东是使用到了notebook控件,不过说实话,我觉得这个控件不是很好用,感觉有些该有的函数没有,要绕很大的弯子才能实现,也许是我没有使用熟练哈~
以下是代码
main.h
#ifndef _MAIN_H_
#define _MAIN_H_
#include "system.h"
//extern struct _FTableView* table_view;
extern FTableView* table_view;
//extern GtkTextBuffer* code ;
extern GtkTextBuffer* debug_view_buffer;
extern GtkWidget* press_button;

void main_window_init(void);
void show_init(void);
void interface_init(void);
void interface_set(void);
void debug_view_init(void);
void view_state_label_init(void);
gint delete_event(GtkWidget* widget, GdkEvent* event, gpointer data);
#endif





main.c
#include "main.h"
/*=============================*/
/*definition space             */
/*=============================*/
#define MAIN_WINDOW_WIDTH 790
#define MAIN_WINDOW_HIGH  590

FTableView* table_view;
GtkWidget* main_window;
GtkWidget* window;
GtkWidget* vbox;
GtkWidget* hbox;
GtkWidget* button_box;
GtkWidget* view_table;
GtkWidget* debug_view;
GtkWidget* debug_view_scroll;
/*variable of display*/
GtkWidget* main_menu_box;
GtkWidget* project_box;
GtkWidget* debug_box;
GtkWidget* view_box;
GtkWidget* view_state_label;
GtkWidget* view_state_label_box;
GtkWidget* debug_view_box;
GtkWidget* default_box;
/*jadge which page of view_table has be clicked*/
GtkWidget* press_button = NULL;

GtkWidget* tmp1;
GtkWidget* tmp2;
GtkWidget* tmp3;
GtkWidget* tmp4;

//GtkTextBuffer* code = NULL;
GtkTextBuffer* debug_view_buffer = NULL;

int main(int argc, char* argv[])
{
    /*init*/
    gtk_init(&argc,&argv);
    main_window_init();
    interface_init();
    debug_view_init();
    table_view = f_table_view_new();
    menu_init();
    view_state_label_init();
    tmp1 = gtk_button_new_with_label("project_space");
    tmp2 = gtk_button_new_with_label("debug_space");
    tmp3 = gtk_button_new_with_label("default_space");
    tmp4 = gtk_button_new_with_label("view_space");
    interface_set();
    g_print("table_view2:%d /n", table_view);
    g_signal_connect(G_OBJECT(tmp3),"event",G_CALLBACK(debug_function),NULL);
    /*show*/
    show_init();
    gtk_main();
    return 0;
}
/*answer the debug button*/
gint debug_function(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    GdkEventButton *button_event = (GdkEventButton *) event;
    //FViewLink* view_link = NULL;
    if (button_event->type == GDK_BUTTON_RELEASE )
    {
        FViewLink* tmp_link = view_link;
        while(tmp_link)
        {
            g_print("%s/n",tmp_link->file_name);
            tmp_link = tmp_link->p_next;
        }
    }
    return FALSE;
}

/*=================================*/
/*a common function to answer the  */
/*window_main                      */
/*=================================*/
gint delete_event(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    if(data == "main_window")
    {
      g_print("main_window send quit!/n");
    }
    //system("ls");
    gtk_main_quit();
    //gtk_widget_destroy(widget);
    return TRUE;
}
/***************************/
/*  init the main window   */
/***************************/
void main_window_init(void)
{
    main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title(GTK_WINDOW(main_window),"flyli");
    gtk_window_set_default_size(GTK_WINDOW(main_window),MAIN_WINDOW_WIDTH,MAIN_WINDOW_HIGH);
    gtk_widget_show(main_window);
    g_signal_connect (G_OBJECT (main_window), "delete_event", G_CALLBACK (delete_event), "main_window");
    g_signal_connect (G_OBJECT (main_window), "key_press_event",G_CALLBACK(main_window_key_press),NULL);
}   
/*************************************/
/* init the layout of the main window*/
/*************************************/
void interface_init(void)
{
    vbox = gtk_vbox_new(FALSE,0);
    hbox = gtk_hbox_new(FALSE,0);
    gtk_container_add(GTK_CONTAINER(main_window), vbox);
    main_menu_box = gtk_hbox_new(FALSE,0);
    project_box = gtk_hbox_new(FALSE,0);
    debug_box = gtk_hbox_new(FALSE,0);
    default_box = gtk_hbox_new(FALSE,0);
    view_box = gtk_hbox_new(FALSE,0);
    debug_view_box = gtk_vbox_new(FALSE,0);
    view_state_label_box = gtk_vbox_new(FALSE,0);
    gtk_widget_show(vbox);
    gtk_widget_show(hbox);
    gtk_widget_show(main_menu_box);
    gtk_widget_show(project_box);
    gtk_widget_show(debug_box);
    gtk_widget_show(view_box);
    gtk_widget_show(default_box);
    gtk_widget_show(view_state_label_box);
}
/***********************************/
/*set the layout of the main window*/
/***********************************/
void interface_set(void)
{
    GtkWidget* tt;
    tt = gtk_vbox_new(FALSE,0);
    gtk_box_pack_start(GTK_BOX(vbox), main_menu_box, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox), project_box, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(hbox), view_box, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(hbox), default_box, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), view_state_label, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(vbox), debug_box, FALSE, FALSE, 0);
    gtk_widget_set_usize(project_box,150,0);
    gtk_widget_set_usize(default_box,150,0);
    gtk_box_pack_start(GTK_BOX(project_box), tmp1, TRUE, TRUE, 0);
    gtk_box_pack_start(GTK_BOX(default_box), tmp3, TRUE, TRUE, 0);
    gtk_container_add (GTK_CONTAINER (debug_box), debug_view_scroll);
    gtk_box_pack_start(GTK_BOX(view_box), table_view->table, TRUE, TRUE, 0);
    g_print("table_view:%d /n", table_view);
    gtk_container_add (GTK_CONTAINER (debug_view_scroll), debug_view);
    gtk_box_pack_start(GTK_BOX(main_menu_box),main_menu_bar,TRUE, TRUE, 0);
}
/***********************/
/* init  show          */
/***********************/
void show_init(void)
{
    gtk_widget_show(tmp1);
    gtk_widget_show(tmp2);
    gtk_widget_show(tmp3);
    gtk_widget_show(tmp4);
    gtk_widget_show(debug_view);
    gtk_widget_show(debug_view_scroll);
}
/*****************/
/*debug view init*/
/*****************/
void debug_view_init(void)
{
    debug_view = gtk_text_view_new();
    debug_view_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(debug_view));
    debug_view_scroll = gtk_scrolled_window_new(NULL,NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(debug_view_scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    gtk_widget_show(debug_view_scroll);
    gtk_widget_show(debug_view);
}
/******************/
/*state label init*/
/******************/
void view_state_label_init(void)
{
    view_state_label = gtk_label_new("no file opened!");
    gtk_widget_show(view_state_label);
}

FMenu.h
#ifndef _F_MENU_H_
#define _F_MENU_H_
#include "system.h"
extern GtkWidget* main_menu;
extern GtkWidget* main_menu_bar;
extern GtkWidget* table_view_label_menu;

void menu_init(void);
gint file_open(GtkWidget* widget, GdkEvent* event, gpointer data);
gint file_open_ok(GtkWidget* widget, GdkEvent* event, gpointer data);
gint file_save(GtkWidget* widget, GdkEvent* event, gpointer data);
gint file_save_ok(GtkWidget* widget, GdkEvent* event, gpointer data);
gint debug_compile(GtkWidget* widget, GdkEvent* event, gpointer data);
gint debug_link(GtkWidget* widget, GdkEvent* event, gpointer data);
gint debug_run(GtkWidget* widget, GdkEvent* event, gpointer data);
gint debug_function(GtkWidget* widget, GdkEvent* event, gpointer data);
gint view_key_press(GtkWidget* widget, GdkEvent* event, gpointer data);
gint main_window_key_press(GtkWidget* widget, GdkEvent* event, gpointer data);
gint table_view_label_press(GtkWidget* widget, GdkEvent* event, gpointer data);
gint table_view_label_close(GtkWidget* widget, GdkEvent* event, gpointer data);
gint table_view_label_close_all(GtkWidget* widget, GdkEvent* event, gpointer data);
gint table_view_label_close_without_this_page(GtkWidget* widget, GdkEvent* event, gpointer data);
#endif



FMenu.c
#include "FMenu.h"
GtkWidget* main_menu;
GtkWidget* main_menu_bar;
GtkWidget* table_view_label_menu;
GtkWidget* file;
const char *file_name = NULL;
/**********************************/
/*init the menu of the main window*/
/**********************************/
void menu_init(void)
{
    GtkWidget* main_file_item;
    GtkWidget* menu_items;
    main_menu_bar = gtk_menu_bar_new();

    //file
    main_menu = gtk_menu_new();
    main_file_item = gtk_menu_item_new_with_label("File");
    gtk_widget_show(main_file_item);

    menu_items = gtk_menu_item_new_with_label("Open(Ctrl_f)");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
    gtk_widget_show (menu_items);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
    g_signal_connect (G_OBJECT (menu_items), "activate", G_CALLBACK (file_open), "main_file_item");

    menu_items = gtk_menu_item_new_with_label("Save(Ctrl_f)");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
    gtk_widget_show (menu_items);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
    g_signal_connect (G_OBJECT (menu_items), "activate", G_CALLBACK (file_save), "main_file_item");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu_bar),main_file_item);

    //debug
    main_menu = gtk_menu_new();
    main_file_item = gtk_menu_item_new_with_label("Debug");
    gtk_widget_show(main_file_item);

    menu_items = gtk_menu_item_new_with_label("Compile(F7)");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
    gtk_widget_show (menu_items);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
    g_signal_connect (G_OBJECT (menu_items), "activate", G_CALLBACK (debug_compile), "main_file_item");

    menu_items = gtk_menu_item_new_with_label("Link(F8)");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
    gtk_widget_show (menu_items);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
    g_signal_connect (G_OBJECT (menu_items), "activate", G_CALLBACK (debug_link), "main_file_item");

    menu_items = gtk_menu_item_new_with_label("Run(F9)");
    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu),menu_items);
    gtk_widget_show (menu_items);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM(main_file_item),main_menu);
    g_signal_connect (G_OBJECT (menu_items), "activate", G_CALLBACK (debug_run), "main_file_item");

    gtk_menu_shell_append(GTK_MENU_SHELL(main_menu_bar),main_file_item);
    //label view right button
    table_view_label_menu = gtk_menu_new();
    menu_items = gtk_menu_item_new_with_label("Close");
    gtk_menu_shell_append(GTK_MENU_SHELL(table_view_label_menu), menu_items);
    g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(table_view_label_close), NULL);
    gtk_widget_show(menu_items);

    menu_items = gtk_menu_item_new_with_label("Close all");
    gtk_menu_shell_append(GTK_MENU_SHELL(table_view_label_menu), menu_items);
    g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(table_view_label_close_all), NULL);
    gtk_widget_show(menu_items);

    menu_items = gtk_menu_item_new_with_label("Close all without this page");
    gtk_menu_shell_append(GTK_MENU_SHELL(table_view_label_menu), menu_items);
    g_signal_connect(G_OBJECT(menu_items), "activate", G_CALLBACK(table_view_label_close_without_this_page), NULL);
    gtk_widget_show(menu_items);


    gtk_widget_show(main_menu_bar);
}

/************************************************/
/*answer the file_open of the main_menu's signal*/
/************************************************/
gint file_open(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    file = gtk_file_selection_new("open file");
    g_signal_connect(GTK_FILE_SELECTION(file)->ok_button,"clicked",G_CALLBACK(file_open_ok),file);
    gtk_widget_show(file);
    g_printf("file_open/n");
    return TRUE;
}
/*************************************************************/
/*answer the file_open's ok_clicked of the main_menu's signal*/
/*************************************************************/
gint file_open_ok(GtkWidget* widget, GdkEvent* envet, gpointer data)
{
    int read_file = 0;
    int len = 0;
    GtkWidget* label = NULL;
    GtkWidget* tlabel = NULL;
    GtkWidget* hbox = NULL;
    GtkWidget* vbox = NULL;
    GtkWidget* view_scroll;
    GtkWidget* view;
    GtkTextIter end;
    char buf[1024] = {0};

    file_name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file));
    g_print("table_view:%d/n", table_view);
    f_table_view_read_file(table_view, file_name);
    gtk_widget_destroy(file);
    return TRUE;
}
/************************************************/
/*answer the file_save of the main_menu's signal*/
/************************************************/
gint file_save(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    FILE* fp = NULL;
    int write_file = 0;
    int len = 0;
    GtkTextIter start;
    GtkTextIter end;
    gchar* buf = NULL;
    char cmd[10000] = {0};
    int n_page = 0;
    GtkTextBuffer* text_buffer = NULL;
    int nth_page;
    GtkWidget* label = NULL;
    FViewLink* view_link = NULL;
    GtkWidget* page = NULL;
    n_page = gtk_notebook_get_n_pages(GTK_NOTEBOOK(table_view->table));
    g_print("-----------------------n_page:%d/n", n_page);
    if(n_page)
    {
        nth_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(table_view->table));
        g_print("nth_page:%d/n",nth_page);
        page = gtk_notebook_get_nth_page(GTK_NOTEBOOK(table_view->table), nth_page);
        g_print("page:%d/n", page);
        label = gtk_notebook_get_tab_label(GTK_NOTEBOOK(table_view->table),page );
        g_print("label:%d/n",label);       
        view_link = f_view_link_find_label(label);   
        g_print("view_link:%d/n",view_link);   
        fp= fopen(view_link->file_name, "w");
        text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(view_link->view));
        g_print("4/n");
        gtk_text_buffer_get_start_iter (text_buffer, &start);
        gtk_text_buffer_get_end_iter (text_buffer, &end);
        buf = gtk_text_buffer_get_text(text_buffer, &start, &end,FALSE);
        fwrite(buf, strlen(buf), 1, fp);
        fclose(fp);
    }
    /*if(file_name != NULL)
    {
        sprintf(cmd,"rm %s",file_name);
        system(cmd);
        close(write_file);
        fp= fopen(file_name, "w");
        //gtk_text_buffer_get_start_iter (code, &start);
        //gtk_text_buffer_get_end_iter (code, &end);
        //buf = gtk_text_buffer_get_text(code, &start, &end,FALSE);
        g_print("%d",strlen(buf));
        fwrite(buf, strlen(buf), 1, fp);
        fclose(fp);
    }
    else
    {
        file = gtk_file_selection_new("open file");
        g_signal_connect(GTK_FILE_SELECTION(file)->ok_button,"clicked",G_CALLBACK(file_save_ok),file);
        gtk_widget_show(file);
    }*/
    g_printf("file_save/n");
    return TRUE;
}
/*************************************************************/
/*answer the save_open's ok_clicked of the main_menu's signal*/
/*************************************************************/
gint file_save_ok(GtkWidget* widget, GdkEvent* envet, gpointer data)
{
    FILE* fp = NULL;
    int write_file = 0;
    int len = 0;
    GtkTextIter start;
    GtkTextIter end;
    char* buf = NULL;
    char cmd[1000] = {0};
   
    /*clear the code buffer*/
    //gtk_text_buffer_set_text(code, "NULL",0);
    file_name = gtk_file_selection_get_filename(GTK_FILE_SELECTION(file));
    write_file = open(file_name, O_WRONLY);
    sprintf(cmd,"rm %s",file_name);
    if(write_file != -1)
    {
        system(cmd);
    }
    close(write_file);
    fp= fopen(file_name, "w");
   
    //gtk_text_buffer_get_start_iter (code, &start);
    //gtk_text_buffer_get_end_iter (code, &end);
    //buf = gtk_text_buffer_get_text(code, &start, &end,FALSE);
   
    fwrite(buf, strlen(buf), 1, fp);
    fclose(fp);
    g_printf("%s save/n",file_name);
    gtk_widget_destroy(file);
    return TRUE;
}
/****************************************************/
/*answer the debug_compile of the main_menu's signal*/
/****************************************************/
gint debug_compile(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    long i = 0;
    char cmd[1000] = {0};
    char* compile_file_name = NULL;
    char* compile_file_path = NULL;
    char* debug_view_text = 0;
    int debug_file = 0;
    char system_rnt_read[1000] = {0};
    char debug_file_name[1000] = {0};
    GtkTextIter start;
    GtkTextIter end;
    g_print("Compile1/n");
    if(file_name != NULL)
    {
        compile_file_name = f_get_string_name((char*)file_name,F_NAME);    
        compile_file_path = f_get_string_name((char*)file_name,F_PATH);    
        sprintf(cmd,"gcc -c %s -o %s.o `pkg-config --cflags --libs gtk+-2.0` > %s/debug.info 2>&1", file_name, compile_file_name, compile_file_path);
        system(cmd);
        sprintf(debug_file_name,"%s/debug.info",compile_file_path);
        free(compile_file_name);
        free(compile_file_path);
    }
    g_print("debug_file_name:%s/n",debug_file_name);
    debug_file = open(debug_file_name,O_RDONLY);
    read(debug_file, system_rnt_read,  sizeof(system_rnt_read));
    gtk_text_buffer_set_text(debug_view_buffer,"NULL",0);
    gtk_text_buffer_get_end_iter(debug_view_buffer, &end);
    gtk_text_buffer_insert(debug_view_buffer, &end, system_rnt_read, strlen(system_rnt_read));

    gtk_text_buffer_get_start_iter(debug_view_buffer, &start);
    gtk_text_buffer_get_end_iter(debug_view_buffer, &end);
    debug_view_text = gtk_text_buffer_get_text(debug_view_buffer, &start, &end, TRUE);
    g_print("%s/n", debug_view_text);
    i = f_get_string_space("错误", debug_view_text);
    gtk_text_buffer_get_end_iter(debug_view_buffer, &end);
    g_print("i====%d/n",i);
    if(i == -1)
        gtk_text_buffer_insert(debug_view_buffer, &end, "恭喜!编译成功", strlen("恭喜!编译成功"));
    return TRUE;
}
/*************************************************/
/*answer the debug_link of the main_menu's signal*/
/*************************************************/
gint debug_link(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    long i = 0;
    char cmd[1000] = {0};
    char* compile_file_name = NULL;
    char* compile_file_path = NULL;
    char* debug_view_text = 0;
    int debug_file = 0;
    char system_rnt_read[1000] = {0};
    char debug_file_name[1000] = {0};
    GtkTextIter start;
    GtkTextIter end;
    g_print("Compile1/n");
    if(file_name != NULL)
    {
        compile_file_name = f_get_string_name((char*)file_name,F_NAME);    
        compile_file_path = f_get_string_name((char*)file_name,F_PATH);    
        sprintf(cmd,"gcc -o %s/main  %s.o `pkg-config --cflags --libs gtk+-2.0` > %s/debug.info 2>&1", compile_file_path, compile_file_name, compile_file_path);
        system(cmd);
        sprintf(debug_file_name,"%s/debug.info",compile_file_path);
        free(compile_file_name);
        free(compile_file_path);
    }
    g_print("debug_file_name:%s/n",debug_file_name);
    debug_file = open(debug_file_name,O_RDONLY);
    read(debug_file, system_rnt_read,  sizeof(system_rnt_read));
    gtk_text_buffer_set_text(debug_view_buffer,"NULL",0);
    gtk_text_buffer_get_end_iter(debug_view_buffer, &end);
    gtk_text_buffer_insert(debug_view_buffer, &end, system_rnt_read, strlen(system_rnt_read));
    //g_print("system_rnt_read:%s/n", system_rnt_read);
    gtk_text_buffer_get_start_iter(debug_view_buffer, &start);
    gtk_text_buffer_get_end_iter(debug_view_buffer, &end);
    debug_view_text = gtk_text_buffer_get_text(debug_view_buffer, &start, &end, TRUE);
    g_print("%s/n", debug_view_text);
    i = f_get_string_space("错误", debug_view_text);
    gtk_text_buffer_get_end_iter(debug_view_buffer, &end);
    g_print("i====%d/n",i);
    if(i == -1)
        gtk_text_buffer_insert(debug_view_buffer, &end, "恭喜!链接成功", strlen("恭喜!链接成功"));

    return TRUE;
}
/************************************************/
/*answer the debug_run of the main_menu's signal*/
/************************************************/
gint debug_run(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    int i = 0;
    char cmd[1000] = {0};
    char* compile_file_name = NULL;
    char* compile_file_path = NULL;
    int debug_file = 0;
    char system_rnt_read[1000] = {0};
    char debug_file_name[1000] = {0};
    GtkTextIter end;
    g_print("Compile1/n");
    if(file_name != NULL)
    {
        compile_file_name = f_get_string_name((char*)file_name,F_NAME);    
        compile_file_path = f_get_string_name((char*)file_name,F_PATH);    
        sprintf(cmd,"%s/main > %s/debug.info 2>&1",  compile_file_path, compile_file_path);
        system(cmd);
        sprintf(debug_file_name,"%s/debug.info",compile_file_path);
        free(compile_file_name);
        free(compile_file_path);
    }
    g_print("debug_file_name:%s/n",debug_file_name);
    debug_file = open(debug_file_name,O_RDONLY);
    read(debug_file, system_rnt_read,  sizeof(system_rnt_read));
    gtk_text_buffer_set_text(debug_view_buffer,"NULL",0);
    gtk_text_buffer_get_end_iter(debug_view_buffer, &end);
    gtk_text_buffer_insert(debug_view_buffer, &end, system_rnt_read, strlen(system_rnt_read));
    //g_print("system_rnt_read:%s/n", system_rnt_read);
    return TRUE;
}
/**********************************************/
/*anser the signal of key_press of main window*/
/**********************************************/
gint main_window_key_press(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    guint key = 0;
    key = event->key.keyval;
    g_print("state:%x/n", event->key.state);
    g_print("val:%x/n", event->key.keyval);   
    switch(event->key.state)
    {
        /*ctrl*/
        case 4:
        {
            switch(event->key.keyval)
            {
                case 'f':
                {
                    file_open(NULL,NULL,NULL);
                    return TRUE;
                    break;
                }
                case 's':
                {
                    file_save(NULL,NULL,NULL);
                    return TRUE;
                    break;
                }
                default:break;
            }
            break;
        }
    }
    return FALSE;
}
/***************************************/
/*anser the signal of key_press of view*/
/***************************************/
gint view_key_press(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    guint key = 0;
    key = event->key.keyval;
    g_print("state:%x/n", event->key.state);
    g_print("val:%x/n", event->key.keyval);   
    switch(event->key.state)
    {
        case 0:
        {
            char cmd[1000] = "123";
            switch(event->key.keyval)
            {
                /*F7*/
                case 0xffc4:
                {
                    debug_compile(NULL,NULL,NULL);
                    return TRUE;
                    break;
                }
                /*F8*/
                case 0xffc5:
                {
                    debug_link(NULL,NULL,NULL);
                    return TRUE;
                    break;
                }
                /*F9*/
                case 0xffc6:
                {
                    debug_run(NULL,NULL,NULL);
                    return TRUE;
                    break;
                }
                default:break;
            }
            break;
        }
        default:
        {
            break;
        }
    }
    return FALSE;
}
gint table_view_label_press(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    GdkEventButton *button_event = (GdkEventButton *) event;
    FViewLink* view_link = NULL;
    if (button_event->type == GDK_BUTTON_RELEASE )
    {
        int nth_page = 0;
        view_link = f_view_link_find_label(widget);
        nth_page = gtk_notebook_page_num(GTK_NOTEBOOK(table_view->table), view_link->scroll);
        gtk_notebook_set_current_page(GTK_NOTEBOOK(table_view->table), nth_page);
        g_print("====nth_page:%d",nth_page);
    }
    if (button_event->type == GDK_BUTTON_RELEASE && button_event->button == 3)
    {
  
        gtk_menu_popup (GTK_MENU (table_view_label_menu), NULL, NULL, NULL, NULL,button_event->button, button_event->time);
         press_button = widget;
        return TRUE;
    }
    return FALSE;
}
gint table_view_label_close(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    f_table_view_close_view(table_view, press_button);
    //g_print("button name: %s/n", gtk_button_get_label(GTK_BUTTON(press_button)));
    return FALSE;
}
gint table_view_label_close_all(GtkWidget* widget, GdkEvent* event, gpointer data)
{
    FViewLink* tmp_link1 = view_link;
    FViewLink* tmp_link2 = view_link->p_next;
    while(view_link_num != 0)
    {
        f_table_view_close_view(table_view, tmp_link1->label);
        tmp_link1 = tmp_link2;
        if(tmp_link2->p_next)
            tmp_link2 = tmp_link2->p_next;
    }
    return FALSE;
}
gint table_view_label_close_without_this_page(GtkWidget* widget, GdkEvent* event, gpointer data)
{

    FViewLink* tmp_link1 = view_link;
    FViewLink* tmp_link2 = view_link->p_next;
    while(view_link_num != 1)
    {
        if(tmp_link1->label != press_button)
            f_table_view_close_view(table_view, tmp_link1->label);
        tmp_link1 = tmp_link2;
        if(tmp_link2->p_next)
            tmp_link2 = tmp_link2->p_next;
    }
    return FALSE;
}







FTableView.h
#ifndef _F_TABLE_VIEW_H_
#define _F_TABLE_VIEW_H_
#include "system.h"
#include "FType.h"
//#define FTableView struct _FtableView
struct _FTableView
{
    GtkWidget* table;
    GtkWidget* view;
    GtkWidget* label;
    GtkWidget* num_label;
    GtkWidget* scroll;
    GtkWidget* vbox;
    GtkWidget* hbox;
};

FTableView*  f_table_view_new();
char  f_table_view_read_file(FTableView* table_view,const char* file_name);
char  f_table_view_close_view(FTableView* table_view, GtkWidget* button);

#define VIEW_LINK_MAX 1000
struct _ViewLink
{
    int id;
    GtkWidget* view;
    GtkWidget* label;
    GtkWidget* num_label;
    GtkWidget* scroll;
    char* file_name;
    struct _ViewLink* p_next;
    struct _ViewLink* p_last;
};
extern FViewLink *view_link;
extern int view_link_num;
int f_view_link_get_free_id(void);
gboolean f_view_link_add(GtkWidget* label, GtkWidget* view, GtkWidget* num_label,GtkWidget* scroll, char* file_name);
gboolean f_view_link_rm_id(int id);
gboolean f_view_link_rm_widget(GtkWidget* view);
gboolean f_view_link_rm_label(GtkWidget* button);
struct _ViewLink* f_view_link_find_id(int id);
struct _ViewLink* f_view_link_find_view(GtkWidget* view);
struct _ViewLink* f_view_link_find_label(GtkWidget* button);


#endif






FTableView.c
#include "FTableView.h"

/*init a new table view*/
FTableView*  f_table_view_new()
{
    FTableView* table_view;
    table_view = malloc(sizeof(FTableView));
    table_view->table =  gtk_notebook_new();
    gtk_notebook_set_tab_pos(GTK_NOTEBOOK(table_view->table), GTK_POS_BOTTOM);
    gtk_notebook_set_scrollable(GTK_NOTEBOOK(table_view->table),TRUE);
    return table_view;
}
/*read a file and display it*/
char  f_table_view_read_file(FTableView* table_view, const char* file_name)
{
    int read_file = 0;
    int len = 0;
    int i = 0;
    int view_size = 0;
    int nth_page = 0;
    char buf[1024] = {0};
    char* label_name = 0;
    GtkTextIter end;
    GtkTextBuffer* code;
    GtkWidget* tmp_label = NULL;
    GtkWidget* button;
    read_file = open(file_name, O_RDONLY);
    if(read_file == -1)
        return FALSE;
    button = gtk_button_new_with_label("a");
    table_view->hbox = gtk_hbox_new(FALSE,0);
    label_name = f_get_string_name((char*)file_name, F_NAME_WITHOUT_PATH);

    table_view->label = gtk_button_new_with_label(label_name);
    free(label_name);
    table_view->scroll = gtk_scrolled_window_new(NULL,NULL);
    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(table_view->scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    table_view->view = gtk_text_view_new();
    table_view->vbox = gtk_vbox_new(FALSE,0);
    code = gtk_text_view_get_buffer(GTK_TEXT_VIEW(table_view->view));
    gtk_text_buffer_set_text(code, "NULL",0);
    while((len = read(read_file, buf, sizeof(buf)))>0)
    {
        gtk_text_buffer_get_end_iter (code, &end);
        gtk_text_buffer_insert(code, &end, buf, len);
    }
    close(read_file);
    gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(table_view->scroll), table_view->hbox);
    gtk_box_pack_start(GTK_BOX(table_view->hbox), table_view->vbox, FALSE, FALSE, 0);
    gtk_box_pack_start(GTK_BOX(table_view->hbox), table_view->view, TRUE, TRUE, 0);
    gtk_text_buffer_get_end_iter (code, &end);
    view_size = gtk_text_iter_get_line(&end);
    g_print("len:%d/n", view_size);
    table_view->num_label = malloc(sizeof(*table_view->num_label)*view_size);
    tmp_label = table_view->num_label;
    for(i = 0; i < view_size; i++)
    {
        sprintf(buf,"%d",i+1);
        tmp_label = gtk_label_new(buf);
        gtk_box_pack_start(GTK_BOX(table_view->vbox), tmp_label, FALSE, FALSE, 0);
        gtk_widget_show(tmp_label);
        tmp_label++;
    }
    nth_page = gtk_notebook_append_page(GTK_NOTEBOOK(table_view->table), table_view->scroll, table_view->label);
    g_print("nth_page:%d/n",nth_page);
    gtk_notebook_get_tab_label(GTK_NOTEBOOK(table_view->table),gtk_notebook_get_nth_page(GTK_NOTEBOOK(table_view->table),nth_page));
    gtk_signal_connect(GTK_OBJECT(table_view->label), "event", G_CALLBACK(table_view_label_press), NULL);
    f_view_link_add(table_view->label, table_view->view, table_view->num_label, table_view->scroll, (char*)file_name);
    gtk_widget_show(table_view->table);
    gtk_widget_show(table_view->label);
    gtk_widget_show(table_view->view);
    gtk_widget_show(table_view->scroll);
    gtk_widget_show(table_view->vbox);
    gtk_widget_show(table_view->hbox);
    gtk_notebook_set_current_page(GTK_NOTEBOOK(table_view->table), nth_page);
    return TRUE;
}
/*close a page of table*/
char  f_table_view_close_view(FTableView* table_view, GtkWidget* button)
{
    FViewLink* view_link =  NULL;
    int page_num = 0;
    view_link = f_view_link_find_label(button);
    page_num = gtk_notebook_page_num(GTK_NOTEBOOK(table_view->table),view_link->scroll);
    gtk_notebook_remove_page(GTK_NOTEBOOK(table_view->table),page_num);
    f_view_link_rm_label(button);
    g_print("view_link find:%d /n", view_link);
    return FALSE;
}



FViewLink *view_link;
int view_link_num = 0;
/*get a free id*/
int f_view_link_get_free_id(void)
{
    int i = 0;
    char if_same = 0;
    struct _ViewLink* p_tmp = view_link;

    if(view_link_num == 0)return 1;
    for(i = 1; i < VIEW_LINK_MAX; i++)
    {
        p_tmp = view_link;
        if_same = 0;
        while(p_tmp)
        {
            if(p_tmp->id == i)
            {
                if_same = 1;
                break;
            }
            if(!if_same)
                return i;
            p_tmp = p_tmp->p_next;
        }
    }
    return -1;
}
/*add a link*/
gboolean f_view_link_add(GtkWidget* label, GtkWidget* view,GtkWidget* num_label, GtkWidget* scroll, char* file_name)
{
    if(view_link_num == 0)
    {
        view_link = malloc(sizeof(struct _ViewLink));
        view_link->view = view;
        view_link->label = label;
        view_link->num_label = num_label;
        view_link->scroll = scroll;
        view_link->file_name = malloc(strlen(file_name)+1);
        sprintf(view_link->file_name,"%s",file_name);
        //view_link->file_name = malloc(strlen())
        view_link->id = f_view_link_get_free_id();
        view_link->p_next = NULL;
        view_link->p_last = NULL;
    }
    else
    {
        struct _ViewLink* p_tmp = view_link;
        /*to the end of link*/
        while(p_tmp->p_next)
            p_tmp = p_tmp->p_next;
        g_print("OK1/n");
        p_tmp->p_next = malloc(sizeof(struct _ViewLink));
        g_print("OK2/n");
        p_tmp->p_next->view = view;
        p_tmp->p_next->label = label;
        p_tmp->p_next->num_label = num_label;
        p_tmp->p_next->scroll = scroll;
        p_tmp->p_next->file_name = malloc(strlen(file_name)+1);
        sprintf(p_tmp->p_next->file_name,"%s",file_name);
        g_print("OK3 filename %s/n", file_name);
        p_tmp->p_next->id = f_view_link_get_free_id();
        p_tmp->p_next->p_next = NULL;
        p_tmp->p_next->p_last = p_tmp;
    }
    view_link_num++;
    return TRUE;
}
/*rm a link by id*/
gboolean f_view_link_rm_id(int id)
{
    struct _ViewLink* p_tmp = NULL;
    p_tmp = f_view_link_find_id(id);
    g_print("Find ID===================== p_tmp:%d/n",p_tmp);
    if(p_tmp)
    {
        if(p_tmp->p_last)
            p_tmp->p_last->p_next = p_tmp->p_next;
        else
            view_link = p_tmp->p_next;
        if(p_tmp->p_next)
            p_tmp->p_next->p_last = p_tmp->p_last;
        g_print("............................%d/n",p_tmp->id);
        free(p_tmp);
    }
    view_link_num--;
    if(view_link_num == 0)
        view_link = NULL;
    return TRUE;
}
/*rm a link by view*/
gboolean f_view_link_rm_widget(GtkWidget* view)
{
    struct _ViewLink* p_tmp = NULL;
    p_tmp = f_view_link_find_view(view);
    if(p_tmp)
    {
        if(p_tmp->p_last)
            p_tmp->p_last->p_next = p_tmp->p_next;
        else
            view_link = p_tmp->p_next;
        if(p_tmp->p_next)       
            p_tmp->p_next->p_last = p_tmp->p_last;
        free(p_tmp);
    }
    view_link_num--;
    if(view_link_num == 0)
        view_link = NULL;
    return TRUE;
}
/*rm a link by label*/
gboolean f_view_link_rm_label(GtkWidget* button)
{
    struct _ViewLink* p_tmp = NULL;
    p_tmp = f_view_link_find_label(button);
    g_print("====%d/n",p_tmp);
    if(p_tmp)
    {
        if(p_tmp->p_last)
            p_tmp->p_last->p_next = p_tmp->p_next;
        else
            view_link = p_tmp->p_next;
        if(p_tmp->p_next)       
            p_tmp->p_next->p_last = p_tmp->p_last;
        free(p_tmp);
    }
    view_link_num--;
    if(view_link_num == 0)
        view_link = NULL;
    g_print("++++++++++++++++++++++/n");
    return TRUE;
}
/*find a link by id*/
struct _ViewLink* f_view_link_find_id(int id)
{
    struct _ViewLink* p_tmp = view_link;
    while(p_tmp)
    {
        if(p_tmp->id == id)
            return p_tmp;
        p_tmp = p_tmp->p_next;
    }
    return NULL;
}
/*find a link by view*/
struct _ViewLink* f_view_link_find_view(GtkWidget* view)
{
    struct _ViewLink* p_tmp = view_link;
    while(p_tmp)
    {
        if(p_tmp->view == view)
            return p_tmp;
        p_tmp = p_tmp->p_next;
    }
    return NULL;
}
/*find a link by label*/
struct _ViewLink* f_view_link_find_label(GtkWidget* label)
{
    struct _ViewLink* p_tmp = view_link;
    while(p_tmp)
    {
        if(p_tmp->label == label)
            return p_tmp;
        p_tmp = p_tmp->p_next;
    }
    return NULL;
}




FString.h
#ifndef _F_STRING_H_
#define _F_STRING_H_
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include "system.h"
#define F_NAME 0
#define F_PATH 1
#define F_NAME_WITHOUT_PATH 2
char* f_get_string_name(char* string,char type);
long f_get_string_space(char* string_find, char* string_from);
#endif




FString.c

#include "FString.h"
/************************************/
/*get the string name without suffix*/
/*remarks:                          */
/*must free the pointer of return   */
/************************************/
char* f_get_string_name(char* string,char type)
{
    char* string_rnt = NULL;
    char* string_from = NULL;
    char tmp = 0;
    unsigned int i = 0;
    string_from = string;
    if(type == F_NAME)
    {
        for(i = 0; i < strlen(string_from); i++)
        {
            if(*(string_from+i) == '.')
            {
                string_rnt = calloc(i+1,1);
                memcpy(string_rnt, string, i);
                return string_rnt;
                break;
            }
        }
    }
    else if(type == F_PATH)
    {
        for(i = strlen(string_from); i != 0; i--)
        {
            if(*(string_from+i) == '/')
            {
                string_rnt = calloc(i+1,1);
                memcpy(string_rnt, string, i);
                return string_rnt;
                break;
            }
        }       
    }
    else if(type == F_NAME_WITHOUT_PATH)
    {
        for(i = strlen(string_from); i != 0; i--)
        {
            if(*(string_from+i) == '/')
            {
                string_rnt = calloc(strlen(string_from)-i+1,1);
                memcpy(string_rnt, string+i+1, strlen(string_from)-i);
                return string_rnt;
                break;
            }
        }
    }
    g_printf("%s/n",string_rnt);
    return NULL;
}
/*find a string's space in another string*/
long f_get_string_space(char* string_find, char* string_from)
{
    long i = 0;
    long j = 0;
    char* find = string_find;
    char* from = string_from;
    char* tmp = NULL;
    char error = 0;
    if(strlen(string_from) < strlen(string_find))
    {
        return -1;
    }
    for(i = 0; i < strlen(string_from)-strlen(string_find); i++)
    {
        find = string_find;
        error = 0;
        tmp = from;
        for(j = 0; j < strlen(string_find); j++)
        {
            if(*find != *tmp)
            {
                error = 1;
                break;
            };   
            find++;
            tmp++;
        }
        if(!error) return i;
        from ++;
    }
    return -1;
}







FType.h
#ifndef _F_TYPE_H_
#define _F_TYPE_H_
typedef struct _FTableView FTableView;
typedef struct _ViewLink FViewLink;
#endif