1 // Copyright 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "ash/system/tray/hover_highlight_view.h" 6 7 #include "ash/system/tray/fixed_sized_image_view.h" 8 #include "ash/system/tray/tray_constants.h" 9 #include "ash/system/tray/view_click_listener.h" 10 #include "grit/ui_resources.h" 11 #include "ui/base/accessibility/accessible_view_state.h" 12 #include "ui/base/resource/resource_bundle.h" 13 #include "ui/gfx/canvas.h" 14 #include "ui/views/border.h" 15 #include "ui/views/controls/image_view.h" 16 #include "ui/views/controls/label.h" 17 #include "ui/views/layout/box_layout.h" 18 #include "ui/views/layout/fill_layout.h" 19 20 namespace { 21 22 const int kCheckLabelPadding = 4; 23 24 } // namespace 25 26 namespace ash { 27 namespace internal { 28 29 HoverHighlightView::HoverHighlightView(ViewClickListener* listener) 30 : listener_(listener), 31 text_label_(NULL), 32 highlight_color_(kHoverBackgroundColor), 33 default_color_(0), 34 text_highlight_color_(0), 35 text_default_color_(0), 36 hover_(false), 37 expandable_(false), 38 checkable_(false), 39 checked_(false) { 40 set_notify_enter_exit_on_child(true); 41 } 42 43 HoverHighlightView::~HoverHighlightView() { 44 } 45 46 void HoverHighlightView::AddIconAndLabel(const gfx::ImageSkia& image, 47 const base::string16& text, 48 gfx::Font::FontStyle style) { 49 SetLayoutManager(new views::BoxLayout( 50 views::BoxLayout::kHorizontal, 0, 3, kTrayPopupPaddingBetweenItems)); 51 views::ImageView* image_view = 52 new FixedSizedImageView(kTrayPopupDetailsIconWidth, 0); 53 image_view->SetImage(image); 54 AddChildView(image_view); 55 56 text_label_ = new views::Label(text); 57 text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 58 text_label_->SetFont(text_label_->font().DeriveFont(0, style)); 59 if (text_default_color_) 60 text_label_->SetEnabledColor(text_default_color_); 61 AddChildView(text_label_); 62 63 SetAccessibleName(text); 64 } 65 66 views::Label* HoverHighlightView::AddLabel(const base::string16& text, 67 gfx::Font::FontStyle style) { 68 SetLayoutManager(new views::FillLayout()); 69 text_label_ = new views::Label(text); 70 int margin = kTrayPopupPaddingHorizontal + 71 kTrayPopupDetailsLabelExtraLeftMargin; 72 int left_margin = 0; 73 int right_margin = 0; 74 if (base::i18n::IsRTL()) 75 right_margin = margin; 76 else 77 left_margin = margin; 78 text_label_->set_border( 79 views::Border::CreateEmptyBorder(5, left_margin, 5, right_margin)); 80 text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 81 text_label_->SetFont(text_label_->font().DeriveFont(0, style)); 82 // Do not set alpha value in disable color. It will have issue with elide 83 // blending filter in disabled state for rendering label text color. 84 text_label_->SetDisabledColor(SkColorSetARGB(255, 127, 127, 127)); 85 if (text_default_color_) 86 text_label_->SetEnabledColor(text_default_color_); 87 AddChildView(text_label_); 88 89 SetAccessibleName(text); 90 return text_label_; 91 } 92 93 views::Label* HoverHighlightView::AddCheckableLabel(const base::string16& text, 94 gfx::Font::FontStyle style, 95 bool checked) { 96 checkable_ = true; 97 checked_ = checked; 98 if (checked) { 99 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 100 const gfx::ImageSkia* check = 101 rb.GetImageNamed(IDR_MENU_CHECK).ToImageSkia(); 102 int margin = kTrayPopupPaddingHorizontal + 103 kTrayPopupDetailsLabelExtraLeftMargin - kCheckLabelPadding; 104 SetLayoutManager(new views::BoxLayout( 105 views::BoxLayout::kHorizontal, 0, 3, kCheckLabelPadding)); 106 views::ImageView* image_view = new FixedSizedImageView(margin, 0); 107 image_view->SetImage(check); 108 image_view->SetHorizontalAlignment(views::ImageView::TRAILING); 109 AddChildView(image_view); 110 111 text_label_ = new views::Label(text); 112 text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 113 text_label_->SetFont(text_label_->font().DeriveFont(0, style)); 114 text_label_->SetDisabledColor(SkColorSetARGB(127, 0, 0, 0)); 115 if (text_default_color_) 116 text_label_->SetEnabledColor(text_default_color_); 117 AddChildView(text_label_); 118 119 SetAccessibleName(text); 120 return text_label_; 121 } 122 return AddLabel(text, style); 123 } 124 125 void HoverHighlightView::SetExpandable(bool expandable) { 126 if (expandable != expandable_) { 127 expandable_ = expandable; 128 InvalidateLayout(); 129 } 130 } 131 132 bool HoverHighlightView::PerformAction(const ui::Event& event) { 133 if (!listener_) 134 return false; 135 listener_->OnViewClicked(this); 136 return true; 137 } 138 139 void HoverHighlightView::GetAccessibleState(ui::AccessibleViewState* state) { 140 ActionableView::GetAccessibleState(state); 141 142 if (checkable_) { 143 state->role = ui::AccessibilityTypes::ROLE_CHECKBUTTON; 144 state->state = checked_ ? ui::AccessibilityTypes::STATE_CHECKED : 0; 145 } 146 } 147 148 gfx::Size HoverHighlightView::GetPreferredSize() { 149 gfx::Size size = ActionableView::GetPreferredSize(); 150 if (!expandable_ || size.height() < kTrayPopupItemHeight) 151 size.set_height(kTrayPopupItemHeight); 152 return size; 153 } 154 155 int HoverHighlightView::GetHeightForWidth(int width) { 156 return GetPreferredSize().height(); 157 } 158 159 void HoverHighlightView::OnMouseEntered(const ui::MouseEvent& event) { 160 hover_ = true; 161 if (text_highlight_color_ && text_label_) 162 text_label_->SetEnabledColor(text_highlight_color_); 163 SchedulePaint(); 164 } 165 166 void HoverHighlightView::OnMouseExited(const ui::MouseEvent& event) { 167 hover_ = false; 168 if (text_default_color_ && text_label_) 169 text_label_->SetEnabledColor(text_default_color_); 170 SchedulePaint(); 171 } 172 173 void HoverHighlightView::OnEnabledChanged() { 174 for (int i = 0; i < child_count(); ++i) 175 child_at(i)->SetEnabled(enabled()); 176 } 177 178 void HoverHighlightView::OnPaintBackground(gfx::Canvas* canvas) { 179 canvas->DrawColor(hover_ ? highlight_color_ : default_color_); 180 } 181 182 void HoverHighlightView::OnFocus() { 183 ScrollRectToVisible(gfx::Rect(gfx::Point(), size())); 184 ActionableView::OnFocus(); 185 } 186 187 } // namespace internal 188 } // namespace ash 189