text: // Copyright 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/hover_highlight_view.h"
  
  #include "ash/system/tray/fixed_sized_image_view.h"
  #include "ash/system/tray/tray_constants.h"
  #include "ash/system/tray/view_click_listener.h"
  #include "ui/accessibility/ax_view_state.h"
  #include "ui/base/resource/resource_bundle.h"
  #include "ui/gfx/canvas.h"
  #include "ui/gfx/font_list.h"
  #include "ui/resources/grit/ui_resources.h"
  #include "ui/views/border.h"
  #include "ui/views/controls/image_view.h"
  #include "ui/views/controls/label.h"
  #include "ui/views/layout/box_layout.h"
  #include "ui/views/layout/fill_layout.h"
  
  namespace {
  
  const int kCheckLabelPadding = 4;
  
  }  // namespace
  
  namespace ash {
  
  HoverHighlightView::HoverHighlightView(ViewClickListener* listener)
      : listener_(listener),
        text_label_(NULL),
        highlight_color_(kHoverBackgroundColor),
        default_color_(0),
        text_highlight_color_(0),
        text_default_color_(0),
        hover_(false),
        expandable_(false),
        checkable_(false),
        checked_(false) {
    set_notify_enter_exit_on_child(true);
  }
  
  HoverHighlightView::~HoverHighlightView() {
  }
  
  void HoverHighlightView::AddIconAndLabel(const gfx::ImageSkia& image,
                                           const base::string16& text,
                                           gfx::Font::FontStyle style) {
    SetLayoutManager(new views::BoxLayout(
        views::BoxLayout::kHorizontal, 0, 3, kTrayPopupPaddingBetweenItems));
    views::ImageView* image_view =
        new FixedSizedImageView(kTrayPopupDetailsIconWidth, 0);
    image_view->SetImage(image);
    AddChildView(image_view);
  
    text_label_ = new views::Label(text);
    text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
    text_label_->SetFontList(text_label_->font_list().DeriveWithStyle(style));
    if (text_default_color_)
      text_label_->SetEnabledColor(text_default_color_);
    AddChildView(text_label_);
  
    SetAccessibleName(text);
  }
  
  views::Label* HoverHighlightView::AddLabel(const base::string16& text,
                                             gfx::HorizontalAlignment alignment,
                                             gfx::Font::FontStyle style) {
    SetLayoutManager(new views::FillLayout());
    text_label_ = new views::Label(text);
    int left_margin = kTrayPopupPaddingHorizontal;
    int right_margin = kTrayPopupPaddingHorizontal;
    if (alignment != gfx::ALIGN_CENTER) {
      if (base::i18n::IsRTL())
        right_margin += kTrayPopupDetailsLabelExtraLeftMargin;
      else
        left_margin += kTrayPopupDetailsLabelExtraLeftMargin;
    }
    text_label_->SetBorder(
        views::Border::CreateEmptyBorder(5, left_margin, 5, right_margin));
    text_label_->SetHorizontalAlignment(alignment);
    text_label_->SetFontList(text_label_->font_list().DeriveWithStyle(style));
    // Do not set alpha value in disable color. It will have issue with elide
    // blending filter in disabled state for rendering label text color.
    text_label_->SetDisabledColor(SkColorSetARGB(255, 127, 127, 127));
    if (text_default_color_)
      text_label_->SetEnabledColor(text_default_color_);
    AddChildView(text_label_);
  
    SetAccessibleName(text);
    return text_label_;
  }
  
  views::Label* HoverHighlightView::AddCheckableLabel(const base::string16& text,
                                                      gfx::Font::FontStyle style,
                                                      bool checked) {
    checkable_ = true;
    checked_ = checked;
    if (checked) {
      ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
      const gfx::ImageSkia* check =
          rb.GetImageNamed(IDR_MENU_CHECK).ToImageSkia();
      int margin = kTrayPopupPaddingHorizontal +
          kTrayPopupDetailsLabelExtraLeftMargin - kCheckLabelPadding;
      SetLayoutManager(new views::BoxLayout(
          views::BoxLayout::kHorizontal, 0, 3, kCheckLabelPadding));
      views::ImageView* image_view = new FixedSizedImageView(margin, 0);
      image_view->SetImage(check);
      image_view->SetHorizontalAlignment(views::ImageView::TRAILING);
      AddChildView(image_view);
  
      text_label_ = new views::Label(text);
      text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
      text_label_->SetFontList(text_label_->font_list().DeriveWithStyle(style));
      text_label_->SetDisabledColor(SkColorSetARGB(127, 0, 0, 0));
      if (text_default_color_)
        text_label_->SetEnabledColor(text_default_color_);
      AddChildView(text_label_);
  
      SetAccessibleName(text);
      return text_label_;
    }
    return AddLabel(text, gfx::ALIGN_LEFT, style);
  }
  
  void HoverHighlightView::SetExpandable(bool expandable) {
    if (expandable != expandable_) {
      expandable_ = expandable;
      InvalidateLayout();
    }
  }
  
  bool HoverHighlightView::PerformAction(const ui::Event& event) {
    if (!listener_)
      return false;
    listener_->OnViewClicked(this);
    return true;
  }
  
  void HoverHighlightView::GetAccessibleState(ui::AXViewState* state) {
    ActionableView::GetAccessibleState(state);
  
    if (checkable_) {
      state->role = ui::AX_ROLE_CHECK_BOX;
      if (checked_)
        state->AddStateFlag(ui::AX_STATE_CHECKED);
    }
  }
  
  gfx::Size HoverHighlightView::GetPreferredSize() const {
    gfx::Size size = ActionableView::GetPreferredSize();
    if (!expandable_ || size.height() < kTrayPopupItemHeight)
      size.set_height(kTrayPopupItemHeight);
    return size;
  }
  
  int HoverHighlightView::GetHeightForWidth(int width) const {
    return GetPreferredSize().height();
  }
  
  void HoverHighlightView::OnMouseEntered(const ui::MouseEvent& event) {
    hover_ = true;
    if (text_highlight_color_ && text_label_)
      text_label_->SetEnabledColor(text_highlight_color_);
    SchedulePaint();
  }
  
  void HoverHighlightView::OnMouseExited(const ui::MouseEvent& event) {
    hover_ = false;
    if (text_default_color_ && text_label_)
      text_label_->SetEnabledColor(text_default_color_);
    SchedulePaint();
  }
  
  void HoverHighlightView::OnEnabledChanged() {
    for (int i = 0; i < child_count(); ++i)
      child_at(i)->SetEnabled(enabled());
  }
  
  void HoverHighlightView::OnPaintBackground(gfx::Canvas* canvas) {
    canvas->DrawColor(hover_ ? highlight_color_ : default_color_);
  }
  
  void HoverHighlightView::OnFocus() {
    ScrollRectToVisible(gfx::Rect(gfx::Point(), size()));
    ActionableView::OnFocus();
  }
  
  }  // namespace ash
  