Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / ash / system / tray / hover_highlight_view.cc
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/accessibility/ax_view_state.h"
12 #include "ui/base/resource/resource_bundle.h"
13 #include "ui/gfx/canvas.h"
14 #include "ui/gfx/font_list.h"
15 #include "ui/views/border.h"
16 #include "ui/views/controls/image_view.h"
17 #include "ui/views/controls/label.h"
18 #include "ui/views/layout/box_layout.h"
19 #include "ui/views/layout/fill_layout.h"
20
21 namespace {
22
23 const int kCheckLabelPadding = 4;
24
25 }  // namespace
26
27 namespace ash {
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_->SetFontList(text_label_->font_list().DeriveWithStyle(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::HorizontalAlignment alignment,
68                                            gfx::Font::FontStyle style) {
69   SetLayoutManager(new views::FillLayout());
70   text_label_ = new views::Label(text);
71   int left_margin = kTrayPopupPaddingHorizontal;
72   int right_margin = kTrayPopupPaddingHorizontal;
73   if (alignment != gfx::ALIGN_CENTER) {
74     if (base::i18n::IsRTL())
75       right_margin += kTrayPopupDetailsLabelExtraLeftMargin;
76     else
77       left_margin += kTrayPopupDetailsLabelExtraLeftMargin;
78   }
79   text_label_->SetBorder(
80       views::Border::CreateEmptyBorder(5, left_margin, 5, right_margin));
81   text_label_->SetHorizontalAlignment(alignment);
82   text_label_->SetFontList(text_label_->font_list().DeriveWithStyle(style));
83   // Do not set alpha value in disable color. It will have issue with elide
84   // blending filter in disabled state for rendering label text color.
85   text_label_->SetDisabledColor(SkColorSetARGB(255, 127, 127, 127));
86   if (text_default_color_)
87     text_label_->SetEnabledColor(text_default_color_);
88   AddChildView(text_label_);
89
90   SetAccessibleName(text);
91   return text_label_;
92 }
93
94 views::Label* HoverHighlightView::AddCheckableLabel(const base::string16& text,
95                                                     gfx::Font::FontStyle style,
96                                                     bool checked) {
97   checkable_ = true;
98   checked_ = checked;
99   if (checked) {
100     ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
101     const gfx::ImageSkia* check =
102         rb.GetImageNamed(IDR_MENU_CHECK).ToImageSkia();
103     int margin = kTrayPopupPaddingHorizontal +
104         kTrayPopupDetailsLabelExtraLeftMargin - kCheckLabelPadding;
105     SetLayoutManager(new views::BoxLayout(
106         views::BoxLayout::kHorizontal, 0, 3, kCheckLabelPadding));
107     views::ImageView* image_view = new FixedSizedImageView(margin, 0);
108     image_view->SetImage(check);
109     image_view->SetHorizontalAlignment(views::ImageView::TRAILING);
110     AddChildView(image_view);
111
112     text_label_ = new views::Label(text);
113     text_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
114     text_label_->SetFontList(text_label_->font_list().DeriveWithStyle(style));
115     text_label_->SetDisabledColor(SkColorSetARGB(127, 0, 0, 0));
116     if (text_default_color_)
117       text_label_->SetEnabledColor(text_default_color_);
118     AddChildView(text_label_);
119
120     SetAccessibleName(text);
121     return text_label_;
122   }
123   return AddLabel(text, gfx::ALIGN_LEFT, style);
124 }
125
126 void HoverHighlightView::SetExpandable(bool expandable) {
127   if (expandable != expandable_) {
128     expandable_ = expandable;
129     InvalidateLayout();
130   }
131 }
132
133 bool HoverHighlightView::PerformAction(const ui::Event& event) {
134   if (!listener_)
135     return false;
136   listener_->OnViewClicked(this);
137   return true;
138 }
139
140 void HoverHighlightView::GetAccessibleState(ui::AXViewState* state) {
141   ActionableView::GetAccessibleState(state);
142
143   if (checkable_) {
144     state->role = ui::AX_ROLE_CHECK_BOX;
145     if (checked_)
146       state->AddStateFlag(ui::AX_STATE_CHECKED);
147   }
148 }
149
150 gfx::Size HoverHighlightView::GetPreferredSize() {
151   gfx::Size size = ActionableView::GetPreferredSize();
152   if (!expandable_ || size.height() < kTrayPopupItemHeight)
153     size.set_height(kTrayPopupItemHeight);
154   return size;
155 }
156
157 int HoverHighlightView::GetHeightForWidth(int width) {
158   return GetPreferredSize().height();
159 }
160
161 void HoverHighlightView::OnMouseEntered(const ui::MouseEvent& event) {
162   hover_ = true;
163   if (text_highlight_color_ && text_label_)
164     text_label_->SetEnabledColor(text_highlight_color_);
165   SchedulePaint();
166 }
167
168 void HoverHighlightView::OnMouseExited(const ui::MouseEvent& event) {
169   hover_ = false;
170   if (text_default_color_ && text_label_)
171     text_label_->SetEnabledColor(text_default_color_);
172   SchedulePaint();
173 }
174
175 void HoverHighlightView::OnEnabledChanged() {
176   for (int i = 0; i < child_count(); ++i)
177     child_at(i)->SetEnabled(enabled());
178 }
179
180 void HoverHighlightView::OnPaintBackground(gfx::Canvas* canvas) {
181   canvas->DrawColor(hover_ ? highlight_color_ : default_color_);
182 }
183
184 void HoverHighlightView::OnFocus() {
185   ScrollRectToVisible(gfx::Rect(gfx::Point(), size()));
186   ActionableView::OnFocus();
187 }
188
189 }  // namespace ash