summaryrefslogtreecommitdiff
path: root/src/glibext/gcodebuffer.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-11-01 20:31:29 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-11-01 20:31:29 (GMT)
commit67c0fe6eddda7ac5ff591ec972425095209d75ff (patch)
treed2f923845545c9b7f94968e9b9ded7539f3dbb7b /src/glibext/gcodebuffer.c
parent085fef16a819cb321fd38e7e0926d3cca863777a (diff)
Moved the caret with mouse and keyboard.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@417 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/glibext/gcodebuffer.c')
-rw-r--r--src/glibext/gcodebuffer.c292
1 files changed, 233 insertions, 59 deletions
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index 1ea8f69..eab418e 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -24,6 +24,7 @@
#include "gcodebuffer.h"
+#include <limits.h>
#include <malloc.h>
#include <string.h>
@@ -123,10 +124,10 @@ static void g_code_buffer_class_init(GCodeBufferClass *);
static void g_code_buffer_init(GCodeBuffer *);
/* Convertit une adresse en indice de ligne. */
-static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *, vmpa_t, bool);
+static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *, const vmpa2t *, bool);
/* Convertit une adresse en indice de ligne. */
-static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, vmpa_t, bool);
+static size_t g_code_buffer_get_index_from_address(GCodeBuffer *, const vmpa2t *, bool);
@@ -407,7 +408,7 @@ GCodeBuffer *g_code_buffer_new(BufferLineColumn main)
* *
******************************************************************************/
-static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, vmpa_t addr, bool first)
+static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, const vmpa2t *addr, bool first)
{
size_t result; /* Indice à retourner */
@@ -451,7 +452,7 @@ static size_t _g_code_buffer_get_index_from_address(const GCodeBuffer *buffer, v
* *
******************************************************************************/
-static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, vmpa_t addr, bool first)
+static size_t g_code_buffer_get_index_from_address(GCodeBuffer *buffer, const vmpa2t *addr, bool first)
{
size_t result; /* Indice à retourner */
@@ -1074,11 +1075,12 @@ gint g_buffer_view_get_height(const GBufferView *view)
/******************************************************************************
* *
-* Paramètres : view = vue de tampon à mettre à jour. *
-* line = ligne correspondant à la position. *
-* index = indice de cette même ligne dans le tampon. *
-* x = abscisse de la zone principale à traiter. *
-* caret = position du curseur à construire. [OUT] *
+* Paramètres : view = vue de tampon à mettre à jour. *
+* line = ligne correspondant à la position. *
+* index = indice de cette même ligne dans le tampon. *
+* x = abscisse 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é. *
* *
@@ -1088,7 +1090,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, GdkRectangle *caret)
+const vmpa2t *g_buffer_view_compute_caret(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*/
@@ -1099,9 +1101,16 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line,
tmp_x -= view->left_text;
if (tmp_x < 0) return NULL;
- segment = g_buffer_line_get_segment_at(line, view->max_widths, &tmp_x, true);
+ segment = g_buffer_line_get_segment_at(line, view->max_widths, display, &tmp_x, GDK_SCROLL_LEFT, true);
+ 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 - tmp_x, tmp_x, g_buffer_segment_get_caret_position(segment, tmp_x),
+ g_buffer_segment_get_width(segment));
+
+ printf(" '%s'\n", g_buffer_segment_get_text(segment));
+
caret->x = (x - tmp_x) + g_buffer_segment_get_caret_position(segment, tmp_x);
first = g_code_buffer_get_index_from_address(view->buffer, view->start, true);
@@ -1110,20 +1119,147 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line,
caret->width = 2;
caret->height = view->line_height;
- return NULL;///g_buffer_line_get_address(line);
+ return get_mrange_addr(g_buffer_line_get_range(line));
}
/******************************************************************************
* *
-* Paramètres : view = vue de tampon à mettre à jour. *
-* caret = position du curseur à faire évoluer. *
-* ctrl = indique la demande d'un parcours rapide. *
-* dir = direction du parcours. *
-* phys = indique si les positions doivent être affichées. *
-* virt = indique si les adresses doivent être affichées. *
-* code = indique si le code binaire doit être affiché. *
+* Paramètres : line = ligne à venir consulter. *
+* caret = position du curseur à faire évoluer. *
+* ctrl = indique la demande d'un parcours rapide. *
+* dir = direction du parcours. *
+* display = règles d'affichage des colonnes modulables. *
+* *
+* Description : Déplace le curseur au sein d'une vue de tampon. *
+* *
+* Retour : true si un déplacement a été effectué, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool _g_buffer_view_move_caret(GBufferView *view, const GBufferLine *line, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, const bool *display)
+{
+ bool result;
+
+ gint tmp_x; /* Copie de travail modifiable */
+ GBufferSegment *segment; /* Segment visé par le pointeur*/
+ size_t first; /* Première ligne intégrée */
+
+ gint ref_x;
+
+
+ gint offset;
+
+
+
+ tmp_x = caret->x;
+
+ tmp_x -= view->left_text;
+ if (tmp_x < 0) return false;
+
+ segment = g_buffer_line_get_segment_at(line, view->max_widths, display, &tmp_x, dir, false);
+
+ if (segment == NULL) printf(" ===== NO SEG...\n");
+
+ if (segment == NULL) return false;
+
+
+ printf(" ====== FIRST SEG :: %p ('%s')\n", segment, g_buffer_segment_get_text(segment));
+
+
+
+ ref_x = tmp_x;
+
+
+
+ //if (dir == GDK_SCROLL_LEFT || dir == GDK_SCROLL_RIGHT)
+ result = g_buffer_segment_move_caret(segment, &tmp_x, ctrl, dir);
+ //else
+ //result = true;
+
+ printf(" ====== MOVE 1 ? %d\n", result);
+
+
+ if (!result)
+ {
+
+
+ segment = g_buffer_line_find_near_segment(line, segment, view->max_widths, display, dir, &offset);
+
+
+ printf(" ====== NEAR SEG :: %p ('%s')\n", segment, segment ? g_buffer_segment_get_text(segment) : NULL);
+
+ if (segment != NULL)
+ {
+ //tmp_x = /*ref_x + */g_buffer_segment_get_width(segment);
+
+
+ //ref_x = tmp_x;
+ ref_x = tmp_x = 0;
+
+
+ ref_x = 0;
+ tmp_x = offset;
+
+
+ result = true;
+ //result = g_buffer_segment_move_caret(segment, &tmp_x, ctrl, dir);
+
+ /*
+ if (result)
+ caret->x -= COL_MARGIN;
+ */
+
+ printf(" ====== MOVE 2 ? %d (offset=%d)\n", result, offset);
+
+
+ }
+
+
+ }
+
+
+ if (result)
+ printf(" ====== NEW CARET: %d -> %d\n", caret->x, caret->x + (tmp_x - ref_x));
+ else
+ printf(" ====== NO NEW CARET!\n");
+
+
+
+ if (result)
+ caret->x += (tmp_x - ref_x);
+
+
+
+ return result;
+
+
+ //bool g_buffer_segment_move_caret(const GBufferSegment *segment, gint *x, bool ctrl, GdkScrollDirection dir)
+
+
+
+ /* TODO : utiliser les arguments booléens */
+
+ caret->x += (dir == GDK_SCROLL_RIGHT ? 10 : -10);
+
+ return true;
+
+
+ return false;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : view = vue de tampon à mettre à jour. *
+* caret = position du curseur à faire évoluer. *
+* ctrl = indique la demande d'un parcours rapide. *
+* dir = direction du parcours. *
+* display = règles d'affichage des colonnes modulables. *
* *
* Description : Déplace le curseur au sein d'une vue de tampon. *
* *
@@ -1133,9 +1269,12 @@ const vmpa2t *g_buffer_view_compute_caret(GBufferView *view, GBufferLine *line,
* *
******************************************************************************/
-vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, bool phys, bool virt, bool code)
+const vmpa2t *g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctrl, GdkScrollDirection dir, const bool *display)
{
- bool result; /* Actualisation à renvoyer */
+ vmpa2t *result; /* Actualisation à renvoyer */
+ GBufferLine *line; /* Ligne sous le pointeur */
+
+
bool computed; /* Récursivité pris en compte */
gint lheight; /* Hauteur d'une ligne */
gint left_pos; /* Retour à la ligne */
@@ -1143,11 +1282,34 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr
BufferLineColumn i; /* Boucle de parcours */
size_t first; /* Première ligne intégrée */
size_t last; /* Dernière ligne intégrée */
- GBufferLine *line; /* Ligne sous le pointeur */
- result = VMPA_INVALID;
+ size_t index; /* Indice de ligne de tampon */
+
+
+ bool moved; /* Mémorisation d'une évolut° */
+
+
+
+
+
+
+ gint tmp_x; /* Copie de travail modifiable */
+ GBufferSegment *segment; /* Segment visé par le pointeur*/
+
+
+
+ result = NULL;
computed = false;
+
+
+ line = g_buffer_view_find_line_at(view, caret->y, &index);
+ if (line == NULL) return NULL;
+
+
+ lheight = g_buffer_view_get_line_height(view);
+
+
switch (dir)
{
case GDK_SCROLL_UP:
@@ -1157,12 +1319,17 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr
case GDK_SCROLL_LEFT:
case GDK_SCROLL_RIGHT:
left_pos = view->left_text;
- if (phys) left_pos += view->max_widths[BLC_PHYSICAL] + COL_MARGIN;
- if (virt) left_pos += view->max_widths[BLC_VIRTUAL] + COL_MARGIN;
- if (code) left_pos += view->max_widths[BLC_BINARY] + COL_MARGIN;
+ if (display[BLC_PHYSICAL]) left_pos += view->max_widths[BLC_PHYSICAL] + COL_MARGIN;
+ if (display[BLC_VIRTUAL]) left_pos += view->max_widths[BLC_VIRTUAL] + COL_MARGIN;
+ if (display[BLC_BINARY]) left_pos += view->max_widths[BLC_BINARY] + COL_MARGIN;
right_pos = left_pos;
for (i = BLC_ASSEMBLY_HEAD; i < BLC_COUNT; i++)
right_pos += view->max_widths[i] + COL_MARGIN;
+
+
+
+ left_pos = view->left_text;
+
break;
default: /* GDK_SCROLL_SMOOTH */
break;
@@ -1171,58 +1338,56 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr
first = g_code_buffer_get_index_from_address(view->buffer, view->start, true);
last = g_code_buffer_get_index_from_address(view->buffer, view->end, false);
+ first = 0;
+
switch (dir)
{
case GDK_SCROLL_UP:
- result = (caret->y >= (first * lheight));
- if (result)
- caret->y -= lheight;
+
+ if (index > first)
+ {
+ line = view->buffer->lines[index - 1];
+ result = g_buffer_view_compute_caret(view, line, index - 1, caret->x, display, caret);
+ }
+
break;
case GDK_SCROLL_DOWN:
- result = ((caret->y + lheight) < (last * lheight));
- if (result)
- caret->y += lheight;
+
+ if (index < last)
+ {
+ line = view->buffer->lines[index + 1];
+ result = g_buffer_view_compute_caret(view, line, index + 1, caret->x, display, caret);
+ }
+
break;
case GDK_SCROLL_LEFT:
- line = g_buffer_view_find_line_at(view, caret->y, NULL);
+
+ line = g_buffer_view_find_line_at(view, caret->y, &index);
if (line == NULL) break;
- result = g_buffer_line_move_caret(line, caret, ctrl, GDK_SCROLL_LEFT, phys, virt, code);
+ moved = _g_buffer_view_move_caret(view, line, caret, ctrl, GDK_SCROLL_LEFT, display);
- if (caret->x < left_pos)
+ if (!moved && index > first)
{
- caret->x = right_pos;
-
- result = g_buffer_view_move_caret(view, caret, ctrl, GDK_SCROLL_UP, phys, virt, code);
-
- if (result == VMPA_INVALID)
- caret->x = left_pos;
- else
- computed = true;
-
+ line = view->buffer->lines[index - 1];
+ result = g_buffer_view_compute_caret(view, line, index - 1, INT_MAX, display, caret);
}
break;
case GDK_SCROLL_RIGHT:
- line = g_buffer_view_find_line_at(view, caret->y, NULL);
+
+ line = g_buffer_view_find_line_at(view, caret->y, &index);
if (line == NULL) break;
- result = g_buffer_line_move_caret(line, caret, ctrl, GDK_SCROLL_RIGHT, phys, virt, code);
+ moved = _g_buffer_view_move_caret(view, line, caret, ctrl, GDK_SCROLL_RIGHT, display);
- if (!result)
+ if (!moved && index < last)
{
- caret->x = left_pos;
-
- result = g_buffer_view_move_caret(view, caret, ctrl, GDK_SCROLL_DOWN, phys, virt, code);
-
- if (result == VMPA_INVALID)
- caret->x = right_pos;
- else
- computed = true;
-
+ line = view->buffer->lines[index + 1];
+ result = g_buffer_view_compute_caret(view, line, index + 1, left_pos, display, caret);
}
break;
@@ -1232,8 +1397,16 @@ vmpa_t g_buffer_view_move_caret(GBufferView *view, GdkRectangle *caret, bool ctr
}
+
+ printf(" --- CARET --- moved = %d index = %d result = %p\n",
+ moved, index, result);
+
+
+
+ /*
if (result && !computed)
- /*result = g_buffer_view_compute_caret(view, caret->x, caret->y, caret, NULL)*/;
+ result = g_buffer_view_compute_caret(view, caret->x, caret->y, caret, display, NULL);
+ */
return result;
@@ -1292,6 +1465,7 @@ bool g_buffer_view_unhighlight_segments(GBufferView *view)
void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
{
+#if 0 /* FIXME : inclusion des champs adresses/code */
GBufferLine *line; /* Ligne sous le pointeur */
GBufferSegment *segment; /* Segment visé par le pointeur*/
bool need_redraw; /* Besoin d'actualisation ? */
@@ -1305,7 +1479,7 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
x -= view->left_text;
if (x < 0) return;
- segment = g_buffer_line_get_segment_at(line, view->max_widths, &x, false);
+ segment = g_buffer_line_get_segment_at(line, view->max_widths, &x, GDK_SCROLL_LEFT, false);
printf(" ... seg @%d ? %p\n", x, segment);
if (segment == NULL) return;
@@ -1330,7 +1504,7 @@ void g_buffer_view_highlight_segments(GBufferView *view, gint x, gint y)
if (need_redraw)
g_signal_emit_by_name(view, "need-redraw");
-
+#endif
}