Patch [#31006] Text editor undo buffer rework.
This commit is contained in:
@@ -83,7 +83,7 @@ void txt_sel_line (struct Text *text);
|
||||
char* txt_sel_to_buf (struct Text *text);
|
||||
void txt_insert_buf (struct Text *text, const char *in_buffer);
|
||||
void txt_print_undo (struct Text *text);
|
||||
void txt_undo_add_toop (struct Text *text, int op, unsigned int froml, unsigned short fromc, unsigned int tol, unsigned short toc);
|
||||
void txt_undo_add_op (struct Text *text, int op);
|
||||
void txt_do_undo (struct Text *text);
|
||||
void txt_do_redo (struct Text *text);
|
||||
void txt_split_curline (struct Text *text);
|
||||
@@ -123,24 +123,6 @@ enum {
|
||||
|
||||
/* Undo opcodes */
|
||||
|
||||
/* Simple main cursor movement */
|
||||
#define UNDO_CLEFT 001
|
||||
#define UNDO_CRIGHT 002
|
||||
#define UNDO_CUP 003
|
||||
#define UNDO_CDOWN 004
|
||||
|
||||
/* Simple selection cursor movement */
|
||||
#define UNDO_SLEFT 005
|
||||
#define UNDO_SRIGHT 006
|
||||
#define UNDO_SUP 007
|
||||
#define UNDO_SDOWN 010
|
||||
|
||||
/* Complex movement (opcode is followed
|
||||
* by 4 character line ID + a 2 character
|
||||
* position ID and opcode (repeat)) */
|
||||
#define UNDO_CTO 011
|
||||
#define UNDO_STO 012
|
||||
|
||||
/* Complex editing */
|
||||
/* 1 - opcode is followed by 1 byte for ascii character and opcode (repeat)) */
|
||||
/* 2 - opcode is followed by 2 bytes for utf-8 character and opcode (repeat)) */
|
||||
@@ -169,8 +151,6 @@ enum {
|
||||
#define UNDO_IBLOCK 030 /* Insert block */
|
||||
|
||||
/* Misc */
|
||||
#define UNDO_SWAP 031 /* Swap cursors */
|
||||
|
||||
#define UNDO_INDENT 032
|
||||
#define UNDO_UNINDENT 033
|
||||
#define UNDO_COMMENT 034
|
||||
|
||||
@@ -136,8 +136,7 @@
|
||||
|
||||
static void txt_pop_first(Text *text);
|
||||
static void txt_pop_last(Text *text);
|
||||
static void txt_undo_add_op(Text *text, int op);
|
||||
static void txt_undo_add_block(Text *text, int op, const char *buf);
|
||||
static void txt_undo_add_blockop(Text *text, int op, const char *buf);
|
||||
static void txt_delete_line(Text *text, TextLine *line);
|
||||
static void txt_delete_sel(Text *text);
|
||||
static void txt_make_dirty(Text *text);
|
||||
@@ -785,23 +784,6 @@ static void txt_curs_sel(Text *text, TextLine ***linep, int **charp)
|
||||
*linep = &text->sell; *charp = &text->selc;
|
||||
}
|
||||
|
||||
static void txt_curs_first(Text *text, TextLine **linep, int *charp)
|
||||
{
|
||||
if (text->curl == text->sell) {
|
||||
*linep = text->curl;
|
||||
if (text->curc < text->selc) *charp = text->curc;
|
||||
else *charp = text->selc;
|
||||
}
|
||||
else if (txt_get_span(text->lines.first, text->curl) < txt_get_span(text->lines.first, text->sell)) {
|
||||
*linep = text->curl;
|
||||
*charp = text->curc;
|
||||
}
|
||||
else {
|
||||
*linep = text->sell;
|
||||
*charp = text->selc;
|
||||
}
|
||||
}
|
||||
|
||||
/*****************************/
|
||||
/* Cursor movement functions */
|
||||
/*****************************/
|
||||
@@ -843,13 +825,11 @@ void txt_move_up(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp;
|
||||
/* int old; */ /* UNUSED */
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else { txt_pop_first(text); txt_curs_cur(text, &linep, &charp); }
|
||||
if (!*linep) return;
|
||||
/* old = *charp; */ /* UNUSED */
|
||||
|
||||
if ((*linep)->prev) {
|
||||
int index = txt_utf8_offset_to_index((*linep)->line, *charp);
|
||||
@@ -857,8 +837,6 @@ void txt_move_up(Text *text, short sel)
|
||||
if (index > txt_utf8_len((*linep)->line)) *charp = (*linep)->len;
|
||||
else *charp = txt_utf8_index_to_offset((*linep)->line, index);
|
||||
|
||||
if (!undoing)
|
||||
txt_undo_add_op(text, sel ? UNDO_SUP : UNDO_CUP);
|
||||
}
|
||||
else {
|
||||
txt_move_bol(text, sel);
|
||||
@@ -871,22 +849,17 @@ void txt_move_down(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp;
|
||||
/* int old; */ /* UNUSED */
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else { txt_pop_last(text); txt_curs_cur(text, &linep, &charp); }
|
||||
if (!*linep) return;
|
||||
/* old = *charp; */ /* UNUSED */
|
||||
|
||||
if ((*linep)->next) {
|
||||
int index = txt_utf8_offset_to_index((*linep)->line, *charp);
|
||||
*linep = (*linep)->next;
|
||||
if (index > txt_utf8_len((*linep)->line)) *charp = (*linep)->len;
|
||||
else *charp = txt_utf8_index_to_offset((*linep)->line, index);
|
||||
|
||||
if (!undoing)
|
||||
txt_undo_add_op(text, sel ? UNDO_SDOWN : UNDO_CDOWN);
|
||||
}
|
||||
else {
|
||||
txt_move_eol(text, sel);
|
||||
@@ -898,7 +871,7 @@ void txt_move_down(Text *text, short sel)
|
||||
void txt_move_left(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp, oundoing = undoing;
|
||||
int *charp;
|
||||
int tabsize = 0, i = 0;
|
||||
|
||||
if (!text) return;
|
||||
@@ -906,8 +879,6 @@ void txt_move_left(Text *text, short sel)
|
||||
else { txt_pop_first(text); txt_curs_cur(text, &linep, &charp); }
|
||||
if (!*linep) return;
|
||||
|
||||
undoing = 1;
|
||||
|
||||
if (*charp == 0) {
|
||||
if ((*linep)->prev) {
|
||||
txt_move_up(text, sel);
|
||||
@@ -939,24 +910,19 @@ void txt_move_left(Text *text, short sel)
|
||||
}
|
||||
}
|
||||
|
||||
undoing = oundoing;
|
||||
if (!undoing) txt_undo_add_op(text, sel ? UNDO_SLEFT : UNDO_CLEFT);
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
}
|
||||
|
||||
void txt_move_right(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp, oundoing = undoing, do_tab = FALSE, i;
|
||||
int *charp, do_tab = FALSE, i;
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else { txt_pop_last(text); txt_curs_cur(text, &linep, &charp); }
|
||||
if (!*linep) return;
|
||||
|
||||
undoing = 1;
|
||||
|
||||
if (*charp == (*linep)->len) {
|
||||
if ((*linep)->next) {
|
||||
txt_move_down(text, sel);
|
||||
@@ -984,124 +950,103 @@ void txt_move_right(Text *text, short sel)
|
||||
else (*charp) += BLI_str_utf8_size((*linep)->line + *charp);
|
||||
}
|
||||
|
||||
undoing = oundoing;
|
||||
if (!undoing) txt_undo_add_op(text, sel ? UNDO_SRIGHT : UNDO_CRIGHT);
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
}
|
||||
|
||||
void txt_jump_left(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp, oldc;
|
||||
int *charp;
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else { txt_pop_first(text); txt_curs_cur(text, &linep, &charp); }
|
||||
if (!*linep) return;
|
||||
oldc = *charp;
|
||||
|
||||
BLI_str_cursor_step_utf8((*linep)->line, (*linep)->len,
|
||||
charp, STRCUR_DIR_PREV,
|
||||
STRCUR_JUMP_DELIM);
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
if (!undoing) {
|
||||
int span = txt_get_span(text->lines.first, *linep);
|
||||
txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, span, oldc, span, (unsigned short)*charp);
|
||||
}
|
||||
}
|
||||
|
||||
void txt_jump_right(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp, oldc;
|
||||
int *charp;
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else { txt_pop_last(text); txt_curs_cur(text, &linep, &charp); }
|
||||
if (!*linep) return;
|
||||
oldc = *charp;
|
||||
|
||||
BLI_str_cursor_step_utf8((*linep)->line, (*linep)->len,
|
||||
charp, STRCUR_DIR_NEXT,
|
||||
STRCUR_JUMP_DELIM);
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
if (!undoing) {
|
||||
int span = txt_get_span(text->lines.first, *linep);
|
||||
txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, span, oldc, span, (unsigned short)*charp);
|
||||
}
|
||||
}
|
||||
|
||||
void txt_move_bol(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp, old;
|
||||
int *charp;
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else txt_curs_cur(text, &linep, &charp);
|
||||
if (!*linep) return;
|
||||
old = *charp;
|
||||
|
||||
*charp = 0;
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, *linep), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
|
||||
}
|
||||
|
||||
void txt_move_eol(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp, old;
|
||||
int *charp;
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else txt_curs_cur(text, &linep, &charp);
|
||||
if (!*linep) return;
|
||||
old = *charp;
|
||||
|
||||
|
||||
*charp = (*linep)->len;
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, *linep), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
|
||||
}
|
||||
|
||||
void txt_move_bof(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp, old;
|
||||
int *charp;
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else txt_curs_cur(text, &linep, &charp);
|
||||
if (!*linep) return;
|
||||
old = *charp;
|
||||
|
||||
*linep = text->lines.first;
|
||||
*charp = 0;
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, *linep), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
|
||||
}
|
||||
|
||||
void txt_move_eof(Text *text, short sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int *charp, old;
|
||||
int *charp;
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else txt_curs_cur(text, &linep, &charp);
|
||||
if (!*linep) return;
|
||||
old = *charp;
|
||||
|
||||
*linep = text->lines.last;
|
||||
*charp = (*linep)->len;
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, *linep), old, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
|
||||
}
|
||||
|
||||
void txt_move_toline(Text *text, unsigned int line, short sel)
|
||||
@@ -1112,16 +1057,14 @@ void txt_move_toline(Text *text, unsigned int line, short sel)
|
||||
/* Moves to a certain byte in a line, not a certain utf8-character! */
|
||||
void txt_move_to(Text *text, unsigned int line, unsigned int ch, short sel)
|
||||
{
|
||||
TextLine **linep, *oldl;
|
||||
int *charp, oldc;
|
||||
TextLine **linep;
|
||||
int *charp;
|
||||
unsigned int i;
|
||||
|
||||
if (!text) return;
|
||||
if (sel) txt_curs_sel(text, &linep, &charp);
|
||||
else txt_curs_cur(text, &linep, &charp);
|
||||
if (!*linep) return;
|
||||
oldc = *charp;
|
||||
oldl = *linep;
|
||||
|
||||
*linep = text->lines.first;
|
||||
for (i = 0; i < line; i++) {
|
||||
@@ -1133,7 +1076,6 @@ void txt_move_to(Text *text, unsigned int line, unsigned int ch, short sel)
|
||||
*charp = ch;
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
if (!undoing) txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, txt_get_span(text->lines.first, oldl), oldc, txt_get_span(text->lines.first, *linep), (unsigned short)*charp);
|
||||
}
|
||||
|
||||
/****************************/
|
||||
@@ -1152,8 +1094,6 @@ static void txt_curs_swap(Text *text)
|
||||
tmpc = text->curc;
|
||||
text->curc = text->selc;
|
||||
text->selc = tmpc;
|
||||
|
||||
if (!undoing) txt_undo_add_op(text, UNDO_SWAP);
|
||||
}
|
||||
|
||||
static void txt_pop_first(Text *text)
|
||||
@@ -1164,12 +1104,6 @@ static void txt_pop_first(Text *text)
|
||||
{
|
||||
txt_curs_swap(text);
|
||||
}
|
||||
|
||||
if (!undoing) txt_undo_add_toop(text, UNDO_STO,
|
||||
txt_get_span(text->lines.first, text->sell),
|
||||
text->selc,
|
||||
txt_get_span(text->lines.first, text->curl),
|
||||
text->curc);
|
||||
|
||||
txt_pop_sel(text);
|
||||
}
|
||||
@@ -1181,12 +1115,6 @@ static void txt_pop_last(Text *text)
|
||||
{
|
||||
txt_curs_swap(text);
|
||||
}
|
||||
|
||||
if (!undoing) txt_undo_add_toop(text, UNDO_STO,
|
||||
txt_get_span(text->lines.first, text->sell),
|
||||
text->selc,
|
||||
txt_get_span(text->lines.first, text->curl),
|
||||
text->curc);
|
||||
|
||||
txt_pop_sel(text);
|
||||
}
|
||||
@@ -1236,7 +1164,7 @@ static void txt_delete_sel(Text *text)
|
||||
|
||||
if (!undoing) {
|
||||
buf = txt_sel_to_buf(text);
|
||||
txt_undo_add_block(text, UNDO_DBLOCK, buf);
|
||||
txt_undo_add_blockop(text, UNDO_DBLOCK, buf);
|
||||
MEM_freeN(buf);
|
||||
}
|
||||
|
||||
@@ -1517,7 +1445,7 @@ void txt_insert_buf(Text *text, const char *in_buffer)
|
||||
buffer = BLI_strdupn(in_buffer, len);
|
||||
len += txt_extended_ascii_as_utf8(&buffer);
|
||||
|
||||
if (!undoing) txt_undo_add_block(text, UNDO_IBLOCK, buffer);
|
||||
if (!undoing) txt_undo_add_blockop(text, UNDO_IBLOCK, buffer);
|
||||
|
||||
u = undoing;
|
||||
undoing = 1;
|
||||
@@ -1599,6 +1527,7 @@ static void dump_buffer(Text *text)
|
||||
while (i++ < text->undo_pos) printf("%d: %d %c\n", i, text->undo_buf[i], text->undo_buf[i]);
|
||||
}
|
||||
|
||||
/* Note: this function is outdated and must be updated if needed for future use */
|
||||
void txt_print_undo(Text *text)
|
||||
{
|
||||
int i = 0;
|
||||
@@ -1615,37 +1544,7 @@ void txt_print_undo(Text *text)
|
||||
while (i <= text->undo_pos) {
|
||||
op = text->undo_buf[i];
|
||||
|
||||
if (op == UNDO_CLEFT) {
|
||||
ops = "Cursor left";
|
||||
}
|
||||
else if (op == UNDO_CRIGHT) {
|
||||
ops = "Cursor right";
|
||||
}
|
||||
else if (op == UNDO_CUP) {
|
||||
ops = "Cursor up";
|
||||
}
|
||||
else if (op == UNDO_CDOWN) {
|
||||
ops = "Cursor down";
|
||||
}
|
||||
else if (op == UNDO_SLEFT) {
|
||||
ops = "Selection left";
|
||||
}
|
||||
else if (op == UNDO_SRIGHT) {
|
||||
ops = "Selection right";
|
||||
}
|
||||
else if (op == UNDO_SUP) {
|
||||
ops = "Selection up";
|
||||
}
|
||||
else if (op == UNDO_SDOWN) {
|
||||
ops = "Selection down";
|
||||
}
|
||||
else if (op == UNDO_STO) {
|
||||
ops = "Selection ";
|
||||
}
|
||||
else if (op == UNDO_CTO) {
|
||||
ops = "Cursor ";
|
||||
}
|
||||
else if (op == UNDO_INSERT_1) {
|
||||
if (op == UNDO_INSERT_1) {
|
||||
ops = "Insert ascii ";
|
||||
}
|
||||
else if (op == UNDO_INSERT_2) {
|
||||
@@ -1681,9 +1580,6 @@ void txt_print_undo(Text *text)
|
||||
else if (op == UNDO_DEL_4) {
|
||||
ops = "Delete unicode ";
|
||||
}
|
||||
else if (op == UNDO_SWAP) {
|
||||
ops = "Cursor swap";
|
||||
}
|
||||
else if (op == UNDO_DBLOCK) {
|
||||
ops = "Delete text block";
|
||||
}
|
||||
@@ -1738,29 +1634,6 @@ void txt_print_undo(Text *text)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (op == UNDO_STO || op == UNDO_CTO) {
|
||||
i++;
|
||||
|
||||
charp = text->undo_buf[i]; i++;
|
||||
charp = charp + (text->undo_buf[i] << 8); i++;
|
||||
|
||||
linep = text->undo_buf[i]; i++;
|
||||
linep = linep + (text->undo_buf[i] << 8); i++;
|
||||
linep = linep + (text->undo_buf[i] << 16); i++;
|
||||
linep = linep + (text->undo_buf[i] << 24); i++;
|
||||
|
||||
printf("to <%d, %d> ", linep, charp);
|
||||
|
||||
charp = text->undo_buf[i]; i++;
|
||||
charp = charp + (text->undo_buf[i] << 8); i++;
|
||||
|
||||
linep = text->undo_buf[i]; i++;
|
||||
linep = linep + (text->undo_buf[i] << 8); i++;
|
||||
linep = linep + (text->undo_buf[i] << 16); i++;
|
||||
linep = linep + (text->undo_buf[i] << 24); i++;
|
||||
|
||||
printf("from <%d, %d>", linep, charp);
|
||||
}
|
||||
else if (op == UNDO_DBLOCK || op == UNDO_IBLOCK) {
|
||||
i++;
|
||||
|
||||
@@ -1811,16 +1684,6 @@ void txt_print_undo(Text *text)
|
||||
}
|
||||
}
|
||||
|
||||
static void txt_undo_add_op(Text *text, int op)
|
||||
{
|
||||
if (!max_undo_test(text, 2))
|
||||
return;
|
||||
|
||||
text->undo_pos++;
|
||||
text->undo_buf[text->undo_pos] = op;
|
||||
text->undo_buf[text->undo_pos + 1] = 0;
|
||||
}
|
||||
|
||||
static void txt_undo_store_uint16(char *undo_buf, int *undo_pos, unsigned short value)
|
||||
{
|
||||
undo_buf[*undo_pos] = (value) & 0xff;
|
||||
@@ -1841,17 +1704,41 @@ static void txt_undo_store_uint32(char *undo_buf, int *undo_pos, unsigned int va
|
||||
(*undo_pos)++;
|
||||
}
|
||||
|
||||
static void txt_undo_add_block(Text *text, int op, const char *buf)
|
||||
/* store the cur cursor to the undo buffer */
|
||||
static void txt_undo_store_cur(Text *text)
|
||||
{
|
||||
txt_undo_store_uint16(text->undo_buf, &text->undo_pos, text->curc);
|
||||
txt_undo_store_uint32(text->undo_buf, &text->undo_pos, txt_get_span(text->lines.first, text->curl));
|
||||
}
|
||||
|
||||
/* store the sel cursor to the undo buffer */
|
||||
static void txt_undo_store_sel(Text *text)
|
||||
{
|
||||
txt_undo_store_uint16(text->undo_buf, &text->undo_pos, text->selc);
|
||||
txt_undo_store_uint32(text->undo_buf, &text->undo_pos, txt_get_span(text->lines.first, text->sell));
|
||||
}
|
||||
|
||||
/* store both cursors to the undo buffer */
|
||||
static void txt_undo_store_cursors(Text *text)
|
||||
{
|
||||
txt_undo_store_cur(text);
|
||||
txt_undo_store_sel(text);
|
||||
}
|
||||
|
||||
/* store an operator along with a block of data */
|
||||
static void txt_undo_add_blockop(Text *text, int op, const char *buf)
|
||||
{
|
||||
unsigned int length = strlen(buf);
|
||||
|
||||
if (!max_undo_test(text, length + 11))
|
||||
if (!max_undo_test(text, length + 11 + 12))
|
||||
return;
|
||||
|
||||
text->undo_pos++;
|
||||
text->undo_buf[text->undo_pos] = op;
|
||||
text->undo_pos++;
|
||||
|
||||
txt_undo_store_cursors(text);
|
||||
|
||||
txt_undo_store_uint32(text->undo_buf, &text->undo_pos, length);
|
||||
|
||||
strncpy(text->undo_buf + text->undo_pos, buf, length);
|
||||
@@ -1863,34 +1750,30 @@ static void txt_undo_add_block(Text *text, int op, const char *buf)
|
||||
text->undo_buf[text->undo_pos + 1] = 0;
|
||||
}
|
||||
|
||||
void txt_undo_add_toop(Text *text, int op, unsigned int froml, unsigned short fromc, unsigned int tol, unsigned short toc)
|
||||
/* store a regular operator */
|
||||
void txt_undo_add_op(Text *text, int op)
|
||||
{
|
||||
if (!max_undo_test(text, 15))
|
||||
return;
|
||||
|
||||
if (froml == tol && fromc == toc) return;
|
||||
|
||||
text->undo_pos++;
|
||||
text->undo_buf[text->undo_pos] = op;
|
||||
|
||||
text->undo_pos++;
|
||||
|
||||
txt_undo_store_uint16(text->undo_buf, &text->undo_pos, fromc);
|
||||
txt_undo_store_uint32(text->undo_buf, &text->undo_pos, froml);
|
||||
txt_undo_store_uint16(text->undo_buf, &text->undo_pos, toc);
|
||||
txt_undo_store_uint32(text->undo_buf, &text->undo_pos, tol);
|
||||
txt_undo_store_cursors(text);
|
||||
|
||||
text->undo_buf[text->undo_pos] = op;
|
||||
|
||||
text->undo_buf[text->undo_pos + 1] = 0;
|
||||
text->undo_buf[text->undo_pos+1] = 0;
|
||||
}
|
||||
|
||||
/* store an operator for a single character */
|
||||
static void txt_undo_add_charop(Text *text, int op_start, unsigned int c)
|
||||
{
|
||||
char utf8[BLI_UTF8_MAX];
|
||||
size_t i, utf8_size = BLI_str_utf8_from_unicode(c, utf8);
|
||||
|
||||
if (!max_undo_test(text, 3 + utf8_size))
|
||||
if (!max_undo_test(text, 3 + utf8_size + 12))
|
||||
return;
|
||||
|
||||
text->undo_pos++;
|
||||
@@ -1899,6 +1782,8 @@ static void txt_undo_add_charop(Text *text, int op_start, unsigned int c)
|
||||
text->undo_buf[text->undo_pos] = op_start + utf8_size - 1;
|
||||
text->undo_pos++;
|
||||
|
||||
txt_undo_store_cur(text);
|
||||
|
||||
for (i = 0; i < utf8_size; i++) {
|
||||
text->undo_buf[text->undo_pos] = utf8[i];
|
||||
text->undo_pos++;
|
||||
@@ -1909,6 +1794,9 @@ static void txt_undo_add_charop(Text *text, int op_start, unsigned int c)
|
||||
else {
|
||||
text->undo_buf[text->undo_pos] = op_start + 3;
|
||||
text->undo_pos++;
|
||||
|
||||
txt_undo_store_cursors(text);
|
||||
|
||||
txt_undo_store_uint32(text->undo_buf, &text->undo_pos, c);
|
||||
text->undo_buf[text->undo_pos] = op_start + 3;
|
||||
}
|
||||
@@ -1934,6 +1822,29 @@ static unsigned int txt_undo_read_uint32(const char *undo_buf, int *undo_pos)
|
||||
return val;
|
||||
}
|
||||
|
||||
/* read the cur cursor from the undo buffer */
|
||||
static void txt_undo_read_cur(const char *undo_buf, int *undo_pos, unsigned int *curln, unsigned short *curc)
|
||||
{
|
||||
*curln = txt_undo_read_uint32(undo_buf, undo_pos);
|
||||
*curc = txt_undo_read_uint16(undo_buf, undo_pos);
|
||||
}
|
||||
|
||||
/* read the sel cursor from the undo buffer */
|
||||
static void txt_undo_read_sel(const char *undo_buf, int *undo_pos, unsigned int *selln, unsigned short *selc)
|
||||
{
|
||||
*selln = txt_undo_read_uint32(undo_buf, undo_pos);
|
||||
*selc = txt_undo_read_uint16(undo_buf, undo_pos);
|
||||
}
|
||||
|
||||
/* read both cursors from the undo buffer */
|
||||
static void txt_undo_read_cursors(const char *undo_buf, int *undo_pos,
|
||||
unsigned int *curln, unsigned short *curc,
|
||||
unsigned int *selln, unsigned short *selc)
|
||||
{
|
||||
txt_undo_read_sel(undo_buf, undo_pos, selln, selc);
|
||||
txt_undo_read_cur(undo_buf, undo_pos, curln, curc);
|
||||
}
|
||||
|
||||
static unsigned int txt_undo_read_unicode(const char *undo_buf, int *undo_pos, short bytes)
|
||||
{
|
||||
unsigned int unicode;
|
||||
@@ -1986,6 +1897,29 @@ static unsigned int txt_redo_read_uint32(const char *undo_buf, int *undo_pos)
|
||||
return val;
|
||||
}
|
||||
|
||||
/* redo read cur cursor from the undo buffer */
|
||||
static void txt_redo_read_cur(const char *undo_buf, int *undo_pos, unsigned int *curln, unsigned short *curc)
|
||||
{
|
||||
*curc = txt_redo_read_uint16(undo_buf, undo_pos);
|
||||
*curln = txt_redo_read_uint32(undo_buf, undo_pos);
|
||||
}
|
||||
|
||||
/* redo read sel cursor from the undo buffer */
|
||||
static void txt_redo_read_sel(const char *undo_buf, int *undo_pos, unsigned int *selln, unsigned short *selc)
|
||||
{
|
||||
*selc = txt_redo_read_uint16(undo_buf, undo_pos);
|
||||
*selln = txt_redo_read_uint32(undo_buf, undo_pos);
|
||||
}
|
||||
|
||||
/* redo read both cursors from the undo buffer */
|
||||
static void txt_redo_read_cursors(const char *undo_buf, int *undo_pos,
|
||||
unsigned int *curln, unsigned short *curc,
|
||||
unsigned int *selln, unsigned short *selc)
|
||||
{
|
||||
txt_redo_read_cur(undo_buf, undo_pos, curln, curc);
|
||||
txt_redo_read_sel(undo_buf, undo_pos, selln, selc);
|
||||
}
|
||||
|
||||
static unsigned int txt_redo_read_unicode(const char *undo_buf, int *undo_pos, short bytes)
|
||||
{
|
||||
unsigned int unicode;
|
||||
@@ -2024,9 +1958,10 @@ void txt_do_undo(Text *text)
|
||||
{
|
||||
int op = text->undo_buf[text->undo_pos];
|
||||
unsigned int linep, i;
|
||||
unsigned int uchar;
|
||||
unsigned int curln, selln;
|
||||
unsigned short curc, selc;
|
||||
unsigned short charp;
|
||||
TextLine *holdl;
|
||||
int holdc, holdln;
|
||||
char *buf;
|
||||
|
||||
if (text->undo_pos < 0) {
|
||||
@@ -2038,88 +1973,60 @@ void txt_do_undo(Text *text)
|
||||
undoing = 1;
|
||||
|
||||
switch (op) {
|
||||
case UNDO_CLEFT:
|
||||
txt_move_right(text, 0);
|
||||
break;
|
||||
|
||||
case UNDO_CRIGHT:
|
||||
txt_move_left(text, 0);
|
||||
break;
|
||||
|
||||
case UNDO_CUP:
|
||||
txt_move_down(text, 0);
|
||||
break;
|
||||
|
||||
case UNDO_CDOWN:
|
||||
txt_move_up(text, 0);
|
||||
break;
|
||||
|
||||
case UNDO_SLEFT:
|
||||
txt_move_right(text, 1);
|
||||
break;
|
||||
|
||||
case UNDO_SRIGHT:
|
||||
txt_move_left(text, 1);
|
||||
break;
|
||||
|
||||
case UNDO_SUP:
|
||||
txt_move_down(text, 1);
|
||||
break;
|
||||
|
||||
case UNDO_SDOWN:
|
||||
txt_move_up(text, 1);
|
||||
break;
|
||||
|
||||
case UNDO_CTO:
|
||||
case UNDO_STO:
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
|
||||
linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
charp = txt_undo_read_uint16(text->undo_buf, &text->undo_pos);
|
||||
|
||||
if (op == UNDO_CTO) {
|
||||
txt_move_toline(text, linep, 0);
|
||||
text->curc = charp;
|
||||
txt_pop_sel(text);
|
||||
}
|
||||
else {
|
||||
txt_move_toline(text, linep, 1);
|
||||
text->selc = charp;
|
||||
}
|
||||
|
||||
text->undo_pos--;
|
||||
break;
|
||||
|
||||
case UNDO_INSERT_1: case UNDO_INSERT_2: case UNDO_INSERT_3: case UNDO_INSERT_4:
|
||||
txt_backspace_char(text);
|
||||
case UNDO_INSERT_1:
|
||||
case UNDO_INSERT_2:
|
||||
case UNDO_INSERT_3:
|
||||
case UNDO_INSERT_4:
|
||||
text->undo_pos -= op - UNDO_INSERT_1 + 1;
|
||||
text->undo_pos--;
|
||||
break;
|
||||
|
||||
case UNDO_BS_1: case UNDO_BS_2: case UNDO_BS_3: case UNDO_BS_4:
|
||||
charp = op - UNDO_BS_1 + 1;
|
||||
txt_add_char(text, txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp));
|
||||
text->undo_pos--;
|
||||
break;
|
||||
|
||||
case UNDO_DEL_1: case UNDO_DEL_2: case UNDO_DEL_3: case UNDO_DEL_4:
|
||||
charp = op - UNDO_DEL_1 + 1;
|
||||
txt_add_char(text, txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp));
|
||||
txt_move_left(text, 0);
|
||||
/* get and restore the cursors */
|
||||
txt_undo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, curln, curc, 1);
|
||||
|
||||
txt_delete_char(text);
|
||||
|
||||
text->undo_pos--;
|
||||
break;
|
||||
|
||||
case UNDO_SWAP:
|
||||
txt_curs_swap(text);
|
||||
case UNDO_BS_1:
|
||||
case UNDO_BS_2:
|
||||
case UNDO_BS_3:
|
||||
case UNDO_BS_4:
|
||||
charp = op - UNDO_BS_1 + 1;
|
||||
uchar = txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp);
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_undo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, curln, curc, 1);
|
||||
|
||||
txt_add_char(text, uchar);
|
||||
|
||||
text->undo_pos--;
|
||||
break;
|
||||
|
||||
case UNDO_DEL_1:
|
||||
case UNDO_DEL_2:
|
||||
case UNDO_DEL_3:
|
||||
case UNDO_DEL_4:
|
||||
charp = op - UNDO_DEL_1 + 1;
|
||||
uchar = txt_undo_read_unicode(text->undo_buf, &text->undo_pos, charp);
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_undo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, curln, curc, 1);
|
||||
|
||||
txt_add_char(text, uchar);
|
||||
|
||||
txt_move_left(text, 0);
|
||||
|
||||
text->undo_pos--;
|
||||
break;
|
||||
|
||||
case UNDO_DBLOCK:
|
||||
/* length of the string in the buffer */
|
||||
linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
|
||||
buf = MEM_mallocN(linep + 1, "dblock buffer");
|
||||
@@ -2128,34 +2035,33 @@ void txt_do_undo(Text *text)
|
||||
text->undo_pos--;
|
||||
}
|
||||
buf[i] = 0;
|
||||
|
||||
txt_curs_first(text, &holdl, &holdc);
|
||||
holdln = txt_get_span(text->lines.first, holdl);
|
||||
|
||||
txt_insert_buf(text, buf);
|
||||
MEM_freeN(buf);
|
||||
|
||||
text->curl = text->lines.first;
|
||||
while (holdln > 0) {
|
||||
if (text->curl->next)
|
||||
text->curl = text->curl->next;
|
||||
|
||||
holdln--;
|
||||
}
|
||||
text->curc = holdc;
|
||||
|
||||
/* skip over the length that was stored again */
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
|
||||
/* Get the cursor positions */
|
||||
txt_undo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
|
||||
|
||||
/* move cur to location that needs buff inserted */
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
|
||||
txt_insert_buf(text, buf);
|
||||
MEM_freeN(buf);
|
||||
|
||||
/* restore the cursors */
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, selln, selc, 1);
|
||||
|
||||
text->undo_pos--;
|
||||
|
||||
break;
|
||||
|
||||
case UNDO_IBLOCK:
|
||||
/* length of the string in the buffer */
|
||||
linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
txt_delete_sel(text);
|
||||
|
||||
/* txt_backspace_char removes utf8-characters, not bytes */
|
||||
buf = MEM_mallocN(linep + 1, "iblock buffer");
|
||||
@@ -2167,47 +2073,32 @@ void txt_do_undo(Text *text)
|
||||
linep = txt_utf8_len(buf);
|
||||
MEM_freeN(buf);
|
||||
|
||||
while (linep > 0) {
|
||||
txt_backspace_char(text);
|
||||
linep--;
|
||||
}
|
||||
/* skip over the length that was stored again */
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_undo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, curln, curc + linep, 1);
|
||||
|
||||
txt_delete_selected(text);
|
||||
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
text->undo_pos--;
|
||||
|
||||
text->undo_pos--;
|
||||
|
||||
break;
|
||||
case UNDO_INDENT:
|
||||
case UNDO_UNINDENT:
|
||||
case UNDO_COMMENT:
|
||||
case UNDO_UNCOMMENT:
|
||||
linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
//linep is now the end line of the selection
|
||||
|
||||
charp = txt_undo_read_uint16(text->undo_buf, &text->undo_pos);
|
||||
//charp is the last char selected or text->line->len
|
||||
|
||||
//set the selection for this now
|
||||
text->selc = charp;
|
||||
text->sell = text->lines.first;
|
||||
for (i = 0; i < linep; i++) {
|
||||
text->sell = text->sell->next;
|
||||
}
|
||||
|
||||
linep = txt_undo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
//first line to be selected
|
||||
|
||||
charp = txt_undo_read_uint16(text->undo_buf, &text->undo_pos);
|
||||
//first postion to be selected
|
||||
text->curc = charp;
|
||||
text->curl = text->lines.first;
|
||||
for (i = 0; i < linep; i++) {
|
||||
text->curl = text->curl->next;
|
||||
}
|
||||
|
||||
case UNDO_DUPLICATE:
|
||||
case UNDO_MOVE_LINES_UP:
|
||||
case UNDO_MOVE_LINES_DOWN:
|
||||
/* get and restore the cursors */
|
||||
txt_undo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, selln, selc, 1);
|
||||
|
||||
if (op == UNDO_INDENT) {
|
||||
txt_unindent(text);
|
||||
@@ -2221,37 +2112,24 @@ void txt_do_undo(Text *text)
|
||||
else if (op == UNDO_UNCOMMENT) {
|
||||
txt_comment(text);
|
||||
}
|
||||
else if (op == UNDO_DUPLICATE) {
|
||||
txt_delete_line(text, text->curl->next);
|
||||
}
|
||||
else if (op == UNDO_MOVE_LINES_UP) {
|
||||
txt_move_lines(text, TXT_MOVE_LINE_DOWN);
|
||||
}
|
||||
else if (op == UNDO_MOVE_LINES_DOWN) {
|
||||
txt_move_lines(text, TXT_MOVE_LINE_UP);
|
||||
}
|
||||
|
||||
text->undo_pos--;
|
||||
break;
|
||||
case UNDO_DUPLICATE:
|
||||
txt_delete_line(text, text->curl->next);
|
||||
break;
|
||||
case UNDO_MOVE_LINES_UP:
|
||||
txt_move_lines(text, TXT_MOVE_LINE_DOWN);
|
||||
break;
|
||||
case UNDO_MOVE_LINES_DOWN:
|
||||
txt_move_lines(text, TXT_MOVE_LINE_UP);
|
||||
break;
|
||||
default:
|
||||
//XXX error("Undo buffer error - resetting");
|
||||
text->undo_pos = -1;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
/* next undo step may need evaluating */
|
||||
if (text->undo_pos >= 0) {
|
||||
switch (text->undo_buf[text->undo_pos]) {
|
||||
case UNDO_STO:
|
||||
txt_do_undo(text);
|
||||
txt_do_redo(text); /* selections need restoring */
|
||||
break;
|
||||
case UNDO_SWAP:
|
||||
txt_do_undo(text); /* swaps should appear transparent */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
undoing = 0;
|
||||
}
|
||||
@@ -2259,9 +2137,12 @@ void txt_do_undo(Text *text)
|
||||
void txt_do_redo(Text *text)
|
||||
{
|
||||
char op;
|
||||
unsigned int linep, i;
|
||||
unsigned short charp;
|
||||
char *buf;
|
||||
unsigned int linep;
|
||||
unsigned short charp;
|
||||
unsigned int uchar;
|
||||
unsigned int curln, selln;
|
||||
unsigned short curc, selc;
|
||||
|
||||
text->undo_pos++;
|
||||
op = text->undo_buf[text->undo_pos];
|
||||
@@ -2274,104 +2155,91 @@ void txt_do_redo(Text *text)
|
||||
undoing = 1;
|
||||
|
||||
switch (op) {
|
||||
case UNDO_CLEFT:
|
||||
txt_move_left(text, 0);
|
||||
break;
|
||||
|
||||
case UNDO_CRIGHT:
|
||||
txt_move_right(text, 0);
|
||||
break;
|
||||
|
||||
case UNDO_CUP:
|
||||
txt_move_up(text, 0);
|
||||
break;
|
||||
|
||||
case UNDO_CDOWN:
|
||||
txt_move_down(text, 0);
|
||||
break;
|
||||
|
||||
case UNDO_SLEFT:
|
||||
txt_move_left(text, 1);
|
||||
break;
|
||||
|
||||
case UNDO_SRIGHT:
|
||||
txt_move_right(text, 1);
|
||||
break;
|
||||
|
||||
case UNDO_SUP:
|
||||
txt_move_up(text, 1);
|
||||
break;
|
||||
|
||||
case UNDO_SDOWN:
|
||||
txt_move_down(text, 1);
|
||||
break;
|
||||
|
||||
case UNDO_INSERT_1: case UNDO_INSERT_2: case UNDO_INSERT_3: case UNDO_INSERT_4:
|
||||
case UNDO_INSERT_1:
|
||||
case UNDO_INSERT_2:
|
||||
case UNDO_INSERT_3:
|
||||
case UNDO_INSERT_4:
|
||||
text->undo_pos++;
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_redo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, curln, curc, 1);
|
||||
|
||||
charp = op - UNDO_INSERT_1 + 1;
|
||||
txt_add_char(text, txt_redo_read_unicode(text->undo_buf, &text->undo_pos, charp));
|
||||
uchar = txt_redo_read_unicode(text->undo_buf, &text->undo_pos, charp);
|
||||
|
||||
txt_add_char(text, uchar);
|
||||
break;
|
||||
|
||||
case UNDO_BS_1: case UNDO_BS_2: case UNDO_BS_3: case UNDO_BS_4:
|
||||
case UNDO_BS_1:
|
||||
case UNDO_BS_2:
|
||||
case UNDO_BS_3:
|
||||
case UNDO_BS_4:
|
||||
text->undo_pos++;
|
||||
txt_backspace_char(text);
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_redo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, curln, curc, 1);
|
||||
|
||||
text->undo_pos += op - UNDO_BS_1 + 1;
|
||||
|
||||
/* move right so we backspace the correct char */
|
||||
txt_move_right(text, 0);
|
||||
txt_backspace_char(text);
|
||||
|
||||
break;
|
||||
|
||||
case UNDO_DEL_1: case UNDO_DEL_2: case UNDO_DEL_3: case UNDO_DEL_4:
|
||||
case UNDO_DEL_1:
|
||||
case UNDO_DEL_2:
|
||||
case UNDO_DEL_3:
|
||||
case UNDO_DEL_4:
|
||||
text->undo_pos++;
|
||||
txt_delete_char(text);
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_redo_read_cur(text->undo_buf, &text->undo_pos, &curln, &curc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, curln, curc, 1);
|
||||
|
||||
text->undo_pos += op - UNDO_DEL_1 + 1;
|
||||
break;
|
||||
|
||||
case UNDO_SWAP:
|
||||
txt_curs_swap(text);
|
||||
txt_do_redo(text); /* swaps should appear transparent a*/
|
||||
break;
|
||||
|
||||
case UNDO_CTO:
|
||||
case UNDO_STO:
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
|
||||
text->undo_pos++;
|
||||
|
||||
charp = txt_redo_read_uint16(text->undo_buf, &text->undo_pos);
|
||||
linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
|
||||
if (op == UNDO_CTO) {
|
||||
txt_move_toline(text, linep, 0);
|
||||
text->curc = charp;
|
||||
txt_pop_sel(text);
|
||||
}
|
||||
else {
|
||||
txt_move_toline(text, linep, 1);
|
||||
text->selc = charp;
|
||||
}
|
||||
txt_delete_char(text);
|
||||
|
||||
break;
|
||||
|
||||
case UNDO_DBLOCK:
|
||||
text->undo_pos++;
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_redo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, selln, selc, 1);
|
||||
|
||||
/* length of the block */
|
||||
linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
txt_delete_sel(text);
|
||||
|
||||
text->undo_pos += linep;
|
||||
|
||||
/* skip over the length that was stored again */
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
|
||||
txt_delete_sel(text);
|
||||
|
||||
break;
|
||||
|
||||
case UNDO_IBLOCK:
|
||||
text->undo_pos++;
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_redo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, curln, curc, 1);
|
||||
|
||||
/* length of the block */
|
||||
linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
|
||||
buf = MEM_mallocN(linep + 1, "iblock buffer");
|
||||
@@ -2382,40 +2250,27 @@ void txt_do_redo(Text *text)
|
||||
txt_insert_buf(text, buf);
|
||||
MEM_freeN(buf);
|
||||
|
||||
/* skip over the length that was stored again */
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
text->undo_pos++;
|
||||
|
||||
break;
|
||||
|
||||
case UNDO_INDENT:
|
||||
case UNDO_UNINDENT:
|
||||
case UNDO_COMMENT:
|
||||
case UNDO_UNCOMMENT:
|
||||
case UNDO_DUPLICATE:
|
||||
case UNDO_MOVE_LINES_UP:
|
||||
case UNDO_MOVE_LINES_DOWN:
|
||||
text->undo_pos++;
|
||||
charp = txt_redo_read_uint16(text->undo_buf, &text->undo_pos);
|
||||
//charp is the first char selected or 0
|
||||
|
||||
linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
//linep is now the first line of the selection
|
||||
//set the selcetion for this now
|
||||
text->curc = charp;
|
||||
text->curl = text->lines.first;
|
||||
for (i = 0; i < linep; i++) {
|
||||
text->curl = text->curl->next;
|
||||
}
|
||||
|
||||
charp = txt_redo_read_uint16(text->undo_buf, &text->undo_pos);
|
||||
//last postion to be selected
|
||||
|
||||
linep = txt_redo_read_uint32(text->undo_buf, &text->undo_pos);
|
||||
//Last line to be selected
|
||||
|
||||
text->selc = charp;
|
||||
text->sell = text->lines.first;
|
||||
for (i = 0; i < linep; i++) {
|
||||
text->sell = text->sell->next;
|
||||
}
|
||||
|
||||
/* get and restore the cursors */
|
||||
txt_redo_read_cursors(text->undo_buf, &text->undo_pos, &curln, &curc, &selln, &selc);
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, selln, selc, 1);
|
||||
|
||||
if (op == UNDO_INDENT) {
|
||||
txt_indent(text);
|
||||
@@ -2429,15 +2284,28 @@ void txt_do_redo(Text *text)
|
||||
else if (op == UNDO_UNCOMMENT) {
|
||||
txt_uncomment(text);
|
||||
}
|
||||
break;
|
||||
case UNDO_DUPLICATE:
|
||||
txt_duplicate_line(text);
|
||||
break;
|
||||
case UNDO_MOVE_LINES_UP:
|
||||
txt_move_lines(text, TXT_MOVE_LINE_UP);
|
||||
break;
|
||||
case UNDO_MOVE_LINES_DOWN:
|
||||
txt_move_lines(text, TXT_MOVE_LINE_DOWN);
|
||||
else if (op == UNDO_DUPLICATE) {
|
||||
txt_duplicate_line(text);
|
||||
}
|
||||
else if (op == UNDO_MOVE_LINES_UP) {
|
||||
/* offset the cursor by + 1 */
|
||||
txt_move_to(text, curln + 1, curc, 0);
|
||||
txt_move_to(text, selln + 1, selc, 1);
|
||||
|
||||
txt_move_lines(text, TXT_MOVE_LINE_UP);
|
||||
}
|
||||
else if (op == UNDO_MOVE_LINES_DOWN) {
|
||||
/* offset the cursor by - 1 */
|
||||
txt_move_to(text, curln - 1, curc, 0);
|
||||
txt_move_to(text, selln - 1, selc, 1);
|
||||
|
||||
txt_move_lines(text, TXT_MOVE_LINE_DOWN);
|
||||
}
|
||||
|
||||
/* re-restore the cursors since they got moved when redoing */
|
||||
txt_move_to(text, curln, curc, 0);
|
||||
txt_move_to(text, selln, selc, 1);
|
||||
|
||||
break;
|
||||
default:
|
||||
//XXX error("Undo buffer error - resetting");
|
||||
@@ -2767,6 +2635,8 @@ static int txt_add_char_intern(Text *text, unsigned int add, int replace_tabs)
|
||||
|
||||
txt_delete_sel(text);
|
||||
|
||||
if (!undoing) txt_undo_add_charop(text, UNDO_INSERT_1, add);
|
||||
|
||||
add_len = BLI_str_utf8_from_unicode(add, ch);
|
||||
mrk = txt_find_marker_region(text, text->curl, text->curc - 1, text->curl->len, 0, 0);
|
||||
if (mrk) {
|
||||
@@ -2793,7 +2663,6 @@ static int txt_add_char_intern(Text *text, unsigned int add, int replace_tabs)
|
||||
txt_make_dirty(text);
|
||||
txt_clean_text(text);
|
||||
|
||||
if (!undoing) txt_undo_add_charop(text, UNDO_INSERT_1, add);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2854,8 +2723,8 @@ int txt_replace_char(Text *text, unsigned int add)
|
||||
|
||||
/* Should probably create a new op for this */
|
||||
if (!undoing) {
|
||||
txt_undo_add_charop(text, UNDO_DEL_1, del);
|
||||
txt_undo_add_charop(text, UNDO_INSERT_1, add);
|
||||
txt_undo_add_charop(text, UNDO_DEL_1, del);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -2924,7 +2793,7 @@ void txt_indent(Text *text)
|
||||
}
|
||||
|
||||
if (!undoing) {
|
||||
txt_undo_add_toop(text, UNDO_INDENT, txt_get_span(text->lines.first, text->curl), text->curc, txt_get_span(text->lines.first, text->sell), text->selc);
|
||||
txt_undo_add_op(text, UNDO_INDENT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2982,7 +2851,7 @@ void txt_unindent(Text *text)
|
||||
}
|
||||
|
||||
if (!undoing) {
|
||||
txt_undo_add_toop(text, UNDO_UNINDENT, txt_get_span(text->lines.first, text->curl), text->curc, txt_get_span(text->lines.first, text->sell), text->selc);
|
||||
txt_undo_add_op(text, UNDO_UNINDENT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3031,7 +2900,7 @@ void txt_comment(Text *text)
|
||||
}
|
||||
|
||||
if (!undoing) {
|
||||
txt_undo_add_toop(text, UNDO_COMMENT, txt_get_span(text->lines.first, text->curl), text->curc, txt_get_span(text->lines.first, text->sell), text->selc);
|
||||
txt_undo_add_op(text, UNDO_COMMENT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3076,7 +2945,7 @@ void txt_uncomment(Text *text)
|
||||
}
|
||||
|
||||
if (!undoing) {
|
||||
txt_undo_add_toop(text, UNDO_UNCOMMENT, txt_get_span(text->lines.first, text->curl), text->curc, txt_get_span(text->lines.first, text->sell), text->selc);
|
||||
txt_undo_add_op(text, UNDO_UNCOMMENT);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1664,7 +1664,7 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
|
||||
Text *text = st->text;
|
||||
TextLine **linep;
|
||||
int *charp;
|
||||
int oldl, oldc, i, j, max, start, end, endj, chop, loop;
|
||||
int oldc, i, j, max, start, end, endj, chop, loop;
|
||||
char ch;
|
||||
|
||||
text_update_character_width(st);
|
||||
@@ -1673,7 +1673,6 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
|
||||
else linep = &text->curl, charp = &text->curc;
|
||||
|
||||
oldc = *charp;
|
||||
oldl = txt_get_span(text->lines.first, *linep);
|
||||
|
||||
max = wrap_width(st, ar);
|
||||
|
||||
@@ -1724,7 +1723,6 @@ static void txt_wrap_move_bol(SpaceText *st, ARegion *ar, short sel)
|
||||
}
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, oldl, *charp);
|
||||
}
|
||||
|
||||
static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
|
||||
@@ -1732,7 +1730,7 @@ static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
|
||||
Text *text = st->text;
|
||||
TextLine **linep;
|
||||
int *charp;
|
||||
int oldl, oldc, i, j, max, start, end, endj, chop, loop;
|
||||
int oldc, i, j, max, start, end, endj, chop, loop;
|
||||
char ch;
|
||||
|
||||
text_update_character_width(st);
|
||||
@@ -1741,7 +1739,6 @@ static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
|
||||
else linep = &text->curl, charp = &text->curc;
|
||||
|
||||
oldc = *charp;
|
||||
oldl = txt_get_span(text->lines.first, *linep);
|
||||
|
||||
max = wrap_width(st, ar);
|
||||
|
||||
@@ -1790,7 +1787,6 @@ static void txt_wrap_move_eol(SpaceText *st, ARegion *ar, short sel)
|
||||
}
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, oldl, *charp);
|
||||
}
|
||||
|
||||
static void txt_wrap_move_up(SpaceText *st, ARegion *ar, short sel)
|
||||
@@ -1798,22 +1794,17 @@ static void txt_wrap_move_up(SpaceText *st, ARegion *ar, short sel)
|
||||
Text *text = st->text;
|
||||
TextLine **linep;
|
||||
int *charp;
|
||||
int oldl, oldc, offl, offc, col, newl;
|
||||
int offl, offc, col;
|
||||
|
||||
text_update_character_width(st);
|
||||
|
||||
if (sel) linep = &text->sell, charp = &text->selc;
|
||||
else linep = &text->curl, charp = &text->curc;
|
||||
|
||||
/* store previous position */
|
||||
oldc = *charp;
|
||||
newl = oldl = txt_get_span(text->lines.first, *linep);
|
||||
|
||||
wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
|
||||
col = text_get_char_pos(st, (*linep)->line, *charp) + offc;
|
||||
if (offl) {
|
||||
*charp = text_get_cursor_rel(st, ar, *linep, offl - 1, col);
|
||||
newl = BLI_findindex(&text->lines, linep);
|
||||
}
|
||||
else {
|
||||
if ((*linep)->prev) {
|
||||
@@ -1822,13 +1813,11 @@ static void txt_wrap_move_up(SpaceText *st, ARegion *ar, short sel)
|
||||
*linep = (*linep)->prev;
|
||||
visible_lines = text_get_visible_lines(st, ar, (*linep)->line);
|
||||
*charp = text_get_cursor_rel(st, ar, *linep, visible_lines - 1, col);
|
||||
newl--;
|
||||
}
|
||||
else *charp = 0;
|
||||
}
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, newl, *charp);
|
||||
}
|
||||
|
||||
static void txt_wrap_move_down(SpaceText *st, ARegion *ar, short sel)
|
||||
@@ -1836,35 +1825,28 @@ static void txt_wrap_move_down(SpaceText *st, ARegion *ar, short sel)
|
||||
Text *text = st->text;
|
||||
TextLine **linep;
|
||||
int *charp;
|
||||
int oldl, oldc, offl, offc, col, newl, visible_lines;
|
||||
int offl, offc, col, newl, visible_lines;
|
||||
|
||||
text_update_character_width(st);
|
||||
|
||||
if (sel) linep = &text->sell, charp = &text->selc;
|
||||
else linep = &text->curl, charp = &text->curc;
|
||||
|
||||
/* store previous position */
|
||||
oldc = *charp;
|
||||
newl = oldl = txt_get_span(text->lines.first, *linep);
|
||||
|
||||
wrap_offset_in_line(st, ar, *linep, *charp, &offl, &offc);
|
||||
col = text_get_char_pos(st, (*linep)->line, *charp) + offc;
|
||||
visible_lines = text_get_visible_lines(st, ar, (*linep)->line);
|
||||
if (offl < visible_lines - 1) {
|
||||
*charp = text_get_cursor_rel(st, ar, *linep, offl + 1, col);
|
||||
newl = BLI_findindex(&text->lines, linep);
|
||||
}
|
||||
else {
|
||||
if ((*linep)->next) {
|
||||
*linep = (*linep)->next;
|
||||
*charp = text_get_cursor_rel(st, ar, *linep, 0, col);
|
||||
newl++;
|
||||
}
|
||||
else *charp = (*linep)->len;
|
||||
}
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, newl, *charp);
|
||||
}
|
||||
|
||||
/* Moves the cursor vertically by the specified number of lines.
|
||||
@@ -1876,12 +1858,10 @@ static void txt_wrap_move_down(SpaceText *st, ARegion *ar, short sel)
|
||||
static void cursor_skip(SpaceText *st, ARegion *ar, Text *text, int lines, int sel)
|
||||
{
|
||||
TextLine **linep;
|
||||
int oldl, oldc, *charp;
|
||||
int *charp;
|
||||
|
||||
if (sel) linep = &text->sell, charp = &text->selc;
|
||||
else linep = &text->curl, charp = &text->curc;
|
||||
oldl = txt_get_span(text->lines.first, *linep);
|
||||
oldc = *charp;
|
||||
|
||||
if (st && ar && st->wordwrap) {
|
||||
int rell, relc;
|
||||
@@ -1904,7 +1884,6 @@ static void cursor_skip(SpaceText *st, ARegion *ar, Text *text, int lines, int s
|
||||
if (*charp > (*linep)->len) *charp = (*linep)->len;
|
||||
|
||||
if (!sel) txt_pop_sel(text);
|
||||
txt_undo_add_toop(text, sel ? UNDO_STO : UNDO_CTO, oldl, oldc, txt_get_span(text->lines.first, *linep), *charp);
|
||||
}
|
||||
|
||||
static int text_move_cursor(bContext *C, int type, int select)
|
||||
@@ -2696,7 +2675,6 @@ static void text_cursor_set_exit(bContext *C, wmOperator *op)
|
||||
SpaceText *st = CTX_wm_space_text(C);
|
||||
Text *text = st->text;
|
||||
SetSelection *ssel = op->customdata;
|
||||
int linep2, charp2;
|
||||
char *buffer;
|
||||
|
||||
if (txt_has_sel(text)) {
|
||||
@@ -2705,12 +2683,6 @@ static void text_cursor_set_exit(bContext *C, wmOperator *op)
|
||||
MEM_freeN(buffer);
|
||||
}
|
||||
|
||||
linep2 = txt_get_span(st->text->lines.first, st->text->sell);
|
||||
charp2 = st->text->selc;
|
||||
|
||||
if (ssel->sell != linep2 || ssel->selc != charp2)
|
||||
txt_undo_add_toop(st->text, UNDO_STO, ssel->sell, ssel->selc, linep2, charp2);
|
||||
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, st->text);
|
||||
|
||||
@@ -2786,19 +2758,12 @@ void TEXT_OT_selection_set(wmOperatorType *ot)
|
||||
static int text_cursor_set_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
SpaceText *st = CTX_wm_space_text(C);
|
||||
Text *text = st->text;
|
||||
ARegion *ar = CTX_wm_region(C);
|
||||
int x = RNA_int_get(op->ptr, "x");
|
||||
int y = RNA_int_get(op->ptr, "y");
|
||||
int oldl, oldc;
|
||||
|
||||
oldl = txt_get_span(text->lines.first, text->curl);
|
||||
oldc = text->curc;
|
||||
|
||||
text_cursor_set_to_pos(st, ar, x, y, 0);
|
||||
|
||||
txt_undo_add_toop(text, UNDO_CTO, oldl, oldc, txt_get_span(text->lines.first, text->curl), text->curc);
|
||||
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, st->text);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user