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/button/native_button_win.h" | 5 #include "views/controls/button/native_button_win.h" |
6 | 6 |
7 #include <commctrl.h> | 7 #include <commctrl.h> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/win_util.h" | 10 #include "base/win_util.h" |
11 #include "views/controls/button/checkbox.h" | 11 #include "views/controls/button/checkbox.h" |
12 #include "views/controls/button/native_button.h" | 12 #include "views/controls/button/native_button.h" |
13 #include "views/controls/button/radio_button.h" | 13 #include "views/controls/button/radio_button.h" |
14 #include "views/widget/widget.h" | 14 #include "views/widget/widget.h" |
15 | 15 |
16 namespace views { | 16 namespace views { |
17 | 17 |
18 //////////////////////////////////////////////////////////////////////////////// | 18 //////////////////////////////////////////////////////////////////////////////// |
19 // NativeButtonWin, public: | 19 // NativeButtonWin, public: |
20 | 20 |
21 NativeButtonWin::NativeButtonWin(NativeButton* native_button) | 21 NativeButtonWin::NativeButtonWin(NativeButton* native_button) |
22 : native_button_(native_button) { | 22 : native_button_(native_button), |
| 23 button_size_valid_(false) { |
23 // Associates the actual HWND with the native_button so the native_button is | 24 // Associates the actual HWND with the native_button so the native_button is |
24 // the one considered as having the focus (not the wrapper) when the HWND is | 25 // the one considered as having the focus (not the wrapper) when the HWND is |
25 // focused directly (with a click for example). | 26 // focused directly (with a click for example). |
26 set_focus_view(native_button); | 27 set_focus_view(native_button); |
27 } | 28 } |
28 | 29 |
29 NativeButtonWin::~NativeButtonWin() { | 30 NativeButtonWin::~NativeButtonWin() { |
30 } | 31 } |
31 | 32 |
32 //////////////////////////////////////////////////////////////////////////////// | 33 //////////////////////////////////////////////////////////////////////////////// |
33 // NativeButtonWin, NativeButtonWrapper implementation: | 34 // NativeButtonWin, NativeButtonWrapper implementation: |
34 | 35 |
35 void NativeButtonWin::UpdateLabel() { | 36 void NativeButtonWin::UpdateLabel() { |
36 // Show or hide the shield icon of Windows onto this button every time when we | 37 // Show or hide the shield icon of Windows onto this button every time when we |
37 // update the button text so Windows can lay out the shield icon and the | 38 // update the button text so Windows can lay out the shield icon and the |
38 // button text correctly. | 39 // button text correctly. |
39 if (win_util::GetWinVersion() >= win_util::WINVERSION_VISTA && | 40 if (win_util::GetWinVersion() >= win_util::WINVERSION_VISTA && |
40 win_util::UserAccountControlIsEnabled()) { | 41 win_util::UserAccountControlIsEnabled()) { |
41 Button_SetElevationRequiredState(native_view(), | 42 Button_SetElevationRequiredState(native_view(), |
42 native_button_->need_elevation()); | 43 native_button_->need_elevation()); |
43 } | 44 } |
44 | 45 |
45 SetWindowText(native_view(), native_button_->label().c_str()); | 46 SetWindowText(native_view(), native_button_->label().c_str()); |
| 47 button_size_valid_ = false; |
46 } | 48 } |
47 | 49 |
48 void NativeButtonWin::UpdateFont() { | 50 void NativeButtonWin::UpdateFont() { |
49 SendMessage(native_view(), WM_SETFONT, | 51 SendMessage(native_view(), WM_SETFONT, |
50 reinterpret_cast<WPARAM>(native_button_->font().hfont()), | 52 reinterpret_cast<WPARAM>(native_button_->font().hfont()), |
51 FALSE); | 53 FALSE); |
| 54 button_size_valid_ = false; |
52 } | 55 } |
53 | 56 |
54 void NativeButtonWin::UpdateEnabled() { | 57 void NativeButtonWin::UpdateEnabled() { |
55 SetEnabled(native_button_->IsEnabled()); | 58 SetEnabled(native_button_->IsEnabled()); |
56 } | 59 } |
57 | 60 |
58 void NativeButtonWin::UpdateDefault() { | 61 void NativeButtonWin::UpdateDefault() { |
59 if (!IsCheckbox()) { | 62 if (!IsCheckbox()) { |
60 SendMessage(native_view(), BM_SETSTYLE, | 63 SendMessage(native_view(), BM_SETSTYLE, |
61 native_button_->is_default() ? BS_DEFPUSHBUTTON : BS_PUSHBUTTON, | 64 native_button_->is_default() ? BS_DEFPUSHBUTTON : BS_PUSHBUTTON, |
62 true); | 65 true); |
| 66 button_size_valid_ = false; |
63 } | 67 } |
64 } | 68 } |
65 | 69 |
66 View* NativeButtonWin::GetView() { | 70 View* NativeButtonWin::GetView() { |
67 return this; | 71 return this; |
68 } | 72 } |
69 | 73 |
70 void NativeButtonWin::SetFocus() { | 74 void NativeButtonWin::SetFocus() { |
71 // Focus the associated HWND. | 75 // Focus the associated HWND. |
72 Focus(); | 76 Focus(); |
73 } | 77 } |
74 | 78 |
75 bool NativeButtonWin::UsesNativeLabel() const { | 79 bool NativeButtonWin::UsesNativeLabel() const { |
76 return true; | 80 return true; |
77 } | 81 } |
78 | 82 |
79 bool NativeButtonWin::UsesNativeRadioButtonGroup() const { | 83 bool NativeButtonWin::UsesNativeRadioButtonGroup() const { |
80 return false; | 84 return false; |
81 } | 85 } |
82 | 86 |
83 gfx::NativeView NativeButtonWin::GetTestingHandle() const { | 87 gfx::NativeView NativeButtonWin::GetTestingHandle() const { |
84 return native_view(); | 88 return native_view(); |
85 } | 89 } |
86 | 90 |
87 //////////////////////////////////////////////////////////////////////////////// | 91 //////////////////////////////////////////////////////////////////////////////// |
88 // NativeButtonWin, View overrides: | 92 // NativeButtonWin, View overrides: |
89 | 93 |
90 gfx::Size NativeButtonWin::GetPreferredSize() { | 94 gfx::Size NativeButtonWin::GetPreferredSize() { |
91 SIZE sz = {0}; | 95 if (!button_size_valid_) { |
92 SendMessage(native_view(), BCM_GETIDEALSIZE, 0, reinterpret_cast<LPARAM>(&sz))
; | 96 SIZE sz = {0}; |
93 | 97 Button_GetIdealSize(native_view(), reinterpret_cast<LPARAM>(&sz)); |
94 return gfx::Size(sz.cx, sz.cy); | 98 button_size_.SetSize(sz.cx, sz.cy); |
| 99 button_size_valid_ = true; |
| 100 } |
| 101 return button_size_; |
95 } | 102 } |
96 | 103 |
97 //////////////////////////////////////////////////////////////////////////////// | 104 //////////////////////////////////////////////////////////////////////////////// |
98 // NativeButtonWin, NativeControlWin overrides: | 105 // NativeButtonWin, NativeControlWin overrides: |
99 | 106 |
100 bool NativeButtonWin::ProcessMessage(UINT message, WPARAM w_param, | 107 bool NativeButtonWin::ProcessMessage(UINT message, WPARAM w_param, |
101 LPARAM l_param, LRESULT* result) { | 108 LPARAM l_param, LRESULT* result) { |
102 if (message == WM_COMMAND && HIWORD(w_param) == BN_CLICKED) { | 109 if (message == WM_COMMAND && HIWORD(w_param) == BN_CLICKED) { |
103 native_button_->ButtonPressed(); | 110 native_button_->ButtonPressed(); |
104 *result = 0; | 111 *result = 0; |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 return new NativeCheckboxWin(checkbox); | 255 return new NativeCheckboxWin(checkbox); |
249 } | 256 } |
250 | 257 |
251 // static | 258 // static |
252 NativeButtonWrapper* NativeButtonWrapper::CreateRadioButtonWrapper( | 259 NativeButtonWrapper* NativeButtonWrapper::CreateRadioButtonWrapper( |
253 RadioButton* radio_button) { | 260 RadioButton* radio_button) { |
254 return new NativeRadioButtonWin(radio_button); | 261 return new NativeRadioButtonWin(radio_button); |
255 } | 262 } |
256 | 263 |
257 } // namespace views | 264 } // namespace views |
OLD | NEW |