OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/find_bar_view.h" | 5 #include "chrome/browser/ui/views/find_bar_view.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
389 NOTREACHED() << L"Unknown button"; | 389 NOTREACHED() << L"Unknown button"; |
390 break; | 390 break; |
391 } | 391 } |
392 } | 392 } |
393 | 393 |
394 //////////////////////////////////////////////////////////////////////////////// | 394 //////////////////////////////////////////////////////////////////////////////// |
395 // FindBarView, views::TextfieldController implementation: | 395 // FindBarView, views::TextfieldController implementation: |
396 | 396 |
397 void FindBarView::ContentsChanged(views::Textfield* sender, | 397 void FindBarView::ContentsChanged(views::Textfield* sender, |
398 const string16& new_contents) { | 398 const string16& new_contents) { |
| 399 // TextfieldController::OnAfterUserAction() is supported only by Views |
| 400 // implementation, and NativeTextfieldWin doesn't call OnAfterUserAction(). |
| 401 // Call Find() here. |
| 402 // TODO(yukishiino): Remove this code after the migration to Views. |
| 403 if (!views::Textfield::IsViewsTextfieldEnabled()) |
| 404 Find(new_contents); |
| 405 } |
| 406 |
| 407 bool FindBarView::HandleKeyEvent(views::Textfield* sender, |
| 408 const ui::KeyEvent& key_event) { |
| 409 // If the dialog is not visible, there is no reason to process keyboard input. |
| 410 if (!host()->IsVisible()) |
| 411 return false; |
| 412 |
| 413 if (find_bar_host()->MaybeForwardKeyEventToWebpage(key_event)) |
| 414 return true; // Handled, we are done! |
| 415 |
| 416 if (key_event.key_code() == ui::VKEY_RETURN) { |
| 417 // Pressing Return/Enter starts the search (unless text box is empty). |
| 418 string16 find_string = find_text_->text(); |
| 419 if (!find_string.empty()) { |
| 420 FindBarController* controller = find_bar_host()->GetFindBarController(); |
| 421 FindTabHelper* find_tab_helper = |
| 422 FindTabHelper::FromWebContents(controller->web_contents()); |
| 423 // Search forwards for enter, backwards for shift-enter. |
| 424 find_tab_helper->StartFinding(find_string, |
| 425 !key_event.IsShiftDown(), |
| 426 false); // Not case sensitive. |
| 427 } |
| 428 return true; |
| 429 } |
| 430 |
| 431 return false; |
| 432 } |
| 433 |
| 434 void FindBarView::OnAfterUserAction(views::Textfield* sender) { |
| 435 // The composition text wouldn't be what the user is really looking for. |
| 436 // We delay the search until the user commits the composition text. |
| 437 if (sender->IsIMEComposing() || sender->text() == last_searched_text_) |
| 438 return; |
| 439 |
| 440 // TODO(yukishiino): Remove this condition check after the migration to Views. |
| 441 if (views::Textfield::IsViewsTextfieldEnabled()) |
| 442 Find(sender->text()); |
| 443 } |
| 444 |
| 445 void FindBarView::OnAfterPaste() { |
| 446 // Clear the last search text so we always search for the user input after |
| 447 // a paste operation, even if the pasted text is the same as before. |
| 448 // See http://crbug.com/79002 |
| 449 last_searched_text_.clear(); |
| 450 } |
| 451 |
| 452 void FindBarView::Find(const string16& search_text) { |
399 FindBarController* controller = find_bar_host()->GetFindBarController(); | 453 FindBarController* controller = find_bar_host()->GetFindBarController(); |
400 DCHECK(controller); | 454 DCHECK(controller); |
401 content::WebContents* web_contents = controller->web_contents(); | 455 content::WebContents* web_contents = controller->web_contents(); |
402 // We must guard against a NULL web_contents, which can happen if the text | 456 // We must guard against a NULL web_contents, which can happen if the text |
403 // in the Find box is changed right after the tab is destroyed. Otherwise, it | 457 // in the Find box is changed right after the tab is destroyed. Otherwise, it |
404 // can lead to crashes, as exposed by automation testing in issue 8048. | 458 // can lead to crashes, as exposed by automation testing in issue 8048. |
405 if (!web_contents) | 459 if (!web_contents) |
406 return; | 460 return; |
407 FindTabHelper* find_tab_helper = FindTabHelper::FromWebContents(web_contents); | 461 FindTabHelper* find_tab_helper = FindTabHelper::FromWebContents(web_contents); |
408 | 462 |
| 463 last_searched_text_ = search_text; |
| 464 |
409 // When the user changes something in the text box we check the contents and | 465 // When the user changes something in the text box we check the contents and |
410 // if the textbox contains something we set it as the new search string and | 466 // if the textbox contains something we set it as the new search string and |
411 // initiate search (even though old searches might be in progress). | 467 // initiate search (even though old searches might be in progress). |
412 if (!new_contents.empty()) { | 468 if (!search_text.empty()) { |
413 // The last two params here are forward (true) and case sensitive (false). | 469 // The last two params here are forward (true) and case sensitive (false). |
414 find_tab_helper->StartFinding(new_contents, true, false); | 470 find_tab_helper->StartFinding(search_text, true, false); |
415 } else { | 471 } else { |
416 find_tab_helper->StopFinding(FindBarController::kClearSelectionOnPage); | 472 find_tab_helper->StopFinding(FindBarController::kClearSelectionOnPage); |
417 UpdateForResult(find_tab_helper->find_result(), string16()); | 473 UpdateForResult(find_tab_helper->find_result(), string16()); |
418 find_bar_host()->MoveWindowIfNecessary(gfx::Rect(), false); | 474 find_bar_host()->MoveWindowIfNecessary(gfx::Rect(), false); |
419 | 475 |
420 // Clearing the text box should clear the prepopulate state so that when | 476 // Clearing the text box should clear the prepopulate state so that when |
421 // we close and reopen the Find box it doesn't show the search we just | 477 // we close and reopen the Find box it doesn't show the search we just |
422 // deleted. We can't do this on ChromeOS yet because we get ContentsChanged | 478 // deleted. We can't do this on ChromeOS yet because we get ContentsChanged |
423 // sent for a lot more things than just the user nulling out the search | 479 // sent for a lot more things than just the user nulling out the search |
424 // terms. See http://crbug.com/45372. | 480 // terms. See http://crbug.com/45372. |
425 Profile* profile = | 481 Profile* profile = |
426 Profile::FromBrowserContext(web_contents->GetBrowserContext()); | 482 Profile::FromBrowserContext(web_contents->GetBrowserContext()); |
427 FindBarState* find_bar_state = FindBarStateFactory::GetForProfile(profile); | 483 FindBarState* find_bar_state = FindBarStateFactory::GetForProfile(profile); |
428 find_bar_state->set_last_prepopulate_text(string16()); | 484 find_bar_state->set_last_prepopulate_text(string16()); |
429 } | 485 } |
430 } | 486 } |
431 | 487 |
432 bool FindBarView::HandleKeyEvent(views::Textfield* sender, | |
433 const ui::KeyEvent& key_event) { | |
434 // If the dialog is not visible, there is no reason to process keyboard input. | |
435 if (!host()->IsVisible()) | |
436 return false; | |
437 | |
438 if (find_bar_host()->MaybeForwardKeyEventToWebpage(key_event)) | |
439 return true; // Handled, we are done! | |
440 | |
441 if (key_event.key_code() == ui::VKEY_RETURN) { | |
442 // Pressing Return/Enter starts the search (unless text box is empty). | |
443 string16 find_string = find_text_->text(); | |
444 if (!find_string.empty()) { | |
445 FindBarController* controller = find_bar_host()->GetFindBarController(); | |
446 FindTabHelper* find_tab_helper = | |
447 FindTabHelper::FromWebContents(controller->web_contents()); | |
448 // Search forwards for enter, backwards for shift-enter. | |
449 find_tab_helper->StartFinding(find_string, | |
450 !key_event.IsShiftDown(), | |
451 false); // Not case sensitive. | |
452 } | |
453 return true; | |
454 } | |
455 | |
456 return false; | |
457 } | |
458 | |
459 void FindBarView::UpdateMatchCountAppearance(bool no_match) { | 488 void FindBarView::UpdateMatchCountAppearance(bool no_match) { |
460 if (no_match) { | 489 if (no_match) { |
461 match_count_text_->SetBackgroundColor(kBackgroundColorNoMatch); | 490 match_count_text_->SetBackgroundColor(kBackgroundColorNoMatch); |
462 match_count_text_->SetEnabledColor(kTextColorNoMatch); | 491 match_count_text_->SetEnabledColor(kTextColorNoMatch); |
463 } else { | 492 } else { |
464 match_count_text_->SetBackgroundColor(kBackgroundColorMatch); | 493 match_count_text_->SetBackgroundColor(kBackgroundColorMatch); |
465 match_count_text_->SetEnabledColor(kTextColorMatchCount); | 494 match_count_text_->SetEnabledColor(kTextColorMatchCount); |
466 } | 495 } |
467 } | 496 } |
468 | 497 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 | 533 |
505 void FindBarView::OnThemeChanged() { | 534 void FindBarView::OnThemeChanged() { |
506 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 535 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
507 if (GetThemeProvider()) { | 536 if (GetThemeProvider()) { |
508 close_button_->SetBackground( | 537 close_button_->SetBackground( |
509 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TAB_TEXT), | 538 GetThemeProvider()->GetColor(ThemeProperties::COLOR_TAB_TEXT), |
510 rb.GetImageSkiaNamed(IDR_CLOSE_1), | 539 rb.GetImageSkiaNamed(IDR_CLOSE_1), |
511 rb.GetImageSkiaNamed(IDR_CLOSE_1_MASK)); | 540 rb.GetImageSkiaNamed(IDR_CLOSE_1_MASK)); |
512 } | 541 } |
513 } | 542 } |
OLD | NEW |