+ bool selection_was_active = selection_active;
+ if(select && !selection_active)
+ selection_pos = edit_pos;
+ selection_active = select;
+
+ unsigned old_edit_pos = edit_pos;
+ edit_pos = min(ep, text.size());
+
+ if(edit_pos!=old_edit_pos)
+ {
+ signal_edit_position_changed.emit(edit_pos);
+ unsigned 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);
+ }
+
+ if(multiline)
+ check_view_range();
+ mark_rebuild();
+}
+
+void Entry::erase_selection(bool emit_change)
+{
+ unsigned start, end;
+ if(!get_selection(start, end))
+ return;
+
+ text.erase(start, end-start);
+ if(emit_change)
+ signal_text_changed.emit(text.get());
+ set_edit_position(start, false);
+}
+
+void Entry::check_cursor_blink()
+{
+ const Part *cursor_part = style->get_part("cursor");
+ bool has_blink = (cursor_part && cursor_part->get_graphic(ACTIVE|FOCUS)!=cursor_part->get_graphic(NORMAL|FOCUS));
+
+ cursor_blink = (state&FOCUS);
+ if((state&FOCUS) && style && has_blink)
+ {
+ set_animation_interval(Time::sec/2);
+ mark_rebuild();
+ }
+ else
+ {
+ if(has_blink)
+ mark_rebuild();
+ stop_animation();
+ }