static void text_change_revert(struct TextObjectChange *change, Object *obj) { Text *text = change->text; switch (change->type) { case TYPE_INSERT_CHAR: text->cursor_pos = change->pos; text->cursor_row = change->row; text_delete_forward(text); break; case TYPE_DELETE_BACKWARD: text->cursor_pos = change->pos; text->cursor_row = change->row; text_insert_char(text, change->ch); break; case TYPE_DELETE_FORWARD: text->cursor_pos = change->pos; text->cursor_row = change->row; text_insert_char(text, change->ch); text->cursor_pos = change->pos; text->cursor_row = change->row; break; case TYPE_SPLIT_ROW: text_join_lines(text, change->row); break; case TYPE_JOIN_ROW: text->cursor_pos = change->pos; text->cursor_row = change->row; text_split_line(text); break; } }
static void text_delete_backward(Text *text) { int row; int i; real width; row = text->cursor_row; if (text->cursor_pos <= 0) { if (row > 0) text_join_lines(text, row-1); return; } memmove(text->line[row] + text->cursor_pos - 1, text->line[row] + text->cursor_pos, text->strlen[row] - text->cursor_pos + 1); text->strlen[row]--; text->cursor_pos --; if (text->cursor_pos > text->strlen[text->cursor_row]) text->cursor_pos = text->strlen[text->cursor_row]; text->row_width[row] = font_string_width(text->line[row], text->font, text->height); width = 0.0; for (i=0;i<text->numlines;i++) { width = MAX(width, text->row_width[i]); } text->max_width = width; }
static void text_change_revert(struct TextObjectChange *change, DiaObject *obj) { Text *text = change->text; switch (change->type) { case TYPE_INSERT_CHAR: text->cursor_pos = change->pos; text->cursor_row = change->row; text_delete_forward(text); break; case TYPE_DELETE_BACKWARD: text->cursor_pos = change->pos; text->cursor_row = change->row; text_insert_char(text, change->ch); break; case TYPE_DELETE_FORWARD: text->cursor_pos = change->pos; text->cursor_row = change->row; text_insert_char(text, change->ch); text->cursor_pos = change->pos; text->cursor_row = change->row; break; case TYPE_SPLIT_ROW: text_join_lines(text, change->row); break; case TYPE_JOIN_ROW: text->cursor_pos = change->pos; text->cursor_row = change->row; text_split_line(text); break; case TYPE_DELETE_ALL: set_string(text, change->str); text->cursor_pos = change->pos; text->cursor_row = change->row; break; } /* restore previous position/size */ if (change->obj->ops->set_props) change->obj->ops->set_props(change->obj, change->props); }
static void text_delete_backward(Text *text) { int row; int i; real width; gchar *line; gchar *utf8_before, *utf8_after; gchar *str1, *str; row = text->cursor_row; if (text->cursor_pos <= 0) { if (row > 0) text_join_lines(text, row-1); return; } line = text_get_line(text, row); utf8_before = g_utf8_offset_to_pointer(line, (glong)(text->cursor_pos - 1)); utf8_after = g_utf8_offset_to_pointer(utf8_before, 1); str1 = g_strndup(line, utf8_before - line); str = g_strconcat(str1, utf8_after, NULL); text_set_line_text(text, row, str); g_free(str); g_free(str1); text->cursor_pos --; if (text->cursor_pos > text_get_line_strlen(text, text->cursor_row)) text->cursor_pos = text_get_line_strlen(text, text->cursor_row); width = 0.0; for (i = 0; i < text->numlines; i++) { width = MAX(width, text_get_line_width(text, i)); } text->max_width = width; }