|
|
|
|
@ -925,6 +925,112 @@ std::string Source::BaseView::get_selected_text() {
|
|
|
|
|
return get_buffer()->get_text(start, end); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool Source::BaseView::on_key_press_event(GdkEventKey *key) { |
|
|
|
|
//Move cursor one paragraph down
|
|
|
|
|
if((key->keyval == GDK_KEY_Down || key->keyval == GDK_KEY_KP_Down) && (key->state & GDK_CONTROL_MASK) > 0) { |
|
|
|
|
auto selection_start_iter = get_buffer()->get_selection_bound()->get_iter(); |
|
|
|
|
auto iter = get_buffer()->get_iter_at_line(get_buffer()->get_insert()->get_iter().get_line()); |
|
|
|
|
bool empty_line = false; |
|
|
|
|
bool text_found = false; |
|
|
|
|
for(;;) { |
|
|
|
|
if(!iter) |
|
|
|
|
break; |
|
|
|
|
if(iter.starts_line()) |
|
|
|
|
empty_line = true; |
|
|
|
|
if(empty_line && !iter.ends_line() && *iter != ' ' && *iter != '\t') |
|
|
|
|
empty_line = false; |
|
|
|
|
if(!text_found && !iter.ends_line() && *iter != ' ' && *iter != '\t') |
|
|
|
|
text_found = true; |
|
|
|
|
if(empty_line && text_found && iter.ends_line()) |
|
|
|
|
break; |
|
|
|
|
iter.forward_char(); |
|
|
|
|
} |
|
|
|
|
iter = get_buffer()->get_iter_at_line(iter.get_line()); |
|
|
|
|
if((key->state & GDK_SHIFT_MASK) > 0) |
|
|
|
|
get_buffer()->select_range(iter, selection_start_iter); |
|
|
|
|
else |
|
|
|
|
get_buffer()->place_cursor(iter); |
|
|
|
|
scroll_to(get_buffer()->get_insert()); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
//Move cursor one paragraph up
|
|
|
|
|
else if((key->keyval == GDK_KEY_Up || key->keyval == GDK_KEY_KP_Up) && (key->state & GDK_CONTROL_MASK) > 0) { |
|
|
|
|
auto selection_start_iter = get_buffer()->get_selection_bound()->get_iter(); |
|
|
|
|
auto iter = get_buffer()->get_iter_at_line(get_buffer()->get_insert()->get_iter().get_line()); |
|
|
|
|
iter.backward_char(); |
|
|
|
|
bool empty_line = false; |
|
|
|
|
bool text_found = false; |
|
|
|
|
bool move_to_start = false; |
|
|
|
|
for(;;) { |
|
|
|
|
if(!iter) |
|
|
|
|
break; |
|
|
|
|
if(iter.ends_line()) |
|
|
|
|
empty_line = true; |
|
|
|
|
if(empty_line && !iter.ends_line() && *iter != ' ' && *iter != '\t') |
|
|
|
|
empty_line = false; |
|
|
|
|
if(!text_found && !iter.ends_line() && *iter != ' ' && *iter != '\t') |
|
|
|
|
text_found = true; |
|
|
|
|
if(empty_line && text_found && iter.starts_line()) |
|
|
|
|
break; |
|
|
|
|
if(iter.is_start()) { |
|
|
|
|
move_to_start = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
iter.backward_char(); |
|
|
|
|
} |
|
|
|
|
if(empty_line && !move_to_start) { |
|
|
|
|
iter = get_iter_at_line_end(iter.get_line()); |
|
|
|
|
iter.forward_char(); |
|
|
|
|
if(!iter.starts_line()) // For CR+LF
|
|
|
|
|
iter.forward_char(); |
|
|
|
|
} |
|
|
|
|
if((key->state & GDK_SHIFT_MASK) > 0) |
|
|
|
|
get_buffer()->select_range(iter, selection_start_iter); |
|
|
|
|
else |
|
|
|
|
get_buffer()->place_cursor(iter); |
|
|
|
|
scroll_to(get_buffer()->get_insert()); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
// Move cursors left one word
|
|
|
|
|
if((key->keyval == GDK_KEY_Left || key->keyval == GDK_KEY_KP_Left) && (key->state & GDK_CONTROL_MASK) > 0) { |
|
|
|
|
enable_multiple_cursors = false; |
|
|
|
|
for(auto &extra_cursor : extra_cursors) { |
|
|
|
|
auto iter = extra_cursor.mark->get_iter(); |
|
|
|
|
iter.backward_word_start(); |
|
|
|
|
extra_cursor.offset = iter.get_line_offset(); |
|
|
|
|
get_buffer()->move_mark(extra_cursor.mark, iter); |
|
|
|
|
} |
|
|
|
|
auto insert = get_buffer()->get_insert(); |
|
|
|
|
auto iter = insert->get_iter(); |
|
|
|
|
iter.backward_word_start(); |
|
|
|
|
get_buffer()->move_mark(insert, iter); |
|
|
|
|
if((key->state & GDK_SHIFT_MASK) == 0) |
|
|
|
|
get_buffer()->move_mark_by_name("selection_bound", iter); |
|
|
|
|
enable_multiple_cursors = true; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
// Move cursors right one word
|
|
|
|
|
if((key->keyval == GDK_KEY_Right || key->keyval == GDK_KEY_KP_Right) && (key->state & GDK_CONTROL_MASK) > 0) { |
|
|
|
|
enable_multiple_cursors = false; |
|
|
|
|
for(auto &extra_cursor : extra_cursors) { |
|
|
|
|
auto iter = extra_cursor.mark->get_iter(); |
|
|
|
|
iter.forward_visible_word_end(); |
|
|
|
|
extra_cursor.offset = iter.get_line_offset(); |
|
|
|
|
get_buffer()->move_mark(extra_cursor.mark, iter); |
|
|
|
|
} |
|
|
|
|
auto insert = get_buffer()->get_insert(); |
|
|
|
|
auto iter = insert->get_iter(); |
|
|
|
|
iter.forward_visible_word_end(); |
|
|
|
|
get_buffer()->move_mark(insert, iter); |
|
|
|
|
if((key->state & GDK_SHIFT_MASK) == 0) |
|
|
|
|
get_buffer()->move_mark_by_name("selection_bound", iter); |
|
|
|
|
enable_multiple_cursors = true; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return Gsv::View::on_key_press_event(key); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool Source::BaseView::on_key_press_event_extra_cursors(GdkEventKey *key) { |
|
|
|
|
setup_extra_cursor_signals(); |
|
|
|
|
|
|
|
|
|
@ -1026,40 +1132,6 @@ bool Source::BaseView::on_key_press_event_extra_cursors(GdkEventKey *key) {
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Move cursors left/right
|
|
|
|
|
if((key->keyval == GDK_KEY_Left || key->keyval == GDK_KEY_KP_Left) && (key->state & GDK_CONTROL_MASK) > 0) { |
|
|
|
|
enable_multiple_cursors = false; |
|
|
|
|
for(auto &extra_cursor : extra_cursors) { |
|
|
|
|
auto iter = extra_cursor.mark->get_iter(); |
|
|
|
|
iter.backward_word_start(); |
|
|
|
|
extra_cursor.offset = iter.get_line_offset(); |
|
|
|
|
get_buffer()->move_mark(extra_cursor.mark, iter); |
|
|
|
|
} |
|
|
|
|
auto insert = get_buffer()->get_insert(); |
|
|
|
|
auto iter = insert->get_iter(); |
|
|
|
|
iter.backward_word_start(); |
|
|
|
|
get_buffer()->move_mark(insert, iter); |
|
|
|
|
if((key->state & GDK_SHIFT_MASK) == 0) |
|
|
|
|
get_buffer()->move_mark_by_name("selection_bound", iter); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
if((key->keyval == GDK_KEY_Right || key->keyval == GDK_KEY_KP_Right) && (key->state & GDK_CONTROL_MASK) > 0) { |
|
|
|
|
enable_multiple_cursors = false; |
|
|
|
|
for(auto &extra_cursor : extra_cursors) { |
|
|
|
|
auto iter = extra_cursor.mark->get_iter(); |
|
|
|
|
iter.forward_visible_word_end(); |
|
|
|
|
extra_cursor.offset = iter.get_line_offset(); |
|
|
|
|
get_buffer()->move_mark(extra_cursor.mark, iter); |
|
|
|
|
} |
|
|
|
|
auto insert = get_buffer()->get_insert(); |
|
|
|
|
auto iter = insert->get_iter(); |
|
|
|
|
iter.forward_visible_word_end(); |
|
|
|
|
get_buffer()->move_mark(insert, iter); |
|
|
|
|
if((key->state & GDK_SHIFT_MASK) == 0) |
|
|
|
|
get_buffer()->move_mark_by_name("selection_bound", iter); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Move cursors up/down
|
|
|
|
|
if((key->keyval == GDK_KEY_Up || key->keyval == GDK_KEY_KP_Up)) { |
|
|
|
|
enable_multiple_cursors = false; |
|
|
|
|
|