summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2016-01-23 17:48:50 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2016-01-23 17:48:50 (GMT)
commitadb98feb93f09d8de343c504a0c8c72815d62dab (patch)
treec345bf863252c2384b946b8ebfa315cda88b8ba9 /src/glibext
parent18be9204f2f6b054f254d1fa045039952ddfad41 (diff)
Created storable items for user comments.
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gbufferline.c59
-rw-r--r--src/glibext/gbufferline.h3
-rw-r--r--src/glibext/gcodebuffer.c74
-rw-r--r--src/glibext/gcodebuffer.h7
4 files changed, 129 insertions, 14 deletions
diff --git a/src/glibext/gbufferline.c b/src/glibext/gbufferline.c
index 2f29ee4..b8838ae 100644
--- a/src/glibext/gbufferline.c
+++ b/src/glibext/gbufferline.c
@@ -78,6 +78,9 @@ static GBufferSegment *get_segment_at(const buffer_line_column *, gint *, GdkScr
static GBufferSegment *find_near_segment(const buffer_line_column *, GBufferSegment *, GdkScrollDirection);
/* Fournit le segment créé par un objet particulier. */
+static GObject *find_first_segment_creator(const buffer_line_column *);
+
+/* Fournit le segment créé par un objet particulier. */
static GBufferSegment *find_segment_from_creator(const buffer_line_column *, GObject *);
/* Imprime le contenu d'une colonne de ligne de texte. */
@@ -410,6 +413,33 @@ static GBufferSegment *find_near_segment(const buffer_line_column *column, GBuff
/******************************************************************************
* *
+* Paramètres : column = colonne de ligne de texte à consulter. *
+* *
+* Description : Fournit le segment créé par un objet particulier. *
+* *
+* Retour : Créateur trouvé à déréférencer par la suite ou NULL si échec.*
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GObject *find_first_segment_creator(const buffer_line_column *column)
+{
+ GObject *result; /* Trouvaille à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = NULL;
+
+ for (i = 0; i < column->count && result == NULL; i++)
+ result = g_buffer_segment_get_creator(column->segments[i]);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : column = colonne de ligne de texte à consulter. *
* creator = créateur à l'origine du segment recherché. *
* *
@@ -1165,6 +1195,35 @@ GBufferSegment *g_buffer_line_find_near_segment(const GBufferLine *line, GBuffer
/******************************************************************************
* *
+* Paramètres : line = ligne à venir consulter. *
+* column = indice de la colonne visée par les recherches. *
+* *
+* Description : Recherche le premier créateur enregistré dans des segments. *
+* *
+* Retour : Créateur trouvé à déréférencer par la suite ou NULL si échec.*
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GObject *g_buffer_line_find_first_segment_creator(const GBufferLine *line, BufferLineColumn column)
+{
+ GObject *result; /* Trouvaille à retourner */
+
+ assert(column < BLC_COUNT);
+
+ result = find_first_segment_creator(&line->columns[column]);
+
+ if (result != NULL)
+ g_object_ref(G_OBJECT(result));
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : line = ligne à venir consulter. *
* creator = créateur à l'origine du segment recherché. *
* *
diff --git a/src/glibext/gbufferline.h b/src/glibext/gbufferline.h
index 19652ab..89313be 100644
--- a/src/glibext/gbufferline.h
+++ b/src/glibext/gbufferline.h
@@ -120,6 +120,9 @@ GBufferSegment *g_buffer_line_get_segment_at(const GBufferLine *, const gint [BL
/* Fournit le segment voisin d'un autre segment identifié. */
GBufferSegment *g_buffer_line_find_near_segment(const GBufferLine *, GBufferSegment *, const gint [BLC_COUNT], const bool *, GdkScrollDirection, gint *);
+/* Recherche le premier créateur enregistré dans des segments. */
+GObject *g_buffer_line_find_first_segment_creator(const GBufferLine *, BufferLineColumn);
+
/* Fournit le segment créé par un objet particulier. */
GBufferSegment *g_buffer_line_find_segment_from_creator(const GBufferLine *, GObject *);
diff --git a/src/glibext/gcodebuffer.c b/src/glibext/gcodebuffer.c
index f96212c..be7fa37 100644
--- a/src/glibext/gcodebuffer.c
+++ b/src/glibext/gcodebuffer.c
@@ -158,10 +158,10 @@ static void g_code_buffer_insert_lines_at(GCodeBuffer *, GBufferLine **, size_t,
/* Affiche un commentaire sur une ligne de tampon donnée. */
-static bool _g_code_buffer_write_inlined_comment(GCodeBuffer *, GBufferLine *, const char *);
+static bool _g_code_buffer_write_inlined_comment(GCodeBuffer *, GBufferLine *, const char *, GObject *);
/* Affiche un commentaire sur une ligne de tampon dédiée. */
-static bool _g_code_buffer_write_comment_area(GCodeBuffer *, GBufferLine *, const char *, bool);
+static bool _g_code_buffer_write_comment_area(GCodeBuffer *, GBufferLine *, const char *, bool, GObject *);
/* Retrouve la première ligne d'une zone de commentaire. */
static size_t g_code_buffer_find_first_line_comment(const GCodeBuffer *, size_t);
@@ -453,6 +453,7 @@ static void g_buffer_scan_process(GBufferScan *scan, GtkExtStatusBar *statusbar)
* Paramètres : buffer = tampon de lignes à consulter. *
* line = ligne à l'intérieur d'un commentaire. *
* comment = nouveau commentaire à inscrire à la ligne donnée. *
+* creator = créateur à l'origine de la construction. *
* *
* Description : Affiche un commentaire sur une ligne de tampon donnée. *
* *
@@ -462,7 +463,7 @@ static void g_buffer_scan_process(GBufferScan *scan, GtkExtStatusBar *statusbar)
* *
******************************************************************************/
-static bool _g_code_buffer_write_inlined_comment(GCodeBuffer *buffer, GBufferLine *line, const char *comment)
+static bool _g_code_buffer_write_inlined_comment(GCodeBuffer *buffer, GBufferLine *line, const char *comment, GObject *creator)
{
bool result; /* Bilan à retourner */
const mrange_t *range; /* Emplace de ligne à utiliser */
@@ -472,6 +473,7 @@ static bool _g_code_buffer_write_inlined_comment(GCodeBuffer *buffer, GBufferLin
char *saveptr; /* Sauvegarde pour la sécurité */
char *token; /* Fragment à insérer */
size_t len; /* Taille dudit fragment */
+ GBufferSegment *segment; /* Segment à marquer au fer */
GBufferLine *new; /* Nouvelle ligne créée */
size_t i; /* Boucle de parcours */
@@ -493,12 +495,17 @@ static bool _g_code_buffer_write_inlined_comment(GCodeBuffer *buffer, GBufferLin
len = strlen(token);
if (!result)
- g_buffer_line_insert_text(line, BLC_COMMENTS, token, len, RTT_COMMENT);
+ {
+ segment = g_buffer_line_insert_text(line, BLC_COMMENTS, token, len, RTT_COMMENT);
+ g_buffer_segment_set_creator(segment, creator);
+ }
else
{
new = g_code_buffer_prepare_new_line(buffer, range);
- g_buffer_line_insert_text(new, BLC_COMMENTS, token, len, RTT_COMMENT);
+
+ segment = g_buffer_line_insert_text(new, BLC_COMMENTS, token, len, RTT_COMMENT);
+ g_buffer_segment_set_creator(segment, creator);
extra = (GBufferLine **)realloc(extra, ++extra_count * sizeof(GBufferLine *));
@@ -534,6 +541,7 @@ static bool _g_code_buffer_write_inlined_comment(GCodeBuffer *buffer, GBufferLin
* Paramètres : buffer = tampon de lignes à consulter. *
* line = ligne à l'intérieur d'un commentaire. *
* comment = nouveau commentaire à inscrire à la ligne donnée. *
+* creator = créateur à l'origine de la construction. *
* *
* Description : Affiche un commentaire sur une ligne de tampon donnée. *
* *
@@ -543,7 +551,7 @@ static bool _g_code_buffer_write_inlined_comment(GCodeBuffer *buffer, GBufferLin
* *
******************************************************************************/
-bool g_code_buffer_update_inlined_comment(GCodeBuffer *buffer, GBufferLine *line, const char *comment)
+bool g_code_buffer_update_inlined_comment(GCodeBuffer *buffer, GBufferLine *line, const char *comment, GObject *creator)
{
bool result; /* Bilan à retourner */
@@ -553,7 +561,7 @@ bool g_code_buffer_update_inlined_comment(GCodeBuffer *buffer, GBufferLine *line
result = true;
if (result)
- result = _g_code_buffer_write_inlined_comment(buffer, line, comment);
+ result = _g_code_buffer_write_inlined_comment(buffer, line, comment, creator);
/* TODO : emit() */
@@ -568,6 +576,7 @@ bool g_code_buffer_update_inlined_comment(GCodeBuffer *buffer, GBufferLine *line
* line = ligne à l'intérieur d'un commentaire. *
* comment = nouveau commentaire à inscrire à la ligne donnée. *
* before = précise la position du commentaire. *
+* creator = créateur à l'origine de la construction. *
* *
* Description : Affiche un commentaire sur une ligne de tampon dédiée. *
* *
@@ -577,7 +586,7 @@ bool g_code_buffer_update_inlined_comment(GCodeBuffer *buffer, GBufferLine *line
* *
******************************************************************************/
-static bool _g_code_buffer_write_comment_area(GCodeBuffer *buffer, GBufferLine *line, const char *comment, bool before)
+static bool _g_code_buffer_write_comment_area(GCodeBuffer *buffer, GBufferLine *line, const char *comment, bool before, GObject *creator)
{
bool result; /* Bilan à retourner */
const mrange_t *range; /* Emplace de ligne à utiliser */
@@ -588,6 +597,7 @@ static bool _g_code_buffer_write_comment_area(GCodeBuffer *buffer, GBufferLine *
char *token; /* Fragment à insérer */
size_t len; /* Taille dudit fragment */
GBufferLine *new; /* Nouvelle ligne créée */
+ GBufferSegment *segment; /* Segment à marquer au fer */
size_t i; /* Boucle de parcours */
assert(!g_buffer_line_has_comment(line));
@@ -609,7 +619,9 @@ static bool _g_code_buffer_write_comment_area(GCodeBuffer *buffer, GBufferLine *
new = g_code_buffer_prepare_new_line(buffer, range);
g_buffer_line_start_merge_at(new, BLC_DISPLAY);
- g_buffer_line_insert_text(new, BLC_DISPLAY, token, len, RTT_COMMENT);
+
+ segment = g_buffer_line_insert_text(new, BLC_DISPLAY, token, len, RTT_COMMENT);
+ g_buffer_segment_set_creator(segment, creator);
extra = (GBufferLine **)realloc(extra, ++extra_count * sizeof(GBufferLine *));
@@ -644,6 +656,7 @@ static bool _g_code_buffer_write_comment_area(GCodeBuffer *buffer, GBufferLine *
* line = ligne à l'intérieur d'un commentaire. *
* comment = nouveau commentaire à inscrire à la ligne donnée. *
* before = précise la position du commentaire. *
+* creator = créateur à l'origine de la construction. *
* *
* Description : Affiche un commentaire sur une ligne de tampon dédiée. *
* *
@@ -653,7 +666,7 @@ static bool _g_code_buffer_write_comment_area(GCodeBuffer *buffer, GBufferLine *
* *
******************************************************************************/
-bool g_code_buffer_update_comment_area(GCodeBuffer *buffer, GBufferLine *line, const char *comment, bool before)
+bool g_code_buffer_update_comment_area(GCodeBuffer *buffer, GBufferLine *line, const char *comment, bool before, GObject *creator)
{
bool result; /* Bilan à retourner */
@@ -663,7 +676,7 @@ bool g_code_buffer_update_comment_area(GCodeBuffer *buffer, GBufferLine *line, c
result = true;
if (result)
- result = _g_code_buffer_write_comment_area(buffer, line, comment, before);
+ result = _g_code_buffer_write_comment_area(buffer, line, comment, before, creator);
/* TODO : emit() */
@@ -873,6 +886,43 @@ static size_t g_code_buffer_find_last_line_comment(const GCodeBuffer *buffer, si
* Paramètres : buffer = tampon de lignes à consulter. *
* line = ligne à l'intérieur d'un commentaire. *
* *
+* Description : Retrouve le créateur d'un commentaire existant. *
+* *
+* Retour : Instance trouvée à déréférencer ensuite ou NULL si aucune. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+GObject *g_code_buffer_get_comment_creator(const GCodeBuffer *buffer, const GBufferLine *line)
+{
+ GObject *result; /* Instance à retourner */
+ BufferLineColumn merge_col; /* Colonne de fusion */
+
+ if (g_buffer_line_has_comment(line))
+ {
+ merge_col = g_buffer_line_get_merge_start(line);
+
+ if (merge_col == BLC_DISPLAY)
+ result = g_buffer_line_find_first_segment_creator(line, BLC_DISPLAY);
+ else
+ result = g_buffer_line_find_first_segment_creator(line, BLC_COMMENTS);
+
+ }
+
+ else
+ result = NULL;
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : buffer = tampon de lignes à consulter. *
+* line = ligne à l'intérieur d'un commentaire. *
+* *
* Description : Récupère le contenu d'un commentaire existant. *
* *
* Retour : Commentaire retrouver à libérer ou NULL en cas d'échec. *
@@ -1536,7 +1586,7 @@ GBufferLine *g_code_buffer_find_line_by_addr(const GCodeBuffer *buffer, const vm
result = buffer->lines[index];
if (flags != BLF_NONE)
- while ((g_buffer_line_get_flags(result) & flags) == 0)
+ while ((g_buffer_line_get_flags(result) & flags) != flags)
{
if ((index + 1) == buffer->used) break;
diff --git a/src/glibext/gcodebuffer.h b/src/glibext/gcodebuffer.h
index d04ed76..8bcbc4a 100644
--- a/src/glibext/gcodebuffer.h
+++ b/src/glibext/gcodebuffer.h
@@ -111,10 +111,13 @@ GDelayedWork *g_buffer_code_scan(GCodeBuffer *, const vmpa2t *, const vmpa2t *,
/* Affiche un commentaire sur une ligne de tampon donnée. */
-bool g_code_buffer_update_inlined_comment(GCodeBuffer *, GBufferLine *, const char *);
+bool g_code_buffer_update_inlined_comment(GCodeBuffer *, GBufferLine *, const char *, GObject *);
/* Affiche un commentaire sur une ligne de tampon dédiée. */
-bool g_code_buffer_update_comment_area(GCodeBuffer *, GBufferLine *, const char *, bool);
+bool g_code_buffer_update_comment_area(GCodeBuffer *, GBufferLine *, const char *, bool, GObject *);
+
+/* Retrouve le créateur d'un commentaire existant. */
+GObject *g_code_buffer_get_comment_creator(const GCodeBuffer *, const GBufferLine *);
/* Récupère le contenu d'un commentaire existant. */
char *g_code_buffer_get_lines_comment(const GCodeBuffer *, const GBufferLine *);