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

Unified Diff: chrome/browser/chromeos/status/input_method_menu.cc

Issue 6962012: Convert ChromiumOS input method menu to views::MenuItemView implementation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix comments. Created 9 years, 6 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/status/input_method_menu.cc
diff --git a/chrome/browser/chromeos/status/input_method_menu.cc b/chrome/browser/chromeos/status/input_method_menu.cc
index 7cd861dfcff10c8fc6974c918160e7ab647802e6..793a33d55e3c26f9058a365b52d3938b1a5fb140 100644
--- a/chrome/browser/chromeos/status/input_method_menu.cc
+++ b/chrome/browser/chromeos/status/input_method_menu.cc
@@ -22,7 +22,11 @@
#include "grit/generated_resources.h"
#include "grit/theme_resources.h"
#include "ui/base/l10n/l10n_util.h"
+#include "ui/base/models/simple_menu_model.h"
#include "ui/base/resource/resource_bundle.h"
+#include "views/controls/menu/menu_model_adapter.h"
+#include "views/controls/menu/submenu_view.h"
+#include "views/window/window.h"
// The language menu consists of 3 parts (in this order):
//
@@ -128,11 +132,10 @@ InputMethodMenu::InputMethodMenu(PrefService* pref_service,
: input_method_descriptors_(CrosLibrary::Get()->GetInputMethodLibrary()->
GetActiveInputMethods()),
model_(NULL),
- // Be aware that the constructor of |input_method_menu_| calls
- // GetItemCount() in this class. Therefore, GetItemCount() have to return
- // 0 when |model_| is NULL.
- ALLOW_THIS_IN_INITIALIZER_LIST(input_method_menu_(this)),
+ ALLOW_THIS_IN_INITIALIZER_LIST(input_method_menu_delegate_(
+ new views::MenuModelAdapter(this))),
minimum_input_method_menu_width_(0),
+ menu_alignment_(views::MenuItemView::TOPRIGHT),
pref_service_(pref_service),
screen_mode_(screen_mode),
for_out_of_box_experience_dialog_(for_out_of_box_experience_dialog) {
@@ -367,10 +370,30 @@ void InputMethodMenu::ActivatedAt(int index) {
////////////////////////////////////////////////////////////////////////////////
// views::ViewMenuDelegate implementation:
-void InputMethodMenu::RunMenu(
- views::View* unused_source, const gfx::Point& pt) {
+void InputMethodMenu::RunMenu(views::View* source, const gfx::Point& pt) {
PrepareForMenuOpen();
- input_method_menu_.RunMenuAt(pt, views::Menu2::ALIGN_TOPRIGHT);
+
+ views::MenuItemView menu(input_method_menu_delegate_.get());
+ input_method_menu_delegate_->BuildMenu(&menu);
+ if (minimum_input_method_menu_width_ > 0) {
+ DCHECK(menu.HasSubmenu());
+ views::SubmenuView* submenu = menu.GetSubmenu();
+ submenu->set_minimum_preferred_width(minimum_input_method_menu_width_);
+ }
+
+ // TODO(rhashimoto): Remove this workaround when WebUI provides a
+ // top-level widget on the ChromeOS login screen that is a window.
+ // The current BackgroundView class for the ChromeOS login screen
+ // creates a owning Widget that has a native GtkWindow but is not a
+ // Window. This makes it impossible to get the NativeWindow via
+ // the views API. This workaround casts the top-level NativeWidget
+ // to a NativeWindow that we can pass to MenuItemView::RunMenuAt().
+ gfx::NativeWindow window = GTK_WINDOW(source->GetWidget()->GetNativeView());
+
+ menu.RunMenuAt(window, NULL,
+ gfx::Rect(pt, gfx::Size(0, 0)),
+ menu_alignment_,
+ true);
}
////////////////////////////////////////////////////////////////////////////////
@@ -452,17 +475,13 @@ void InputMethodMenu::FirstObserverIsAdded(InputMethodLibrary* obj) {
void InputMethodMenu::PrepareForMenuOpen() {
UserMetrics::RecordAction(UserMetricsAction("LanguageMenuButton_Open"));
- PrepareMenu();
+ PrepareMenuModel();
}
-void InputMethodMenu::PrepareMenu() {
+void InputMethodMenu::PrepareMenuModel() {
input_method_descriptors_.reset(CrosLibrary::Get()->GetInputMethodLibrary()->
GetActiveInputMethods());
RebuildModel();
- input_method_menu_.Rebuild();
- if (minimum_input_method_menu_width_ > 0) {
- input_method_menu_.SetMinimumWidth(minimum_input_method_menu_width_);
- }
}
void InputMethodMenu::ActiveInputMethodsChanged(
@@ -520,6 +539,9 @@ void InputMethodMenu::RebuildModel() {
model_->AddRadioItem(COMMAND_ID_CUSTOMIZE_LANGUAGE, dummy_label,
0 /* dummy */);
}
+
+ // Wrap new model with views::MenuDelegate interface.
+ input_method_menu_delegate_.reset(new views::MenuModelAdapter(this));
}
bool InputMethodMenu::IndexIsInInputMethodList(int index) const {
« no previous file with comments | « chrome/browser/chromeos/status/input_method_menu.h ('k') | chrome/browser/chromeos/status/input_method_menu_button.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698