root/ash/system/tray/tray_notification_view.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. icon_
  2. InitView
  3. SetIconImage
  4. GetIconImage
  5. UpdateView
  6. UpdateViewAndImage
  7. StartAutoCloseTimer
  8. StopAutoCloseTimer
  9. RestartAutoCloseTimer
  10. ButtonPressed
  11. OnMousePressed
  12. OnGestureEvent
  13. OnClose
  14. OnClickAction
  15. OnSlideOut
  16. HandleClose
  17. HandleClickAction

// 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 {

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 ash

/* [<][>][^][v][top][bottom][index][help] */