diff options
Diffstat (limited to 'chromium/ash/system/tray/tray_notification_view.cc')
-rw-r--r-- | chromium/ash/system/tray/tray_notification_view.cc | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/chromium/ash/system/tray/tray_notification_view.cc b/chromium/ash/system/tray/tray_notification_view.cc new file mode 100644 index 00000000000..c09589285ea --- /dev/null +++ b/chromium/ash/system/tray/tray_notification_view.cc @@ -0,0 +1,172 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/tray/tray_notification_view.h" + +#include "ash/system/tray/system_tray_item.h" +#include "ash/system/tray/tray_constants.h" +#include "grit/ash_strings.h" +#include "grit/ui_resources.h" +#include "ui/base/resource/resource_bundle.h" +#include "ui/gfx/image/image_skia.h" +#include "ui/views/background.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/image_view.h" +#include "ui/views/layout/grid_layout.h" + +namespace ash { +namespace internal { + +TrayNotificationView::TrayNotificationView(SystemTrayItem* owner, int icon_id) + : owner_(owner), + icon_id_(icon_id), + icon_(NULL) { +} + +TrayNotificationView::~TrayNotificationView() { +} + +void TrayNotificationView::InitView(views::View* contents) { + set_background(views::Background::CreateSolidBackground(kBackgroundColor)); + + views::GridLayout* layout = new views::GridLayout(this); + SetLayoutManager(layout); + + views::ImageButton* close_button = new views::ImageButton(this); + close_button->SetImage(views::CustomButton::STATE_NORMAL, + ResourceBundle::GetSharedInstance().GetImageSkiaNamed( + IDR_MESSAGE_CLOSE)); + close_button->SetImageAlignment(views::ImageButton::ALIGN_CENTER, + views::ImageButton::ALIGN_MIDDLE); + + icon_ = new views::ImageView; + if (icon_id_ != 0) { + icon_->SetImage( + ResourceBundle::GetSharedInstance().GetImageSkiaNamed(icon_id_)); + } + + views::ColumnSet* columns = layout->AddColumnSet(0); + + columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2); + + // Icon + columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, + 0, /* resize percent */ + views::GridLayout::FIXED, + kNotificationIconWidth, kNotificationIconWidth); + + columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2); + + // Contents + columns->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, + 100, /* resize percent */ + views::GridLayout::FIXED, + kTrayNotificationContentsWidth, + kTrayNotificationContentsWidth); + + columns->AddPaddingColumn(0, kTrayPopupPaddingHorizontal / 2); + + // Close button + columns->AddColumn(views::GridLayout::CENTER, views::GridLayout::LEADING, + 0, /* resize percent */ + views::GridLayout::FIXED, + kNotificationButtonWidth, kNotificationButtonWidth); + + // Layout rows + layout->AddPaddingRow(0, kTrayPopupPaddingBetweenItems); + layout->StartRow(0, 0); + layout->AddView(icon_); + layout->AddView(contents); + layout->AddView(close_button); + layout->AddPaddingRow(0, kTrayPopupPaddingBetweenItems); +} + +void TrayNotificationView::SetIconImage(const gfx::ImageSkia& image) { + icon_->SetImage(image); + SchedulePaint(); +} + +const gfx::ImageSkia& TrayNotificationView::GetIconImage() const { + return icon_->GetImage(); +} + +void TrayNotificationView::UpdateView(views::View* new_contents) { + RemoveAllChildViews(true); + InitView(new_contents); + Layout(); + PreferredSizeChanged(); + SchedulePaint(); +} + +void TrayNotificationView::UpdateViewAndImage(views::View* new_contents, + const gfx::ImageSkia& image) { + RemoveAllChildViews(true); + InitView(new_contents); + icon_->SetImage(image); + Layout(); + PreferredSizeChanged(); + SchedulePaint(); +} + +void TrayNotificationView::StartAutoCloseTimer(int seconds) { + autoclose_.Stop(); + autoclose_delay_ = seconds; + if (autoclose_delay_) { + autoclose_.Start(FROM_HERE, + base::TimeDelta::FromSeconds(autoclose_delay_), + this, &TrayNotificationView::HandleClose); + } +} + +void TrayNotificationView::StopAutoCloseTimer() { + autoclose_.Stop(); +} + +void TrayNotificationView::RestartAutoCloseTimer() { + if (autoclose_delay_) + StartAutoCloseTimer(autoclose_delay_); +} + +void TrayNotificationView::ButtonPressed(views::Button* sender, + const ui::Event& event) { + HandleClose(); +} + +bool TrayNotificationView::OnMousePressed(const ui::MouseEvent& event) { + HandleClickAction(); + return true; +} + +void TrayNotificationView::OnGestureEvent(ui::GestureEvent* event) { + SlideOutView::OnGestureEvent(event); + if (event->handled()) + return; + if (event->type() != ui::ET_GESTURE_TAP) + return; + HandleClickAction(); + event->SetHandled(); +} + +void TrayNotificationView::OnClose() { +} + +void TrayNotificationView::OnClickAction() { +} + +void TrayNotificationView::OnSlideOut() { + owner_->HideNotificationView(); +} + +void TrayNotificationView::HandleClose() { + OnClose(); + owner_->HideNotificationView(); +} + +void TrayNotificationView::HandleClickAction() { + HandleClose(); + OnClickAction(); +} + +} // namespace internal +} // namespace ash |