|
|
|
|
@@ -987,16 +987,16 @@ static void txt_delete_sel (Text *text)
|
|
|
|
|
buf= MEM_mallocN(text->curc+(text->sell->len - text->selc)+1, "textline_string");
|
|
|
|
|
|
|
|
|
|
if (text->curl != text->sell) {
|
|
|
|
|
txt_clear_marker_region(text, text->curl, text->curc, text->curl->len, 0);
|
|
|
|
|
txt_clear_marker_region(text, text->curl, text->curc, text->curl->len, 0, 0);
|
|
|
|
|
move= txt_get_span(text->curl, text->sell);
|
|
|
|
|
} else {
|
|
|
|
|
mrk= txt_find_marker_region(text, text->curl, text->curc, text->selc, 0);
|
|
|
|
|
mrk= txt_find_marker_region(text, text->curl, text->curc, text->selc, 0, 0);
|
|
|
|
|
if (mrk && (mrk->start > text->curc || mrk->end < text->selc))
|
|
|
|
|
txt_clear_marker_region(text, text->curl, text->curc, text->selc, 0);
|
|
|
|
|
txt_clear_marker_region(text, text->curl, text->curc, text->selc, 0, 0);
|
|
|
|
|
move= 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mrk= txt_find_marker_region(text, text->sell, text->selc-1, text->sell->len, 0);
|
|
|
|
|
mrk= txt_find_marker_region(text, text->sell, text->selc-1, text->sell->len, 0, 0);
|
|
|
|
|
if (mrk) {
|
|
|
|
|
lineno= mrk->lineno;
|
|
|
|
|
do {
|
|
|
|
|
@@ -2190,7 +2190,7 @@ static void txt_combine_lines (Text *text, TextLine *linea, TextLine *lineb)
|
|
|
|
|
|
|
|
|
|
if(!linea || !lineb) return;
|
|
|
|
|
|
|
|
|
|
mrk= txt_find_marker_region(text, lineb, 0, lineb->len, 0);
|
|
|
|
|
mrk= txt_find_marker_region(text, lineb, 0, lineb->len, 0, 0);
|
|
|
|
|
if (mrk) {
|
|
|
|
|
lineno= mrk->lineno;
|
|
|
|
|
do {
|
|
|
|
|
@@ -2236,12 +2236,12 @@ void txt_delete_char (Text *text)
|
|
|
|
|
} else { /* Just deleting a char */
|
|
|
|
|
int i= text->curc;
|
|
|
|
|
|
|
|
|
|
TextMarker *mrk= txt_find_marker_region(text, text->curl, i-1, text->curl->len, 0);
|
|
|
|
|
TextMarker *mrk= txt_find_marker_region(text, text->curl, i-1, text->curl->len, 0, 0);
|
|
|
|
|
if (mrk) {
|
|
|
|
|
int lineno= mrk->lineno;
|
|
|
|
|
if (mrk->end==i) {
|
|
|
|
|
if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) {
|
|
|
|
|
txt_clear_markers(text, mrk->flags);
|
|
|
|
|
txt_clear_markers(text, mrk->group, TMARK_TEMP);
|
|
|
|
|
} else {
|
|
|
|
|
TextMarker *nxt= mrk->next;
|
|
|
|
|
BLI_freelinkN(&text->markers, mrk);
|
|
|
|
|
@@ -2301,12 +2301,12 @@ void txt_backspace_char (Text *text)
|
|
|
|
|
else { /* Just backspacing a char */
|
|
|
|
|
int i= text->curc-1;
|
|
|
|
|
|
|
|
|
|
TextMarker *mrk= txt_find_marker_region(text, text->curl, i, text->curl->len, 0);
|
|
|
|
|
TextMarker *mrk= txt_find_marker_region(text, text->curl, i, text->curl->len, 0, 0);
|
|
|
|
|
if (mrk) {
|
|
|
|
|
int lineno= mrk->lineno;
|
|
|
|
|
if (mrk->start==i+1) {
|
|
|
|
|
if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) {
|
|
|
|
|
txt_clear_markers(text, mrk->flags);
|
|
|
|
|
txt_clear_markers(text, mrk->group, TMARK_TEMP);
|
|
|
|
|
} else {
|
|
|
|
|
TextMarker *nxt= mrk->next;
|
|
|
|
|
BLI_freelinkN(&text->markers, mrk);
|
|
|
|
|
@@ -2359,7 +2359,7 @@ int txt_add_char (Text *text, char add)
|
|
|
|
|
|
|
|
|
|
txt_delete_sel(text);
|
|
|
|
|
|
|
|
|
|
mrk= txt_find_marker_region(text, text->curl, text->curc-1, text->curl->len, 0);
|
|
|
|
|
mrk= txt_find_marker_region(text, text->curl, text->curc-1, text->curl->len, 0, 0);
|
|
|
|
|
if (mrk) {
|
|
|
|
|
lineno= mrk->lineno;
|
|
|
|
|
do {
|
|
|
|
|
@@ -2401,7 +2401,7 @@ int txt_replace_char (Text *text, char add)
|
|
|
|
|
if (text->curc==text->curl->len || txt_has_sel(text) || add=='\n') {
|
|
|
|
|
TextMarker *mrk;
|
|
|
|
|
int i= txt_add_char(text, add);
|
|
|
|
|
mrk= txt_find_marker(text, text->curl, text->curc, 0);
|
|
|
|
|
mrk= txt_find_marker(text, text->curl, text->curc, 0, 0);
|
|
|
|
|
if (mrk && mrk->end==text->curc) mrk->end--;
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
@@ -2689,7 +2689,7 @@ static int color_match(TextMarker *a, TextMarker *b) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Creates and adds a marker to the list maintaining sorted order */
|
|
|
|
|
void txt_add_marker(Text *text, TextLine *line, int start, int end, char clr[4], int flags) {
|
|
|
|
|
void txt_add_marker(Text *text, TextLine *line, int start, int end, char clr[4], int group, int flags) {
|
|
|
|
|
TextMarker *tmp, *marker;
|
|
|
|
|
|
|
|
|
|
marker= MEM_mallocN(sizeof(TextMarker), "text_marker");
|
|
|
|
|
@@ -2697,6 +2697,7 @@ void txt_add_marker(Text *text, TextLine *line, int start, int end, char clr[4],
|
|
|
|
|
marker->lineno= txt_get_span(text->lines.first, line);
|
|
|
|
|
marker->start= MIN2(start, end);
|
|
|
|
|
marker->end= MAX2(start, end);
|
|
|
|
|
marker->group= group;
|
|
|
|
|
marker->flags= flags;
|
|
|
|
|
|
|
|
|
|
marker->clr[0]= clr[0];
|
|
|
|
|
@@ -2712,17 +2713,18 @@ void txt_add_marker(Text *text, TextLine *line, int start, int end, char clr[4],
|
|
|
|
|
else BLI_addhead(&text->markers, marker);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Returns the first matching marker on the specified line between two points,
|
|
|
|
|
with at least the specified flags set. If flags is zero, all markers will be
|
|
|
|
|
searched */
|
|
|
|
|
TextMarker *txt_find_marker_region(Text *text, TextLine *line, int start, int end, int flags) {
|
|
|
|
|
/* Returns the first matching marker on the specified line between two points.
|
|
|
|
|
If the group or flags fields are non-zero the returned flag must be in the
|
|
|
|
|
specified group and have at least the specified flags set. */
|
|
|
|
|
TextMarker *txt_find_marker_region(Text *text, TextLine *line, int start, int end, int group, int flags) {
|
|
|
|
|
TextMarker *marker, *next;
|
|
|
|
|
int lineno= txt_get_span(text->lines.first, line);
|
|
|
|
|
|
|
|
|
|
for (marker=text->markers.first; marker; marker=next) {
|
|
|
|
|
next= marker->next;
|
|
|
|
|
|
|
|
|
|
if ((marker->flags & flags) != flags) continue;
|
|
|
|
|
if (group && marker->group != group) continue;
|
|
|
|
|
else if ((marker->flags & flags) != flags) continue;
|
|
|
|
|
else if (marker->lineno < lineno) continue;
|
|
|
|
|
else if (marker->lineno > lineno) break;
|
|
|
|
|
|
|
|
|
|
@@ -2733,9 +2735,10 @@ TextMarker *txt_find_marker_region(Text *text, TextLine *line, int start, int en
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Clears all markers on the specified line between two points with at least
|
|
|
|
|
the specified flags set. If flags is zero, all markers will be cleared */
|
|
|
|
|
short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, int flags) {
|
|
|
|
|
/* Clears all markers on the specified line between two points. If the group or
|
|
|
|
|
flags fields are non-zero the returned flag must be in the specified group
|
|
|
|
|
and have at least the specified flags set. */
|
|
|
|
|
short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, int group, int flags) {
|
|
|
|
|
TextMarker *marker, *next;
|
|
|
|
|
int lineno= txt_get_span(text->lines.first, line);
|
|
|
|
|
short cleared= 0;
|
|
|
|
|
@@ -2743,7 +2746,8 @@ short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, in
|
|
|
|
|
for (marker=text->markers.first; marker; marker=next) {
|
|
|
|
|
next= marker->next;
|
|
|
|
|
|
|
|
|
|
if ((marker->flags & flags) != flags) continue;
|
|
|
|
|
if (group && marker->group != group) continue;
|
|
|
|
|
else if ((marker->flags & flags) != flags) continue;
|
|
|
|
|
else if (marker->lineno < lineno) continue;
|
|
|
|
|
else if (marker->lineno > lineno) break;
|
|
|
|
|
|
|
|
|
|
@@ -2756,16 +2760,18 @@ short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, in
|
|
|
|
|
return cleared;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Clears all markers with at least the specified flags set (useful for
|
|
|
|
|
clearing temporary markers) */
|
|
|
|
|
short txt_clear_markers(Text *text, int flags) {
|
|
|
|
|
/* Clears all markers in the specified group (if given) with at least the
|
|
|
|
|
specified flags set. Useful for clearing temporary markers (group=0,
|
|
|
|
|
flags=TMARK_TEMP) */
|
|
|
|
|
short txt_clear_markers(Text *text, int group, int flags) {
|
|
|
|
|
TextMarker *marker, *next;
|
|
|
|
|
short cleared= 0;
|
|
|
|
|
|
|
|
|
|
for (marker=text->markers.first; marker; marker=next) {
|
|
|
|
|
next= marker->next;
|
|
|
|
|
|
|
|
|
|
if ((marker->flags & flags) == flags) {
|
|
|
|
|
if ((!group || marker->group==group) &&
|
|
|
|
|
(marker->flags & flags) == flags) {
|
|
|
|
|
BLI_freelinkN(&text->markers, marker);
|
|
|
|
|
cleared= 1;
|
|
|
|
|
}
|
|
|
|
|
@@ -2774,13 +2780,14 @@ short txt_clear_markers(Text *text, int flags) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Finds the marker at the specified line and cursor position with at least the
|
|
|
|
|
specified flags set. If flags is zero, all markers will be searched */
|
|
|
|
|
TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int flags) {
|
|
|
|
|
specified flags set in the given group (if non-zero). */
|
|
|
|
|
TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int group, int flags) {
|
|
|
|
|
TextMarker *marker;
|
|
|
|
|
int lineno= txt_get_span(text->lines.first, line);
|
|
|
|
|
|
|
|
|
|
for (marker=text->markers.first; marker; marker=marker->next) {
|
|
|
|
|
if ((marker->flags & flags) != flags) continue;
|
|
|
|
|
if (group && marker->group != group) continue;
|
|
|
|
|
else if ((marker->flags & flags) != flags) continue;
|
|
|
|
|
else if (marker->lineno < lineno) continue;
|
|
|
|
|
else if (marker->lineno > lineno) break;
|
|
|
|
|
|
|
|
|
|
@@ -2790,53 +2797,27 @@ TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int flags) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Finds the previous marker with matching flags. If no other marker is found,
|
|
|
|
|
the same one will be returned */
|
|
|
|
|
/* Finds the previous marker in the same group. If no other is found, the same
|
|
|
|
|
marker will be returned */
|
|
|
|
|
TextMarker *txt_prev_marker(Text *text, TextMarker *marker) {
|
|
|
|
|
TextMarker *tmp= marker;
|
|
|
|
|
while (tmp) {
|
|
|
|
|
if (tmp->prev) tmp= tmp->prev;
|
|
|
|
|
else tmp= text->markers.last;
|
|
|
|
|
if (tmp->flags == marker->flags)
|
|
|
|
|
if (tmp->group == marker->group)
|
|
|
|
|
return tmp;
|
|
|
|
|
}
|
|
|
|
|
return NULL; /* Only if marker==NULL */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Finds the next marker with matching flags. If no other marker is found, the
|
|
|
|
|
same one will be returned */
|
|
|
|
|
/* Finds the next marker in the same group. If no other is found, the same
|
|
|
|
|
marker will be returned */
|
|
|
|
|
TextMarker *txt_next_marker(Text *text, TextMarker *marker) {
|
|
|
|
|
TextMarker *tmp= marker;
|
|
|
|
|
while (tmp) {
|
|
|
|
|
if (tmp->next) tmp= tmp->next;
|
|
|
|
|
else tmp= text->markers.first;
|
|
|
|
|
if (tmp->flags == marker->flags)
|
|
|
|
|
return tmp;
|
|
|
|
|
}
|
|
|
|
|
return NULL; /* Only if marker==NULL */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Finds the previous marker with matching colour. If no other marker is found,
|
|
|
|
|
the same one will be returned */
|
|
|
|
|
TextMarker *txt_prev_marker_color(Text *text, TextMarker *marker) {
|
|
|
|
|
TextMarker *tmp= marker;
|
|
|
|
|
while (tmp) {
|
|
|
|
|
if (tmp->prev) tmp= tmp->prev;
|
|
|
|
|
else tmp= text->markers.last;
|
|
|
|
|
if (color_match(tmp, marker))
|
|
|
|
|
return tmp;
|
|
|
|
|
}
|
|
|
|
|
return NULL; /* Only if marker==NULL */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Finds the next marker with matching colour. If no other marker is found, the
|
|
|
|
|
same one will be returned */
|
|
|
|
|
TextMarker *txt_next_marker_color(Text *text, TextMarker *marker) {
|
|
|
|
|
TextMarker *tmp= marker;
|
|
|
|
|
while (tmp) {
|
|
|
|
|
if (tmp->next) tmp= tmp->next;
|
|
|
|
|
else tmp= text->markers.first;
|
|
|
|
|
if (color_match(tmp, marker))
|
|
|
|
|
if (tmp->group == marker->group)
|
|
|
|
|
return tmp;
|
|
|
|
|
}
|
|
|
|
|
return NULL; /* Only if marker==NULL */
|
|
|
|
|
|