Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: chrome/browser/ui/views/omnibox/omnibox_view_views.cc

Issue 8044004: Clean up of SelectionModel (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: add comment about 'next' in ReplaceTextInternal Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | ui/gfx/render_text.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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/ui/views/omnibox/omnibox_view_views.h" 5 #include "chrome/browser/ui/views/omnibox/omnibox_view_views.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "chrome/app/chrome_command_ids.h" 10 #include "chrome/app/chrome_command_ids.h"
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 !event.IsControlDown()) { 230 !event.IsControlDown()) {
231 if (model_->is_keyword_hint()) { 231 if (model_->is_keyword_hint()) {
232 handled = model_->AcceptKeyword(); 232 handled = model_->AcceptKeyword();
233 } else { 233 } else {
234 string16::size_type start = 0; 234 string16::size_type start = 0;
235 string16::size_type end = 0; 235 string16::size_type end = 0;
236 size_t length = GetTextLength(); 236 size_t length = GetTextLength();
237 GetSelectionBounds(&start, &end); 237 GetSelectionBounds(&start, &end);
238 if (start != end || start < length) { 238 if (start != end || start < length) {
239 OnBeforePossibleChange(); 239 OnBeforePossibleChange();
240 textfield_->SelectSelectionModel(gfx::SelectionModel(length, length)); 240 textfield_->SelectRange(ui::Range(length, length));
241 OnAfterPossibleChange(); 241 OnAfterPossibleChange();
242 handled = true; 242 handled = true;
243 } 243 }
244 244
245 // TODO(Oshima): handle instant 245 // TODO(Oshima): handle instant
246 } 246 }
247 } 247 }
248 // TODO(oshima): page up & down 248 // TODO(oshima): page up & down
249 249
250 return handled; 250 return handled;
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
397 397
398 void OmniboxViewViews::SetWindowTextAndCaretPos(const string16& text, 398 void OmniboxViewViews::SetWindowTextAndCaretPos(const string16& text,
399 size_t caret_pos) { 399 size_t caret_pos) {
400 const ui::Range range(caret_pos, caret_pos); 400 const ui::Range range(caret_pos, caret_pos);
401 SetTextAndSelectedRange(text, range); 401 SetTextAndSelectedRange(text, range);
402 } 402 }
403 403
404 void OmniboxViewViews::SetForcedQuery() { 404 void OmniboxViewViews::SetForcedQuery() {
405 const string16 current_text(GetText()); 405 const string16 current_text(GetText());
406 const size_t start = current_text.find_first_not_of(kWhitespaceUTF16); 406 const size_t start = current_text.find_first_not_of(kWhitespaceUTF16);
407 if (start == string16::npos || (current_text[start] != '?')) { 407 if (start == string16::npos || (current_text[start] != '?'))
408 SetUserText(ASCIIToUTF16("?")); 408 SetUserText(ASCIIToUTF16("?"));
409 } else { 409 else
410 textfield_->SelectSelectionModel(gfx::SelectionModel(current_text.size(), 410 textfield_->SelectRange(ui::Range(current_text.size(), start + 1));
411 start + 1));
412 }
413 } 411 }
414 412
415 bool OmniboxViewViews::IsSelectAll() { 413 bool OmniboxViewViews::IsSelectAll() {
416 // TODO(oshima): IME support. 414 // TODO(oshima): IME support.
417 return textfield_->text() == textfield_->GetSelectedText(); 415 return textfield_->text() == textfield_->GetSelectedText();
418 } 416 }
419 417
420 bool OmniboxViewViews::DeleteAtEndPressed() { 418 bool OmniboxViewViews::DeleteAtEndPressed() {
421 return delete_at_end_pressed_; 419 return delete_at_end_pressed_;
422 } 420 }
423 421
424 void OmniboxViewViews::GetSelectionBounds(string16::size_type* start, 422 void OmniboxViewViews::GetSelectionBounds(string16::size_type* start,
425 string16::size_type* end) { 423 string16::size_type* end) {
426 gfx::SelectionModel sel; 424 ui::Range range;
427 textfield_->GetSelectionModel(&sel); 425 textfield_->GetSelectedRange(&range);
428 *start = static_cast<size_t>(sel.selection_end()); 426 *start = static_cast<size_t>(range.end());
429 *end = static_cast<size_t>(sel.selection_start()); 427 *end = static_cast<size_t>(range.start());
430 } 428 }
431 429
432 void OmniboxViewViews::SelectAll(bool reversed) { 430 void OmniboxViewViews::SelectAll(bool reversed) {
433 if (reversed) 431 if (reversed)
434 textfield_->SelectSelectionModel(gfx::SelectionModel(GetTextLength(), 0)); 432 textfield_->SelectRange(ui::Range(GetTextLength(), 0));
435 else 433 else
436 textfield_->SelectSelectionModel(gfx::SelectionModel(0, GetTextLength())); 434 textfield_->SelectRange(ui::Range(0, GetTextLength()));
437 } 435 }
438 436
439 void OmniboxViewViews::RevertAll() { 437 void OmniboxViewViews::RevertAll() {
440 ClosePopup(); 438 ClosePopup();
441 model_->Revert(); 439 model_->Revert();
442 TextChanged(); 440 TextChanged();
443 } 441 }
444 442
445 void OmniboxViewViews::UpdatePopup() { 443 void OmniboxViewViews::UpdatePopup() {
446 model_->SetInputInProgress(true); 444 model_->SetInputInProgress(true);
447 if (!model_->has_focus()) 445 if (!model_->has_focus())
448 return; 446 return;
449 447
450 // Don't inline autocomplete when the caret/selection isn't at the end of 448 // Don't inline autocomplete when the caret/selection isn't at the end of
451 // the text, or in the middle of composition. 449 // the text, or in the middle of composition.
452 gfx::SelectionModel sel; 450 ui::Range sel;
453 textfield_->GetSelectionModel(&sel); 451 textfield_->GetSelectedRange(&sel);
454 size_t max_of_selection = std::max(sel.selection_start(),
455 sel.selection_end());
456 bool no_inline_autocomplete = 452 bool no_inline_autocomplete =
457 max_of_selection < GetTextLength() || textfield_->IsIMEComposing(); 453 sel.GetMax() < GetTextLength() || textfield_->IsIMEComposing();
458 454
459 bool is_sel_empty = (sel.selection_start() == sel.selection_end()); 455 model_->StartAutocomplete(!sel.is_empty(), no_inline_autocomplete);
460 model_->StartAutocomplete(!is_sel_empty, no_inline_autocomplete);
461 } 456 }
462 457
463 void OmniboxViewViews::ClosePopup() { 458 void OmniboxViewViews::ClosePopup() {
464 model_->StopAutocomplete(); 459 model_->StopAutocomplete();
465 } 460 }
466 461
467 void OmniboxViewViews::SetFocus() { 462 void OmniboxViewViews::SetFocus() {
468 // In views-implementation, the focus is on textfield rather than OmniboxView. 463 // In views-implementation, the focus is on textfield rather than OmniboxView.
469 textfield_->RequestFocus(); 464 textfield_->RequestFocus();
470 } 465 }
471 466
472 void OmniboxViewViews::OnTemporaryTextMaybeChanged( 467 void OmniboxViewViews::OnTemporaryTextMaybeChanged(
473 const string16& display_text, 468 const string16& display_text,
474 bool save_original_selection) { 469 bool save_original_selection) {
475 if (save_original_selection) { 470 if (save_original_selection)
476 gfx::SelectionModel sel; 471 textfield_->GetSelectedRange(&saved_temporary_selection_);
477 textfield_->GetSelectionModel(&sel);
478 saved_temporary_selection_.set_start(sel.selection_start());
479 saved_temporary_selection_.set_end(sel.selection_end());
480 }
481 472
482 SetWindowTextAndCaretPos(display_text, display_text.length()); 473 SetWindowTextAndCaretPos(display_text, display_text.length());
483 TextChanged(); 474 TextChanged();
484 } 475 }
485 476
486 bool OmniboxViewViews::OnInlineAutocompleteTextMaybeChanged( 477 bool OmniboxViewViews::OnInlineAutocompleteTextMaybeChanged(
487 const string16& display_text, 478 const string16& display_text,
488 size_t user_text_length) { 479 size_t user_text_length) {
489 if (display_text == GetText()) 480 if (display_text == GetText())
490 return false; 481 return false;
491 ui::Range range(display_text.size(), user_text_length); 482 ui::Range range(display_text.size(), user_text_length);
492 SetTextAndSelectedRange(display_text, range); 483 SetTextAndSelectedRange(display_text, range);
493 TextChanged(); 484 TextChanged();
494 return true; 485 return true;
495 } 486 }
496 487
497 void OmniboxViewViews::OnRevertTemporaryText() { 488 void OmniboxViewViews::OnRevertTemporaryText() {
498 gfx::SelectionModel sel(saved_temporary_selection_.start(), 489 textfield_->SelectRange(saved_temporary_selection_);
499 saved_temporary_selection_.end());
500 textfield_->SelectSelectionModel(sel);
501 TextChanged(); 490 TextChanged();
502 } 491 }
503 492
504 void OmniboxViewViews::OnBeforePossibleChange() { 493 void OmniboxViewViews::OnBeforePossibleChange() {
505 // Record our state. 494 // Record our state.
506 text_before_change_ = GetText(); 495 text_before_change_ = GetText();
507 gfx::SelectionModel sel; 496 textfield_->GetSelectedRange(&sel_before_change_);
508 textfield_->GetSelectionModel(&sel);
509 sel_before_change_.set_start(sel.selection_start());
510 sel_before_change_.set_end(sel.selection_end());
511 ime_composing_before_change_ = textfield_->IsIMEComposing(); 497 ime_composing_before_change_ = textfield_->IsIMEComposing();
512 } 498 }
513 499
514 bool OmniboxViewViews::OnAfterPossibleChange() { 500 bool OmniboxViewViews::OnAfterPossibleChange() {
515 gfx::SelectionModel sel;
516 textfield_->GetSelectionModel(&sel);
517 ui::Range new_sel; 501 ui::Range new_sel;
518 new_sel.set_start(sel.selection_start()); 502 textfield_->GetSelectedRange(&new_sel);
519 new_sel.set_end(sel.selection_end());
520 503
521 // See if the text or selection have changed since OnBeforePossibleChange(). 504 // See if the text or selection have changed since OnBeforePossibleChange().
522 const string16 new_text = GetText(); 505 const string16 new_text = GetText();
523 const bool text_changed = (new_text != text_before_change_) || 506 const bool text_changed = (new_text != text_before_change_) ||
524 (ime_composing_before_change_ != textfield_->IsIMEComposing()); 507 (ime_composing_before_change_ != textfield_->IsIMEComposing());
525 const bool selection_differs = 508 const bool selection_differs =
526 !((sel_before_change_.is_empty() && new_sel.is_empty()) || 509 !((sel_before_change_.is_empty() && new_sel.is_empty()) ||
527 sel_before_change_.EqualsIgnoringDirection(new_sel)); 510 sel_before_change_.EqualsIgnoringDirection(new_sel));
528 511
529 // When the user has deleted text, we don't allow inline autocomplete. Make 512 // When the user has deleted text, we don't allow inline autocomplete. Make
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
690 673
691 void OmniboxViewViews::TextChanged() { 674 void OmniboxViewViews::TextChanged() {
692 EmphasizeURLComponents(); 675 EmphasizeURLComponents();
693 model_->OnChanged(); 676 model_->OnChanged();
694 } 677 }
695 678
696 void OmniboxViewViews::SetTextAndSelectedRange(const string16& text, 679 void OmniboxViewViews::SetTextAndSelectedRange(const string16& text,
697 const ui::Range& range) { 680 const ui::Range& range) {
698 if (text != GetText()) 681 if (text != GetText())
699 textfield_->SetText(text); 682 textfield_->SetText(text);
700 textfield_->SelectSelectionModel(gfx::SelectionModel( 683 textfield_->SelectRange(range);
701 range.start(), range.end()));
702 } 684 }
703 685
704 string16 OmniboxViewViews::GetSelectedText() const { 686 string16 OmniboxViewViews::GetSelectedText() const {
705 // TODO(oshima): Support instant, IME. 687 // TODO(oshima): Support instant, IME.
706 return textfield_->GetSelectedText(); 688 return textfield_->GetSelectedText();
707 } 689 }
708 690
709
710 AutocompletePopupView* OmniboxViewViews::CreatePopupView( 691 AutocompletePopupView* OmniboxViewViews::CreatePopupView(
711 View* location_bar) { 692 View* location_bar) {
712 #if defined(TOUCH_UI) 693 #if defined(TOUCH_UI)
713 typedef TouchAutocompletePopupContentsView AutocompleteContentsView; 694 typedef TouchAutocompletePopupContentsView AutocompleteContentsView;
714 #else 695 #else
715 typedef AutocompletePopupContentsView AutocompleteContentsView; 696 typedef AutocompletePopupContentsView AutocompleteContentsView;
716 #endif 697 #endif
717 return new AutocompleteContentsView(gfx::Font(), this, model_.get(), 698 return new AutocompleteContentsView(gfx::Font(), this, model_.get(),
718 location_bar); 699 location_bar);
719 } 700 }
OLDNEW
« no previous file with comments | « no previous file | ui/gfx/render_text.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698