summaryrefslogtreecommitdiff
path: root/src/editor.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2008-10-05 11:53:24 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2008-10-05 11:53:24 (GMT)
commitc1b34ed255813ad28bf69fc28592d4cd253f7248 (patch)
tree85bb91925a5a2fb748947320a0023b6d39c4a34f /src/editor.c
parent2ccf097c9344465944089bebbc2ffd66ac93e1fd (diff)
Added a basic support of project files.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@33 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/editor.c')
-rw-r--r--src/editor.c366
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);
+
+}