// Copyright 2013 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 "ui/message_center/views/message_center_button_bar.h"

#include "base/macros.h"
#include "build/build_config.h"
#include "ui/base/models/simple_menu_model.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/text_constants.h"
#include "ui/message_center/message_center.h"
#include "ui/message_center/message_center_style.h"
#include "ui/message_center/message_center_tray.h"
#include "ui/message_center/notifier_settings.h"
#include "ui/message_center/views/message_center_view.h"
#include "ui/resources/grit/ui_resources.h"
#include "ui/strings/grit/ui_strings.h"
#include "ui/views/controls/button/button.h"
#include "ui/views/controls/button/image_button.h"
#include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/button/menu_button.h"
#include "ui/views/controls/button/menu_button_listener.h"
#include "ui/views/controls/label.h"
#include "ui/views/controls/menu/menu_runner.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/layout/grid_layout.h"
#include "ui/views/painter.h"

namespace message_center {

namespace {
const int kButtonSize = 40;
const int kLeftPaddingWidthForNonArrows = 16;
const int kFooterTopMargin = 6;
const int kFooterBottomMargin = 3;
const int kFooterLeftMargin = 4;
const int kFooterRightMargin = 14;
}  // namespace

// NotificationCenterButton ////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
class NotificationCenterButton : public views::ToggleImageButton {
 public:
  NotificationCenterButton(views::ButtonListener* listener,
                           int normal_id,
                           int hover_id,
                           int pressed_id,
                           int text_id);
  void set_size(gfx::Size size) { size_ = size; }

 protected:
  // Overridden from views::View:
  gfx::Size GetPreferredSize() const override;

 private:
  gfx::Size size_;

  DISALLOW_COPY_AND_ASSIGN(NotificationCenterButton);
};

NotificationCenterButton::NotificationCenterButton(
    views::ButtonListener* listener,
    int normal_id,
    int hover_id,
    int pressed_id,
    int text_id)
    : views::ToggleImageButton(listener), size_(kButtonSize, kButtonSize) {
  ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();
  SetImage(STATE_NORMAL, *resource_bundle.GetImageSkiaNamed(normal_id));
  SetImage(STATE_HOVERED, *resource_bundle.GetImageSkiaNamed(hover_id));
  SetImage(STATE_PRESSED, *resource_bundle.GetImageSkiaNamed(pressed_id));
  SetImageAlignment(views::ImageButton::ALIGN_CENTER,
                    views::ImageButton::ALIGN_MIDDLE);
  if (text_id)
    SetTooltipText(resource_bundle.GetLocalizedString(text_id));

  SetFocusForPlatform();

  SetFocusPainter(views::Painter::CreateSolidFocusPainter(
      kFocusBorderColor,
      gfx::Insets(1, 2, 2, 2)));
}

gfx::Size NotificationCenterButton::GetPreferredSize() const { return size_; }

// MessageCenterButtonBar /////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
MessageCenterButtonBar::MessageCenterButtonBar(
    MessageCenterView* message_center_view,
    MessageCenter* message_center,
    NotifierSettingsProvider* notifier_settings_provider,
    bool settings_initially_visible,
    const base::string16& title)
    : message_center_view_(message_center_view),
      message_center_(message_center),
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
      close_bubble_button_(NULL),
#endif
      title_arrow_(NULL),
      notification_label_(NULL),
      button_container_(NULL),
      close_all_button_(NULL),
      settings_button_(NULL),
      quiet_mode_button_(NULL) {
  SetPaintToLayer();
  set_background(
      views::Background::CreateSolidBackground(kMessageCenterBackgroundColor));

  ui::ResourceBundle& resource_bundle = ui::ResourceBundle::GetSharedInstance();

  title_arrow_ = new NotificationCenterButton(this,
                                              IDR_NOTIFICATION_ARROW,
                                              IDR_NOTIFICATION_ARROW_HOVER,
                                              IDR_NOTIFICATION_ARROW_PRESSED,
                                              0);
  title_arrow_->set_size(gfx::Size(kButtonSize, kButtonSize));

  // Keyboardists can use the gear button to switch modes.
  title_arrow_->SetFocusBehavior(FocusBehavior::NEVER);
  AddChildView(title_arrow_);

  notification_label_ = new views::Label(title);
  notification_label_->SetAutoColorReadabilityEnabled(false);
  notification_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
  notification_label_->SetEnabledColor(kRegularTextColor);
  AddChildView(notification_label_);

  button_container_ = new views::View;
  button_container_->SetLayoutManager(
      new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
  quiet_mode_button_ = new NotificationCenterButton(
      this,
      IDR_NOTIFICATION_DO_NOT_DISTURB,
      IDR_NOTIFICATION_DO_NOT_DISTURB_HOVER,
      IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED,
      IDS_MESSAGE_CENTER_QUIET_MODE_BUTTON_TOOLTIP);
  quiet_mode_button_->SetToggledImage(
      views::Button::STATE_NORMAL,
      resource_bundle.GetImageSkiaNamed(
          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
  quiet_mode_button_->SetToggledImage(
      views::Button::STATE_HOVERED,
      resource_bundle.GetImageSkiaNamed(
          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
  quiet_mode_button_->SetToggledImage(
      views::Button::STATE_PRESSED,
      resource_bundle.GetImageSkiaNamed(
          IDR_NOTIFICATION_DO_NOT_DISTURB_PRESSED));
  quiet_mode_button_->SetToggled(message_center->IsQuietMode());
  button_container_->AddChildView(quiet_mode_button_);

  close_all_button_ =
      new NotificationCenterButton(this,
                                   IDR_NOTIFICATION_CLEAR_ALL,
                                   IDR_NOTIFICATION_CLEAR_ALL_HOVER,
                                   IDR_NOTIFICATION_CLEAR_ALL_PRESSED,
                                   IDS_MESSAGE_CENTER_CLEAR_ALL);
  close_all_button_->SetImage(
      views::Button::STATE_DISABLED,
      *resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_CLEAR_ALL_DISABLED));
  button_container_->AddChildView(close_all_button_);

  settings_button_ =
      new NotificationCenterButton(this,
                                   IDR_NOTIFICATION_SETTINGS,
                                   IDR_NOTIFICATION_SETTINGS_HOVER,
                                   IDR_NOTIFICATION_SETTINGS_PRESSED,
                                   IDS_MESSAGE_CENTER_SETTINGS_BUTTON_LABEL);
  button_container_->AddChildView(settings_button_);

#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
  close_bubble_button_ = new views::ImageButton(this);
  close_bubble_button_->SetImage(
      views::Button::STATE_NORMAL,
      resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE));
  close_bubble_button_->SetImage(
      views::Button::STATE_HOVERED,
      resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE_HOVER));
  close_bubble_button_->SetImage(
      views::Button::STATE_PRESSED,
      resource_bundle.GetImageSkiaNamed(IDR_NOTIFICATION_BUBBLE_CLOSE_PRESSED));
  AddChildView(close_bubble_button_);
#endif

  SetCloseAllButtonEnabled(!settings_initially_visible);
  SetBackArrowVisible(settings_initially_visible);
  ViewVisibilityChanged();
}

void MessageCenterButtonBar::ViewVisibilityChanged() {
  gfx::ImageSkia* settings_image =
      ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
          IDR_NOTIFICATION_SETTINGS);
  int image_margin = std::max(0, (kButtonSize - settings_image->width()) / 2);
  views::GridLayout* layout = new views::GridLayout(this);
  SetLayoutManager(layout);
  layout->SetInsets(kFooterTopMargin,
                    kFooterLeftMargin,
                    kFooterBottomMargin,
                    std::max(0, kFooterRightMargin - image_margin));
  views::ColumnSet* column = layout->AddColumnSet(0);
  if (title_arrow_->visible()) {
    // Column for the left-arrow used to back out of settings.
    column->AddColumn(views::GridLayout::LEADING,
                      views::GridLayout::CENTER,
                      0.0f,
                      views::GridLayout::FIXED,
                      kButtonSize,
                      0);
  } else {
    column->AddPaddingColumn(0.0f, kLeftPaddingWidthForNonArrows);
  }

  // Column for the label "Notifications".
  column->AddColumn(views::GridLayout::LEADING,
                    views::GridLayout::CENTER,
                    0.0f,
                    views::GridLayout::USE_PREF,
                    0,
                    0);

  // Fills in the remaining space between "Notifications" and buttons.
  column->AddPaddingColumn(1.0f, image_margin);

  // The button area column.
  column->AddColumn(views::GridLayout::LEADING,
                    views::GridLayout::CENTER,
                    0.0f,
                    views::GridLayout::USE_PREF,
                    0,
                    0);

#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
  // The close-bubble button.
  column->AddColumn(views::GridLayout::LEADING,
                    views::GridLayout::LEADING,
                    0.0f,
                    views::GridLayout::USE_PREF,
                    0,
                    0);
#endif

  layout->StartRow(0, 0, kButtonSize);
  if (title_arrow_->visible())
    layout->AddView(title_arrow_);
  layout->AddView(notification_label_);
  layout->AddView(button_container_);
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
  layout->AddView(close_bubble_button_);
#endif
}

MessageCenterButtonBar::~MessageCenterButtonBar() {}

void MessageCenterButtonBar::SetSettingsAndQuietModeButtonsEnabled(
    bool enabled) {
  settings_button_->SetEnabled(enabled);
  quiet_mode_button_->SetEnabled(enabled);
}

void MessageCenterButtonBar::SetCloseAllButtonEnabled(bool enabled) {
  if (close_all_button_)
    close_all_button_->SetEnabled(enabled);
}

views::Button* MessageCenterButtonBar::GetCloseAllButtonForTest() const {
  return close_all_button_;
}

views::Button* MessageCenterButtonBar::GetQuietModeButtonForTest() const {
  return quiet_mode_button_;
}

views::Button* MessageCenterButtonBar::GetSettingsButtonForTest() const {
  return settings_button_;
}

void MessageCenterButtonBar::SetBackArrowVisible(bool visible) {
  if (title_arrow_)
    title_arrow_->SetVisible(visible);
  ViewVisibilityChanged();
  Layout();
}

void MessageCenterButtonBar::SetTitle(const base::string16& title) {
  notification_label_->SetText(title);
}

void MessageCenterButtonBar::SetButtonsVisible(bool visible) {
  settings_button_->SetVisible(visible);
  quiet_mode_button_->SetVisible(visible);

  if (close_all_button_)
    close_all_button_->SetVisible(visible);

  ViewVisibilityChanged();
  Layout();
}

void MessageCenterButtonBar::ChildVisibilityChanged(views::View* child) {
  InvalidateLayout();
}

void MessageCenterButtonBar::ButtonPressed(views::Button* sender,
                                           const ui::Event& event) {
  if (sender == close_all_button_) {
    message_center_view()->ClearAllClosableNotifications();
  } else if (sender == settings_button_ || sender == title_arrow_) {
    MessageCenterView* center_view = message_center_view();
    center_view->SetSettingsVisible(!center_view->settings_visible());
  } else if (sender == quiet_mode_button_) {
    if (message_center()->IsQuietMode())
      message_center()->SetQuietMode(false);
    else
      message_center()->EnterQuietModeWithExpire(base::TimeDelta::FromDays(1));
    quiet_mode_button_->SetToggled(message_center()->IsQuietMode());
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
  } else if (sender == close_bubble_button_) {
    message_center_view()->tray()->HideMessageCenterBubble();
#endif
  } else {
    NOTREACHED();
  }
}

}  // namespace message_center
