1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "ui/message_center/views/message_center_button_bar.h"
7 #include "grit/ui_resources.h"
8 #include "grit/ui_strings.h"
9 #include "ui/base/l10n/l10n_util.h"
10 #include "ui/base/models/simple_menu_model.h"
11 #include "ui/base/resource/resource_bundle.h"
12 #include "ui/gfx/canvas.h"
13 #include "ui/gfx/text_constants.h"
14 #include "ui/message_center/message_center.h"
15 #include "ui/message_center/message_center_style.h"
16 #include "ui/message_center/message_center_tray.h"
17 #include "ui/message_center/notifier_settings.h"
18 #include "ui/message_center/views/message_center_view.h"
19 #include "ui/views/controls/button/button.h"
20 #include "ui/views/controls/button/image_button.h"
21 #include "ui/views/controls/button/label_button.h"
22 #include "ui/views/controls/button/menu_button.h"
23 #include "ui/views/controls/button/menu_button_listener.h"
24 #include "ui/views/controls/label.h"
25 #include "ui/views/controls/menu/menu_runner.h"
26 #include "ui/views/layout/box_layout.h"
27 #include "ui/views/layout/grid_layout.h"
28 #include "ui/views/painter.h"
30 namespace message_center {
33 const int kButtonSize = 40;
34 const int kChevronWidth = 8;
35 const int kFooterTopMargin = 6;
36 const int kFooterBottomMargin = 3;
37 const int kFooterLeftMargin = 20;
38 const int kFooterRightMargin = 14;
41 // NotificationCenterButton ////////////////////////////////////////////////////
42 ////////////////////////////////////////////////////////////////////////////////
43 class NotificationCenterButton : public views::ToggleImageButton {
45 NotificationCenterButton(views::ButtonListener* listener,
50 void set_size(gfx::Size size) { size_ = size; }
53 // Overridden from views::View:
54 virtual gfx::Size GetPreferredSize() OVERRIDE;
59 DISALLOW_COPY_AND_ASSIGN(NotificationCenterButton);
62 NotificationCenterButton::NotificationCenterButton(
63 views::ButtonListener* listener,
68 : views::ToggleImageButton(listener), size_(kButtonSize, kButtonSize) {
69 ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
70 SetImage(STATE_NORMAL, resource_bundle.GetImageSkiaNamed(normal_id));
71 SetImage(STATE_HOVERED, resource_bundle.GetImageSkiaNamed(hover_id));
72 SetImage(STATE_PRESSED, resource_bundle.GetImageSkiaNamed(pressed_id));
73 SetImageAlignment(views::ImageButton::ALIGN_CENTER,
74 views::ImageButton::ALIGN_MIDDLE);
76 SetTooltipText(resource_bundle.GetLocalizedString(text_id));
79 set_request_focus_on_press(false);
81 SetFocusPainter(views::Painter::CreateSolidFocusPainter(
83 gfx::Insets(1, 2, 2, 2)));
86 gfx::Size NotificationCenterButton::GetPreferredSize() { return size_; }
88 // MessageCenterButtonBar /////////////////////////////////////////////////////
89 ///////////////////////////////////////////////////////////////////////////////
90 MessageCenterButtonBar::MessageCenterButtonBar(
91 MessageCenterView* message_center_view,
92 MessageCenter* message_center,
93 NotifierSettingsProvider* notifier_settings_provider,
94 bool settings_initially_visible)
95 : message_center_view_(message_center_view),
96 message_center_(message_center),
97 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
98 close_bubble_button_(NULL),
101 notification_label_(NULL),
102 button_container_(NULL),
103 close_all_button_(NULL),
104 settings_button_(NULL),
105 quiet_mode_button_(NULL) {
106 SetPaintToLayer(true);
108 views::Background::CreateSolidBackground(kMessageCenterBackgroundColor));
110 ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
112 title_arrow_ = new NotificationCenterButton(this,
113 IDR_NOTIFICATION_ARROW,
114 IDR_NOTIFICATION_ARROW_HOVER,
115 IDR_NOTIFICATION_ARROW_PRESSED,
117 title_arrow_->set_size(gfx::Size(kChevronWidth, kButtonSize));
119 // Keyboardists can use the gear button to switch modes.
120 title_arrow_->SetFocusable(false);
121 AddChildView(title_arrow_);
123 notification_label_ = new views::Label(
124 l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_FOOTER_TITLE));
125 notification_label_->SetAutoColorReadabilityEnabled(false);
126 notification_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
127 notification_label_->SetEnabledColor(kRegularTextColor);
128 AddChildView(notification_label_);
130 button_container_ = new views::View;
131 button_container_->SetLayoutManager(
132 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
133 quiet_mode_button_ = new NotificationCenterButton(
135 IDR_NOTIFICATION_DO_NOT_DISTURB,
136 IDR_NOTIFICATION_DO_NOT_DISTURB_HOVER,
137 IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED,
138 IDS_MESSAGE_CENTER_QUIET_MODE_BUTTON_TOOLTIP);
139 quiet_mode_button_->SetToggledImage(
140 views::Button::STATE_NORMAL,
141 resource_bundle.GetImageSkiaNamed(
142 IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
143 quiet_mode_button_->SetToggledImage(
144 views::Button::STATE_HOVERED,
145 resource_bundle.GetImageSkiaNamed(
146 IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
147 quiet_mode_button_->SetToggledImage(
148 views::Button::STATE_PRESSED,
149 resource_bundle.GetImageSkiaNamed(
150 IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
151 quiet_mode_button_->SetToggled(message_center->IsQuietMode());
152 button_container_->AddChildView(quiet_mode_button_);
155 new NotificationCenterButton(this,
156 IDR_NOTIFICATION_CLEAR_ALL,
157 IDR_NOTIFICATION_CLEAR_ALL_HOVER,
158 IDR_NOTIFICATION_CLEAR_ALL_PRESSED,
159 IDS_MESSAGE_CENTER_CLEAR_ALL);
160 close_all_button_->SetImage(
161 views::Button::STATE_DISABLED,
162 resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_CLEAR_ALL_DISABLED));
163 button_container_->AddChildView(close_all_button_);
166 new NotificationCenterButton(this,
167 IDR_NOTIFICATION_SETTINGS,
168 IDR_NOTIFICATION_SETTINGS_HOVER,
169 IDR_NOTIFICATION_SETTINGS_PRESSED,
170 IDS_MESSAGE_CENTER_SETTINGS_BUTTON_LABEL);
171 button_container_->AddChildView(settings_button_);
173 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
174 close_bubble_button_ = new views::ImageButton(this);
175 close_bubble_button_->SetImage(
176 views::Button::STATE_NORMAL,
177 resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE));
178 close_bubble_button_->SetImage(
179 views::Button::STATE_HOVERED,
180 resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE_HOVER));
181 close_bubble_button_->SetImage(
182 views::Button::STATE_PRESSED,
183 resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE_PRESSED));
184 AddChildView(close_bubble_button_);
187 SetCloseAllButtonEnabled(!settings_initially_visible);
188 SetBackArrowVisible(settings_initially_visible);
189 ViewVisibilityChanged();
192 void MessageCenterButtonBar::ViewVisibilityChanged() {
193 gfx::ImageSkia* settings_image =
194 ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
195 IDR_NOTIFICATION_SETTINGS);
196 int image_margin = std::max(0, (kButtonSize - settings_image->width()) / 2);
197 views::GridLayout* layout = new views::GridLayout(this);
198 SetLayoutManager(layout);
199 layout->SetInsets(kFooterTopMargin,
202 std::max(0, kFooterRightMargin - image_margin));
203 views::ColumnSet* column = layout->AddColumnSet(0);
204 if (title_arrow_->visible()) {
205 // Column for the left-arrow used to back out of settings.
206 column->AddColumn(views::GridLayout::LEADING,
207 views::GridLayout::CENTER,
209 views::GridLayout::USE_PREF,
213 column->AddPaddingColumn(0.0f, 10);
216 // Column for the label "Notifications".
217 column->AddColumn(views::GridLayout::LEADING,
218 views::GridLayout::CENTER,
220 views::GridLayout::USE_PREF,
224 // Fills in the remaining space between "Notifications" and buttons.
225 column->AddPaddingColumn(1.0f, image_margin);
227 // The button area column.
228 column->AddColumn(views::GridLayout::LEADING,
229 views::GridLayout::CENTER,
231 views::GridLayout::USE_PREF,
235 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
236 // The close-bubble button.
237 column->AddColumn(views::GridLayout::LEADING,
238 views::GridLayout::LEADING,
240 views::GridLayout::USE_PREF,
245 layout->StartRow(0, 0);
246 if (title_arrow_->visible())
247 layout->AddView(title_arrow_);
248 layout->AddView(notification_label_);
249 layout->AddView(button_container_);
250 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
251 layout->AddView(close_bubble_button_);
255 MessageCenterButtonBar::~MessageCenterButtonBar() {}
257 void MessageCenterButtonBar::SetAllButtonsEnabled(bool enabled) {
258 if (close_all_button_)
259 close_all_button_->SetEnabled(enabled);
260 settings_button_->SetEnabled(enabled);
261 quiet_mode_button_->SetEnabled(enabled);
264 void MessageCenterButtonBar::SetCloseAllButtonEnabled(bool enabled) {
265 if (close_all_button_)
266 close_all_button_->SetEnabled(enabled);
269 void MessageCenterButtonBar::SetBackArrowVisible(bool visible) {
271 title_arrow_->SetVisible(visible);
272 ViewVisibilityChanged();
276 void MessageCenterButtonBar::ChildVisibilityChanged(views::View* child) {
280 void MessageCenterButtonBar::ButtonPressed(views::Button* sender,
281 const ui::Event& event) {
282 if (sender == close_all_button_) {
283 message_center_view()->ClearAllNotifications();
284 } else if (sender == settings_button_ || sender == title_arrow_) {
285 MessageCenterView* center_view = message_center_view();
286 center_view->SetSettingsVisible(!center_view->settings_visible());
287 } else if (sender == quiet_mode_button_) {
288 if (message_center()->IsQuietMode())
289 message_center()->SetQuietMode(false);
291 message_center()->EnterQuietModeWithExpire(base::TimeDelta::FromDays(1));
292 quiet_mode_button_->SetToggled(message_center()->IsQuietMode());
293 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
294 } else if (sender == close_bubble_button_) {
295 message_center_view()->tray()->HideMessageCenterBubble();
302 } // namespace message_center