| 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/menu_button.h" | 5 #include "views/controls/button/menu_button.h" |
| 6 | 6 |
| 7 #include "app/drag_drop_types.h" | 7 #include "app/drag_drop_types.h" |
| 8 #include "app/l10n_util.h" | 8 #include "app/l10n_util.h" |
| 9 #include "app/resource_bundle.h" | 9 #include "app/resource_bundle.h" |
| 10 #include "gfx/canvas.h" | 10 #include "gfx/canvas.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 MenuButton::MenuButton(ButtonListener* listener, | 43 MenuButton::MenuButton(ButtonListener* listener, |
| 44 const std::wstring& text, | 44 const std::wstring& text, |
| 45 ViewMenuDelegate* menu_delegate, | 45 ViewMenuDelegate* menu_delegate, |
| 46 bool show_menu_marker) | 46 bool show_menu_marker) |
| 47 : TextButton(listener, text), | 47 : TextButton(listener, text), |
| 48 menu_visible_(false), | 48 menu_visible_(false), |
| 49 menu_delegate_(menu_delegate), | 49 menu_delegate_(menu_delegate), |
| 50 show_menu_marker_(show_menu_marker), | 50 show_menu_marker_(show_menu_marker), |
| 51 menu_marker_(ResourceBundle::GetSharedInstance().GetBitmapNamed( | 51 menu_marker_(ResourceBundle::GetSharedInstance().GetBitmapNamed( |
| 52 IDR_MENU_DROPARROW)) { | 52 IDR_MENU_DROPARROW)), |
| 53 destroyed_flag_(NULL) { |
| 53 set_alignment(TextButton::ALIGN_LEFT); | 54 set_alignment(TextButton::ALIGN_LEFT); |
| 54 } | 55 } |
| 55 | 56 |
| 56 MenuButton::~MenuButton() { | 57 MenuButton::~MenuButton() { |
| 58 if (destroyed_flag_) |
| 59 *destroyed_flag_ = true; |
| 57 } | 60 } |
| 58 | 61 |
| 59 //////////////////////////////////////////////////////////////////////////////// | 62 //////////////////////////////////////////////////////////////////////////////// |
| 60 // | 63 // |
| 61 // MenuButton - Public APIs | 64 // MenuButton - Public APIs |
| 62 // | 65 // |
| 63 //////////////////////////////////////////////////////////////////////////////// | 66 //////////////////////////////////////////////////////////////////////////////// |
| 64 | 67 |
| 65 gfx::Size MenuButton::GetPreferredSize() { | 68 gfx::Size MenuButton::GetPreferredSize() { |
| 66 gfx::Size prefsize = TextButton::GetPreferredSize(); | 69 gfx::Size prefsize = TextButton::GetPreferredSize(); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 // We're about to show the menu from a mouse press. By showing from the | 141 // We're about to show the menu from a mouse press. By showing from the |
| 139 // mouse press event we block RootView in mouse dispatching. This also | 142 // mouse press event we block RootView in mouse dispatching. This also |
| 140 // appears to cause RootView to get a mouse pressed BEFORE the mouse | 143 // appears to cause RootView to get a mouse pressed BEFORE the mouse |
| 141 // release is seen, which means RootView sends us another mouse press no | 144 // release is seen, which means RootView sends us another mouse press no |
| 142 // matter where the user pressed. To force RootView to recalculate the | 145 // matter where the user pressed. To force RootView to recalculate the |
| 143 // mouse target during the mouse press we explicitly set the mouse handler | 146 // mouse target during the mouse press we explicitly set the mouse handler |
| 144 // to NULL. | 147 // to NULL. |
| 145 GetRootView()->SetMouseHandler(NULL); | 148 GetRootView()->SetMouseHandler(NULL); |
| 146 | 149 |
| 147 menu_visible_ = true; | 150 menu_visible_ = true; |
| 151 |
| 152 bool destroyed = false; |
| 153 destroyed_flag_ = &destroyed; |
| 154 |
| 148 menu_delegate_->RunMenu(this, menu_position); | 155 menu_delegate_->RunMenu(this, menu_position); |
| 156 |
| 157 if (destroyed) { |
| 158 // The menu was deleted while showing. Don't attempt any processing. |
| 159 return false; |
| 160 } |
| 161 |
| 149 menu_visible_ = false; | 162 menu_visible_ = false; |
| 150 menu_closed_time_ = Time::Now(); | 163 menu_closed_time_ = Time::Now(); |
| 151 | 164 |
| 152 // Now that the menu has closed, we need to manually reset state to | 165 // Now that the menu has closed, we need to manually reset state to |
| 153 // "normal" since the menu modal loop will have prevented normal | 166 // "normal" since the menu modal loop will have prevented normal |
| 154 // mouse move messages from getting to this View. We set "normal" | 167 // mouse move messages from getting to this View. We set "normal" |
| 155 // and not "hot" because the likelihood is that the mouse is now | 168 // and not "hot" because the likelihood is that the mouse is now |
| 156 // somewhere else (user clicked elsewhere on screen to close the menu | 169 // somewhere else (user clicked elsewhere on screen to close the menu |
| 157 // or selected an item) and we will inevitably refresh the hot state | 170 // or selected an item) and we will inevitably refresh the hot state |
| 158 // in the event the mouse _is_ over the view. | 171 // in the event the mouse _is_ over the view. |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 | 260 |
| 248 *state = AccessibilityTypes::STATE_HASPOPUP; | 261 *state = AccessibilityTypes::STATE_HASPOPUP; |
| 249 return true; | 262 return true; |
| 250 } | 263 } |
| 251 | 264 |
| 252 std::string MenuButton::GetClassName() const { | 265 std::string MenuButton::GetClassName() const { |
| 253 return kViewClassName; | 266 return kViewClassName; |
| 254 } | 267 } |
| 255 | 268 |
| 256 } // namespace views | 269 } // namespace views |
| OLD | NEW |