Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/views/controls/menu/menu_controller.h" | 5 #include "ui/views/controls/menu/menu_controller.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <windowsx.h> | 8 #include <windowsx.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 100 // Returns true if |menu| doesn't have a mnemonic and first character of the its | 100 // Returns true if |menu| doesn't have a mnemonic and first character of the its |
| 101 // title is |key|. | 101 // title is |key|. |
| 102 bool TitleMatchesMnemonic(MenuItemView* menu, base::char16 key) { | 102 bool TitleMatchesMnemonic(MenuItemView* menu, base::char16 key) { |
| 103 if (menu->GetMnemonic()) | 103 if (menu->GetMnemonic()) |
| 104 return false; | 104 return false; |
| 105 | 105 |
| 106 base::string16 lower_title = base::i18n::ToLower(menu->title()); | 106 base::string16 lower_title = base::i18n::ToLower(menu->title()); |
| 107 return !lower_title.empty() && lower_title[0] == key; | 107 return !lower_title.empty() && lower_title[0] == key; |
| 108 } | 108 } |
| 109 | 109 |
| 110 #if defined(USE_AURA) | |
|
tapted
2014/05/02 00:22:57
I think there will be resistance to this many #ifd
| |
| 110 aura::Window* GetOwnerRootWindow(views::Widget* owner) { | 111 aura::Window* GetOwnerRootWindow(views::Widget* owner) { |
| 111 return owner ? owner->GetNativeWindow()->GetRootWindow() : NULL; | 112 return owner ? owner->GetNativeWindow()->GetRootWindow() : NULL; |
| 112 } | 113 } |
| 113 | 114 |
| 114 // ActivationChangeObserverImpl is used to observe activation changes and close | 115 // ActivationChangeObserverImpl is used to observe activation changes and close |
| 115 // the menu. Additionally it listens for the root window to be destroyed and | 116 // the menu. Additionally it listens for the root window to be destroyed and |
| 116 // cancel the menu as well. | 117 // cancel the menu as well. |
| 117 class ActivationChangeObserverImpl | 118 class ActivationChangeObserverImpl |
| 118 : public aura::client::ActivationChangeObserver, | 119 : public aura::client::ActivationChangeObserver, |
| 119 public aura::WindowObserver, | 120 public aura::WindowObserver, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 160 root_->RemovePreTargetHandler(this); | 161 root_->RemovePreTargetHandler(this); |
| 161 root_->RemoveObserver(this); | 162 root_->RemoveObserver(this); |
| 162 root_ = NULL; | 163 root_ = NULL; |
| 163 } | 164 } |
| 164 | 165 |
| 165 MenuController* controller_; | 166 MenuController* controller_; |
| 166 aura::Window* root_; | 167 aura::Window* root_; |
| 167 | 168 |
| 168 DISALLOW_COPY_AND_ASSIGN(ActivationChangeObserverImpl); | 169 DISALLOW_COPY_AND_ASSIGN(ActivationChangeObserverImpl); |
| 169 }; | 170 }; |
| 171 #endif // USE_AURA | |
| 170 | 172 |
| 171 } // namespace | 173 } // namespace |
| 172 | 174 |
| 173 // Returns the first descendant of |view| that is hot tracked. | 175 // Returns the first descendant of |view| that is hot tracked. |
| 174 static CustomButton* GetFirstHotTrackedView(View* view) { | 176 static CustomButton* GetFirstHotTrackedView(View* view) { |
| 175 if (!view) | 177 if (!view) |
| 176 return NULL; | 178 return NULL; |
| 177 CustomButton* button = CustomButton::AsCustomButton(view); | 179 CustomButton* button = CustomButton::AsCustomButton(view); |
| 178 if (button) { | 180 if (button) { |
| 179 if (button->IsHotTracked()) | 181 if (button->IsHotTracked()) |
| (...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1184 observer.reset(new ActivationChangeObserverImpl(this, root)); | 1186 observer.reset(new ActivationChangeObserverImpl(this, root)); |
| 1185 aura::client::GetDispatcherClient(root) | 1187 aura::client::GetDispatcherClient(root) |
| 1186 ->RunWithDispatcher(&nested_dispatcher); | 1188 ->RunWithDispatcher(&nested_dispatcher); |
| 1187 } else { | 1189 } else { |
| 1188 base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); | 1190 base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); |
| 1189 base::MessageLoop::ScopedNestableTaskAllower allow(loop); | 1191 base::MessageLoop::ScopedNestableTaskAllower allow(loop); |
| 1190 base::RunLoop run_loop(&nested_dispatcher); | 1192 base::RunLoop run_loop(&nested_dispatcher); |
| 1191 run_loop.Run(); | 1193 run_loop.Run(); |
| 1192 } | 1194 } |
| 1193 } | 1195 } |
| 1196 #elif defined(OS_MACOSX) | |
| 1197 void MenuController::RunMessageLoop(bool nested_menu) { | |
| 1198 base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); | |
| 1199 base::MessageLoop::ScopedNestableTaskAllower allow(loop); | |
| 1200 base::RunLoop run_loop; | |
| 1201 run_loop.Run(); | |
| 1202 } | |
| 1194 #else | 1203 #else |
| 1195 void MenuController::RunMessageLoop(bool nested_menu) { | 1204 void MenuController::RunMessageLoop(bool nested_menu) { |
| 1196 internal::MenuEventDispatcher event_dispatcher(this); | 1205 internal::MenuEventDispatcher event_dispatcher(this); |
| 1197 scoped_ptr<ui::ScopedEventDispatcher> old_dispatcher = | 1206 scoped_ptr<ui::ScopedEventDispatcher> old_dispatcher = |
| 1198 nested_dispatcher_.Pass(); | 1207 nested_dispatcher_.Pass(); |
| 1199 if (ui::PlatformEventSource::GetInstance()) { | 1208 if (ui::PlatformEventSource::GetInstance()) { |
| 1200 nested_dispatcher_ = | 1209 nested_dispatcher_ = |
| 1201 ui::PlatformEventSource::GetInstance()->OverrideDispatcher( | 1210 ui::PlatformEventSource::GetInstance()->OverrideDispatcher( |
| 1202 &event_dispatcher); | 1211 &event_dispatcher); |
| 1203 } | 1212 } |
| (...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2222 WPARAM target = client_area ? event.native_event().wParam : nc_hit_result; | 2231 WPARAM target = client_area ? event.native_event().wParam : nc_hit_result; |
| 2223 LPARAM window_coords = MAKELPARAM(window_x, window_y); | 2232 LPARAM window_coords = MAKELPARAM(window_x, window_y); |
| 2224 PostMessage(target_window, event_type, target, window_coords); | 2233 PostMessage(target_window, event_type, target, window_coords); |
| 2225 return; | 2234 return; |
| 2226 } | 2235 } |
| 2227 #endif | 2236 #endif |
| 2228 // Non-Windows Aura or |window| is in metro mode. | 2237 // Non-Windows Aura or |window| is in metro mode. |
| 2229 if (!window) | 2238 if (!window) |
| 2230 return; | 2239 return; |
| 2231 | 2240 |
| 2241 #if defined(USE_AURA) | |
| 2232 aura::Window* root = window->GetRootWindow(); | 2242 aura::Window* root = window->GetRootWindow(); |
| 2233 ScreenPositionClient* spc = aura::client::GetScreenPositionClient(root); | 2243 ScreenPositionClient* spc = aura::client::GetScreenPositionClient(root); |
| 2234 if (!spc) | 2244 if (!spc) |
| 2235 return; | 2245 return; |
| 2236 | 2246 |
| 2237 gfx::Point root_loc(screen_loc); | 2247 gfx::Point root_loc(screen_loc); |
| 2238 spc->ConvertPointFromScreen(root, &root_loc); | 2248 spc->ConvertPointFromScreen(root, &root_loc); |
| 2239 | 2249 |
| 2240 ui::MouseEvent clone(static_cast<const ui::MouseEvent&>(event)); | 2250 ui::MouseEvent clone(static_cast<const ui::MouseEvent&>(event)); |
| 2241 clone.set_location(root_loc); | 2251 clone.set_location(root_loc); |
| 2242 clone.set_root_location(root_loc); | 2252 clone.set_root_location(root_loc); |
| 2243 root->GetHost()->dispatcher()->RepostEvent(clone); | 2253 root->GetHost()->dispatcher()->RepostEvent(clone); |
| 2254 #endif | |
| 2244 } | 2255 } |
| 2245 | 2256 |
| 2246 void MenuController::SetDropMenuItem( | 2257 void MenuController::SetDropMenuItem( |
| 2247 MenuItemView* new_target, | 2258 MenuItemView* new_target, |
| 2248 MenuDelegate::DropPosition new_position) { | 2259 MenuDelegate::DropPosition new_position) { |
| 2249 if (new_target == drop_target_ && new_position == drop_position_) | 2260 if (new_target == drop_target_ && new_position == drop_position_) |
| 2250 return; | 2261 return; |
| 2251 | 2262 |
| 2252 if (drop_target_) { | 2263 if (drop_target_) { |
| 2253 drop_target_->GetParentMenuItem()->GetSubmenu()->SetDropMenuItem( | 2264 drop_target_->GetParentMenuItem()->GetSubmenu()->SetDropMenuItem( |
| (...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2372 // the next native message. We quite the nested message loop as soon as | 2383 // the next native message. We quite the nested message loop as soon as |
| 2373 // possible to avoid having deleted views classes (such as widgets and | 2384 // possible to avoid having deleted views classes (such as widgets and |
| 2374 // rootviews) on the stack when the nested message loop stops. | 2385 // rootviews) on the stack when the nested message loop stops. |
| 2375 // | 2386 // |
| 2376 // It's safe to invoke QuitNestedMessageLoop() multiple times, it only effects | 2387 // It's safe to invoke QuitNestedMessageLoop() multiple times, it only effects |
| 2377 // the current loop. | 2388 // the current loop. |
| 2378 bool quit_now = ShouldQuitNow() && exit_type_ != EXIT_NONE && | 2389 bool quit_now = ShouldQuitNow() && exit_type_ != EXIT_NONE && |
| 2379 message_loop_depth_; | 2390 message_loop_depth_; |
| 2380 | 2391 |
| 2381 if (quit_now) { | 2392 if (quit_now) { |
| 2393 #if defined(USE_AURA) | |
| 2382 if (owner_) { | 2394 if (owner_) { |
| 2383 aura::Window* root = owner_->GetNativeWindow()->GetRootWindow(); | 2395 aura::Window* root = owner_->GetNativeWindow()->GetRootWindow(); |
| 2384 aura::client::GetDispatcherClient(root)->QuitNestedMessageLoop(); | 2396 aura::client::GetDispatcherClient(root)->QuitNestedMessageLoop(); |
| 2385 } else { | 2397 } else { |
| 2386 base::MessageLoop::current()->QuitNow(); | 2398 base::MessageLoop::current()->QuitNow(); |
| 2387 } | 2399 } |
| 2400 #else | |
| 2401 base::MessageLoop::current()->QuitNow(); | |
| 2402 #endif | |
| 2388 // Restore the previous dispatcher. | 2403 // Restore the previous dispatcher. |
| 2389 nested_dispatcher_.reset(); | 2404 nested_dispatcher_.reset(); |
| 2390 } | 2405 } |
| 2391 } | 2406 } |
| 2392 | 2407 |
| 2393 bool MenuController::ShouldQuitNow() const { | 2408 bool MenuController::ShouldQuitNow() const { |
| 2409 #if defined(USE_AURA) | |
| 2394 aura::Window* root = GetOwnerRootWindow(owner_); | 2410 aura::Window* root = GetOwnerRootWindow(owner_); |
| 2395 return !aura::client::GetDragDropClient(root) || | 2411 return !aura::client::GetDragDropClient(root) || |
| 2396 !aura::client::GetDragDropClient(root)->IsDragDropInProgress(); | 2412 !aura::client::GetDragDropClient(root)->IsDragDropInProgress(); |
| 2413 #else | |
| 2414 return true; | |
| 2415 #endif | |
| 2397 } | 2416 } |
| 2398 | 2417 |
| 2399 void MenuController::HandleMouseLocation(SubmenuView* source, | 2418 void MenuController::HandleMouseLocation(SubmenuView* source, |
| 2400 const gfx::Point& mouse_location) { | 2419 const gfx::Point& mouse_location) { |
| 2401 if (showing_submenu_) | 2420 if (showing_submenu_) |
| 2402 return; | 2421 return; |
| 2403 | 2422 |
| 2404 // Ignore mouse events if we're closing the menu. | 2423 // Ignore mouse events if we're closing the menu. |
| 2405 if (exit_type_ != EXIT_NONE) | 2424 if (exit_type_ != EXIT_NONE) |
| 2406 return; | 2425 return; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 2422 (!pending_state_.item->HasSubmenu() || | 2441 (!pending_state_.item->HasSubmenu() || |
| 2423 !pending_state_.item->GetSubmenu()->IsShowing())) { | 2442 !pending_state_.item->GetSubmenu()->IsShowing())) { |
| 2424 // On exit if the user hasn't selected an item with a submenu, move the | 2443 // On exit if the user hasn't selected an item with a submenu, move the |
| 2425 // selection back to the parent menu item. | 2444 // selection back to the parent menu item. |
| 2426 SetSelection(pending_state_.item->GetParentMenuItem(), | 2445 SetSelection(pending_state_.item->GetParentMenuItem(), |
| 2427 SELECTION_OPEN_SUBMENU); | 2446 SELECTION_OPEN_SUBMENU); |
| 2428 } | 2447 } |
| 2429 } | 2448 } |
| 2430 | 2449 |
| 2431 gfx::Screen* MenuController::GetScreen() { | 2450 gfx::Screen* MenuController::GetScreen() { |
| 2432 aura::Window* root = GetOwnerRootWindow(owner_); | 2451 Widget* root = owner_->GetTopLevelWidget(); |
| 2433 return root ? gfx::Screen::GetScreenFor(root) | 2452 return root ? gfx::Screen::GetScreenFor(root->GetNativeView()) |
|
Andre
2014/05/01 22:38:43
I'm not sure about this change (limited experience
tapted
2014/05/02 00:22:57
This looks good! (I think :)
| |
| 2434 : gfx::Screen::GetNativeScreen(); | 2453 : gfx::Screen::GetNativeScreen(); |
| 2435 } | 2454 } |
| 2436 | 2455 |
| 2437 } // namespace views | 2456 } // namespace views |
| OLD | NEW |