| 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_mac.h" | 5 #include "chrome/browser/autocomplete/autocomplete_edit_view_mac.h" |
| 6 | 6 |
| 7 #include <Carbon/Carbon.h> // kVK_Return | 7 #include <Carbon/Carbon.h> // kVK_Return |
| 8 #include "app/gfx/font.h" | 8 #include "app/gfx/font.h" |
| 9 #include "app/resource_bundle.h" | 9 #include "app/resource_bundle.h" |
| 10 #include "base/clipboard.h" | 10 #include "base/clipboard.h" |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 void AutocompleteEditViewMac::SetUserText(const std::wstring& text, | 285 void AutocompleteEditViewMac::SetUserText(const std::wstring& text, |
| 286 const std::wstring& display_text, | 286 const std::wstring& display_text, |
| 287 bool update_popup) { | 287 bool update_popup) { |
| 288 model_->SetUserText(text); | 288 model_->SetUserText(text); |
| 289 // TODO(shess): TODO below from gtk. | 289 // TODO(shess): TODO below from gtk. |
| 290 // TODO(deanm): something about selection / focus change here. | 290 // TODO(deanm): something about selection / focus change here. |
| 291 SetText(display_text); | 291 SetText(display_text); |
| 292 if (update_popup) { | 292 if (update_popup) { |
| 293 UpdatePopup(); | 293 UpdatePopup(); |
| 294 } | 294 } |
| 295 controller_->OnChanged(); |
| 295 } | 296 } |
| 296 | 297 |
| 297 NSRange AutocompleteEditViewMac::GetSelectedRange() const { | 298 NSRange AutocompleteEditViewMac::GetSelectedRange() const { |
| 298 DCHECK([field_ currentEditor]); | 299 DCHECK([field_ currentEditor]); |
| 299 return [[field_ currentEditor] selectedRange]; | 300 return [[field_ currentEditor] selectedRange]; |
| 300 } | 301 } |
| 301 | 302 |
| 302 void AutocompleteEditViewMac::SetSelectedRange(const NSRange range) { | 303 void AutocompleteEditViewMac::SetSelectedRange(const NSRange range) { |
| 303 // This can be called when we don't have focus. For instance, when | 304 // This can be called when we don't have focus. For instance, when |
| 304 // the user clicks the "Go" button. | 305 // the user clicks the "Go" button. |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 if (scheme_security_level == ToolbarModel::SECURE) { | 421 if (scheme_security_level == ToolbarModel::SECURE) { |
| 421 color = SecureSchemeColor(); | 422 color = SecureSchemeColor(); |
| 422 } else { | 423 } else { |
| 423 color = InsecureSchemeColor(); | 424 color = InsecureSchemeColor(); |
| 424 } | 425 } |
| 425 [as addAttribute:NSForegroundColorAttributeName value:color | 426 [as addAttribute:NSForegroundColorAttributeName value:color |
| 426 range:ComponentToNSRange(parts.scheme)]; | 427 range:ComponentToNSRange(parts.scheme)]; |
| 427 } | 428 } |
| 428 | 429 |
| 429 [field_ setObjectValue:as]; | 430 [field_ setObjectValue:as]; |
| 431 |
| 432 // TODO(shess): This may be an appropriate place to call: |
| 433 // controller_->OnChanged(); |
| 434 // In the current implementation, this tells LocationBarViewMac to |
| 435 // mess around with |model_| and update |field_|. Unfortunately, |
| 436 // when I look at our peer implementations, it's not entirely clear |
| 437 // to me if this is safe. SetText() is sort of an utility method, |
| 438 // and different callers sometimes have different needs. Research |
| 439 // this issue so that it can be added safely. |
| 440 |
| 441 // TODO(shess): Also, consider whether this code couldn't just |
| 442 // manage things directly. Windows uses a series of overlaid view |
| 443 // objects to accomplish the hinting stuff that OnChanged() does, so |
| 444 // it makes sense to have it in the controller that lays those |
| 445 // things out. Mac instead pushes the support into a custom |
| 446 // text-field implementation. |
| 430 } | 447 } |
| 431 | 448 |
| 432 void AutocompleteEditViewMac::SetTextAndSelectedRange( | 449 void AutocompleteEditViewMac::SetTextAndSelectedRange( |
| 433 const std::wstring& display_text, const NSRange range) { | 450 const std::wstring& display_text, const NSRange range) { |
| 434 SetText(display_text); | 451 SetText(display_text); |
| 435 SetSelectedRange(range); | 452 SetSelectedRange(range); |
| 436 } | 453 } |
| 437 | 454 |
| 438 void AutocompleteEditViewMac::EmphasizeURLComponents() { | 455 void AutocompleteEditViewMac::EmphasizeURLComponents() { |
| 439 if ([field_ currentEditor]) { | 456 if ([field_ currentEditor]) { |
| 440 SetTextAndSelectedRange(GetText(), GetSelectedRange()); | 457 SetTextAndSelectedRange(GetText(), GetSelectedRange()); |
| 441 } else { | 458 } else { |
| 442 SetText(GetText()); | 459 SetText(GetText()); |
| 443 } | 460 } |
| 444 } | 461 } |
| 445 | 462 |
| 446 void AutocompleteEditViewMac::OnTemporaryTextMaybeChanged( | 463 void AutocompleteEditViewMac::OnTemporaryTextMaybeChanged( |
| 447 const std::wstring& display_text, bool save_original_selection) { | 464 const std::wstring& display_text, bool save_original_selection) { |
| 448 // TODO(shess): I believe this is for when the user arrows around | 465 // TODO(shess): I believe this is for when the user arrows around |
| 449 // the popup, will be restored if they hit escape. Figure out if | 466 // the popup, will be restored if they hit escape. Figure out if |
| 450 // that is for certain it. | 467 // that is for certain it. |
| 451 if (save_original_selection) { | 468 if (save_original_selection) { |
| 452 saved_temporary_selection_ = GetSelectedRange(); | 469 saved_temporary_selection_ = GetSelectedRange(); |
| 453 saved_temporary_text_ = GetText(); | 470 saved_temporary_text_ = GetText(); |
| 454 } | 471 } |
| 455 | 472 |
| 456 SetWindowTextAndCaretPos(display_text, display_text.size()); | 473 SetWindowTextAndCaretPos(display_text, display_text.size()); |
| 474 controller_->OnChanged(); |
| 457 } | 475 } |
| 458 | 476 |
| 459 bool AutocompleteEditViewMac::OnInlineAutocompleteTextMaybeChanged( | 477 bool AutocompleteEditViewMac::OnInlineAutocompleteTextMaybeChanged( |
| 460 const std::wstring& display_text, size_t user_text_length) { | 478 const std::wstring& display_text, size_t user_text_length) { |
| 461 // TODO(shess): Make sure that this actually works. The round trip | 479 // TODO(shess): Make sure that this actually works. The round trip |
| 462 // to native form and back may mean that it's the same but not the | 480 // to native form and back may mean that it's the same but not the |
| 463 // same. | 481 // same. |
| 464 if (display_text == GetText()) { | 482 if (display_text == GetText()) { |
| 465 return false; | 483 return false; |
| 466 } | 484 } |
| 467 | 485 |
| 468 DCHECK_LE(user_text_length, display_text.size()); | 486 DCHECK_LE(user_text_length, display_text.size()); |
| 469 const NSRange range = NSMakeRange(user_text_length, display_text.size()); | 487 const NSRange range = NSMakeRange(user_text_length, display_text.size()); |
| 470 SetTextAndSelectedRange(display_text, range); | 488 SetTextAndSelectedRange(display_text, range); |
| 489 controller_->OnChanged(); |
| 471 | 490 |
| 472 return true; | 491 return true; |
| 473 } | 492 } |
| 474 | 493 |
| 475 void AutocompleteEditViewMac::OnRevertTemporaryText() { | 494 void AutocompleteEditViewMac::OnRevertTemporaryText() { |
| 476 SetTextAndSelectedRange(saved_temporary_text_, saved_temporary_selection_); | 495 SetTextAndSelectedRange(saved_temporary_text_, saved_temporary_selection_); |
| 477 saved_temporary_text_.clear(); | 496 saved_temporary_text_.clear(); |
| 478 } | 497 } |
| 479 | 498 |
| 480 bool AutocompleteEditViewMac::IsFirstResponder() const { | 499 bool AutocompleteEditViewMac::IsFirstResponder() const { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 | 537 |
| 519 const bool something_changed = model_->OnAfterPossibleChange(new_text, | 538 const bool something_changed = model_->OnAfterPossibleChange(new_text, |
| 520 selection_differs, text_differs, just_deleted_text, at_end_of_edit); | 539 selection_differs, text_differs, just_deleted_text, at_end_of_edit); |
| 521 | 540 |
| 522 // Restyle in case the user changed something. | 541 // Restyle in case the user changed something. |
| 523 // TODO(shess): I believe there are multiple-redraw cases, here. | 542 // TODO(shess): I believe there are multiple-redraw cases, here. |
| 524 // Linux watches for something_changed && text_differs, but that | 543 // Linux watches for something_changed && text_differs, but that |
| 525 // fails for us in case you copy the URL and paste the identical URL | 544 // fails for us in case you copy the URL and paste the identical URL |
| 526 // back (we'll lose the styling). | 545 // back (we'll lose the styling). |
| 527 EmphasizeURLComponents(); | 546 EmphasizeURLComponents(); |
| 547 controller_->OnChanged(); |
| 528 | 548 |
| 529 return something_changed; | 549 return something_changed; |
| 530 } | 550 } |
| 531 | 551 |
| 532 gfx::NativeView AutocompleteEditViewMac::GetNativeView() const { | 552 gfx::NativeView AutocompleteEditViewMac::GetNativeView() const { |
| 533 return field_; | 553 return field_; |
| 534 } | 554 } |
| 535 | 555 |
| 536 void AutocompleteEditViewMac::OnUpOrDownKeyPressed(bool up, bool by_page) { | 556 void AutocompleteEditViewMac::OnUpOrDownKeyPressed(bool up, bool by_page) { |
| 537 // We should only arrive here when the field is focussed. | 557 // We should only arrive here when the field is focussed. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 607 | 627 |
| 608 void AutocompleteEditViewMac::OnControlKeyChanged(bool pressed) { | 628 void AutocompleteEditViewMac::OnControlKeyChanged(bool pressed) { |
| 609 model_->OnControlKeyChanged(pressed); | 629 model_->OnControlKeyChanged(pressed); |
| 610 } | 630 } |
| 611 | 631 |
| 612 void AutocompleteEditViewMac::AcceptInput( | 632 void AutocompleteEditViewMac::AcceptInput( |
| 613 WindowOpenDisposition disposition, bool for_drop) { | 633 WindowOpenDisposition disposition, bool for_drop) { |
| 614 model_->AcceptInput(disposition, for_drop); | 634 model_->AcceptInput(disposition, for_drop); |
| 615 } | 635 } |
| 616 | 636 |
| 637 void AutocompleteEditViewMac::AcceptKeyword() { |
| 638 model_->AcceptKeyword(); |
| 639 } |
| 640 |
| 617 void AutocompleteEditViewMac::FocusLocation() { | 641 void AutocompleteEditViewMac::FocusLocation() { |
| 618 [[field_ window] makeFirstResponder:field_]; | 642 [[field_ window] makeFirstResponder:field_]; |
| 619 DCHECK_EQ([field_ currentEditor], [[field_ window] firstResponder]); | 643 DCHECK_EQ([field_ currentEditor], [[field_ window] firstResponder]); |
| 620 } | 644 } |
| 621 | 645 |
| 622 // TODO(shess): Copied from autocomplete_edit_view_win.cc. Could this | 646 // TODO(shess): Copied from autocomplete_edit_view_win.cc. Could this |
| 623 // be pushed into the model? | 647 // be pushed into the model? |
| 624 std::wstring AutocompleteEditViewMac::GetClipboardText(Clipboard* clipboard) { | 648 std::wstring AutocompleteEditViewMac::GetClipboardText(Clipboard* clipboard) { |
| 625 // autocomplete_edit_view_win.cc assumes this can never happen, we | 649 // autocomplete_edit_view_win.cc assumes this can never happen, we |
| 626 // will too. | 650 // will too. |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 if (cmd == @selector(scrollPageUp:)) { | 716 if (cmd == @selector(scrollPageUp:)) { |
| 693 edit_view_->OnUpOrDownKeyPressed(true, true); | 717 edit_view_->OnUpOrDownKeyPressed(true, true); |
| 694 return YES; | 718 return YES; |
| 695 } | 719 } |
| 696 | 720 |
| 697 if (cmd == @selector(cancelOperation:)) { | 721 if (cmd == @selector(cancelOperation:)) { |
| 698 edit_view_->OnEscapeKeyPressed(); | 722 edit_view_->OnEscapeKeyPressed(); |
| 699 return YES; | 723 return YES; |
| 700 } | 724 } |
| 701 | 725 |
| 726 if (cmd == @selector(insertTab:)) { |
| 727 edit_view_->AcceptKeyword(); |
| 728 return YES; |
| 729 } |
| 730 |
| 702 // |-noop:| is sent when the user presses Cmd+Return. Override the no-op | 731 // |-noop:| is sent when the user presses Cmd+Return. Override the no-op |
| 703 // behavior with the proper WindowOpenDisposition. | 732 // behavior with the proper WindowOpenDisposition. |
| 704 NSEvent* event = [NSApp currentEvent]; | 733 NSEvent* event = [NSApp currentEvent]; |
| 705 if (cmd == @selector(insertNewline:) || | 734 if (cmd == @selector(insertNewline:) || |
| 706 (cmd == @selector(noop:) && [event keyCode] == kVK_Return)) { | 735 (cmd == @selector(noop:) && [event keyCode] == kVK_Return)) { |
| 707 WindowOpenDisposition disposition = | 736 WindowOpenDisposition disposition = |
| 708 event_utils::WindowOpenDispositionFromNSEvent(event); | 737 event_utils::WindowOpenDispositionFromNSEvent(event); |
| 709 edit_view_->AcceptInput(disposition, false); | 738 edit_view_->AcceptInput(disposition, false); |
| 710 return YES; | 739 return YES; |
| 711 } | 740 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 // prepended and ".com" appended. This calls down to | 800 // prepended and ".com" appended. This calls down to |
| 772 // AutocompleteEditModel::OnControlKeyChanged() so that it can change | 801 // AutocompleteEditModel::OnControlKeyChanged() so that it can change |
| 773 // the popup to reflect this. See autocomplete_edit.cc | 802 // the popup to reflect this. See autocomplete_edit.cc |
| 774 // OnControlKeyChanged() and OnAfterPossibleChange(). | 803 // OnControlKeyChanged() and OnAfterPossibleChange(). |
| 775 - (void)control:(NSControl*)control flagsChanged:(NSEvent*)theEvent { | 804 - (void)control:(NSControl*)control flagsChanged:(NSEvent*)theEvent { |
| 776 BOOL controlFlag = ([theEvent modifierFlags]&NSControlKeyMask) != 0; | 805 BOOL controlFlag = ([theEvent modifierFlags]&NSControlKeyMask) != 0; |
| 777 edit_view_->OnControlKeyChanged(controlFlag); | 806 edit_view_->OnControlKeyChanged(controlFlag); |
| 778 } | 807 } |
| 779 | 808 |
| 780 @end | 809 @end |
| OLD | NEW |