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