summaryrefslogtreecommitdiff
path: root/src/gtkext/gtkgraphview.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-10-22 22:41:50 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-10-22 22:41:50 (GMT)
commit30bc43ca00140bc215d6a1beb81ab5542e68d13b (patch)
tree205eb23f57545d195e1fcb8141ac80da28409f80 /src/gtkext/gtkgraphview.c
parentb649c2c01ab407958f3b7057153fb02c9c7d0be1 (diff)
Supported scrolling internally and thus fixed bugs with big binaries.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@132 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gtkext/gtkgraphview.c')
-rw-r--r--src/gtkext/gtkgraphview.c183
1 files changed, 176 insertions, 7 deletions
diff --git a/src/gtkext/gtkgraphview.c b/src/gtkext/gtkgraphview.c
index d62cc33..34e0e80 100644
--- a/src/gtkext/gtkgraphview.c
+++ b/src/gtkext/gtkgraphview.c
@@ -38,6 +38,9 @@
struct _GtkGraphView
{
GtkBinView parent; /* A laisser en premier */
+ GtkFixed *support; /* Support des vues en bloc */
+
+ GtkRequisition requisition; /* Espace requis d'affichage */
vmpa_t start; /* Début de la portion vue */
vmpa_t end; /* Fin de la portion affichée */
@@ -68,12 +71,21 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *);
/* Initialise une instance d'afficheur de code en graphique. */
static void gtk_graph_view_init(GtkGraphView *);
+/* Fournit la taille de composant requise pour un plein rendu. */
+static void gtk_graph_view_size_request(GtkWidget *, GtkRequisition *);
+
+/* S'adapte à la surface concédée par le composant parent. */
+static void gtk_graph_view_size_allocate(GtkWidget *, GtkAllocation *);
+
/* Met à jour l'affichage de la vue sous forme graphique. */
-static gboolean gtk_graph_view_expose(GtkGraphView *, GdkEventExpose *);
+static gboolean gtk_graph_view_expose(GtkWidget *, GdkEventExpose *, GtkGraphView *);
/* Supprime tout contenu de l'afficheur de code en graphique. */
static void gtk_graph_view_reset(GtkGraphView *);
+/* Réagit à un défilement quelconque. */
+static void gtk_graph_view_scroll(GtkGraphView *);
+
/* Définit les lignes du graphique de représentation. */
static void gtk_graph_view_set_rendering_lines(GtkGraphView *, GRenderingLine *, GRenderingLine *);
@@ -112,7 +124,8 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass)
widget_class = (GtkWidgetClass *)klass;
- widget_class->expose_event = gtk_graph_view_expose;
+ widget_class->size_request = gtk_graph_view_size_request;
+ widget_class->size_allocate = gtk_graph_view_size_allocate;
}
@@ -132,13 +145,28 @@ static void gtk_graph_view_class_init(GtkGraphViewClass *klass)
static void gtk_graph_view_init(GtkGraphView *view)
{
GtkBinView *binview; /* Instance parente */
+ GdkColor white; /* Couleur de fond normale */
binview = GTK_BIN_VIEW(view);
+ binview->scroll = (scroll_fc)gtk_graph_view_scroll;
binview->set_lines = (set_rendering_lines_fc)gtk_graph_view_set_rendering_lines;
binview->define_address = (define_main_address_fc)gtk_graph_view_define_main_address;
binview->get_coordinates = (get_addr_coordinates_fc)gtk_graph_view_get_address_coordinates;
+ view->support = GTK_FIXED(gtk_fixed_new());
+ gtk_fixed_set_has_window(view->support, TRUE);
+
+ g_signal_connect(G_OBJECT(view->support), "expose-event",
+ G_CALLBACK(gtk_graph_view_expose), view);
+
+ gtk_widget_show(GTK_WIDGET(view->support));
+
+ gdk_color_white(gtk_widget_get_colormap(GTK_WIDGET(view->support)), &white);
+ gtk_widget_modify_bg(GTK_WIDGET(view->support), GTK_STATE_NORMAL, &white);
+
+ gtk_fixed_put(GTK_FIXED(view), GTK_WIDGET(view->support), 0, 0);
+
view->mutex = g_mutex_new();
view->cond = g_cond_new();
@@ -147,6 +175,98 @@ static void gtk_graph_view_init(GtkGraphView *view)
/******************************************************************************
* *
+* Paramètres : widget = composant GTK à consulter. *
+* requisition = dimensions souhaitées. [OUT] *
+* *
+* Description : Fournit la taille de composant requise pour un plein rendu. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+static void gtk_graph_view_size_request(GtkWidget *widget, GtkRequisition *requisition)
+{
+ gpointer fixed_class; /* Classe parente */
+ GtkGraphView *view; /* Autre vision du composant */
+
+ fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget));
+
+ GTK_WIDGET_CLASS(fixed_class)->size_request(GTK_FIXED(widget), requisition);
+
+ view = GTK_GRAPH_VIEW(widget);
+
+ if (view->requisition.width == 0 && view->requisition.height == 0)
+ view->requisition = *requisition;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = composant GTK à mettre à jour. *
+* allocation = étendue accordée à la vue. *
+* *
+* Description : S'adapte à la surface concédée par le composant parent. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_graph_view_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
+{
+ gpointer fixed_class; /* Classe parente */
+ GtkBinView *view; /* Autre version du composant */
+ GtkAllocation valloc; /* Surface utilisable */
+ gboolean changed; /* Changement de valeur ? */
+
+ /* Mise à jour GTK */
+
+ fixed_class = g_type_class_peek_parent(GTK_GRAPH_VIEW_GET_CLASS(widget));
+
+ GTK_WIDGET_CLASS(fixed_class)->size_allocate(GTK_FIXED(widget), allocation);
+
+ view = GTK_BIN_VIEW(widget);
+
+ gtk_bin_view_compute_allocation(view, &valloc);
+
+ /* Défilement horizontal */
+
+ view->hadjustment->page_size = valloc.width;
+ view->hadjustment->step_increment = valloc.width * 0.1;
+ view->hadjustment->page_increment = valloc.width * 0.9;
+
+ view->hadjustment->upper = MAX(GTK_GRAPH_VIEW(view)->requisition.width, valloc.width);
+
+ gtk_bin_view_reclamp_adjustment(view->hadjustment, &changed);
+
+ gtk_adjustment_changed(view->hadjustment);
+
+ if (changed)
+ gtk_adjustment_value_changed(view->hadjustment);
+
+ /* Défilement vertical */
+
+ view->vadjustment->page_size = valloc.height;
+ view->vadjustment->step_increment = valloc.width * 0.1;
+ view->vadjustment->page_increment = valloc.width * 0.9;
+
+ view->vadjustment->upper = MAX(GTK_GRAPH_VIEW(view)->requisition.height, valloc.height);
+
+ gtk_bin_view_reclamp_adjustment(view->vadjustment, &changed);
+
+ gtk_adjustment_changed(view->vadjustment);
+
+ if (changed)
+ gtk_adjustment_value_changed(view->vadjustment);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : - *
* *
* Description : Crée un nouveau composant pour l'affichage en graphique. *
@@ -171,8 +291,9 @@ GtkWidget* gtk_graph_view_new(void)
/******************************************************************************
* *
-* Paramètres : view = composant GTK à redessiner. *
-* event = informations liées à l'événement. *
+* Paramètres : widget = composant GTK à redessiner. *
+* event = informations liées à l'événement. *
+* view = support maître à consulter. *
* *
* Description : Met à jour l'affichage de la vue sous forme graphique. *
* *
@@ -182,13 +303,13 @@ GtkWidget* gtk_graph_view_new(void)
* *
******************************************************************************/
-static gboolean gtk_graph_view_expose(GtkGraphView *view, GdkEventExpose *event)
+static gboolean gtk_graph_view_expose(GtkWidget *widget, GdkEventExpose *event, GtkGraphView *view)
{
size_t i; /* Boucle de parcours */
for (i = 0; i < view->links_count; i++)
gtk_link_renderer_draw(view->links[i],
- GDK_DRAWABLE(GTK_WIDGET(view)->window),
+ GDK_DRAWABLE(widget->window),
GTK_BIN_VIEW(view)->gc);
return FALSE;
@@ -212,6 +333,9 @@ static void gtk_graph_view_reset(GtkGraphView *view)
{
size_t i; /* Boucle de parcours */
+ view->requisition.width = 0;
+ view->requisition.height = 0;
+
view->start = 0;
view->end = 0;
@@ -247,6 +371,28 @@ static void gtk_graph_view_reset(GtkGraphView *view)
+
+/******************************************************************************
+* *
+* Paramètres : view = composant GTK à mettre à jour. *
+* *
+* Description : Réagit à un défilement quelconque. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void gtk_graph_view_scroll(GtkGraphView *view)
+{
+ gtk_fixed_move(GTK_FIXED(view), GTK_WIDGET(view->support),
+ -GTK_BIN_VIEW(view)->hadjustment->value,
+ -GTK_BIN_VIEW(view)->vadjustment->value);
+
+}
+
+
/******************************************************************************
* *
* Paramètres : view = composant GTK à mettre à jour. *
@@ -322,7 +468,7 @@ static void gtk_graph_view_define_main_address(GtkGraphView *view, vmpa_t addr)
view->childs = gtk_graph_view_load_nodes(view, GTK_BIN_VIEW(view)->binary, first, last);
- build_graph_view(GTK_FIXED(view), view->childs, view->childs_count);
+ build_graph_view(view, view->childs, view->childs_count);
break;
@@ -507,6 +653,29 @@ static void notify_graph_view(GtkBinView *view, GtkGraphView *parent)
/******************************************************************************
* *
+* Paramètres : view = composant GTK à mettre à jour. *
+* widget = composant GTK à insérer. *
+* x = abscisse du point d'insertion. *
+* y = ordonnée du point d'insertion. *
+* *
+* Description : Place une vue sous forme de bloc dans le graphique. *
+* *
+* Retour : Plutôt que de redéfinir *toutes* les méthodes de *
+* GtkContainer, on étend ! *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void gtk_graph_view_put(GtkGraphView *view, GtkWidget *widget, gint x, gint y)
+{
+ gtk_fixed_put(view->support, widget, x, y);
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : view = composant GTK à mettre à jour. *
* links = liens graphiques entre les blocs à intégrer. *
* count = quantité de ces liens graphiques. *