OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h" | 5 #include "chrome/browser/autocomplete/autocomplete_edit_view_gtk.h" |
6 | 6 |
7 #include <gtk/gtk.h> | 7 #include <gtk/gtk.h> |
8 #include <gdk/gdkkeysyms.h> | 8 #include <gdk/gdkkeysyms.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 UpdatePopup(); | 331 UpdatePopup(); |
332 TextChanged(); | 332 TextChanged(); |
333 } | 333 } |
334 | 334 |
335 void AutocompleteEditViewGtk::SetWindowTextAndCaretPos(const std::wstring& text, | 335 void AutocompleteEditViewGtk::SetWindowTextAndCaretPos(const std::wstring& text, |
336 size_t caret_pos) { | 336 size_t caret_pos) { |
337 CharRange range(static_cast<int>(caret_pos), static_cast<int>(caret_pos)); | 337 CharRange range(static_cast<int>(caret_pos), static_cast<int>(caret_pos)); |
338 SetTextAndSelectedRange(text, range); | 338 SetTextAndSelectedRange(text, range); |
339 } | 339 } |
340 | 340 |
341 void AutocompleteEditViewGtk::SetTextAndSelectedRange(const std::wstring& text, | |
342 const CharRange& range) { | |
343 std::string utf8 = WideToUTF8(text); | |
344 gtk_text_buffer_set_text(text_buffer_, utf8.data(), utf8.length()); | |
345 | |
346 GtkTextIter insert, bound; | |
347 ItersFromCharRange(range, &insert, &bound); | |
348 gtk_text_buffer_select_range(text_buffer_, &insert, &bound); | |
349 } | |
350 | |
351 void AutocompleteEditViewGtk::SetForcedQuery() { | 341 void AutocompleteEditViewGtk::SetForcedQuery() { |
352 const std::wstring current_text(GetText()); | 342 const std::wstring current_text(GetText()); |
353 if (current_text.empty() || (current_text[0] != '?')) { | 343 if (current_text.empty() || (current_text[0] != '?')) { |
354 SetUserText(L"?"); | 344 SetUserText(L"?"); |
355 } else { | 345 } else { |
356 GtkTextIter start, end; | |
357 gtk_text_buffer_get_bounds(text_buffer_, &start, &end); | |
358 gtk_text_buffer_get_iter_at_offset(text_buffer_, &start, 1); | |
359 StartUpdatingHighlightedText(); | 346 StartUpdatingHighlightedText(); |
360 gtk_text_buffer_select_range(text_buffer_, &start, &end); | 347 SetSelectedRange(CharRange(current_text.size(), 1)); |
361 FinishUpdatingHighlightedText(); | 348 FinishUpdatingHighlightedText(); |
362 } | 349 } |
363 } | 350 } |
364 | 351 |
365 bool AutocompleteEditViewGtk::IsSelectAll() { | 352 bool AutocompleteEditViewGtk::IsSelectAll() { |
366 GtkTextIter sel_start, sel_end; | 353 GtkTextIter sel_start, sel_end; |
367 gtk_text_buffer_get_selection_bounds(text_buffer_, &sel_start, &sel_end); | 354 gtk_text_buffer_get_selection_bounds(text_buffer_, &sel_start, &sel_end); |
368 | 355 |
369 GtkTextIter start, end; | 356 GtkTextIter start, end; |
370 gtk_text_buffer_get_bounds(text_buffer_, &start, &end); | 357 gtk_text_buffer_get_bounds(text_buffer_, &start, &end); |
(...skipping 29 matching lines...) Expand all Loading... |
400 model_->StartAutocomplete(std::max(sel.cp_max, sel.cp_min) < GetTextLength()); | 387 model_->StartAutocomplete(std::max(sel.cp_max, sel.cp_min) < GetTextLength()); |
401 } | 388 } |
402 | 389 |
403 void AutocompleteEditViewGtk::ClosePopup() { | 390 void AutocompleteEditViewGtk::ClosePopup() { |
404 popup_view_->GetModel()->StopAutocomplete(); | 391 popup_view_->GetModel()->StopAutocomplete(); |
405 } | 392 } |
406 | 393 |
407 void AutocompleteEditViewGtk::OnTemporaryTextMaybeChanged( | 394 void AutocompleteEditViewGtk::OnTemporaryTextMaybeChanged( |
408 const std::wstring& display_text, | 395 const std::wstring& display_text, |
409 bool save_original_selection) { | 396 bool save_original_selection) { |
410 if (save_original_selection) { | 397 if (save_original_selection) |
411 saved_temporary_selection_ = GetSelection(); | 398 saved_temporary_selection_ = GetSelection(); |
412 saved_temporary_text_ = GetText(); | |
413 } | |
414 | 399 |
415 StartUpdatingHighlightedText(); | 400 StartUpdatingHighlightedText(); |
416 SetWindowTextAndCaretPos(display_text, display_text.length()); | 401 SetWindowTextAndCaretPos(display_text, display_text.length()); |
417 FinishUpdatingHighlightedText(); | 402 FinishUpdatingHighlightedText(); |
418 TextChanged(); | 403 TextChanged(); |
419 } | 404 } |
420 | 405 |
421 bool AutocompleteEditViewGtk::OnInlineAutocompleteTextMaybeChanged( | 406 bool AutocompleteEditViewGtk::OnInlineAutocompleteTextMaybeChanged( |
422 const std::wstring& display_text, | 407 const std::wstring& display_text, |
423 size_t user_text_length) { | 408 size_t user_text_length) { |
424 if (display_text == GetText()) | 409 if (display_text == GetText()) |
425 return false; | 410 return false; |
426 | 411 |
427 StartUpdatingHighlightedText(); | 412 StartUpdatingHighlightedText(); |
428 SetWindowTextAndCaretPos(display_text, 0); | 413 CharRange range(display_text.size(), user_text_length); |
429 | 414 SetTextAndSelectedRange(display_text, range); |
430 // Select the part of the text that was inline autocompleted. | |
431 GtkTextIter bound, insert; | |
432 gtk_text_buffer_get_bounds(text_buffer_, &insert, &bound); | |
433 gtk_text_buffer_get_iter_at_offset(text_buffer_, &insert, user_text_length); | |
434 gtk_text_buffer_select_range(text_buffer_, &insert, &bound); | |
435 | |
436 FinishUpdatingHighlightedText(); | 415 FinishUpdatingHighlightedText(); |
437 TextChanged(); | 416 TextChanged(); |
438 return true; | 417 return true; |
439 } | 418 } |
440 | 419 |
441 void AutocompleteEditViewGtk::OnRevertTemporaryText() { | 420 void AutocompleteEditViewGtk::OnRevertTemporaryText() { |
442 StartUpdatingHighlightedText(); | 421 StartUpdatingHighlightedText(); |
443 SetTextAndSelectedRange(saved_temporary_text_, saved_temporary_selection_); | 422 SetSelectedRange(saved_temporary_selection_); |
444 FinishUpdatingHighlightedText(); | 423 FinishUpdatingHighlightedText(); |
445 saved_temporary_text_.clear(); | |
446 TextChanged(); | 424 TextChanged(); |
447 } | 425 } |
448 | 426 |
449 void AutocompleteEditViewGtk::OnBeforePossibleChange() { | 427 void AutocompleteEditViewGtk::OnBeforePossibleChange() { |
450 // If this change is caused by a paste clipboard action and all text is | 428 // If this change is caused by a paste clipboard action and all text is |
451 // selected, then call model_->on_paste_replacing_all() to prevent inline | 429 // selected, then call model_->on_paste_replacing_all() to prevent inline |
452 // autocomplete. | 430 // autocomplete. |
453 if (paste_clipboard_requested_) { | 431 if (paste_clipboard_requested_) { |
454 paste_clipboard_requested_ = false; | 432 paste_clipboard_requested_ = false; |
455 if (IsSelectAll()) | 433 if (IsSelectAll()) |
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 const std::string& selected_text) { | 1146 const std::string& selected_text) { |
1169 GtkClipboard* clipboard = | 1147 GtkClipboard* clipboard = |
1170 gtk_widget_get_clipboard(text_view_, GDK_SELECTION_PRIMARY); | 1148 gtk_widget_get_clipboard(text_view_, GDK_SELECTION_PRIMARY); |
1171 DCHECK(clipboard); | 1149 DCHECK(clipboard); |
1172 if (!clipboard) | 1150 if (!clipboard) |
1173 return; | 1151 return; |
1174 | 1152 |
1175 gtk_clipboard_set_text( | 1153 gtk_clipboard_set_text( |
1176 clipboard, selected_text.data(), selected_text.size()); | 1154 clipboard, selected_text.data(), selected_text.size()); |
1177 } | 1155 } |
| 1156 |
| 1157 void AutocompleteEditViewGtk::SetTextAndSelectedRange(const std::wstring& text, |
| 1158 const CharRange& range) { |
| 1159 std::string utf8 = WideToUTF8(text); |
| 1160 gtk_text_buffer_set_text(text_buffer_, utf8.data(), utf8.length()); |
| 1161 SetSelectedRange(range); |
| 1162 } |
| 1163 |
| 1164 void AutocompleteEditViewGtk::SetSelectedRange(const CharRange& range) { |
| 1165 GtkTextIter insert, bound; |
| 1166 ItersFromCharRange(range, &bound, &insert); |
| 1167 gtk_text_buffer_select_range(text_buffer_, &insert, &bound); |
| 1168 } |
OLD | NEW |