OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "views/controls/native_control_win.h" | 5 #include "views/controls/native_control_win.h" |
6 | 6 |
7 #include <windowsx.h> | 7 #include <windowsx.h> |
8 | 8 |
9 #include "app/l10n_util_win.h" | 9 #include "app/l10n_util_win.h" |
10 #include "app/win/scoped_prop.h" | 10 #include "app/win/scoped_prop.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/win_util.h" | 12 #include "base/win_util.h" |
13 #include "views/focus/focus_manager.h" | 13 #include "views/focus/focus_manager.h" |
14 | 14 |
15 namespace views { | 15 namespace views { |
16 | 16 |
17 // static | 17 static const wchar_t* kNativeControlWinKey = L"__NATIVE_CONTROL_WIN__"; |
18 const wchar_t* NativeControlWin::kNativeControlWinKey = | |
19 L"__NATIVE_CONTROL_WIN__"; | |
20 | 18 |
21 //////////////////////////////////////////////////////////////////////////////// | 19 //////////////////////////////////////////////////////////////////////////////// |
22 // NativeControlWin, public: | 20 // NativeControlWin, public: |
23 | 21 |
24 NativeControlWin::NativeControlWin() { | 22 NativeControlWin::NativeControlWin() { |
25 } | 23 } |
26 | 24 |
27 NativeControlWin::~NativeControlWin() { | 25 NativeControlWin::~NativeControlWin() { |
28 HWND hwnd = native_view(); | 26 HWND hwnd = native_view(); |
29 if (hwnd) { | 27 if (hwnd) { |
30 // Destroy the hwnd if it still exists. Otherwise we won't have shut things | 28 // Destroy the hwnd if it still exists. Otherwise we won't have shut things |
31 // down correctly, leading to leaking and crashing if another message | 29 // down correctly, leading to leaking and crashing if another message |
32 // comes in for the hwnd. | 30 // comes in for the hwnd. |
33 Detach(); | 31 Detach(); |
34 DestroyWindow(hwnd); | 32 DestroyWindow(hwnd); |
35 } | 33 } |
36 } | 34 } |
37 | 35 |
38 bool NativeControlWin::ProcessMessage(UINT message, WPARAM w_param, | 36 bool NativeControlWin::ProcessMessage(UINT message, |
39 LPARAM l_param, LRESULT* result) { | 37 WPARAM w_param, |
| 38 LPARAM l_param, |
| 39 LRESULT* result) { |
40 switch (message) { | 40 switch (message) { |
41 case WM_CONTEXTMENU: | 41 case WM_CONTEXTMENU: |
42 ShowContextMenu(gfx::Point(GET_X_LPARAM(l_param), GET_Y_LPARAM(l_param))); | 42 ShowContextMenu(gfx::Point(GET_X_LPARAM(l_param), GET_Y_LPARAM(l_param))); |
43 *result = 0; | 43 *result = 0; |
44 return true; | 44 return true; |
45 case WM_CTLCOLORBTN: | 45 case WM_CTLCOLORBTN: |
46 case WM_CTLCOLORSTATIC: | 46 case WM_CTLCOLORSTATIC: |
47 *result = GetControlColor(message, reinterpret_cast<HDC>(w_param), | 47 *result = GetControlColor(message, reinterpret_cast<HDC>(w_param), |
48 native_view()); | 48 native_view()); |
49 return true; | 49 return true; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 | 123 |
124 if (location.x() == -1 && location.y() == -1) | 124 if (location.x() == -1 && location.y() == -1) |
125 View::ShowContextMenu(GetKeyboardContextMenuLocation(), false); | 125 View::ShowContextMenu(GetKeyboardContextMenuLocation(), false); |
126 else | 126 else |
127 View::ShowContextMenu(location, true); | 127 View::ShowContextMenu(location, true); |
128 } | 128 } |
129 | 129 |
130 void NativeControlWin::NativeControlCreated(HWND native_control) { | 130 void NativeControlWin::NativeControlCreated(HWND native_control) { |
131 // Associate this object with the control's HWND so that WidgetWin can find | 131 // Associate this object with the control's HWND so that WidgetWin can find |
132 // this object when it receives messages from it. | 132 // this object when it receives messages from it. |
133 prop_.reset( | 133 props_.push_back( |
134 new app::win::ScopedProp(native_control, kNativeControlWinKey, this)); | 134 new app::win::ScopedProp(native_control, kNativeControlWinKey, this)); |
| 135 props_.push_back(ChildWindowMessageProcessor::Register(native_control, this)); |
135 | 136 |
136 // Subclass so we get WM_KEYDOWN and WM_SETFOCUS messages. | 137 // Subclass so we get WM_KEYDOWN and WM_SETFOCUS messages. |
137 original_wndproc_ = | 138 original_wndproc_ = |
138 win_util::SetWindowProc(native_control, | 139 win_util::SetWindowProc(native_control, |
139 &NativeControlWin::NativeControlWndProc); | 140 &NativeControlWin::NativeControlWndProc); |
140 | 141 |
141 Attach(native_control); | 142 Attach(native_control); |
142 // native_view() is now valid. | 143 // native_view() is now valid. |
143 | 144 |
144 // Update the newly created HWND with any resident enabled state. | 145 // Update the newly created HWND with any resident enabled state. |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
204 return 0; | 205 return 0; |
205 } else if (message == WM_SETFOCUS) { | 206 } else if (message == WM_SETFOCUS) { |
206 // Let the focus manager know that the focus changed. | 207 // Let the focus manager know that the focus changed. |
207 FocusManager* focus_manager = native_control->GetFocusManager(); | 208 FocusManager* focus_manager = native_control->GetFocusManager(); |
208 if (focus_manager) { | 209 if (focus_manager) { |
209 focus_manager->SetFocusedView(native_control->focus_view()); | 210 focus_manager->SetFocusedView(native_control->focus_view()); |
210 } else { | 211 } else { |
211 NOTREACHED(); | 212 NOTREACHED(); |
212 } | 213 } |
213 } else if (message == WM_DESTROY) { | 214 } else if (message == WM_DESTROY) { |
214 native_control->prop_.reset(); | 215 native_control->props_.reset(); |
215 win_util::SetWindowProc(window, native_control->original_wndproc_); | 216 win_util::SetWindowProc(window, native_control->original_wndproc_); |
216 } | 217 } |
217 | 218 |
218 return CallWindowProc(native_control->original_wndproc_, window, message, | 219 return CallWindowProc(native_control->original_wndproc_, window, message, |
219 w_param, l_param); | 220 w_param, l_param); |
220 } | 221 } |
221 | 222 |
222 } // namespace views | 223 } // namespace views |
OLD | NEW |