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; } }
gboolean text_delete_key_handler(Focus *focus, ObjectChange ** change) { Text *text; int row, i; const char *utf; gunichar c; text = focus->text; row = text->cursor_row; if (text->cursor_pos >= text_get_line_strlen(text, row)) { if (row+1 < text->numlines) { *change = text_create_change(text, TYPE_JOIN_ROW, 'Q', text->cursor_pos, row, focus->obj); } else { return FALSE; } } else { utf = text_get_line(text, row); for (i = 0; i < text->cursor_pos; i++) utf = g_utf8_next_char (utf); c = g_utf8_get_char (utf); *change = text_create_change (text, TYPE_DELETE_FORWARD, c, text->cursor_pos, text->cursor_row, focus->obj); } text_delete_forward(text); return TRUE;; }
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 int text_key_event(Focus *focus, guint keyval, char *str, int strlen, ObjectChange **change) { Text *text; int return_val; int row; return_val = FALSE; *change = NULL; text = (Text *)focus->user_data; /* printf("Got an %d '%s' (%d)\n", keyval, str, strlen); */ switch(keyval) { case GDK_Up: text->cursor_row--; if (text->cursor_row<0) text->cursor_row = 0; if (text->cursor_pos > text->strlen[text->cursor_row]) text->cursor_pos = text->strlen[text->cursor_row]; break; case GDK_Down: text->cursor_row++; if (text->cursor_row >= text->numlines) text->cursor_row = text->numlines - 1; if (text->cursor_pos > text->strlen[text->cursor_row]) text->cursor_pos = text->strlen[text->cursor_row]; break; case GDK_Left: text->cursor_pos--; if (text->cursor_pos<0) text->cursor_pos = 0; break; case GDK_Right: text->cursor_pos++; if (text->cursor_pos > text->strlen[text->cursor_row]) text->cursor_pos = text->strlen[text->cursor_row]; break; case GDK_Delete: return_val = TRUE; row = text->cursor_row; if (text->cursor_pos >= text->strlen[row]) { if (row+1 < text->numlines) { *change = text_create_change(text, TYPE_JOIN_ROW, 'Q', text->cursor_pos, row); } else { return_val = FALSE; break; } } else { *change = text_create_change(text, TYPE_DELETE_FORWARD, text->line[row][text->cursor_pos], text->cursor_pos, text->cursor_row); } text_delete_forward(text); break; case GDK_BackSpace: return_val = TRUE; row = text->cursor_row; if (text->cursor_pos <= 0) { if (row > 0) { *change = text_create_change(text, TYPE_JOIN_ROW, 'Q', text->strlen[row-1], row-1); } else { return_val = FALSE; break; } } else { *change = text_create_change(text, TYPE_DELETE_BACKWARD, text->line[row][text->cursor_pos-1], text->cursor_pos-1, text->cursor_row); } text_delete_backward(text); break; case GDK_Return: return_val = TRUE; *change = text_create_change(text, TYPE_SPLIT_ROW, 'Q', text->cursor_pos, text->cursor_row); text_split_line(text); break; default: if (strlen>0) { return_val = TRUE; *change = text_create_change(text, TYPE_INSERT_CHAR, str[0], text->cursor_pos, text->cursor_row); text_insert_char(text, str[0]); } break; } return return_val; }