15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_notification_view.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_item.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "ui/resources/grit/ui_resources.h"
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/background.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/image_button.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TrayNotificationView::TrayNotificationView(SystemTrayItem* owner, int icon_id)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : owner_(owner),
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      icon_id_(icon_id),
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      icon_(NULL),
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      autoclose_delay_(0) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayNotificationView::~TrayNotificationView() {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::InitView(views::View* contents) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_background(views::Background::CreateSolidBackground(kBackgroundColor));
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::GridLayout* layout = new views::GridLayout(this);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLayoutManager(layout);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ImageButton* close_button = new views::ImageButton(this);
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  close_button->SetImage(views::CustomButton::STATE_NORMAL,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             IDR_MESSAGE_CLOSE));
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  close_button->SetImageAlignment(views::ImageButton::ALIGN_CENTER,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  views::ImageButton::ALIGN_MIDDLE);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon_ = new views::ImageView;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (icon_id_ != 0) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    icon_->SetImage(
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ResourceBundle::GetSharedInstance().GetImageSkiaNamed(icon_id_));
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::ColumnSet* columns = layout->AddColumnSet(0);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Icon
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     0, /* resize percent */
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::FIXED,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     kNotificationIconWidth, kNotificationIconWidth);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contents
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     100, /* resize percent */
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::FIXED,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     kTrayNotificationContentsWidth,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     kTrayNotificationContentsWidth);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close button
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::LEADING,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     0, /* resize percent */
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     views::GridLayout::FIXED,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     kNotificationButtonWidth, kNotificationButtonWidth);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Layout rows
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, kTrayPopupPaddingBetweenItems);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->StartRow(0, 0);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(icon_);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(contents);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddView(close_button);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layout->AddPaddingRow(0, kTrayPopupPaddingBetweenItems);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::SetIconImage(const gfx::ImageSkia& image) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon_->SetImage(image);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const gfx::ImageSkia& TrayNotificationView::GetIconImage() const {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return icon_->GetImage();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::UpdateView(views::View* new_contents) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAllChildViews(true);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitView(new_contents);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Layout();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PreferredSizeChanged();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::UpdateViewAndImage(views::View* new_contents,
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              const gfx::ImageSkia& image) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RemoveAllChildViews(true);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitView(new_contents);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon_->SetImage(image);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Layout();
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PreferredSizeChanged();
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SchedulePaint();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TrayNotificationView::StartAutoCloseTimer(int seconds) {
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  autoclose_.Stop();
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  autoclose_delay_ = seconds;
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (autoclose_delay_) {
115868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    autoclose_.Start(FROM_HERE,
116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     base::TimeDelta::FromSeconds(autoclose_delay_),
117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                     this, &TrayNotificationView::HandleClose);
118868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TrayNotificationView::StopAutoCloseTimer() {
122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  autoclose_.Stop();
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void TrayNotificationView::RestartAutoCloseTimer() {
126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (autoclose_delay_)
127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    StartAutoCloseTimer(autoclose_delay_);
128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::ButtonPressed(views::Button* sender,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const ui::Event& event) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleClose();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayNotificationView::OnMousePressed(const ui::MouseEvent& event) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleClickAction();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TrayNotificationView::OnGestureEvent(ui::GestureEvent* event) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SlideOutView::OnGestureEvent(event);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event->handled())
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event->type() != ui::ET_GESTURE_TAP)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleClickAction();
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  event->SetHandled();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::OnClose() {
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::OnClickAction() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::OnSlideOut() {
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  owner_->HideNotificationView();
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::HandleClose() {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnClose();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  owner_->HideNotificationView();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayNotificationView::HandleClickAction() {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HandleClose();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OnClickAction();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
171