summaryrefslogtreecommitdiff
path: root/src/gui/panels/bookmarks.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/panels/bookmarks.c')
-rw-r--r--src/gui/panels/bookmarks.c163
1 files changed, 76 insertions, 87 deletions
diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c
index 977cbc9..e06b891 100644
--- a/src/gui/panels/bookmarks.c
+++ b/src/gui/panels/bookmarks.c
@@ -28,7 +28,6 @@
#include <assert.h>
#include <cairo-gobject.h>
#include <malloc.h>
-#include <regex.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
@@ -44,6 +43,7 @@
#include "../../glibext/chrysamarshal.h"
#include "../../glibext/signal.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdockable-int.h"
#include "../../gtkext/support.h"
@@ -57,7 +57,7 @@ struct _GBookmarksPanel
GPanelItem parent; /* A laisser en premier */
GtkTreeView *treeview; /* Composant d'affichage */
- regex_t *filter; /* Filtre appliqué ou NULL */
+ const regex_t *filter; /* Filtre appliqué ou NULL */
GtkMenu *menu; /* Menu contextuel pour param. */
@@ -98,6 +98,9 @@ static void g_bookmarks_panel_class_init(GBookmarksPanelClass *);
/* Initialise une instance de panneau de paramètres de config. */
static void g_bookmarks_panel_init(GBookmarksPanel *);
+/* Procède à l'initialisation de l'interface de rassemblement. */
+static void g_bookmarks_panel_dockable_interface_init(GtkDockableInterface *);
+
/* Supprime toutes les références externes. */
static void g_bookmarks_panel_dispose(GBookmarksPanel *);
@@ -141,10 +144,10 @@ static void on_param_value_edited(GtkCellRendererText *, gchar *, gchar *, GtkTr
/* Démarre l'actualisation du filtrage des paramètres. */
-static void on_param_search_changed(GtkSearchEntry *, GBookmarksPanel *);
+static void update_filtered_bookmarks(GBookmarksPanel *, const regex_t *);
-/* Détermine si un paramètre doit être filtré ou non. */
-static bool is_param_filtered(GBookmarksPanel *, const char *);
+/* Détermine si un signet doit être filtré ou non. */
+static bool is_bookmark_filtered(GBookmarksPanel *, const char *, const char *, const char *);
@@ -177,7 +180,8 @@ static void mcb_bookmarks_panel_filter(GtkMenuItem *, GBookmarksPanel *);
/* Indique le type définit pour un panneau d'affichage des signets liés à un binaire. */
-G_DEFINE_TYPE(GBookmarksPanel, g_bookmarks_panel, G_TYPE_PANEL_ITEM);
+G_DEFINE_TYPE_WITH_CODE(GBookmarksPanel, g_bookmarks_panel, G_TYPE_PANEL_ITEM,
+ G_IMPLEMENT_INTERFACE(GTK_TYPE_DOCKABLE, g_bookmarks_panel_dockable_interface_init))
/******************************************************************************
@@ -233,9 +237,6 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel)
{
GEditorItem *base; /* Version basique d'instance */
GObject *ref; /* Espace de référencement */
- GtkWidget *label; /* Etiquette à utiliser */
- GtkWidget *search; /* Zone de recherche */
- GtkWidget *scrolled; /* Fenêtre défilante */
GtkTreeStore *store; /* Modèle de gestion */
GtkWidget *treeview; /* Affichage de la liste */
GtkCellRenderer *renderer; /* Moteur de rendu de colonne */
@@ -245,35 +246,16 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel)
base = G_EDITOR_ITEM(panel);
- base->widget = gtk_grid_new();
+ base->widget = gtk_scrolled_window_new(NULL, NULL);
gtk_widget_show(base->widget);
- gtk_grid_set_row_spacing(GTK_GRID(base->widget), 8);
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(base->widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(base->widget), GTK_SHADOW_IN);
ref = G_OBJECT(base->widget);
g_object_set_data(ref, "panel", panel);
- /* Partie recherche */
-
- label = qck_create_label(NULL, NULL, _("Look for:"));
- g_object_set(label, "margin", 8, NULL);
- gtk_grid_attach(GTK_GRID(base->widget), label, 0, 0, 1, 1);
-
- search = gtk_search_entry_new();
- ///g_signal_connect(search, "search-changed", G_CALLBACK(on_param_search_changed), panel);
- gtk_widget_show(search);
- gtk_widget_set_hexpand(search, TRUE);
- gtk_grid_attach_next_to(GTK_GRID(base->widget), search, label, GTK_POS_RIGHT, 1, 1);
-
- /* Partie paramètres */
-
- scrolled = gtk_scrolled_window_new(NULL, NULL);
- gtk_widget_show(scrolled);
- gtk_widget_set_vexpand(scrolled, TRUE);
- gtk_grid_attach_next_to(GTK_GRID(base->widget), scrolled, label, GTK_POS_BOTTOM, 2, 1);
-
- gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled), GTK_SHADOW_IN);
+ /* Partie signets */
store = gtk_tree_store_new(BMC_COUNT, G_TYPE_OBJECT,
CAIRO_GOBJECT_TYPE_SURFACE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
@@ -287,7 +269,7 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel)
G_CALLBACK(on_key_pressed_over_params), panel);
gtk_widget_show(treeview);
- gtk_container_add(GTK_CONTAINER(scrolled), treeview);
+ gtk_container_add(GTK_CONTAINER(base->widget), treeview);
g_object_unref(G_OBJECT(store));
@@ -352,6 +334,35 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel)
/******************************************************************************
* *
+* Paramètres : iface = interface GTK à initialiser. *
+* *
+* Description : Procède à l'initialisation de l'interface de rassemblement. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_bookmarks_panel_dockable_interface_init(GtkDockableInterface *iface)
+{
+ GtkDockableInterface *parent_iface; /* Définition précédente */
+
+ parent_iface = (GtkDockableInterface *)g_type_interface_peek_parent(iface);
+
+ iface->can_search = true;
+ iface->can_be_closed = true;
+
+ iface->get_name = parent_iface->get_name;
+ iface->get_desc = parent_iface->get_desc;
+ iface->get_widget = parent_iface->get_widget;
+ iface->update_filtered = (update_filtered_data_fc)update_filtered_bookmarks;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : panel = instance d'objet GLib à traiter. *
* *
* Description : Supprime toutes les références externes. *
@@ -385,10 +396,7 @@ static void g_bookmarks_panel_dispose(GBookmarksPanel *panel)
******************************************************************************/
static void g_bookmarks_panel_finalize(GBookmarksPanel *panel)
-{
- if (panel->filter != NULL)
- regfree(panel->filter);
-
+{
G_OBJECT_CLASS(g_bookmarks_panel_parent_class)->finalize(G_OBJECT(panel));
}
@@ -485,6 +493,7 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary
const vmpa2t *addr; /* Adressse associée au signet */
VMPA_BUFFER(phys); /* Position physique */
VMPA_BUFFER(virt); /* Adresse virtuelle */
+ const char *comment; /* Commentaire associé */
GtkTreeIter iter; /* Point d'insertion */
/* Basculement du binaire utilisé */
@@ -537,13 +546,18 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary
vmpa2_phys_to_string(addr, msize, phys, NULL);
vmpa2_virt_to_string(addr, msize, virt, NULL);
+ comment = g_db_bookmark_get_comment(bookmark);
+
+ if (is_bookmark_filtered(panel, phys, virt, comment))
+ continue;
+
gtk_tree_store_append(store, &iter, NULL);
gtk_tree_store_set(store, &iter,
BMC_BOOKMARK, bookmark,
BMC_PICTURE, G_BOOKMARKS_PANEL_GET_CLASS(panel)->bookmark_img,
BMC_PHYSICAL, phys,
BMC_VIRTUAL, virt,
- BMC_COMMENT, g_db_bookmark_get_comment(bookmark),
+ BMC_COMMENT, comment,
-1);
}
@@ -970,8 +984,8 @@ static void on_param_value_edited(GtkCellRendererText *renderer, gchar *path, gc
/******************************************************************************
* *
-* Paramètres : entry = entrée de texte contenant le filtre brut. *
-* panel = panneau assurant l'affichage des paramètres. *
+* Paramètres : panel = panneau assurant l'affichage des paramètres. *
+* preg = expression régulière compilée à utiliser. *
* *
* Description : Démarre l'actualisation du filtrage des paramètres. *
* *
@@ -981,76 +995,51 @@ static void on_param_value_edited(GtkCellRendererText *renderer, gchar *path, gc
* *
******************************************************************************/
-static void on_param_search_changed(GtkSearchEntry *entry, GBookmarksPanel *panel)
+static void update_filtered_bookmarks(GBookmarksPanel *panel, const regex_t *preg)
{
- const gchar *text; /* Texte de l'utilisateur */
- int ret; /* Bilan de mise en place */
- GdkRGBA error; /* Couleur d'erreur */
-
- if (panel->filter != NULL)
- {
- regfree(panel->filter);
- free(panel->filter);
- panel->filter = NULL;
- }
-
- text = gtk_entry_get_text(GTK_ENTRY(entry));
-
- if (strlen(text) > 0)
- {
- panel->filter = (regex_t *)calloc(1, sizeof(regex_t));
- ret = regcomp(panel->filter, text, REG_EXTENDED);
-
- if (ret != 0)
- {
- free(panel->filter);
- panel->filter = NULL;
+ panel->filter = preg;
- error.red = 1.0;
- error.green = 0.0;
- error.blue = 0.0;
- error.alpha = 1.0;
- gtk_widget_override_color(GTK_WIDGET(entry), GTK_STATE_NORMAL, &error);
-
- return;
-
- }
-
- }
-
- gtk_widget_override_color(GTK_WIDGET(entry), GTK_STATE_NORMAL, NULL);
-
- //reload_config_into_treeview(panel, get_main_configuration());
+ reload_bookmarks_into_treeview(panel, panel->binary);
}
/******************************************************************************
* *
-* Paramètres : panel = panneau assurant l'affichage des paramètres. *
-* name = chemin d'accès au paramètre à traiter. *
+* Paramètres : panel = panneau assurant l'affichage des paramètres. *
+* phys = position physique du signet. *
+* virt = adresse virtuelle du signet. *
+* comment = commentaire lisible associé au signet. *
* *
-* Description : Détermine si un paramètre doit être filtré ou non. *
+* Description : Détermine si un signet doit être filtré ou non. *
* *
-* Retour : true si le paramètre ne doit pas être affiché, false sinon. *
+* Retour : true si le signet ne doit pas être affiché, false sinon. *
* *
* Remarques : - *
* *
******************************************************************************/
-static bool is_param_filtered(GBookmarksPanel *panel, const char *name)
+static bool is_bookmark_filtered(GBookmarksPanel *panel, const char *phys, const char *virt, const char *comment)
{
+ bool result; /* Bilan à retourner */
regmatch_t match; /* Récupération des trouvailles*/
int ret; /* Bilan du filtrage */
if (panel->filter == NULL)
return false;
- ret = regexec(panel->filter, name, 1, &match, 0);
- if (ret == REG_NOMATCH)
- return true;
+ result = true;
+
+ ret = regexec(panel->filter, phys, 1, &match, 0);
+ result &= (ret == REG_NOMATCH);
- return false;
+ ret = regexec(panel->filter, virt, 1, &match, 0);
+ result &= (ret == REG_NOMATCH);
+
+ ret = regexec(panel->filter, comment, 1, &match, 0);
+ result &= (ret == REG_NOMATCH);
+
+ return result;
}