Home | History | Annotate | Download | only in tray
      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 "ui/base/resource/resource_bundle.h"
     10 #include "ui/gfx/image/image_skia.h"
     11 #include "ui/resources/grit/ui_resources.h"
     12 #include "ui/views/background.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 
     19 TrayNotificationView::TrayNotificationView(SystemTrayItem* owner, int icon_id)
     20     : owner_(owner),
     21       icon_id_(icon_id),
     22       icon_(NULL),
     23       autoclose_delay_(0) {
     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 ash
    171