| 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 <algorithm> |
| 6 |
| 5 #include "app/l10n_util.h" | 7 #include "app/l10n_util.h" |
| 6 #include "app/l10n_util_win.h" | 8 #include "app/l10n_util_win.h" |
| 7 #include "app/win_util.h" | 9 #include "app/win_util.h" |
| 8 #include "base/clipboard.h" | 10 #include "base/clipboard.h" |
| 9 #include "base/gfx/native_theme.h" | 11 #include "base/gfx/native_theme.h" |
| 10 #include "base/scoped_clipboard_writer.h" | 12 #include "base/scoped_clipboard_writer.h" |
| 11 #include "base/string_util.h" | 13 #include "base/string_util.h" |
| 12 #include "base/win_util.h" | 14 #include "base/win_util.h" |
| 13 #include "grit/app_strings.h" | 15 #include "grit/app_strings.h" |
| 14 #include "skia/ext/skia_utils_win.h" | 16 #include "skia/ext/skia_utils_win.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 | 89 |
| 88 RECT r = {0, 0, textfield_->width(), textfield_->height()}; | 90 RECT r = {0, 0, textfield_->width(), textfield_->height()}; |
| 89 Create(textfield_->GetWidget()->GetNativeView(), r, NULL, style, ex_style); | 91 Create(textfield_->GetWidget()->GetNativeView(), r, NULL, style, ex_style); |
| 90 | 92 |
| 91 if (textfield_->style() & Textfield::STYLE_LOWERCASE) { | 93 if (textfield_->style() & Textfield::STYLE_LOWERCASE) { |
| 92 DCHECK((textfield_->style() & Textfield::STYLE_PASSWORD) == 0); | 94 DCHECK((textfield_->style() & Textfield::STYLE_PASSWORD) == 0); |
| 93 SetEditStyle(SES_LOWERCASE, SES_LOWERCASE); | 95 SetEditStyle(SES_LOWERCASE, SES_LOWERCASE); |
| 94 } | 96 } |
| 95 | 97 |
| 96 // Set up the text_object_model_. | 98 // Set up the text_object_model_. |
| 97 CComPtr<IRichEditOle> ole_interface; | 99 ScopedComPtr<IRichEditOle, &IID_IRichEditOle> ole_interface; |
| 98 ole_interface.Attach(GetOleInterface()); | 100 ole_interface.Attach(GetOleInterface()); |
| 99 text_object_model_ = ole_interface; | 101 text_object_model_.QueryFrom(ole_interface); |
| 100 } | 102 } |
| 101 | 103 |
| 102 NativeTextfieldWin::~NativeTextfieldWin() { | 104 NativeTextfieldWin::~NativeTextfieldWin() { |
| 103 if (IsWindow()) | 105 if (IsWindow()) |
| 104 DestroyWindow(); | 106 DestroyWindow(); |
| 105 } | 107 } |
| 106 | 108 |
| 107 void NativeTextfieldWin::AttachHack() { | 109 void NativeTextfieldWin::AttachHack() { |
| 108 // See the code in textfield.cc that calls this for why this is here. | 110 // See the code in textfield.cc that calls this for why this is here. |
| 109 container_view_->set_focus_view(textfield_); | 111 container_view_->set_focus_view(textfield_); |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 if (textfield_->read_only() || textfield_->IsPassword()) | 300 if (textfield_->read_only() || textfield_->IsPassword()) |
| 299 return; | 301 return; |
| 300 | 302 |
| 301 OnCopy(); | 303 OnCopy(); |
| 302 | 304 |
| 303 // This replace selection will have no effect (even on the undo stack) if the | 305 // This replace selection will have no effect (even on the undo stack) if the |
| 304 // current selection is empty. | 306 // current selection is empty. |
| 305 ReplaceSel(L"", true); | 307 ReplaceSel(L"", true); |
| 306 } | 308 } |
| 307 | 309 |
| 308 LRESULT NativeTextfieldWin::OnImeChar(UINT message, WPARAM wparam, LPARAM lparam
) { | 310 LRESULT NativeTextfieldWin::OnImeChar(UINT message, |
| 311 WPARAM wparam, |
| 312 LPARAM lparam) { |
| 309 // http://crbug.com/7707: a rich-edit control may crash when it receives a | 313 // http://crbug.com/7707: a rich-edit control may crash when it receives a |
| 310 // WM_IME_CHAR message while it is processing a WM_IME_COMPOSITION message. | 314 // WM_IME_CHAR message while it is processing a WM_IME_COMPOSITION message. |
| 311 // Since view controls don't need WM_IME_CHAR messages, we prevent WM_IME_CHAR | 315 // Since view controls don't need WM_IME_CHAR messages, we prevent WM_IME_CHAR |
| 312 // messages from being dispatched to view controls via the CallWindowProc() | 316 // messages from being dispatched to view controls via the CallWindowProc() |
| 313 // call. | 317 // call. |
| 314 return 0; | 318 return 0; |
| 315 } | 319 } |
| 316 | 320 |
| 317 LRESULT NativeTextfieldWin::OnImeStartComposition(UINT message, | 321 LRESULT NativeTextfieldWin::OnImeStartComposition(UINT message, |
| 318 WPARAM wparam, | 322 WPARAM wparam, |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 void NativeTextfieldWin::OnMouseLeave() { | 509 void NativeTextfieldWin::OnMouseLeave() { |
| 506 SetContainsMouse(false); | 510 SetContainsMouse(false); |
| 507 } | 511 } |
| 508 | 512 |
| 509 LRESULT NativeTextfieldWin::OnMouseWheel(UINT message, WPARAM w_param, | 513 LRESULT NativeTextfieldWin::OnMouseWheel(UINT message, WPARAM w_param, |
| 510 LPARAM l_param) { | 514 LPARAM l_param) { |
| 511 // Reroute the mouse-wheel to the window under the mouse pointer if | 515 // Reroute the mouse-wheel to the window under the mouse pointer if |
| 512 // applicable. | 516 // applicable. |
| 513 if (views::RerouteMouseWheel(m_hWnd, w_param, l_param)) | 517 if (views::RerouteMouseWheel(m_hWnd, w_param, l_param)) |
| 514 return 0; | 518 return 0; |
| 515 return DefWindowProc(message, w_param, l_param);; | 519 return DefWindowProc(message, w_param, l_param); |
| 516 } | 520 } |
| 517 | 521 |
| 518 void NativeTextfieldWin::OnMouseMove(UINT keys, const CPoint& point) { | 522 void NativeTextfieldWin::OnMouseMove(UINT keys, const CPoint& point) { |
| 519 SetContainsMouse(true); | 523 SetContainsMouse(true); |
| 520 // Clamp the selection to the visible text so the user can't drag to select | 524 // Clamp the selection to the visible text so the user can't drag to select |
| 521 // the "phantom newline". In theory we could achieve this by clipping the X | 525 // the "phantom newline". In theory we could achieve this by clipping the X |
| 522 // coordinate, but in practice the edit seems to behave nondeterministically | 526 // coordinate, but in practice the edit seems to behave nondeterministically |
| 523 // with similar sequences of clipped input coordinates fed to it. Maybe it's | 527 // with similar sequences of clipped input coordinates fed to it. Maybe it's |
| 524 // reading the mouse cursor position directly? | 528 // reading the mouse cursor position directly? |
| 525 // | 529 // |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 835 tme.dwFlags = TME_LEAVE; | 839 tme.dwFlags = TME_LEAVE; |
| 836 tme.hwndTrack = m_hWnd; | 840 tme.hwndTrack = m_hWnd; |
| 837 tme.dwHoverTime = 0; | 841 tme.dwHoverTime = 0; |
| 838 TrackMouseEvent(&tme); | 842 TrackMouseEvent(&tme); |
| 839 } | 843 } |
| 840 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME); | 844 RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME); |
| 841 } | 845 } |
| 842 | 846 |
| 843 ITextDocument* NativeTextfieldWin::GetTextObjectModel() const { | 847 ITextDocument* NativeTextfieldWin::GetTextObjectModel() const { |
| 844 if (!text_object_model_) { | 848 if (!text_object_model_) { |
| 845 CComPtr<IRichEditOle> ole_interface; | 849 ScopedComPtr<IRichEditOle, &IID_IRichEditOle> ole_interface; |
| 846 ole_interface.Attach(GetOleInterface()); | 850 ole_interface.Attach(GetOleInterface()); |
| 847 text_object_model_ = ole_interface; | 851 text_object_model_.QueryFrom(ole_interface); |
| 848 } | 852 } |
| 849 return text_object_model_; | 853 return text_object_model_; |
| 850 } | 854 } |
| 851 | 855 |
| 852 void NativeTextfieldWin::BuildContextMenu() { | 856 void NativeTextfieldWin::BuildContextMenu() { |
| 853 if (context_menu_contents_.get()) | 857 if (context_menu_contents_.get()) |
| 854 return; | 858 return; |
| 855 context_menu_contents_.reset(new SimpleMenuModel(this)); | 859 context_menu_contents_.reset(new SimpleMenuModel(this)); |
| 856 context_menu_contents_->AddItemWithStringId(IDS_APP_UNDO, IDS_APP_UNDO); | 860 context_menu_contents_->AddItemWithStringId(IDS_APP_UNDO, IDS_APP_UNDO); |
| 857 context_menu_contents_->AddSeparator(); | 861 context_menu_contents_->AddSeparator(); |
| 858 context_menu_contents_->AddItemWithStringId(IDS_APP_CUT, IDS_APP_CUT); | 862 context_menu_contents_->AddItemWithStringId(IDS_APP_CUT, IDS_APP_CUT); |
| 859 context_menu_contents_->AddItemWithStringId(IDS_APP_COPY, IDS_APP_COPY); | 863 context_menu_contents_->AddItemWithStringId(IDS_APP_COPY, IDS_APP_COPY); |
| 860 context_menu_contents_->AddItemWithStringId(IDS_APP_PASTE, IDS_APP_PASTE); | 864 context_menu_contents_->AddItemWithStringId(IDS_APP_PASTE, IDS_APP_PASTE); |
| 861 context_menu_contents_->AddSeparator(); | 865 context_menu_contents_->AddSeparator(); |
| 862 context_menu_contents_->AddItemWithStringId(IDS_APP_SELECT_ALL, | 866 context_menu_contents_->AddItemWithStringId(IDS_APP_SELECT_ALL, |
| 863 IDS_APP_SELECT_ALL); | 867 IDS_APP_SELECT_ALL); |
| 864 context_menu_.reset(new Menu2(context_menu_contents_.get())); | 868 context_menu_.reset(new Menu2(context_menu_contents_.get())); |
| 865 } | 869 } |
| 866 | 870 |
| 867 //////////////////////////////////////////////////////////////////////////////// | 871 //////////////////////////////////////////////////////////////////////////////// |
| 868 // NativeTextfieldWrapper, public: | 872 // NativeTextfieldWrapper, public: |
| 869 | 873 |
| 870 // static | 874 // static |
| 871 NativeTextfieldWrapper* NativeTextfieldWrapper::CreateWrapper( | 875 NativeTextfieldWrapper* NativeTextfieldWrapper::CreateWrapper( |
| 872 Textfield* field) { | 876 Textfield* field) { |
| 873 return new NativeTextfieldWin(field); | 877 return new NativeTextfieldWin(field); |
| 874 } | 878 } |
| 875 | 879 |
| 876 } // namespace views | 880 } // namespace views |
| OLD | NEW |