diff options
Diffstat (limited to 'widgets/text')
-rw-r--r-- | widgets/text/e-text.c | 64 |
1 files changed, 59 insertions, 5 deletions
diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c index 2d4ab7fb80..87f0cdfb22 100644 --- a/widgets/text/e-text.c +++ b/widgets/text/e-text.c @@ -2626,7 +2626,8 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp { EText *text = E_TEXT(data); int sel_start, sel_end; - gboolean changed = TRUE; + gboolean scroll = TRUE; + gboolean use_start = TRUE; switch (command->action) { case E_TEP_MOVE: @@ -2636,6 +2637,7 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp g_timer_reset(text->timer); } + use_start = TRUE; break; case E_TEP_SELECT: text->selection_start = e_text_model_validate_position (text->model, text->selection_start); /* paranoia */ @@ -2653,6 +2655,8 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp g_timer_reset(text->timer); } + use_start = FALSE; + break; case E_TEP_DELETE: if (text->selection_end == text->selection_start) { @@ -2662,6 +2666,9 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp if (text->timer) { g_timer_reset(text->timer); } + + use_start = FALSE; + break; case E_TEP_INSERT: @@ -2683,7 +2690,7 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp if (text->timer) { g_timer_reset(text->timer); } - changed = FALSE; + scroll = FALSE; break; case E_TEP_PASTE: e_text_get_selection (text, clipboard_atom, command->time); @@ -2711,13 +2718,13 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp command->time, NULL, NULL); - changed = FALSE; + scroll = FALSE; break; case E_TEP_UNGRAB: e_canvas_item_ungrab (E_CANVAS (GNOME_CANVAS_ITEM(text)->canvas), GNOME_CANVAS_ITEM(text), command->time); - changed = FALSE; + scroll = FALSE; break; case E_TEP_CAPS: if (text->selection_start == text->selection_end) { @@ -2729,10 +2736,57 @@ e_text_command(ETextEventProcessor *tep, ETextEventProcessorCommand *command, gp } break; case E_TEP_NOP: - changed = FALSE; + scroll = FALSE; break; } + if (scroll && !text->button_down) { + int i; + int count = pango_layout_get_line_count (text->layout); + PangoLayoutLine *cur_line = NULL; + int selection_index = use_start ? text->selection_start : text->selection_end; + + for (i = 0; i < count; i ++) { + PangoLayoutLine *line = pango_layout_get_line (text->layout, i); + if (selection_index >= line->start_index && selection_index <= line->start_index + line->length) { + /* found the line with the start of the selection */ + cur_line = line; + break; + } + } + + if (cur_line) { + int xpos; + double clip_width; + gboolean trailing = FALSE; + + if (selection_index == cur_line->start_index + cur_line->length) { + selection_index--; + trailing = TRUE; + } + + pango_layout_line_index_to_x (cur_line, selection_index - cur_line->start_index, + trailing, &xpos); + + xpos = PANGO_PIXELS (xpos); + + if (xpos < text->xofs_edit) { + text->xofs_edit = xpos; + } + + clip_width = text->clip_width; + if (clip_width >= 0 && text->draw_borders) { + clip_width -= 6; + if (clip_width < 0) + clip_width = 0; + } + + if (2 + xpos - clip_width > text->xofs_edit) { + text->xofs_edit = 2 + xpos - clip_width; + } + } + } + text->needs_redraw = 1; gnome_canvas_item_request_update (GNOME_CANVAS_ITEM(text)); } |