diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2016-01-23 17:48:50 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2016-01-23 17:48:50 (GMT) |
commit | adb98feb93f09d8de343c504a0c8c72815d62dab (patch) | |
tree | c345bf863252c2384b946b8ebfa315cda88b8ba9 /src/glibext | |
parent | 18be9204f2f6b054f254d1fa045039952ddfad41 (diff) |
Created storable items for user comments.
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gbufferline.c | 59 | ||||
-rw-r--r-- | src/glibext/gbufferline.h | 3 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.c | 74 | ||||
-rw-r--r-- | src/glibext/gcodebuffer.h | 7 |
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 *); |