diff options
Diffstat (limited to 'src/gui/menus')
-rw-r--r-- | src/gui/menus/edition.c | 122 |
1 files changed, 121 insertions, 1 deletions
diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index fc23f49..eec3016 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -28,11 +28,16 @@ #include <i18n.h> +#include "../../dialogs/bookmark.h" #include "../../dialogs/goto.h" #include "../../gtkext/easygtk.h" +#include "../../gtkext/gtkbufferview.h" +/* Réagit avec le menu "Edition -> Signets -> Basculer...". */ +static void mcb_edition_bookmarks_toggle(GtkMenuItem *, GMenuBar *); + /* Réagit avec le menu "Edition -> Aller à l'adresse...". */ static void mcb_edition_goto(GtkMenuItem *, GMenuBar *); @@ -56,7 +61,9 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b { GtkWidget *result; /* Support à retourner */ GtkWidget *menubar; /* Support pour éléments */ - GtkWidget *submenuitem; /* Sous-élément de menu */ + GtkWidget *submenuitem; /* Sous-élément de menu #1 */ + GtkWidget *deepmenubar; /* Support pour éléments #2 */ + GtkWidget *deepmenuitem; /* Sous-élément de menu #2 */ result = gtk_menu_item_new_with_mnemonic(_("_Edition")); gtk_widget_show(result); @@ -64,6 +71,20 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b menubar = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar); + submenuitem = qck_create_menu_item(NULL, NULL, _("Bookmarks"), NULL, NULL); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + deepmenubar = gtk_menu_new(); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar); + + deepmenuitem = qck_create_menu_item(NULL, NULL, _("Toggle at current location"), + G_CALLBACK(mcb_edition_bookmarks_toggle), bar); + add_accelerator_to_menu_item(deepmenuitem, "<Ctrl>D", accgroup); + gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); + + submenuitem = qck_create_menu_separator(); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + submenuitem = qck_create_menu_item(NULL, NULL, _("Go to address..."), G_CALLBACK(mcb_edition_goto), bar); add_accelerator_to_menu_item(submenuitem, "<Ctrl>G", accgroup); @@ -79,6 +100,105 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b * Paramètres : menuitem = élément de menu sélectionné. * * bar = barre de menu parente. * * * +* Description : Réagit avec le menu "Edition -> Signets -> Basculer...". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) +{ + GEditorItem *editem; /* Autre version de la barre */ + GtkViewPanel *panel; /* Vue offrant l'affichage */ + const vmpa2t *curloc; /* Localisation d'un curseur */ + GLoadedBinary *binary; /* Binaire en cours d'étude */ + GDbCollection *collec; /* Collection à manipuler */ + GDbItem *exist; /* Sens du basculement courant */ + GObject *ref; /* Espace de référencements */ + GtkWidget *dialog; /* Boîte de dialogue à montrer */ + GDbItem *bookmark; /* Nouveau signet défini */ + gint ret; /* Retour de confirmation */ + + editem = G_EDITOR_ITEM(bar); + + /* Détermination de l'adresse visée */ + + panel = g_editor_item_get_current_view(editem); + + if (!GTK_IS_BUFFER_VIEW(panel)) + curloc = NULL; + else + curloc = gtk_buffer_view_get_caret_location(GTK_BUFFER_VIEW(panel)); + + /* Accès à la collection */ + + binary = g_editor_item_get_current_binary(editem); + collec = g_loaded_binary_find_collection(binary, DBF_BOOKMARKS); + + /** + * On choisit de se passer de verrou ici : + * - si l'élément existe, la suppression prend en compte le fait + * que l'élément puisse disparaître entre temps. + * - si l'élément n'existe pas, une boîte de dialogue est prévue + * au moment de l'insertion finale. Dans ce cas, l'utilisateur + * peut de plus modifier la position pendant la définition. + */ + + if (curloc == NULL) + exist = NULL; + else + exist = NULL;//g_db_collection_has_key(collec, curloc); + + if (exist != NULL) + g_loaded_binary_remove_from_collection(binary, DBF_BOOKMARKS, exist); + + else + { + ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); + dialog = create_bookmark_dialog(GTK_WINDOW(ref), curloc); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) + { + bookmark = get_item_from_bookmark_dialog(dialog); + + g_db_collection_wlock(G_DB_COLLECTION(collec)); + + if (g_db_collection_has_item(collec, G_DB_ITEM(bookmark))) + { + ret = qck_show_question(GTK_WINDOW(ref), + _("Location already bookmarked!"), + _("A bookmark has been defined at the same location.\n" \ + "Do you want to replace it ?")); + + if (ret != GTK_RESPONSE_YES) + goto mcb_ebt_add_finish; + + } + + _g_loaded_binary_add_to_collection(binary, DBF_BOOKMARKS, G_DB_ITEM(bookmark), false); + + mcb_ebt_add_finish: + + g_db_collection_wunlock(G_DB_COLLECTION(collec)); + + } + + gtk_widget_destroy(dialog); + + } + + g_object_unref(G_OBJECT(collec)); + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* bar = barre de menu parente. * +* * * Description : Réagit avec le menu "Edition -> Aller à l'adresse...". * * * * Retour : - * |