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 172