+ if(multiline)
+ check_view_range();
+
+ check_cursor_blink();
+}
+
+void Entry::move_edit_position(Navigation nav, bool select)
+{
+ if(nav==NAV_LEFT)
+ set_edit_position(text.move_offset(edit_pos, -1), select);
+ else if(nav==NAV_RIGHT)
+ set_edit_position(text.move_offset(edit_pos, 1), select);
+ else if(nav==NAV_DOWN)
+ {
+ size_t row, col;
+ text.offset_to_coords(edit_pos, row, col);
+ set_edit_position(text.coords_to_offset(row+1, col), select);
+ }
+ else if(nav==NAV_UP)
+ {
+ size_t row, col;
+ text.offset_to_coords(edit_pos, row, col);
+ set_edit_position((row>0 ? text.coords_to_offset(row-1, col) : 0), select);
+ }
+ else
+ throw invalid_argument("Entry::move_edit_position");
+}
+
+void Entry::adjust_edit_position_for_change(size_t pos, ptrdiff_t change)
+{
+ size_t old_edit_pos = edit_pos;
+ size_t old_select_pos = selection_pos;
+
+ if(change>0)
+ {
+ if(edit_pos>=pos)
+ edit_pos += change;
+ if(selection_active && selection_pos>=pos)
+ selection_pos += change;
+ }
+ else if(change<0)
+ {
+ if(edit_pos>=pos)
+ edit_pos -= min<size_t>(edit_pos-pos, -change);
+ if(selection_active && selection_pos>=pos)
+ selection_pos -= min<size_t>(selection_pos-pos, -change);
+ }
+
+ if(edit_pos!=old_edit_pos)
+ signal_edit_position_changed.emit(edit_pos);
+ if(selection_active && (edit_pos!=old_edit_pos || selection_pos!=old_select_pos))
+ {
+ size_t start, end;
+ if(get_selection(start, end))
+ signal_selection_changed.emit(start, end);
+ }
+}
+
+void Entry::set_edit_position(size_t ep, bool select)
+{
+ bool selection_was_active = selection_active;
+ if(select && !selection_active)
+ selection_pos = edit_pos;
+ selection_active = select;
+
+ size_t old_edit_pos = edit_pos;
+ edit_pos = min(ep, text.size());
+
+ if(edit_pos!=old_edit_pos)
+ {
+ signal_edit_position_changed.emit(edit_pos);
+ size_t start, end;
+ if(get_selection(start, end))
+ signal_selection_changed.emit(start, end);
+ else if(selection_was_active)
+ signal_selection_changed.emit(edit_pos, edit_pos);
+ }