blob: 14f2283a0ba446d7d9f80a354903d614bd52d0d5 [file] [log] [blame]
// 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