Index: chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc |
diff --git a/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc b/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc |
index 46ddb70cd79b55b67790a53bee835fa55f9364e6..30db56a466b8a75fc254fcedf726c2d0505e64e8 100644 |
--- a/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc |
+++ b/chrome/browser/autocomplete/autocomplete_edit_view_gtk.cc |
@@ -779,6 +779,11 @@ void AutocompleteEditViewGtk::SetInstantSuggestion(const string16& suggestion) { |
UpdateInstantViewColors(); |
} |
+string16 AutocompleteEditViewGtk::GetInstantSuggestion() const { |
+ const gchar* suggestion = gtk_label_get_text(GTK_LABEL(instant_view_)); |
+ return suggestion ? UTF8ToUTF16(suggestion) : string16(); |
+} |
+ |
int AutocompleteEditViewGtk::TextWidth() const { |
int horizontal_border_size = |
gtk_text_view_get_border_window_size(GTK_TEXT_VIEW(text_view_), |
@@ -834,12 +839,6 @@ views::View* AutocompleteEditViewGtk::AddToView(views::View* parent) { |
return host; |
} |
-bool AutocompleteEditViewGtk::CommitInstantSuggestion( |
- const string16& typed_text, |
- const string16& suggestion) { |
- return CommitInstantSuggestion(); |
-} |
- |
void AutocompleteEditViewGtk::EnableAccessibility() { |
accessible_widget_helper_.reset( |
new AccessibleWidgetHelper(text_view(), model_->profile())); |
@@ -898,7 +897,7 @@ void AutocompleteEditViewGtk::Observe(NotificationType type, |
} |
void AutocompleteEditViewGtk::AnimationEnded(const ui::Animation* animation) { |
- controller_->OnCommitSuggestedText(GetText()); |
+ controller_->OnCommitSuggestedText(false); |
} |
void AutocompleteEditViewGtk::AnimationProgressed( |
@@ -1344,9 +1343,6 @@ void AutocompleteEditViewGtk::HandleViewMoveCursor( |
if (step == GTK_MOVEMENT_VISUAL_POSITIONS && !extend_selection && |
(count == 1 || count == -1)) { |
- gint cursor_pos; |
- g_object_get(G_OBJECT(text_buffer_), "cursor-position", &cursor_pos, NULL); |
- |
// We need to take the content direction into account when handling cursor |
// movement, because the behavior of Left and Right key will be inverted if |
// the direction is RTL. Although we should check the direction around the |
@@ -1369,8 +1365,8 @@ void AutocompleteEditViewGtk::HandleViewMoveCursor( |
text_buffer_, count == count_towards_end ? &sel_end : &sel_start); |
OnAfterPossibleChange(); |
handled = true; |
- } else if (count == count_towards_end && cursor_pos == GetTextLength()) { |
- handled = controller_->OnCommitSuggestedText(GetText()); |
+ } else if (count == count_towards_end && !IsCaretAtEnd()) { |
+ handled = controller_->OnCommitSuggestedText(true); |
} |
} else if (step == GTK_MOVEMENT_PAGES) { // Page up and down. |
// Multiply by count for the direction (if we move too much that's ok). |
@@ -1638,15 +1634,29 @@ void AutocompleteEditViewGtk::HandleViewMoveFocus(GtkWidget* widget, |
bool handled = false; |
// Trigger Tab to search behavior only when Tab key is pressed. |
- if (model_->is_keyword_hint()) { |
+ if (model_->is_keyword_hint()) |
handled = model_->AcceptKeyword(); |
- } else if (GTK_WIDGET_VISIBLE(instant_view_)) { |
- controller_->OnCommitSuggestedText(GetText()); |
+ |
+#if GTK_CHECK_VERSION(2, 20, 0) |
+ if (!handled && !preedit_.empty()) |
handled = true; |
- } else { |
- handled = controller_->AcceptCurrentInstantPreview(); |
+#endif |
+ |
+ if (!handled && GTK_WIDGET_VISIBLE(instant_view_)) |
+ handled = controller_->OnCommitSuggestedText(true); |
+ |
+ if (!handled) { |
+ if (!IsCaretAtEnd()) { |
+ OnBeforePossibleChange(); |
+ PlaceCaretAt(GetTextLength()); |
+ OnAfterPossibleChange(); |
+ handled = true; |
+ } |
} |
+ if (!handled) |
+ handled = controller_->AcceptCurrentInstantPreview(); |
+ |
if (handled) { |
static guint signal_id = g_signal_lookup("move-focus", GTK_TYPE_WIDGET); |
g_signal_stop_emission(widget, signal_id, 0); |
@@ -1822,7 +1832,8 @@ void AutocompleteEditViewGtk::FinishUpdatingHighlightedText() { |
g_signal_handler_unblock(text_buffer_, mark_set_handler_id2_); |
} |
-AutocompleteEditViewGtk::CharRange AutocompleteEditViewGtk::GetSelection() { |
+AutocompleteEditViewGtk::CharRange |
+ AutocompleteEditViewGtk::GetSelection() const { |
// You can not just use get_selection_bounds here, since the order will be |
// ascending, and you don't know where the user's start and end of the |
// selection was (if the selection was forwards or backwards). Get the |
@@ -1871,6 +1882,18 @@ int AutocompleteEditViewGtk::GetTextLength() const { |
#endif |
} |
+void AutocompleteEditViewGtk::PlaceCaretAt(int pos) { |
+ GtkTextIter cursor; |
+ gtk_text_buffer_get_iter_at_offset(text_buffer_, &cursor, pos); |
+ gtk_text_buffer_place_cursor(text_buffer_, &cursor); |
+} |
+ |
+bool AutocompleteEditViewGtk::IsCaretAtEnd() const { |
+ const CharRange selection = GetSelection(); |
+ return selection.cp_min == selection.cp_max && |
+ selection.cp_min == GetTextLength(); |
+} |
+ |
void AutocompleteEditViewGtk::EmphasizeURLComponents() { |
#if GTK_CHECK_VERSION(2, 20, 0) |
// We can't change the text style easily, if the preedit string (the text |
@@ -1946,16 +1969,6 @@ void AutocompleteEditViewGtk::StopAnimation() { |
UpdateInstantViewColors(); |
} |
-bool AutocompleteEditViewGtk::CommitInstantSuggestion() { |
- const gchar* suggestion = gtk_label_get_text(GTK_LABEL(instant_view_)); |
- if (!suggestion || !*suggestion) |
- return false; |
- |
- model()->FinalizeInstantQuery(GetText(), |
- UTF8ToUTF16(suggestion)); |
- return true; |
-} |
- |
void AutocompleteEditViewGtk::TextChanged() { |
EmphasizeURLComponents(); |
controller_->OnChanged(); |