- add sources.
[platform/framework/web/crosswalk.git] / src / ash / system / tray / tray_notification_view.cc
1 // Copyright (c) 2012 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 "ash/system/tray/tray_notification_view.h"
6
7 #include "ash/system/tray/system_tray_item.h"
8 #include "ash/system/tray/tray_constants.h"
9 #include "grit/ash_strings.h"
10 #include "grit/ui_resources.h"
11 #include "ui/base/resource/resource_bundle.h"
12 #include "ui/gfx/image/image_skia.h"
13 #include "ui/views/controls/button/image_button.h"
14 #include "ui/views/controls/image_view.h"
15 #include "ui/views/layout/grid_layout.h"
16
17 namespace ash {
18 namespace internal {
19
20 TrayNotificationView::TrayNotificationView(SystemTrayItem* owner, int icon_id)
21     : owner_(owner),
22       icon_id_(icon_id),
23       icon_(NULL) {
24 }
25
26 TrayNotificationView::~TrayNotificationView() {
27 }
28
29 void TrayNotificationView::InitView(views::View* contents) {
30   set_background(views::Background::CreateSolidBackground(kBackgroundColor));
31
32   views::GridLayout* layout = new views::GridLayout(this);
33   SetLayoutManager(layout);
34
35   views::ImageButton* close_button = new views::ImageButton(this);
36   close_button->SetImage(views::CustomButton::STATE_NORMAL,
37                          ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
38                              IDR_MESSAGE_CLOSE));
39   close_button->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
40                                   views::ImageButton::ALIGN_MIDDLE);
41
42   icon_ = new views::ImageView;
43   if (icon_id_ != 0) {
44     icon_->SetImage(
45         ResourceBundle::GetSharedInstance().GetImageSkiaNamed(icon_id_));
46   }
47
48   views::ColumnSet* columns = layout->AddColumnSet(0);
49
50   columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2);
51
52   // Icon
53   columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER,
54                      0, /* resize percent */
55                      views::GridLayout::FIXED,
56                      kNotificationIconWidth, kNotificationIconWidth);
57
58   columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2);
59
60   // Contents
61   columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
62                      100, /* resize percent */
63                      views::GridLayout::FIXED,
64                      kTrayNotificationContentsWidth,
65                      kTrayNotificationContentsWidth);
66
67   columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2);
68
69   // Close button
70   columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::LEADING,
71                      0, /* resize percent */
72                      views::GridLayout::FIXED,
73                      kNotificationButtonWidth, kNotificationButtonWidth);
74
75   // Layout rows
76   layout->AddPaddingRow(0, kTrayPopupPaddingBetweenItems);
77   layout->StartRow(0, 0);
78   layout->AddView(icon_);
79   layout->AddView(contents);
80   layout->AddView(close_button);
81   layout->AddPaddingRow(0, kTrayPopupPaddingBetweenItems);
82 }
83
84 void TrayNotificationView::SetIconImage(const gfx::ImageSkia& image) {
85   icon_->SetImage(image);
86   SchedulePaint();
87 }
88
89 const gfx::ImageSkia& TrayNotificationView::GetIconImage() const {
90   return icon_->GetImage();
91 }
92
93 void TrayNotificationView::UpdateView(views::View* new_contents) {
94   RemoveAllChildViews(true);
95   InitView(new_contents);
96   Layout();
97   PreferredSizeChanged();
98   SchedulePaint();
99 }
100
101 void TrayNotificationView::UpdateViewAndImage(views::View* new_contents,
102                                               const gfx::ImageSkia& image) {
103   RemoveAllChildViews(true);
104   InitView(new_contents);
105   icon_->SetImage(image);
106   Layout();
107   PreferredSizeChanged();
108   SchedulePaint();
109 }
110
111 void TrayNotificationView::StartAutoCloseTimer(int seconds) {
112   autoclose_.Stop();
113   autoclose_delay_ = seconds;
114   if (autoclose_delay_) {
115     autoclose_.Start(FROM_HERE,
116                      base::TimeDelta::FromSeconds(autoclose_delay_),
117                      this, &TrayNotificationView::HandleClose);
118   }
119 }
120
121 void TrayNotificationView::StopAutoCloseTimer() {
122   autoclose_.Stop();
123 }
124
125 void TrayNotificationView::RestartAutoCloseTimer() {
126   if (autoclose_delay_)
127     StartAutoCloseTimer(autoclose_delay_);
128 }
129
130 void TrayNotificationView::ButtonPressed(views::Button* sender,
131                                          const ui::Event& event) {
132   HandleClose();
133 }
134
135 bool TrayNotificationView::OnMousePressed(const ui::MouseEvent& event) {
136   HandleClickAction();
137   return true;
138 }
139
140 void TrayNotificationView::OnGestureEvent(ui::GestureEvent* event) {
141   SlideOutView::OnGestureEvent(event);
142   if (event->handled())
143     return;
144   if (event->type() != ui::ET_GESTURE_TAP)
145     return;
146   HandleClickAction();
147   event->SetHandled();
148 }
149
150 void TrayNotificationView::OnClose() {
151 }
152
153 void TrayNotificationView::OnClickAction() {
154 }
155
156 void TrayNotificationView::OnSlideOut() {
157   owner_->HideNotificationView();
158 }
159
160 void TrayNotificationView::HandleClose() {
161   OnClose();
162   owner_->HideNotificationView();
163 }
164
165 void TrayNotificationView::HandleClickAction() {
166   HandleClose();
167   OnClickAction();
168 }
169
170 }  // namespace internal
171 }  // namespace ash