diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-03-08 19:30:52 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-03-08 19:30:52 (GMT) |
commit | 68bb7efaf61e4f5ca2f2cffce84995ffd667c4cc (patch) | |
tree | 9b6a6f63ee20b08d8c2ac35849ee051d61787447 /src/glibext/gcodebuffer.c | |
parent | dc9e68505c4cc7ad208e63dbc7d0e0e8f582d0d9 (diff) |
Handle cross references as well as entry points.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@482 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r-- | src/glibext/gcodebuffer.c | 121 |
1 files changed, 115 insertions, 6 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c index 4b5378d..ac6e807 100644 --- a/src/glibext/gcodebuffer.c +++ b/src/glibext/gcodebuffer.c @@ -145,6 +145,7 @@ struct _GBufferView GCodeBuffer *buffer; /* Tampon de code visualisé */ vmpa_t start; /* Première ligne intégrée */ vmpa_t end; /* Dernière ligne intégrée */ + size_t first_index; /* Indice de la première ligne */ gint line_height; /* Hauteur maximale des lignes */ gint max_widths[BLC_COUNT]; /* Taille cachée des colonnes */ @@ -813,6 +814,8 @@ static void g_buffer_view_class_init(GBufferViewClass *class) static void g_buffer_view_init(GBufferView *buffer) { + buffer->first_index = 0; + g_buffer_view_reset_required_height(buffer); g_buffer_view_reset_required_widths(buffer); @@ -1156,6 +1159,112 @@ gint g_buffer_view_get_height(const GBufferView *view) /****************************************************************************** * * +* Paramètres : view = visualisation à consulter. * +* x = abscisse comprise dans le segment recherché. [OUT] * +* y = ordonnée comprise dans la ligne recherchée. * +* idx = indice de la ligne trouvée ou NULL. [OUT] * +* display = règles d'affichage des colonnes modulables. * +* segment = portion de texte recherchée ou NULL. [OUT] * +* * +* Description : Fournit la ligne et son segment présents à une position. * +* * +* Retour : Ligne retrouvée ou NULL si aucune. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GBufferLine *g_buffer_view_find_line_and_segment_at(GBufferView *view, gint *x, gint y, size_t *idx, const bool *display, GBufferSegment **segment) +{ + GBufferLine *result; /* Ligne trouvée à retourner */ + gint lheight; /* Hauteur d'une ligne */ + size_t index; /* Indice attendu */ + + /* Recherche d'une ligne correspondante */ + + lheight = g_buffer_view_get_line_height(view); + index = view->first_index + y / lheight; + + if (idx != NULL) + *idx = index; + + result = (index < view->buffer->used ? view->buffer->lines[index] : NULL); + + /* Recherche du segment visé éventuel */ + + if (result != NULL && segment != NULL) + { + if (*x < view->left_text) + *segment = NULL; + + else + *segment = g_buffer_line_get_segment_at(result, view->max_widths, display, x, GDK_SCROLL_LEFT, true); + + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : view = vue de tampon à mettre à jour. * +* x = abscisse de la zone principale à traiter. * +* y = ordonnée de la zone principale à traiter. * +* display = règles d'affichage des colonnes modulables. * +* caret = position du curseur à construire. [OUT] * +* * +* Description : Calcule la position idéale de curseur pour un point donné. * +* * +* Retour : Adresse si une a pu être déterminée, NULL sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, gint x, gint y, const bool *display, GdkRectangle *caret) +{ + gint remaining; /* Copie de travail modifiable */ + size_t index; /* Indice de ligne de tampon */ + GBufferLine *line; /* Ligne à la position courante*/ + GBufferSegment *segment; /* Segment présent sur la place*/ + + remaining = x; + + line = g_buffer_view_find_line_and_segment_at(view, &remaining, y, &index, display, &segment); + + if (line == NULL) return NULL; + if (segment == NULL) printf(" -- no segment\n"); + if (segment == NULL) return NULL; + + + + + + printf("\n[BASE] tronc = %d reste = %d dernier = %d largeur = %d\n", + x - remaining, remaining, g_buffer_segment_get_caret_position(segment, remaining), + g_buffer_segment_get_width(segment)); + + printf(" '%s'\n", g_buffer_segment_get_text(segment, false)); + + + + + caret->x = (x - remaining) + g_buffer_segment_get_caret_position(segment, remaining); + + caret->y = (index - view->first_index) * view->line_height; + + caret->width = 2; + caret->height = view->line_height; + + return get_mrange_addr(g_buffer_line_get_range(line)); + +} + + +/****************************************************************************** +* * * Paramètres : view = vue de tampon à mettre à jour. * * line = ligne correspondant à la position. * * index = indice de cette même ligne dans le tampon. * @@ -1171,7 +1280,7 @@ gint g_buffer_view_get_height(const GBufferView *view) * * ******************************************************************************/ -const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line, size_t index, gint x, const bool *display, GdkRectangle *caret) +const vmpa2t *g_buffer_view_compute_caret_old(GBufferView *view, GBufferLine *line, size_t index, gint x, const bool *display, GdkRectangle *caret) { gint tmp_x; /* Copie de travail modifiable */ GBufferSegment *segment; /* Segment visé par le pointeur*/ @@ -1428,7 +1537,7 @@ const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, b if (index > first) { line = view->buffer->lines[index - 1]; - result = g_buffer_view_compute_caret(view, line, index - 1, caret->x, display, caret); + result = g_buffer_view_compute_caret_old(view, line, index - 1, caret->x, display, caret); } break; @@ -1438,7 +1547,7 @@ const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, b if (index < last) { line = view->buffer->lines[index + 1]; - result = g_buffer_view_compute_caret(view, line, index + 1, caret->x, display, caret); + result = g_buffer_view_compute_caret_old(view, line, index + 1, caret->x, display, caret); } break; @@ -1453,7 +1562,7 @@ const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, b if (!moved && index > first) { line = view->buffer->lines[index - 1]; - result = g_buffer_view_compute_caret(view, line, index - 1, INT_MAX, display, caret); + result = g_buffer_view_compute_caret_old(view, line, index - 1, INT_MAX, display, caret); } break; @@ -1468,7 +1577,7 @@ const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, b if (!moved && index < last) { line = view->buffer->lines[index + 1]; - result = g_buffer_view_compute_caret(view, line, index + 1, left_pos, display, caret); + result = g_buffer_view_compute_caret_old(view, line, index + 1, left_pos, display, caret); } break; @@ -1486,7 +1595,7 @@ const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, b /* if (result && !computed) - result = g_buffer_view_compute_caret(view, caret->x, caret->y, caret, display, NULL); + result = g_buffer_view_compute_caret_old(view, caret->x, caret->y, caret, display, NULL); */ return result; |