summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-03-08 19:30:52 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-03-08 19:30:52 (GMT)
commit68bb7efaf61e4f5ca2f2cffce84995ffd667c4cc (patch)
tree9b6a6f63ee20b08d8c2ac35849ee051d61787447 /src/glibext/gcodebuffer.c
parentdc9e68505c4cc7ad208e63dbc7d0e0e8f582d0d9 (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.c121
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;