summaryrefslogtreecommitdiff
path: root/src/gui/panels/strings.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/panels/strings.c')
-rw-r--r--src/gui/panels/strings.c137
1 files changed, 55 insertions, 82 deletions
diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c
index 8d41165..4d7d077 100644
--- a/src/gui/panels/strings.c
+++ b/src/gui/panels/strings.c
@@ -26,7 +26,6 @@
#include <inttypes.h>
-#include <regex.h>
#include "panel-int.h"
@@ -34,6 +33,7 @@
#include "../../core/params.h"
#include "../../dialogs/gotox.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdockable-int.h"
@@ -46,7 +46,7 @@ struct _GStringsPanel
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. */
@@ -84,22 +84,23 @@ static void g_strings_panel_class_init(GStringsPanelClass *);
/* Initialise une instance de panneau d'affichage des chaînes. */
static void g_strings_panel_init(GStringsPanel *);
+/* Procède à l'initialisation de l'interface de rassemblement. */
+static void g_strings_panel_dockable_interface_init(GtkDockableInterface *);
+
/* Supprime toutes les références externes. */
static void g_strings_panel_dispose(GStringsPanel *);
/* Procède à la libération totale de la mémoire. */
static void g_strings_panel_finalize(GStringsPanel *);
-/* Réagit à un changement d'affichage principal de contenu. */
-static void change_strings_panel_current_binary(GStringsPanel *, GLoadedBinary *);
-
-
-
/* ------------------------- AFFICHAGE A L'AIDE D'UNE LISTE ------------------------- */
+/* Réagit à un changement d'affichage principal de contenu. */
+static void change_strings_panel_current_binary(GStringsPanel *, GLoadedBinary *);
+
/* Réagit au changement de sélection des chaînes textuelles. */
static void on_strings_selection_change(GtkTreeSelection *, GStringsPanel *);
@@ -117,8 +118,8 @@ static void on_string_value_edited(GtkCellRendererText *, gchar *, gchar *, GtkT
/* ------------------------- FILTRAGE DES SYMBOLES PRESENTS ------------------------- */
-/* Démarre l'actualisation du filtrage des paramètres. */
-static void on_string_search_changed(GtkSearchEntry *, GStringsPanel *);
+/* Démarre l'actualisation du filtrage des chaînes. */
+static void update_filtered_strings(GStringsPanel *, const regex_t *);
/* Détermine si une chaîne textuelle doit être filtrée ou non. */
static bool is_string_filtered(GStringsPanel *, const char *, const char *);
@@ -151,14 +152,14 @@ static void mcb_strings_panel_filter(GtkMenuItem *, GStringsPanel *);
-
/* ---------------------------------------------------------------------------------- */
/* PARTIE PRINCIPALE DU PANNEAU */
/* ---------------------------------------------------------------------------------- */
/* Indique le type définit pour un panneau d'affichage des chaînes. */
-G_DEFINE_TYPE(GStringsPanel, g_strings_panel, G_TYPE_PANEL_ITEM);
+G_DEFINE_TYPE_WITH_CODE(GStringsPanel, g_strings_panel, G_TYPE_PANEL_ITEM,
+ G_IMPLEMENT_INTERFACE(GTK_TYPE_DOCKABLE, g_strings_panel_dockable_interface_init))
/******************************************************************************
@@ -206,9 +207,6 @@ static void g_strings_panel_init(GStringsPanel *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 */
@@ -219,35 +217,16 @@ static void g_strings_panel_init(GStringsPanel *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_string_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 chaînes */
store = gtk_tree_store_new(STC_COUNT, G_TYPE_OBJECT,
G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
@@ -263,7 +242,7 @@ static void g_strings_panel_init(GStringsPanel *panel)
G_CALLBACK(on_key_pressed_over_strings), 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));
@@ -336,6 +315,35 @@ static void g_strings_panel_init(GStringsPanel *panel)
/******************************************************************************
* *
+* Paramètres : iface = interface GTK à initialiser. *
+* *
+* Description : Procède à l'initialisation de l'interface de rassemblement. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_strings_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_strings;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : panel = instance d'objet GLib à traiter. *
* *
* Description : Supprime toutes les références externes. *
@@ -708,10 +716,10 @@ static void on_string_value_edited(GtkCellRendererText *renderer, gchar *path, g
/******************************************************************************
* *
-* 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. *
+* Description : Démarre l'actualisation du filtrage des chaînes. *
* *
* Retour : - *
* *
@@ -719,44 +727,9 @@ static void on_string_value_edited(GtkCellRendererText *renderer, gchar *path, g
* *
******************************************************************************/
-static void on_string_search_changed(GtkSearchEntry *entry, GStringsPanel *panel)
+static void update_filtered_strings(GStringsPanel *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;
-
- 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);
+ panel->filter = preg;
change_strings_panel_current_binary(panel, panel->binary);
@@ -786,18 +759,18 @@ static bool is_string_filtered(GStringsPanel *panel, const char *label, const ch
if (panel->filter == NULL)
return false;
- result = false;
+ result = true;
if (label != NULL)
{
ret = regexec(panel->filter, label, 1, &match, 0);
- result |= (ret != REG_NOMATCH);
+ result &= (ret == REG_NOMATCH);
}
ret = regexec(panel->filter, value, 1, &match, 0);
- result |= (ret != REG_NOMATCH);
+ result &= (ret == REG_NOMATCH);
- return !result;
+ return result;
}