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