Пример #1
0
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;
  }
}
Пример #2
0
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;;
}
Пример #3
0
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);
}
Пример #4
0
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;
}