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

Side by Side Diff: chrome/browser/autocomplete/autocomplete_edit_view_win.cc

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

Powered by Google App Engine
This is Rietveld 408576698