| // Copyright 2013 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 "ui/message_center/views/message_center_button_bar.h" |
| |
| #include "base/macros.h" |
| #include "build/build_config.h" |
| #include "ui/base/models/simple_menu_model.h" |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/text_constants.h" |
| #include "ui/message_center/message_center.h" |
| #include "ui/message_center/message_center_style.h" |
| #include "ui/message_center/message_center_tray.h" |
| #include "ui/message_center/notifier_settings.h" |
| #include "ui/message_center/views/message_center_view.h" |
| #include "ui/resources/grit/ui_resources.h" |
| #include "ui/strings/grit/ui_strings.h" |
| #include "ui/views/controls/button/button.h" |
| #include "ui/views/controls/button/image_button.h" |
| #include "ui/views/controls/button/label_button.h" |
| #include "ui/views/controls/button/menu_button.h" |
| #include "ui/views/controls/button/menu_button_listener.h" |
| #include "ui/views/controls/label.h" |
| #include "ui/views/controls/menu/menu_runner.h" |
| #include "ui/views/layout/box_layout.h" |
| #include "ui/views/layout/grid_layout.h" |
| #include "ui/views/painter.h" |
| |
| namespace message_center { |
| |
| namespace { |
| const int kButtonSize = 40; |
| const int kLeftPaddingWidthForNonArrows = 16; |
| const int kFooterTopMargin = 6; |
| const int kFooterBottomMargin = 3; |
| const int kFooterLeftMargin = 4; |
| const int kFooterRightMargin = 14; |
| } // namespace |
| |
| // NotificationCenterButton //////////////////////////////////////////////////// |
| //////////////////////////////////////////////////////////////////////////////// |
| class NotificationCenterButton : public views::ToggleImageButton { |
| public: |
| NotificationCenterButton(views::ButtonListener* listener, |
| int normal_id, |
| int hover_id, |
| int pressed_id, |
| int text_id); |
| void set_size(gfx::Size size) { size_ = size; } |
| |
| protected: |
| // Overridden from views::View: |
| gfx::Size GetPreferredSize() const override; |
| |
| private: |
| gfx::Size size_; |
| |
| DISALLOW_COPY_AND_ASSIGN(NotificationCenterButton); |
| }; |
| |
| NotificationCenterButton::NotificationCenterButton( |
| views::ButtonListener* listener, |
| int normal_id, |
| int hover_id, |
| int pressed_id, |
| int text_id) |
| : views::ToggleImageButton(listener), size_(kButtonSize, kButtonSize) { |
| ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance(); |
| SetImage(STATE_NORMAL, *resource_bundle.GetImageSkiaNamed(normal_id)); |
| SetImage(STATE_HOVERED, *resource_bundle.GetImageSkiaNamed(hover_id)); |
| SetImage(STATE_PRESSED, *resource_bundle.GetImageSkiaNamed(pressed_id)); |
| SetImageAlignment(views::ImageButton::ALIGN_CENTER, |
| views::ImageButton::ALIGN_MIDDLE); |
| if (text_id) |
| SetTooltipText(resource_bundle.GetLocalizedString(text_id)); |
| |
| SetFocusForPlatform(); |
| |
| SetFocusPainter(views::Painter::CreateSolidFocusPainter( |
| kFocusBorderColor, |
| gfx::Insets(1, 2, 2, 2))); |
| } |
| |
| gfx::Size NotificationCenterButton::GetPreferredSize() const { return size_; } |
| |
| // MessageCenterButtonBar ///////////////////////////////////////////////////// |
| /////////////////////////////////////////////////////////////////////////////// |
| MessageCenterButtonBar::MessageCenterButtonBar( |
| MessageCenterView* message_center_view, |
| MessageCenter* message_center, |
| NotifierSettingsProvider* notifier_settings_provider, |
| bool settings_initially_visible, |
| const base::string16& title) |
| : message_center_view_(message_center_view), |
| message_center_(message_center), |
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| close_bubble_button_(NULL), |
| #endif |
| title_arrow_(NULL), |
| notification_label_(NULL), |
| button_container_(NULL), |
| close_all_button_(NULL), |
| settings_button_(NULL), |
| quiet_mode_button_(NULL) { |
| SetPaintToLayer(); |
| set_background( |
| views::Background::CreateSolidBackground(kMessageCenterBackgroundColor)); |
| |
| ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance(); |
| |
| title_arrow_ = new NotificationCenterButton(this, |
| IDR_NOTIFICATION_ARROW, |
| IDR_NOTIFICATION_ARROW_HOVER, |
| IDR_NOTIFICATION_ARROW_PRESSED, |
| 0); |
| title_arrow_->set_size(gfx::Size(kButtonSize, kButtonSize)); |
| |
| // Keyboardists can use the gear button to switch modes. |
| title_arrow_->SetFocusBehavior(FocusBehavior::NEVER); |
| AddChildView(title_arrow_); |
| |
| notification_label_ = new views::Label(title); |
| notification_label_->SetAutoColorReadabilityEnabled(false); |
| notification_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); |
| notification_label_->SetEnabledColor(kRegularTextColor); |
| AddChildView(notification_label_); |
| |
| button_container_ = new views::View; |
| button_container_->SetLayoutManager( |
| new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); |
| quiet_mode_button_ = new NotificationCenterButton( |
| this, |
| IDR_NOTIFICATION_DO_NOT_DISTURB, |
| IDR_NOTIFICATION_DO_NOT_DISTURB_HOVER, |
| IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED, |
| IDS_MESSAGE_CENTER_QUIET_MODE_BUTTON_TOOLTIP); |
| quiet_mode_button_->SetToggledImage( |
| views::Button::STATE_NORMAL, |
| resource_bundle.GetImageSkiaNamed( |
| IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED)); |
| quiet_mode_button_->SetToggledImage( |
| views::Button::STATE_HOVERED, |
| resource_bundle.GetImageSkiaNamed( |
| IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED)); |
| quiet_mode_button_->SetToggledImage( |
| views::Button::STATE_PRESSED, |
| resource_bundle.GetImageSkiaNamed( |
| IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED)); |
| quiet_mode_button_->SetToggled(message_center->IsQuietMode()); |
| button_container_->AddChildView(quiet_mode_button_); |
| |
| close_all_button_ = |
| new NotificationCenterButton(this, |
| IDR_NOTIFICATION_CLEAR_ALL, |
| IDR_NOTIFICATION_CLEAR_ALL_HOVER, |
| IDR_NOTIFICATION_CLEAR_ALL_PRESSED, |
| IDS_MESSAGE_CENTER_CLEAR_ALL); |
| close_all_button_->SetImage( |
| views::Button::STATE_DISABLED, |
| *resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_CLEAR_ALL_DISABLED)); |
| button_container_->AddChildView(close_all_button_); |
| |
| settings_button_ = |
| new NotificationCenterButton(this, |
| IDR_NOTIFICATION_SETTINGS, |
| IDR_NOTIFICATION_SETTINGS_HOVER, |
| IDR_NOTIFICATION_SETTINGS_PRESSED, |
| IDS_MESSAGE_CENTER_SETTINGS_BUTTON_LABEL); |
| button_container_->AddChildView(settings_button_); |
| |
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| close_bubble_button_ = new views::ImageButton(this); |
| close_bubble_button_->SetImage( |
| views::Button::STATE_NORMAL, |
| resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE)); |
| close_bubble_button_->SetImage( |
| views::Button::STATE_HOVERED, |
| resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE_HOVER)); |
| close_bubble_button_->SetImage( |
| views::Button::STATE_PRESSED, |
| resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE_PRESSED)); |
| AddChildView(close_bubble_button_); |
| #endif |
| |
| SetCloseAllButtonEnabled(!settings_initially_visible); |
| SetBackArrowVisible(settings_initially_visible); |
| ViewVisibilityChanged(); |
| } |
| |
| void MessageCenterButtonBar::ViewVisibilityChanged() { |
| gfx::ImageSkia* settings_image = |
| ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( |
| IDR_NOTIFICATION_SETTINGS); |
| int image_margin = std::max(0, (kButtonSize - settings_image->width()) / 2); |
| views::GridLayout* layout = new views::GridLayout(this); |
| SetLayoutManager(layout); |
| layout->SetInsets(kFooterTopMargin, |
| kFooterLeftMargin, |
| kFooterBottomMargin, |
| std::max(0, kFooterRightMargin - image_margin)); |
| views::ColumnSet* column = layout->AddColumnSet(0); |
| if (title_arrow_->visible()) { |
| // Column for the left-arrow used to back out of settings. |
| column->AddColumn(views::GridLayout::LEADING, |
| views::GridLayout::CENTER, |
| 0.0f, |
| views::GridLayout::FIXED, |
| kButtonSize, |
| 0); |
| } else { |
| column->AddPaddingColumn(0.0f, kLeftPaddingWidthForNonArrows); |
| } |
| |
| // Column for the label "Notifications". |
| column->AddColumn(views::GridLayout::LEADING, |
| views::GridLayout::CENTER, |
| 0.0f, |
| views::GridLayout::USE_PREF, |
| 0, |
| 0); |
| |
| // Fills in the remaining space between "Notifications" and buttons. |
| column->AddPaddingColumn(1.0f, image_margin); |
| |
| // The button area column. |
| column->AddColumn(views::GridLayout::LEADING, |
| views::GridLayout::CENTER, |
| 0.0f, |
| views::GridLayout::USE_PREF, |
| 0, |
| 0); |
| |
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| // The close-bubble button. |
| column->AddColumn(views::GridLayout::LEADING, |
| views::GridLayout::LEADING, |
| 0.0f, |
| views::GridLayout::USE_PREF, |
| 0, |
| 0); |
| #endif |
| |
| layout->StartRow(0, 0, kButtonSize); |
| if (title_arrow_->visible()) |
| layout->AddView(title_arrow_); |
| layout->AddView(notification_label_); |
| layout->AddView(button_container_); |
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| layout->AddView(close_bubble_button_); |
| #endif |
| } |
| |
| MessageCenterButtonBar::~MessageCenterButtonBar() {} |
| |
| void MessageCenterButtonBar::SetSettingsAndQuietModeButtonsEnabled( |
| bool enabled) { |
| settings_button_->SetEnabled(enabled); |
| quiet_mode_button_->SetEnabled(enabled); |
| } |
| |
| void MessageCenterButtonBar::SetCloseAllButtonEnabled(bool enabled) { |
| if (close_all_button_) |
| close_all_button_->SetEnabled(enabled); |
| } |
| |
| views::Button* MessageCenterButtonBar::GetCloseAllButtonForTest() const { |
| return close_all_button_; |
| } |
| |
| views::Button* MessageCenterButtonBar::GetQuietModeButtonForTest() const { |
| return quiet_mode_button_; |
| } |
| |
| views::Button* MessageCenterButtonBar::GetSettingsButtonForTest() const { |
| return settings_button_; |
| } |
| |
| void MessageCenterButtonBar::SetBackArrowVisible(bool visible) { |
| if (title_arrow_) |
| title_arrow_->SetVisible(visible); |
| ViewVisibilityChanged(); |
| Layout(); |
| } |
| |
| void MessageCenterButtonBar::SetTitle(const base::string16& title) { |
| notification_label_->SetText(title); |
| } |
| |
| void MessageCenterButtonBar::SetButtonsVisible(bool visible) { |
| settings_button_->SetVisible(visible); |
| quiet_mode_button_->SetVisible(visible); |
| |
| if (close_all_button_) |
| close_all_button_->SetVisible(visible); |
| |
| ViewVisibilityChanged(); |
| Layout(); |
| } |
| |
| void MessageCenterButtonBar::ChildVisibilityChanged(views::View* child) { |
| InvalidateLayout(); |
| } |
| |
| void MessageCenterButtonBar::ButtonPressed(views::Button* sender, |
| const ui::Event& event) { |
| if (sender == close_all_button_) { |
| message_center_view()->ClearAllClosableNotifications(); |
| } else if (sender == settings_button_ || sender == title_arrow_) { |
| MessageCenterView* center_view = message_center_view(); |
| center_view->SetSettingsVisible(!center_view->settings_visible()); |
| } else if (sender == quiet_mode_button_) { |
| if (message_center()->IsQuietMode()) |
| message_center()->SetQuietMode(false); |
| else |
| message_center()->EnterQuietModeWithExpire(base::TimeDelta::FromDays(1)); |
| quiet_mode_button_->SetToggled(message_center()->IsQuietMode()); |
| #if defined(OS_LINUX) && !defined(OS_CHROMEOS) |
| } else if (sender == close_bubble_button_) { |
| message_center_view()->tray()->HideMessageCenterBubble(); |
| #endif |
| } else { |
| NOTREACHED(); |
| } |
| } |
| |
| } // namespace message_center |