普通文本  |  171行  |  4.89 KB

// 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 "ui/base/resource/resource_bundle.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/resources/grit/ui_resources.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),
      autoclose_delay_(0) {
}

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