Upstream version 6.35.121.0
[platform/framework/web/crosswalk.git] / src / ui / message_center / views / message_center_button_bar.cc
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.
4
5 #include "ui/message_center/views/message_center_button_bar.h"
6
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/notifier_settings.h"
17 #include "ui/message_center/views/message_center_view.h"
18 #include "ui/views/controls/button/button.h"
19 #include "ui/views/controls/button/image_button.h"
20 #include "ui/views/controls/button/label_button.h"
21 #include "ui/views/controls/button/menu_button.h"
22 #include "ui/views/controls/button/menu_button_listener.h"
23 #include "ui/views/controls/label.h"
24 #include "ui/views/controls/menu/menu_runner.h"
25 #include "ui/views/layout/box_layout.h"
26 #include "ui/views/layout/grid_layout.h"
27 #include "ui/views/painter.h"
28
29 namespace message_center {
30
31 namespace {
32 const int kButtonSize = 40;
33 const int kChevronWidth = 8;
34 const int kFooterTopMargin = 6;
35 const int kFooterBottomMargin = 3;
36 const int kFooterLeftMargin = 20;
37 const int kFooterRightMargin = 14;
38 }  // namespace
39
40 // NotificationCenterButton ////////////////////////////////////////////////////
41 ////////////////////////////////////////////////////////////////////////////////
42 class NotificationCenterButton : public views::ToggleImageButton {
43  public:
44   NotificationCenterButton(views::ButtonListener* listener,
45                            int normal_id,
46                            int hover_id,
47                            int pressed_id,
48                            int text_id);
49   void set_size(gfx::Size size) { size_ = size; }
50
51  protected:
52   // Overridden from views::View:
53   virtual gfx::Size GetPreferredSize() OVERRIDE;
54
55  private:
56   gfx::Size size_;
57
58   DISALLOW_COPY_AND_ASSIGN(NotificationCenterButton);
59 };
60
61 NotificationCenterButton::NotificationCenterButton(
62     views::ButtonListener* listener,
63     int normal_id,
64     int hover_id,
65     int pressed_id,
66     int text_id)
67     : views::ToggleImageButton(listener), size_(kButtonSize, kButtonSize) {
68   ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
69   SetImage(STATE_NORMAL, resource_bundle.GetImageSkiaNamed(normal_id));
70   SetImage(STATE_HOVERED, resource_bundle.GetImageSkiaNamed(hover_id));
71   SetImage(STATE_PRESSED, resource_bundle.GetImageSkiaNamed(pressed_id));
72   SetImageAlignment(views::ImageButton::ALIGN_CENTER,
73                     views::ImageButton::ALIGN_MIDDLE);
74   if (text_id)
75     SetTooltipText(resource_bundle.GetLocalizedString(text_id));
76
77   SetFocusable(true);
78   set_request_focus_on_press(false);
79
80   SetFocusPainter(views::Painter::CreateSolidFocusPainter(
81       kFocusBorderColor,
82       gfx::Insets(1, 2, 2, 2)));
83 }
84
85 gfx::Size NotificationCenterButton::GetPreferredSize() { return size_; }
86
87 // MessageCenterButtonBar /////////////////////////////////////////////////////
88 ///////////////////////////////////////////////////////////////////////////////
89 MessageCenterButtonBar::MessageCenterButtonBar(
90     MessageCenterView* message_center_view,
91     MessageCenter* message_center,
92     NotifierSettingsProvider* notifier_settings_provider,
93     bool settings_initially_visible)
94     : message_center_view_(message_center_view),
95       message_center_(message_center),
96       title_arrow_(NULL),
97       notification_label_(NULL),
98       button_container_(NULL),
99       close_all_button_(NULL),
100       settings_button_(NULL),
101       quiet_mode_button_(NULL) {
102   SetPaintToLayer(true);
103   set_background(
104       views::Background::CreateSolidBackground(kMessageCenterBackgroundColor));
105
106   ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
107
108   title_arrow_ = new NotificationCenterButton(this,
109                                               IDR_NOTIFICATION_ARROW,
110                                               IDR_NOTIFICATION_ARROW_HOVER,
111                                               IDR_NOTIFICATION_ARROW_PRESSED,
112                                               0);
113   title_arrow_->set_size(gfx::Size(kChevronWidth, kButtonSize));
114
115   // Keyboardists can use the gear button to switch modes.
116   title_arrow_->SetFocusable(false);
117   AddChildView(title_arrow_);
118
119   notification_label_ = new views::Label(
120       l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_FOOTER_TITLE));
121   notification_label_->SetAutoColorReadabilityEnabled(false);
122   notification_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
123   notification_label_->SetEnabledColor(kRegularTextColor);
124   AddChildView(notification_label_);
125
126   button_container_ = new views::View;
127   button_container_->SetLayoutManager(
128       new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
129   quiet_mode_button_ = new NotificationCenterButton(
130       this,
131       IDR_NOTIFICATION_DO_NOT_DISTURB,
132       IDR_NOTIFICATION_DO_NOT_DISTURB_HOVER,
133       IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED,
134       IDS_MESSAGE_CENTER_QUIET_MODE_BUTTON_TOOLTIP);
135   quiet_mode_button_->SetToggledImage(
136       views::Button::STATE_NORMAL,
137       resource_bundle.GetImageSkiaNamed(
138           IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
139   quiet_mode_button_->SetToggledImage(
140       views::Button::STATE_HOVERED,
141       resource_bundle.GetImageSkiaNamed(
142           IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
143   quiet_mode_button_->SetToggledImage(
144       views::Button::STATE_PRESSED,
145       resource_bundle.GetImageSkiaNamed(
146           IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
147   quiet_mode_button_->SetToggled(message_center->IsQuietMode());
148   button_container_->AddChildView(quiet_mode_button_);
149
150   close_all_button_ =
151       new NotificationCenterButton(this,
152                                    IDR_NOTIFICATION_CLEAR_ALL,
153                                    IDR_NOTIFICATION_CLEAR_ALL_HOVER,
154                                    IDR_NOTIFICATION_CLEAR_ALL_PRESSED,
155                                    IDS_MESSAGE_CENTER_CLEAR_ALL);
156   close_all_button_->SetImage(
157       views::Button::STATE_DISABLED,
158       resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_CLEAR_ALL_DISABLED));
159   button_container_->AddChildView(close_all_button_);
160
161   settings_button_ =
162       new NotificationCenterButton(this,
163                                    IDR_NOTIFICATION_SETTINGS,
164                                    IDR_NOTIFICATION_SETTINGS_HOVER,
165                                    IDR_NOTIFICATION_SETTINGS_PRESSED,
166                                    IDS_MESSAGE_CENTER_SETTINGS_BUTTON_LABEL);
167   button_container_->AddChildView(settings_button_);
168
169   SetCloseAllButtonEnabled(!settings_initially_visible);
170   SetBackArrowVisible(settings_initially_visible);
171   ViewVisibilityChanged();
172 }
173
174 void MessageCenterButtonBar::ViewVisibilityChanged() {
175   gfx::ImageSkia* settings_image =
176       ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
177           IDR_NOTIFICATION_SETTINGS);
178   int image_margin = std::max(0, (kButtonSize - settings_image->width()) / 2);
179   views::GridLayout* layout = new views::GridLayout(this);
180   SetLayoutManager(layout);
181   layout->SetInsets(kFooterTopMargin,
182                     kFooterLeftMargin,
183                     kFooterBottomMargin,
184                     std::max(0, kFooterRightMargin - image_margin));
185   views::ColumnSet* column = layout->AddColumnSet(0);
186   if (title_arrow_->visible()) {
187     // Column for the left-arrow used to back out of settings.
188     column->AddColumn(views::GridLayout::LEADING,
189                       views::GridLayout::CENTER,
190                       0.0f,
191                       views::GridLayout::USE_PREF,
192                       0,
193                       0);
194
195     column->AddPaddingColumn(0.0f, 10);
196   }
197
198   // Column for the label "Notifications".
199   column->AddColumn(views::GridLayout::LEADING,
200                     views::GridLayout::CENTER,
201                     0.0f,
202                     views::GridLayout::USE_PREF,
203                     0,
204                     0);
205
206   // Fills in the remaining space between "Notifications" and buttons.
207   column->AddPaddingColumn(1.0f, image_margin);
208
209   // The button area column.
210   column->AddColumn(views::GridLayout::LEADING,
211                     views::GridLayout::CENTER,
212                     0.0f,
213                     views::GridLayout::USE_PREF,
214                     0,
215                     0);
216
217   layout->StartRow(0, 0);
218   if (title_arrow_->visible())
219     layout->AddView(title_arrow_);
220   layout->AddView(notification_label_);
221   layout->AddView(button_container_);
222 }
223
224 MessageCenterButtonBar::~MessageCenterButtonBar() {}
225
226 void MessageCenterButtonBar::SetAllButtonsEnabled(bool enabled) {
227   if (close_all_button_)
228     close_all_button_->SetEnabled(enabled);
229   settings_button_->SetEnabled(enabled);
230   quiet_mode_button_->SetEnabled(enabled);
231 }
232
233 void MessageCenterButtonBar::SetCloseAllButtonEnabled(bool enabled) {
234   if (close_all_button_)
235     close_all_button_->SetEnabled(enabled);
236 }
237
238 void MessageCenterButtonBar::SetBackArrowVisible(bool visible) {
239   if (title_arrow_)
240     title_arrow_->SetVisible(visible);
241   ViewVisibilityChanged();
242   Layout();
243 }
244
245 void MessageCenterButtonBar::ChildVisibilityChanged(views::View* child) {
246   InvalidateLayout();
247 }
248
249 void MessageCenterButtonBar::ButtonPressed(views::Button* sender,
250                                            const ui::Event& event) {
251   if (sender == close_all_button_) {
252     message_center_view()->ClearAllNotifications();
253   } else if (sender == settings_button_ || sender == title_arrow_) {
254     MessageCenterView* center_view = message_center_view();
255     center_view->SetSettingsVisible(!center_view->settings_visible());
256   } else if (sender == quiet_mode_button_) {
257     if (message_center()->IsQuietMode())
258       message_center()->SetQuietMode(false);
259     else
260       message_center()->EnterQuietModeWithExpire(base::TimeDelta::FromDays(1));
261     quiet_mode_button_->SetToggled(message_center()->IsQuietMode());
262   } else {
263     NOTREACHED();
264   }
265 }
266
267 }  // namespace message_center