diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-05-06 00:07:18 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-05-06 00:07:18 (GMT) |
commit | d76e89e102aacfe945b44eb3150cb9f4bbf7b613 (patch) | |
tree | 7dda55fabeddcd0dbd1813d9ceef4b905a056c7f /src/glibext | |
parent | 2c6e4f3f3f15d1568e9dae407e32a217d8f7ab19 (diff) |
Displayed a tooltip for strings or code symbols in buffer views.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@530 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gcodebuffer.c | 109 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 8 |
2 files changed, 106 insertions, 11 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index 8633461..c9abf4e 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -145,8 +145,8 @@ struct _GBufferView GCodeBuffer *buffer; /* Tampon de code visualisé */ vmpa2t *start; /* Première ligne intégrée */ vmpa2t *end; /* Dernière ligne intégrée */ - size_t first_index; /* Indice de la première ligne */ - size_t last_index; /* Indice de la dernière ligne */ + size_t first_index; /* Indice de la première ligne */ /* FIXME : utiliser partout ? */ + size_t last_index; /* Indice de la dernière ligne */ /* FIXME : idem */ gint line_height; /* Hauteur maximale des lignes */ gint max_widths[BLC_COUNT]; /* Taille cachée des colonnes */ @@ -744,6 +744,8 @@ GBufferLine *g_code_buffer_insert_after(GCodeBuffer *buffer, GBufferLine *line) * * * Paramètres : buffer = composant GTK à mettre à jour. * * addr = adresse où retrouver la ligne recherchée. * +* flags = propriétés à vérifier en tout ou partie. * +* idx = indice de la ligne trouvée ou NULL. [OUT] * * * * Description : Retrouve une ligne au sein d'un tampon avec une adresse. * * * @@ -753,7 +755,7 @@ GBufferLine *g_code_buffer_insert_after(GCodeBuffer *buffer, GBufferLine *line) * * ******************************************************************************/ -GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vmpa2t *addr) +GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vmpa2t *addr, BufferLineFlags flags, size_t *idx) { GBufferLine *result; /* Instance à retourner */ size_t index; /* Indice de la ligne visée */ @@ -765,18 +767,24 @@ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vm else { + if (idx != NULL) + *idx = index; + result = buffer->lines[index]; - while ((g_buffer_line_get_flags(result) & BLF_HAS_CODE) == 0) - { - if ((index + 1) == buffer->used) break; + if (flags != BLF_NONE) + while ((g_buffer_line_get_flags(result) & flags) == 0) + { + if ((index + 1) == buffer->used) break; - /* FIXME : vérifier que l'adresse est toujours celle recherchée ! */ - /* TODO : passer la recherche de code en option via argument ? */ + /* FIXME : vérifier que l'adresse est toujours celle recherchée ! */ - result = buffer->lines[++index]; + if (idx != NULL) + (*idx)++; - } + result = buffer->lines[++index]; + + } g_object_ref(G_OBJECT(result)); @@ -1943,6 +1951,87 @@ void g_buffer_view_export(const GBufferView *view, buffer_export_context *ctx, B /****************************************************************************** * * +* Paramètres : view = visualisation à consulter. * +* addr = adresse où retrouver la ligne recherchée. * +* flags = propriétés à vérifier en tout ou partie. * +* idx = indice de la ligne trouvée ou NULL. [OUT] * +* * +* Description : Retrouve une ligne au sein d'un tampon avec une adresse. * +* * +* Retour : Line retrouvée ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_buffer_view_find_line_by_addr(const GBufferView *view, const vmpa2t *addr, BufferLineFlags flags, size_t *idx) +{ + GBufferLine *result; /* Ligne trouvée à retourner */ + phys_t length; /* Taille de la vue */ + mrange_t vrange; /* Couverture de la vue */ + bool allowed; /* Rechercher validée ? */ + + /* Vérification des bornes */ + + if (view->start != NULL/* && view->end != NULL*/) + { + length = compute_vmpa_diff(view->start, view->end); + + init_mrange(&vrange, view->start, length); + + allowed = mrange_contains_addr_inclusive(&vrange, addr); + + } + else allowed = true; + + /* Lancement des recherches ? */ + + if (allowed) + result = g_code_buffer_find_line_by_addr(view->buffer, addr, flags, idx); + else + result = NULL; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : view = visualisation à consulter. * +* index = indice de la ligne recherchée. * +* * +* Description : Retrouve une ligne au sein d'un tampon avec un indice. * +* * +* Retour : Line retrouvée ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_buffer_view_find_line_by_index(const GBufferView *view, size_t index) +{ + GBufferLine *result; /* Ligne trouvée à retourner */ + bool allowed; /* Rechercher validée ? */ + + /* Vérification des bornes */ + + allowed = (view->first_index <= index && index < view->last_index); + + /* Lancement des recherches ? */ + + if (allowed) + result = view->buffer->lines[index]; + else + result = NULL; + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : view = visualisation à consulter. * * y = ordonnée comprise dans la ligne recherchée. * * idx = indice de la ligne trouvée ou NULL. [OUT] * diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h index a248df3..652ea23 100644 --- a/src/glibext/gcodebuffer.h +++ b/src/glibext/gcodebuffer.h @@ -70,7 +70,7 @@ GBufferLine *g_code_buffer_insert_at(GCodeBuffer *, vmpa_t, bool); GBufferLine *g_code_buffer_insert_after(GCodeBuffer *, GBufferLine *); /* Retrouve une ligne au sein d'un tampon avec une adresse. */ -GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *, const vmpa2t *); +GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *, const vmpa2t *, BufferLineFlags, size_t *); /* Augmente l'indentation des prochaines lignes. */ void g_code_buffer_inc_indentation(GCodeBuffer *); @@ -152,6 +152,12 @@ void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, gint, const cairo_ /* Exporte le contenu du tampon de code désassemblé. */ void g_buffer_view_export(const GBufferView *, buffer_export_context *, BufferExportType, const bool *); +/* Retrouve une ligne au sein d'un tampon avec une adresse. */ +GBufferLine *g_buffer_view_find_line_by_addr(const GBufferView *, const vmpa2t *, BufferLineFlags, size_t *); + +/* Retrouve une ligne au sein d'un tampon avec un indice. */ +GBufferLine *g_buffer_view_find_line_by_index(const GBufferView *, size_t ); + /* Fournit la ligne présente à une ordonnée donnée. */ GBufferLine *g_buffer_view_find_line_at(GBufferView *, gint, size_t *) __attribute__ ((deprecated)); |