diff options
Diffstat (limited to 'src/editor.c')
-rw-r--r-- | src/editor.c | 366 |
1 files changed, 364 insertions, 2 deletions
diff --git a/src/editor.c b/src/editor.c index dbdc2d3..0673110 100644 --- a/src/editor.c +++ b/src/editor.c @@ -50,6 +50,8 @@ #include "binary.h" +#include "dlg_sections.h" +#include "easygtk.h" #include "gtksnippet.h" #include "gtkcodeview.h" #include "pan_symbols.h" @@ -70,6 +72,36 @@ void destroy_editor(GtkWidget *, gpointer); +/* Réagit au menu "Fichier -> Enregistrer le projet". */ +void mcb_file_save_project(GtkMenuItem *, gpointer); + +/* Réagit au menu "Fichier -> Enregistrer le projet sous...". */ +void mcb_file_save_project_as(GtkMenuItem *, gpointer); + + + +/* Charge un projet récent et met à jour la liste. */ +void mcb_open_recent_project(GtkMenuItem *, gpointer); + + + +/* Affiche la boîte d'ajout d'un binaire au projet courant. */ +void mcb_project_add_binary(GtkMenuItem *, gpointer); + +/* Retire un binaire du projet courant. */ +void mcb_project_remove_binary(GtkMenuItem *, gpointer); + + + +/* Affiche la boîte de sélection des sections. */ +void mcb_select_sections(GtkMenuItem *, gpointer); + + + +/* Met à jour le contenu du menu 'Projet'. */ +void reload_menu_project(GObject *); + + /****************************************************************************** @@ -355,6 +387,11 @@ on_button2_clicked (GtkButton *button, GtkWidget *create_editor(void) { GtkWidget *result; /* Fenêtre à renvoyer */ + GtkWidget *menuboard; /* Barre de menus principale */ + GtkWidget *menuitem; /* Elément de menu */ + GtkWidget *menubar; /* Support pour éléments */ + GtkWidget *submenuitem; /* Sous-élément de menu */ + GtkWidget *submenubar; /* Support pour sous-éléments */ GtkWidget *vbox1; GtkWidget *vpaned1; @@ -393,6 +430,9 @@ GtkWidget *create_editor(void) GtkWidget *panel; + openida_project *project; + + #if 0 GtkWidget *vbox; /* Support à divisions vert. */ GtkWidget *notebook; /* Support à onglets */ @@ -414,12 +454,73 @@ GtkWidget *create_editor(void) - - vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_show (vbox1); gtk_container_add (GTK_CONTAINER (result), vbox1); + + /* Intégration des menus */ + + menuboard = gtk_menu_bar_new(); + gtk_widget_show(menuboard); + gtk_box_pack_start(GTK_BOX(vbox1), menuboard, FALSE, FALSE, 0); + + menuitem = gtk_menu_item_new_with_mnemonic(_("_File")); + gtk_widget_show(menuitem); + gtk_container_add(GTK_CONTAINER(menuboard), menuitem); + + menubar = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar); + + submenuitem = qck_create_menu_item(NULL, NULL, _("Save project"), G_CALLBACK(mcb_file_save_project), result); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenuitem = qck_create_menu_item(NULL, NULL, _("Save project as..."), G_CALLBACK(mcb_file_save_project_as), result); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenuitem = qck_create_menu_separator(); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenuitem = qck_create_menu_item(G_OBJECT(result), "menu_recent_prjs", _("Recent projects..."), NULL, NULL); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenubar = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), submenubar); + + menuitem = gtk_menu_item_new_with_mnemonic(_("_Project")); + gtk_widget_show(menuitem); + gtk_container_add(GTK_CONTAINER(menuboard), menuitem); + + menubar = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar); + + submenuitem = qck_create_menu_item(NULL, NULL, _("Add a binary..."), G_CALLBACK(mcb_project_add_binary), result); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenuitem = qck_create_menu_item(G_OBJECT(result), "menu_prj_remove_bin", _("Remove a binary"), NULL, NULL); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenubar = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), submenubar); + + submenuitem = qck_create_menu_separator(); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenuitem = qck_create_menu_item(NULL, NULL, _("Select sections..."), G_CALLBACK(mcb_select_sections), NULL); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + + + load_recent_openida_projects_list(G_OBJECT(result), G_CALLBACK(mcb_open_recent_project)); + + + project = load_openida_project_from_xml("/home/ocb/test.oip")/*create_empty_openida_project()*/; + set_current_openida_project(project); + + reload_menu_project(G_OBJECT(result)); + + + vpaned1 = gtk_vpaned_new (); gtk_widget_show (vpaned1); gtk_box_pack_start (GTK_BOX (vbox1), vpaned1, TRUE, TRUE, 0); @@ -688,5 +789,266 @@ void destroy_editor(GtkWidget *widget, gpointer data) +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* data = adresse de l'espace de référencement global. * +* * +* Description : Réagit au menu "Fichier -> Enregistrer le projet". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void mcb_file_save_project(GtkMenuItem *menuitem, gpointer data) +{ + openida_project *project; /* Projet courant */ + + project = get_current_openida_project(); + + if (has_storing_filename(project)) + write_openida_project_to_xml(project, NULL); + + else + mcb_file_save_project_as(menuitem, data); + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* data = adresse de l'espace de référencement global. * +* * +* Description : Réagit au menu "Fichier -> Enregistrer le projet sous...". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void mcb_file_save_project_as(GtkMenuItem *menuitem, gpointer data) +{ + GtkWidget *dialog; /* Boîte à afficher */ + gchar *filename; /* Nom du fichier à intégrer */ + + dialog = gtk_file_chooser_dialog_new (_("Save the project as..."), GTK_WINDOW(data), + GTK_FILE_CHOOSER_ACTION_SAVE, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + if (gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + write_openida_project_to_xml(get_current_openida_project(), filename); + + g_free(filename); + + } + + gtk_widget_destroy(dialog); + +} + + + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* data = adresse de l'espace de référencement global. * +* * +* Description : Charge un projet récent et met à jour la liste. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void mcb_open_recent_project(GtkMenuItem *menuitem, gpointer data) +{ + const gchar *caption; /* Etiquette du menu */ + openida_project *project; /* Nouveau projet chargé */ + + caption = gtk_label_get_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(menuitem)))); + + project = load_openida_project_from_xml(caption); + + if (project != NULL) + { + set_current_openida_project(project); + /* TODO ... */ + } + +} + + + + + + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* data = adresse de l'espace de référencement global. * +* * +* Description : Affiche la boîte d'ajout d'un binaire au projet courant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void mcb_project_add_binary(GtkMenuItem *menuitem, gpointer data) +{ + GtkWidget *dialog; /* Boîte à afficher */ + gchar *filename; /* Nom du fichier à intégrer */ + openida_binary *binary; /* Représentation chargée */ + + dialog = gtk_file_chooser_dialog_new (_("Open a binary file"), GTK_WINDOW(data), + GTK_FILE_CHOOSER_ACTION_OPEN, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + NULL); + + if (gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) + { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + + binary = load_binary_file(filename); + + if (binary != NULL) + { + attach_binary_to_openida_project(get_current_openida_project(), binary); + reload_menu_project(G_OBJECT(data)); + } + + g_free(filename); + + } + + gtk_widget_destroy(dialog); + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* data = adresse de l'espace de référencement global. * +* * +* Description : Retire un binaire du projet courant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void mcb_project_remove_binary(GtkMenuItem *menuitem, gpointer data) +{ + openida_binary *binary; /* Représentation chargée */ + + binary = g_object_get_data(G_OBJECT(menuitem), "binary"); + + detach_binary_to_openida_project(get_current_openida_project(), binary); + unload_binary_file(binary); + + reload_menu_project(G_OBJECT(data)); + +} + + + + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* data = adresse de l'espace de référencement global. * +* * +* Description : Affiche la boîte de sélection des sections. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void mcb_select_sections(GtkMenuItem *menuitem, gpointer data) +{ + GtkWidget *dialog; /* Boîte de dialogue à montrer */ + + dialog = create_sections_dialog(create_empty_openida_project()/* FIXME */); + gtk_widget_show(dialog); + +} + + + + + + +/****************************************************************************** +* * +* Paramètres : ref = espace de référencements global. * +* * +* Description : Met à jour le contenu du menu 'Projet'. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void reload_menu_project(GObject *ref) +{ + GtkWidget *menuitem; /* Menu principal à compléter */ + GtkWidget *menubar; /* Support pour éléments */ + GList *list; /* Liste des éléments en place */ + GList *iter; /* Boucle de parcours #1 */ + size_t count; /* Nombre de binaires attachés */ + const openida_binary **binaries; /* Liste de ces binaires */ + size_t i; /* Boucle de parcours #2 */ + const char *desc; /* Description à afficher */ + GtkWidget *submenuitem; /* Sous-menu à ajouter */ + + menuitem = GTK_WIDGET(g_object_get_data(ref, "menu_prj_remove_bin")); + menubar = gtk_menu_item_get_submenu(GTK_MENU_ITEM(menuitem)); + + /* Remise à zéro */ + + list = gtk_container_get_children(GTK_CONTAINER(menubar)); + + for (iter = list; iter != NULL; iter = g_list_next(iter)) + gtk_container_remove(GTK_CONTAINER(menubar), GTK_WIDGET(iter->data)); + + g_list_free(list); + + /* Ajout des entrées */ + + binaries = get_openida_project_binaries(get_current_openida_project(), &count); + + for (i = 0; i < count; i++) + { + desc = openida_binary_to_string(binaries[i]); + + submenuitem = qck_create_menu_item(NULL, NULL, desc, G_CALLBACK(mcb_project_remove_binary), ref); + g_object_set_data(G_OBJECT(submenuitem), "binary", binaries[i]); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + } + + gtk_widget_set_sensitive(menuitem, count > 0); + +} |