Index: chrome/browser/chromeos/views/native_menu_webui.cc |
diff --git a/chrome/browser/chromeos/views/native_menu_webui.cc b/chrome/browser/chromeos/views/native_menu_webui.cc |
deleted file mode 100644 |
index 1bcd5feafaa5772680bbc66c853f14502c218599..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/views/native_menu_webui.cc |
+++ /dev/null |
@@ -1,401 +0,0 @@ |
-// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "chrome/browser/chromeos/views/native_menu_webui.h" |
- |
-#include <string> |
- |
-#include "base/message_loop.h" |
-#include "base/string_util.h" |
-#include "chrome/browser/chromeos/views/menu_locator.h" |
-#include "chrome/browser/chromeos/views/webui_menu_widget.h" |
-#include "chrome/browser/chromeos/webui/menu_ui.h" |
-#include "chrome/browser/profiles/profile_manager.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_list.h" |
-#include "chrome/browser/ui/browser_window.h" |
-#include "chrome/common/url_constants.h" |
-#include "ui/base/models/menu_model.h" |
-#include "ui/gfx/rect.h" |
-#include "views/controls/menu/menu_2.h" |
-#include "views/controls/menu/nested_dispatcher_gtk.h" |
- |
-#if defined(TOUCH_UI) |
-#include "views/focus/accelerator_handler.h" |
-#include "views/controls/menu/native_menu_x.h" |
-#else |
-#include "views/controls/menu/native_menu_gtk.h" |
-#endif |
- |
-namespace { |
- |
-using chromeos::NativeMenuWebUI; |
-using chromeos::WebUIMenuWidget; |
- |
-// Returns true if the menu item type specified can be executed as a command. |
-bool MenuTypeCanExecute(ui::MenuModel::ItemType type) { |
- return type == ui::MenuModel::TYPE_COMMAND || |
- type == ui::MenuModel::TYPE_CHECK || |
- type == ui::MenuModel::TYPE_RADIO; |
-} |
- |
-gboolean Destroy(GtkWidget* widget, gpointer data) { |
- WebUIMenuWidget* menu_widget = static_cast<WebUIMenuWidget*>(data); |
- NativeMenuWebUI* webui_menu = menu_widget->webui_menu(); |
- // webui_menu can be NULL if widget is destroyed by signal. |
- if (webui_menu) |
- webui_menu->Hide(); |
- return true; |
-} |
- |
-// Returns the active toplevel window. |
-gfx::NativeWindow FindActiveToplevelWindow() { |
- GList* toplevels = gtk_window_list_toplevels(); |
- while (toplevels) { |
- gfx::NativeWindow window = static_cast<gfx::NativeWindow>(toplevels->data); |
- if (gtk_window_is_active(window)) { |
- return window; |
- } |
- toplevels = g_list_next(toplevels); |
- } |
- return NULL; |
-} |
- |
-// Currently opened menu. See RunMenuAt for reason why we need this. |
-NativeMenuWebUI* current_ = NULL; |
- |
-} // namespace |
- |
-namespace chromeos { |
- |
-// static |
-void NativeMenuWebUI::SetMenuURL(views::Menu2* menu2, const GURL& url) { |
- // No-op if WebUI menu is disabled. |
- if (!MenuUI::IsEnabled()) |
- return; |
- |
- gfx::NativeView native = menu2->GetNativeMenu(); |
- DCHECK(native); |
- WebUIMenuWidget* widget = WebUIMenuWidget::FindWebUIMenuWidget(native); |
- DCHECK(widget); |
- widget->webui_menu()->set_menu_url(url); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeMenuWebUI, public: |
- |
-NativeMenuWebUI::NativeMenuWebUI(ui::MenuModel* menu_model, bool root) |
- : parent_(NULL), |
- submenu_(NULL), |
- model_(menu_model), |
- menu_widget_(NULL), |
- menu_shown_(false), |
- activated_menu_(NULL), |
- activated_index_(-1), |
- menu_action_(MENU_ACTION_NONE), |
- menu_url_(StringPrintf("chrome://%s", chrome::kChromeUIMenu)), |
- on_menu_opened_called_(false), |
- nested_dispatcher_(NULL) { |
- menu_widget_ = new WebUIMenuWidget(this, root); |
- // Set the initial location off the screen not to show small |
- // window with dropshadow. |
- menu_widget_->Init(NULL, gfx::Rect(-10000, -10000, 1, 1)); |
-} |
- |
-NativeMenuWebUI::~NativeMenuWebUI() { |
- if (nested_dispatcher_) { |
- // Menu is destroyed while its in message loop. |
- // Let nested dispatcher know the creator is deleted. |
- nested_dispatcher_->CreatorDestroyed(); |
- Hide(); |
- } |
- if (menu_widget_) { |
- menu_widget_->Close(); |
- menu_widget_ = NULL; |
- } |
- parent_ = NULL; |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeMenuWebUI, MenuWrapper implementation: |
- |
-void NativeMenuWebUI::RunMenuAt(const gfx::Point& point, int alignment) { |
- if (current_ != NULL) { |
- // This happens when there is a nested task to show menu, which is |
- // executed after menu is open. Since we need to enable nested task, |
- // this condition has to be handled here. |
- return; |
- } |
- current_ = this; |
- bool context = false; |
- |
- // TODO(oshima): This is quick hack to check if it's context menu. (in rtl) |
- // Fix this once we migrated. |
- if (alignment == views::Menu2::ALIGN_TOPLEFT) { |
- context = true; |
- } |
- |
- activated_menu_ = NULL; |
- activated_index_ = -1; |
- menu_action_ = MENU_ACTION_NONE; |
- |
- MenuLocator* locator = context ? |
- MenuLocator::CreateContextMenuLocator(point) : |
- MenuLocator::CreateDropDownMenuLocator(point); |
- ShowAt(locator); |
- DCHECK(!menu_shown_); |
- menu_shown_ = true; |
- on_menu_opened_called_ = false; |
- |
- // TODO(oshima): A menu must be deleted when parent window is |
- // closed. Menu2 doesn't know about the parent window, however, so |
- // we're using toplevel gtkwindow. This is probably sufficient, but |
- // I will update Menu2 to pass host view (which is necessary anyway |
- // to get the right position) and get a parent widnow through |
- // it. http://crosbug/7642 |
- gfx::NativeWindow parent = FindActiveToplevelWindow(); |
- gulong handle = 0; |
- if (parent) { |
- handle = g_signal_connect(G_OBJECT(parent), "destroy", |
- G_CALLBACK(&Destroy), |
- menu_widget_); |
- } |
- // We need to turn on nestable tasks as a renderer uses tasks internally. |
- // Without this, renderer cannnot finish loading page. |
- nested_dispatcher_ = |
- new views::NestedDispatcherGtk(this, true /* allow nested */); |
- bool deleted = nested_dispatcher_->RunAndSelfDestruct(); |
- current_ = NULL; // this is static and safe to access. |
- if (deleted) { |
- // The menu was destryed while menu is shown, so return immediately. |
- // Don't touch the instance which is already deleted. |
- return; |
- } |
- nested_dispatcher_ = NULL; |
- if (menu_shown_) { |
- // If this happens it means we haven't yet gotten the hide signal and |
- // someone else quit the message loop on us. |
- NOTREACHED(); |
- menu_shown_ = false; |
- } |
- if (handle) |
- g_signal_handler_disconnect(G_OBJECT(parent), handle); |
- |
- menu_widget_->Hide(); |
- // Close All submenus. |
- submenu_.reset(); |
- ProcessActivate(); |
-} |
- |
-void NativeMenuWebUI::CancelMenu() { |
- Hide(); |
-} |
- |
-void NativeMenuWebUI::Rebuild() { |
- activated_menu_ = NULL; |
- menu_widget_->ExecuteJavascript(L"modelUpdated()"); |
-} |
- |
-void NativeMenuWebUI::UpdateStates() { |
- // Update menu contnets and submenus. |
- Rebuild(); |
-} |
- |
-gfx::NativeMenu NativeMenuWebUI::GetNativeMenu() const { |
- return menu_widget_->GetNativeView(); |
-} |
- |
-NativeMenuWebUI::MenuAction NativeMenuWebUI::GetMenuAction() const { |
- return menu_action_; |
-} |
- |
-void NativeMenuWebUI::AddMenuListener(views::MenuListener* listener) { |
- listeners_.AddObserver(listener); |
-} |
- |
-void NativeMenuWebUI::RemoveMenuListener(views::MenuListener* listener) { |
- listeners_.RemoveObserver(listener); |
-} |
- |
-void NativeMenuWebUI::SetMinimumWidth(int width) { |
- gtk_widget_set_size_request(menu_widget_->GetNativeView(), width, 1); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeMenuWebUI, MessageLoopForUI::Dispatcher implementation: |
- |
-bool NativeMenuWebUI::Dispatch(GdkEvent* event) { |
- switch (event->type) { |
- case GDK_MOTION_NOTIFY: { |
- NativeMenuWebUI* target = FindMenuAt( |
- gfx::Point(event->motion.x_root, event->motion.y_root)); |
- if (target) |
- target->menu_widget_->EnableInput(false); |
- break; |
- } |
- case GDK_BUTTON_PRESS: { |
- NativeMenuWebUI* target = FindMenuAt( |
- gfx::Point(event->motion.x_root, event->motion.y_root)); |
- if (!target) { |
- Hide(); |
- return true; |
- } |
- break; |
- } |
- default: |
- break; |
- } |
- gtk_main_do_event(event); |
- return true; |
-} |
- |
-#if defined(TOUCH_UI) |
-base::MessagePumpGlibXDispatcher::DispatchStatus |
- NativeMenuWebUI::DispatchX(XEvent* xevent) { |
- return views::DispatchXEvent(xevent) ? |
- base::MessagePumpGlibXDispatcher::EVENT_PROCESSED : |
- base::MessagePumpGlibXDispatcher::EVENT_IGNORED; |
- |
-} |
-#endif |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeMenuWebUI, MenuControl implementation: |
- |
-void NativeMenuWebUI::Activate(ui::MenuModel* model, |
- int index, |
- ActivationMode activation) { |
- NativeMenuWebUI* root = GetRoot(); |
- if (root) { |
- if (activation == CLOSE_AND_ACTIVATE) { |
- root->activated_menu_ = model; |
- root->activated_index_ = index; |
- root->menu_action_ = MENU_ACTION_SELECTED; |
- root->Hide(); |
- } else { |
- if (model->IsEnabledAt(index) && |
- MenuTypeCanExecute(model->GetTypeAt(index))) { |
- model->ActivatedAt(index); |
- } |
- } |
- } |
-} |
- |
-void NativeMenuWebUI::OpenSubmenu(int index, int y) { |
- submenu_.reset(); |
- // Returns the model for the submenu at the specified index. |
- ui::MenuModel* submenu = model_->GetSubmenuModelAt(index); |
- submenu_.reset(new chromeos::NativeMenuWebUI(submenu, false)); |
- submenu_->set_menu_url(menu_url_); |
- // y in menu_widget_ coordinate. |
- submenu_->set_parent(this); |
- submenu_->ShowAt( |
- MenuLocator::CreateSubMenuLocator( |
- menu_widget_, |
- menu_widget_->menu_locator()->GetSubmenuDirection(), |
- y)); |
-} |
- |
-void NativeMenuWebUI::CloseAll() { |
- NativeMenuWebUI* root = GetRoot(); |
- // root can be null if the submenu is detached from parent. |
- if (root) |
- root->Hide(); |
-} |
- |
-void NativeMenuWebUI::CloseSubmenu() { |
- submenu_.reset(); // This closes subsequent children. |
-} |
- |
-void NativeMenuWebUI::MoveInputToSubmenu() { |
- if (submenu_.get()) { |
- submenu_->menu_widget_->EnableInput(true); |
- } |
-} |
- |
-void NativeMenuWebUI::MoveInputToParent() { |
- if (parent_) { |
- parent_->menu_widget_->EnableInput(true); |
- } |
-} |
- |
-void NativeMenuWebUI::OnLoad() { |
- // TODO(oshima): OnLoad is no longer used, but kept in case |
- // we may need it. Delete this if this is not necessary to |
- // implement wrench/network/bookmark menus. |
-} |
- |
-void NativeMenuWebUI::SetSize(const gfx::Size& size) { |
- menu_widget_->SetSize(size); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeMenuWebUI, public: |
- |
-void NativeMenuWebUI::Hide() { |
- // Only root can hide and exit the message loop. |
- DCHECK(menu_widget_->is_root()); |
- DCHECK(!parent_); |
- if (!menu_shown_) { |
- // The menu has been already hidden by us and we're in the process of |
- // quiting the message loop.. |
- return; |
- } |
- CloseSubmenu(); |
- menu_shown_ = false; |
- MessageLoop::current()->Quit(); |
-} |
- |
-NativeMenuWebUI* NativeMenuWebUI::GetRoot() { |
- NativeMenuWebUI* ancestor = this; |
- while (ancestor->parent_) |
- ancestor = ancestor->parent_; |
- if (ancestor->menu_widget_->is_root()) |
- return ancestor; |
- else |
- return NULL; |
-} |
- |
-Profile* NativeMenuWebUI::GetProfile() { |
- Browser* browser = BrowserList::GetLastActive(); |
- // browser can be null in login screen. |
- if (!browser) |
- return ProfileManager::GetDefaultProfile(); |
- return browser->GetProfile(); |
-} |
- |
-void NativeMenuWebUI::InputIsReady() { |
- if (!on_menu_opened_called_) { |
- on_menu_opened_called_ = true; |
- FOR_EACH_OBSERVER(views::MenuListener, listeners_, OnMenuOpened()); |
- } |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// NativeMenuWebUI, private: |
- |
-void NativeMenuWebUI::ProcessActivate() { |
- if (activated_menu_ && |
- activated_menu_->IsEnabledAt(activated_index_) && |
- MenuTypeCanExecute(activated_menu_->GetTypeAt(activated_index_))) { |
- activated_menu_->ActivatedAt(activated_index_); |
- } |
-} |
- |
-void NativeMenuWebUI::ShowAt(MenuLocator* locator) { |
- model_->MenuWillShow(); |
- menu_widget_->ShowAt(locator); |
-} |
- |
-NativeMenuWebUI* NativeMenuWebUI::FindMenuAt(const gfx::Point& point) { |
- if (submenu_.get()) { |
- NativeMenuWebUI* found = submenu_->FindMenuAt(point); |
- if (found) |
- return found; |
- } |
- gfx::Rect bounds = menu_widget_->GetClientAreaScreenBounds(); |
- return bounds.Contains(point) ? this : NULL; |
-} |
- |
-} // namespace chromeos |