Index: ui/message_center/views/notifier_settings_view.cc |
diff --git a/ui/message_center/views/notifier_settings_view.cc b/ui/message_center/views/notifier_settings_view.cc |
index 5673070fbe2edfabe0a2ae4719ab74ea8479cdeb..b97bc841b5e831222be541987a1d9781ed6c4acb 100644 |
--- a/ui/message_center/views/notifier_settings_view.cc |
+++ b/ui/message_center/views/notifier_settings_view.cc |
@@ -8,14 +8,18 @@ |
#include <string> |
#include "base/strings/string16.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "grit/ui_resources.h" |
#include "grit/ui_strings.h" |
+#include "skia/ext/image_operations.h" |
#include "third_party/skia/include/core/SkColor.h" |
#include "ui/base/keycodes/keyboard_codes.h" |
#include "ui/base/l10n/l10n_util.h" |
+#include "ui/base/models/simple_menu_model.h" |
#include "ui/base/resource/resource_bundle.h" |
#include "ui/gfx/canvas.h" |
#include "ui/gfx/image/image.h" |
+#include "ui/gfx/image/image_skia_operations.h" |
#include "ui/gfx/size.h" |
#include "ui/message_center/message_center_style.h" |
#include "ui/message_center/views/message_center_view.h" |
@@ -23,8 +27,10 @@ |
#include "ui/views/border.h" |
#include "ui/views/controls/button/checkbox.h" |
#include "ui/views/controls/button/custom_button.h" |
+#include "ui/views/controls/button/menu_button.h" |
#include "ui/views/controls/image_view.h" |
#include "ui/views/controls/label.h" |
+#include "ui/views/controls/menu/menu_runner.h" |
#include "ui/views/controls/scroll_view.h" |
#include "ui/views/controls/scrollbar/overlay_scroll_bar.h" |
#include "ui/views/layout/box_layout.h" |
@@ -114,6 +120,78 @@ bool EntryView::OnKeyReleased(const ui::KeyEvent& event) { |
} // namespace |
+// NotifierGroupMenuModel ////////////////////////////////////////////////////// |
+//////////////////////////////////////////////////////////////////////////////// |
+class NotifierGroupMenuModel : public ui::SimpleMenuModel, |
+ public ui::SimpleMenuModel::Delegate { |
+ public: |
+ NotifierGroupMenuModel(NotifierSettingsProvider* notifier_settings_provider); |
+ virtual ~NotifierGroupMenuModel(); |
+ |
+ // Overridden from ui::SimpleMenuModel::Delegate: |
+ virtual bool IsCommandIdChecked(int command_id) const OVERRIDE; |
+ virtual bool IsCommandIdEnabled(int command_id) const OVERRIDE; |
+ virtual bool GetAcceleratorForCommandId( |
+ int command_id, |
+ ui::Accelerator* accelerator) OVERRIDE; |
+ virtual void ExecuteCommand(int command_id, int event_flags) OVERRIDE; |
+ |
+ private: |
+ NotifierSettingsProvider* notifier_settings_provider_; |
+}; |
+ |
+NotifierGroupMenuModel::NotifierGroupMenuModel( |
+ NotifierSettingsProvider* notifier_settings_provider) |
+ : ui::SimpleMenuModel(this), |
+ notifier_settings_provider_(notifier_settings_provider) { |
+ if (!notifier_settings_provider_) |
+ return; |
+ |
+ size_t num_menu_items = notifier_settings_provider_->GetNotifierGroupCount(); |
+ for (size_t i = 0; i < num_menu_items; ++i) { |
+ const NotifierGroup& group = |
+ notifier_settings_provider_->GetNotifierGroupAt(i); |
+ |
+ AddItem(i, group.login_info.empty() ? group.name : group.login_info); |
+ |
+ gfx::ImageSkia resized_icon = gfx::ImageSkiaOperations::CreateResizedImage( |
+ *group.icon.ToImageSkia(), |
+ skia::ImageOperations::RESIZE_BETTER, |
+ gfx::Size(kSettingsIconSize, kSettingsIconSize)); |
+ |
+ SetIcon(i, gfx::Image(resized_icon)); |
+ } |
+} |
+ |
+NotifierGroupMenuModel::~NotifierGroupMenuModel() {} |
+ |
+bool NotifierGroupMenuModel::IsCommandIdChecked(int command_id) const { |
+ return false; |
+} |
+ |
+bool NotifierGroupMenuModel::IsCommandIdEnabled(int command_id) const { |
+ return true; |
+} |
+ |
+bool NotifierGroupMenuModel::GetAcceleratorForCommandId( |
+ int command_id, |
+ ui::Accelerator* accelerator) { |
+ return false; |
+} |
+ |
+void NotifierGroupMenuModel::ExecuteCommand(int command_id, int event_flags) { |
+ if (!notifier_settings_provider_) |
+ return; |
+ |
+ size_t notifier_group_index = static_cast<size_t>(command_id); |
+ size_t num_notifier_groups = |
+ notifier_settings_provider_->GetNotifierGroupCount(); |
+ if (notifier_group_index >= num_notifier_groups) |
+ return; |
+ |
+ notifier_settings_provider_->SwitchToNotifierGroup(notifier_group_index); |
+} |
+ |
// We do not use views::Checkbox class directly because it doesn't support |
// showing 'icon'. |
class NotifierSettingsView::NotifierButton : public views::CustomButton, |
@@ -240,30 +318,11 @@ NotifierSettingsView::NotifierSettingsView(NotifierSettingsProvider* provider) |
scroller_->SetVerticalScrollBar(new views::OverlayScrollBar(false)); |
AddChildView(scroller_); |
- views::View* contents_view = new views::View(); |
- contents_view->SetLayoutManager(new views::BoxLayout( |
- views::BoxLayout::kVertical, 0, 0, 0)); |
- |
- views::Label* top_label = new views::Label(l10n_util::GetStringUTF16( |
- IDS_MESSAGE_CENTER_SETTINGS_DIALOG_DESCRIPTION)); |
- top_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
- top_label->SetMultiLine(true); |
- top_label->SizeToFit(kMinimumWindowWidth - kMarginWidth * 2); |
- contents_view->AddChildView(new EntryView(top_label)); |
- |
std::vector<Notifier*> notifiers; |
if (provider_) |
provider_->GetNotifierList(¬ifiers); |
- for (size_t i = 0; i < notifiers.size(); ++i) { |
- NotifierButton* button = new NotifierButton(notifiers[i], this); |
- EntryView* entry = new EntryView(button); |
- entry->set_focusable(true); |
- contents_view->AddChildView(entry); |
- buttons_.insert(button); |
- } |
- scroller_->SetContents(contents_view); |
- contents_view->SetBoundsRect(gfx::Rect(contents_view->GetPreferredSize())); |
+ UpdateContentsView(notifiers); |
} |
NotifierSettingsView::~NotifierSettingsView() { |
@@ -287,6 +346,57 @@ void NotifierSettingsView::UpdateIconImage(const NotifierId& notifier_id, |
} |
} |
+void NotifierSettingsView::NotifierGroupChanged() { |
+ std::vector<Notifier*> notifiers; |
+ if (provider_) |
+ provider_->GetNotifierList(¬ifiers); |
+ |
+ UpdateContentsView(notifiers); |
+} |
+ |
+void NotifierSettingsView::UpdateContentsView( |
+ const std::vector<Notifier*>& notifiers) { |
+ buttons_.clear(); |
+ |
+ views::View* contents_view = new views::View(); |
+ contents_view->SetLayoutManager( |
+ new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 0)); |
+ |
+ views::View* contents_title_view = new views::View(); |
+ contents_title_view->SetLayoutManager( |
+ new views::BoxLayout(views::BoxLayout::kVertical, 0, 0, 5)); |
+ views::Label* top_label = new views::Label(l10n_util::GetStringUTF16( |
+ IDS_MESSAGE_CENTER_SETTINGS_DIALOG_DESCRIPTION)); |
+ top_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
+ top_label->SetMultiLine(true); |
+ contents_title_view->AddChildView(top_label); |
+ |
+ string16 notifier_group_text; |
+ if (provider_) { |
+ const NotifierGroup& active_group = provider_->GetActiveNotifierGroup(); |
+ notifier_group_text = active_group.login_info.empty() |
+ ? active_group.name |
+ : active_group.login_info; |
+ } |
+ |
+ views::View* notifier_group_selector = |
+ new views::MenuButton(NULL, notifier_group_text, this, true); |
+ contents_title_view->AddChildView(notifier_group_selector); |
+ contents_view->AddChildView(new EntryView(contents_title_view)); |
+ |
+ for (size_t i = 0; i < notifiers.size(); ++i) { |
+ NotifierButton* button = new NotifierButton(notifiers[i], this); |
+ EntryView* entry = new EntryView(button); |
+ entry->set_focusable(true); |
+ contents_view->AddChildView(entry); |
+ buttons_.insert(button); |
+ } |
+ scroller_->SetContents(contents_view); |
+ |
+ contents_view->SetBoundsRect(gfx::Rect(contents_view->GetPreferredSize())); |
+ InvalidateLayout(); |
+} |
+ |
void NotifierSettingsView::Layout() { |
int title_height = title_entry_->GetHeightForWidth(width()); |
title_entry_->SetBounds(0, 0, width(), title_height); |
@@ -343,11 +453,30 @@ void NotifierSettingsView::ButtonPressed(views::Button* sender, |
std::set<NotifierButton*>::iterator iter = buttons_.find( |
static_cast<NotifierButton*>(sender)); |
- DCHECK(iter != buttons_.end()); |
+ |
+ if (iter == buttons_.end()) |
+ return; |
(*iter)->SetChecked(!(*iter)->checked()); |
if (provider_) |
provider_->SetNotifierEnabled((*iter)->notifier(), (*iter)->checked()); |
} |
+void NotifierSettingsView::OnMenuButtonClicked(views::View* source, |
+ const gfx::Point& point) { |
+ notifier_group_menu_model_.reset(new NotifierGroupMenuModel(provider_)); |
+ notifier_group_menu_runner_.reset( |
+ new views::MenuRunner(notifier_group_menu_model_.get())); |
+ if (views::MenuRunner::MENU_DELETED == |
+ notifier_group_menu_runner_->RunMenuAt(GetWidget(), |
+ NULL, |
+ source->GetBoundsInScreen(), |
+ views::MenuItemView::BUBBLE_ABOVE, |
+ ui::MENU_SOURCE_MOUSE, |
+ views::MenuRunner::CONTEXT_MENU)) |
+ return; |
+ MessageCenterView* center_view = static_cast<MessageCenterView*>(parent()); |
+ center_view->OnSettingsChanged(); |
+} |
+ |
} // namespace message_center |