Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(606)

Unified Diff: chrome/browser/chromeos/views/native_menu_webui.cc

Issue 6693032: Remove WebUI menu (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: " Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
« no previous file with comments | « chrome/browser/chromeos/views/native_menu_webui.h ('k') | chrome/browser/chromeos/views/webui_menu_widget.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698