| 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_win.h" | 5 #include "chrome/browser/autocomplete/autocomplete_edit_view_win.h" |
| 6 | 6 |
| 7 #include <locale> | 7 #include <locale> |
| 8 | 8 |
| 9 #include "app/clipboard/clipboard.h" | 9 #include "app/clipboard/clipboard.h" |
| 10 #include "app/clipboard/scoped_clipboard_writer.h" | 10 #include "app/clipboard/scoped_clipboard_writer.h" |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 model_->SetUserText(text); | 610 model_->SetUserText(text); |
| 611 saved_selection_for_focus_change_.cpMin = -1; | 611 saved_selection_for_focus_change_.cpMin = -1; |
| 612 SetWindowTextAndCaretPos(display_text, display_text.length()); | 612 SetWindowTextAndCaretPos(display_text, display_text.length()); |
| 613 if (update_popup) | 613 if (update_popup) |
| 614 UpdatePopup(); | 614 UpdatePopup(); |
| 615 TextChanged(); | 615 TextChanged(); |
| 616 } | 616 } |
| 617 | 617 |
| 618 void AutocompleteEditViewWin::SetWindowTextAndCaretPos(const std::wstring& text, | 618 void AutocompleteEditViewWin::SetWindowTextAndCaretPos(const std::wstring& text, |
| 619 size_t caret_pos) { | 619 size_t caret_pos) { |
| 620 HIMC imm_context = ImmGetContext(m_hWnd); | |
| 621 if (imm_context) { | |
| 622 // In Windows Vista, SetWindowText() automatically cancels any ongoing | |
| 623 // IME composition, and updates the text of the underlying edit control. | |
| 624 // In Windows XP, however, SetWindowText() gets applied to the IME | |
| 625 // composition string if it exists, and doesn't update the underlying edit | |
| 626 // control. To avoid this, we force the IME to cancel any outstanding | |
| 627 // compositions here. This is harmless in Vista and in cases where the IME | |
| 628 // isn't composing. | |
| 629 | |
| 630 // NOTE: We MUST ignore messages like WM_IME_COMPOSITION that may be sent as | |
| 631 // a result of doing this. Until the SetWindowText() call below, the | |
| 632 // underlying edit (on XP) has out-of-date text in it; for problems this can | |
| 633 // cause, see OnImeComposition(). | |
| 634 ignore_ime_messages_ = true; | |
| 635 ImmNotifyIME(imm_context, NI_COMPOSITIONSTR, CPS_CANCEL, 0); | |
| 636 ImmReleaseContext(m_hWnd, imm_context); | |
| 637 ignore_ime_messages_ = false; | |
| 638 } | |
| 639 | |
| 640 SetWindowText(text.c_str()); | 620 SetWindowText(text.c_str()); |
| 641 PlaceCaretAt(caret_pos); | 621 PlaceCaretAt(caret_pos); |
| 642 } | 622 } |
| 643 | 623 |
| 644 void AutocompleteEditViewWin::SetForcedQuery() { | 624 void AutocompleteEditViewWin::SetForcedQuery() { |
| 645 const std::wstring current_text(GetText()); | 625 const std::wstring current_text(GetText()); |
| 646 if (current_text.empty() || (current_text[0] != '?')) | 626 if (current_text.empty() || (current_text[0] != '?')) |
| 647 SetUserText(L"?"); | 627 SetUserText(L"?"); |
| 648 else | 628 else |
| 649 SetSelection(current_text.length(), 1); | 629 SetSelection(current_text.length(), 1); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 796 size_t user_text_length) { | 776 size_t user_text_length) { |
| 797 // Update the text and selection. Because this can be called repeatedly while | 777 // Update the text and selection. Because this can be called repeatedly while |
| 798 // typing, we've careful not to freeze the edit unless we really need to. | 778 // typing, we've careful not to freeze the edit unless we really need to. |
| 799 // Also, unlike in the temporary text case above, here we don't want to update | 779 // Also, unlike in the temporary text case above, here we don't want to update |
| 800 // the caret/selection unless we have to, since this might make the user's | 780 // the caret/selection unless we have to, since this might make the user's |
| 801 // caret position change without warning during typing. | 781 // caret position change without warning during typing. |
| 802 if (display_text == GetText()) | 782 if (display_text == GetText()) |
| 803 return false; | 783 return false; |
| 804 | 784 |
| 805 ScopedFreeze freeze(this, GetTextObjectModel()); | 785 ScopedFreeze freeze(this, GetTextObjectModel()); |
| 806 // NOTE: We don't need the IME composition hack in SetWindowTextAndCaretPos() | |
| 807 // here, because UpdatePopup() disables inline autocomplete when a | |
| 808 // composition is in progress, thus preventing us from reaching this code. | |
| 809 SetWindowText(display_text.c_str()); | 786 SetWindowText(display_text.c_str()); |
| 810 // Set a reversed selection to keep the caret in the same position, which | 787 // Set a reversed selection to keep the caret in the same position, which |
| 811 // avoids scrolling the user's text. | 788 // avoids scrolling the user's text. |
| 812 SetSelection(static_cast<LONG>(display_text.length()), | 789 SetSelection(static_cast<LONG>(display_text.length()), |
| 813 static_cast<LONG>(user_text_length)); | 790 static_cast<LONG>(user_text_length)); |
| 814 TextChanged(); | 791 TextChanged(); |
| 815 return true; | 792 return true; |
| 816 } | 793 } |
| 817 | 794 |
| 818 void AutocompleteEditViewWin::OnRevertTemporaryText() { | 795 void AutocompleteEditViewWin::OnRevertTemporaryText() { |
| (...skipping 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1711 | 1688 |
| 1712 // Restore saved selection if available. | 1689 // Restore saved selection if available. |
| 1713 if (saved_selection_for_focus_change_.cpMin != -1) { | 1690 if (saved_selection_for_focus_change_.cpMin != -1) { |
| 1714 SetSelectionRange(saved_selection_for_focus_change_); | 1691 SetSelectionRange(saved_selection_for_focus_change_); |
| 1715 saved_selection_for_focus_change_.cpMin = -1; | 1692 saved_selection_for_focus_change_.cpMin = -1; |
| 1716 } | 1693 } |
| 1717 | 1694 |
| 1718 SetMsgHandled(false); | 1695 SetMsgHandled(false); |
| 1719 } | 1696 } |
| 1720 | 1697 |
| 1698 LRESULT AutocompleteEditViewWin::OnSetText(const wchar_t* text) { |
| 1699 // Ignore all IME messages while we process this WM_SETTEXT message. |
| 1700 // When SetWindowText() is called while an IME is composing text, the IME |
| 1701 // calls SendMessage() to send a WM_IME_COMPOSITION message. When we receive |
| 1702 // this WM_IME_COMPOSITION message, we update the omnibox and may call |
| 1703 // SetWindowText() again. To stop this recursive message-handler call, we |
| 1704 // stop updating the omnibox while we process a WM_SETTEXT message. |
| 1705 // We wouldn't need to do this update anyway, because either we're in the |
| 1706 // middle of updating the omnibox already or the caller of SetWindowText() |
| 1707 // is going to update the omnibox next. |
| 1708 AutoReset auto_reset_ignore_ime_messages(&ignore_ime_messages_, true); |
| 1709 return DefWindowProc(WM_SETTEXT, 0, reinterpret_cast<LPARAM>(text)); |
| 1710 } |
| 1711 |
| 1721 void AutocompleteEditViewWin::OnSysChar(TCHAR ch, | 1712 void AutocompleteEditViewWin::OnSysChar(TCHAR ch, |
| 1722 UINT repeat_count, | 1713 UINT repeat_count, |
| 1723 UINT flags) { | 1714 UINT flags) { |
| 1724 // Nearly all alt-<xxx> combos result in beeping rather than doing something | 1715 // Nearly all alt-<xxx> combos result in beeping rather than doing something |
| 1725 // useful, so we discard most. Exceptions: | 1716 // useful, so we discard most. Exceptions: |
| 1726 // * ctrl-alt-<xxx>, which is sometimes important, generates WM_CHAR instead | 1717 // * ctrl-alt-<xxx>, which is sometimes important, generates WM_CHAR instead |
| 1727 // of WM_SYSCHAR, so it doesn't need to be handled here. | 1718 // of WM_SYSCHAR, so it doesn't need to be handled here. |
| 1728 // * alt-space gets translated by the default WM_SYSCHAR handler to a | 1719 // * alt-space gets translated by the default WM_SYSCHAR handler to a |
| 1729 // WM_SYSCOMMAND to open the application context menu, so we need to allow | 1720 // WM_SYSCOMMAND to open the application context menu, so we need to allow |
| 1730 // it through. | 1721 // it through. |
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2432 context_menu_contents_->AddItemWithStringId(IDS_PASTE_AND_GO, | 2423 context_menu_contents_->AddItemWithStringId(IDS_PASTE_AND_GO, |
| 2433 IDS_PASTE_AND_GO); | 2424 IDS_PASTE_AND_GO); |
| 2434 context_menu_contents_->AddSeparator(); | 2425 context_menu_contents_->AddSeparator(); |
| 2435 context_menu_contents_->AddItemWithStringId(IDS_SELECT_ALL, IDS_SELECT_ALL); | 2426 context_menu_contents_->AddItemWithStringId(IDS_SELECT_ALL, IDS_SELECT_ALL); |
| 2436 context_menu_contents_->AddSeparator(); | 2427 context_menu_contents_->AddSeparator(); |
| 2437 context_menu_contents_->AddItemWithStringId(IDS_EDIT_SEARCH_ENGINES, | 2428 context_menu_contents_->AddItemWithStringId(IDS_EDIT_SEARCH_ENGINES, |
| 2438 IDS_EDIT_SEARCH_ENGINES); | 2429 IDS_EDIT_SEARCH_ENGINES); |
| 2439 } | 2430 } |
| 2440 context_menu_.reset(new views::Menu2(context_menu_contents_.get())); | 2431 context_menu_.reset(new views::Menu2(context_menu_contents_.get())); |
| 2441 } | 2432 } |
| OLD | NEW |