1// Copyright (c) 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/tray_item_more.h"
6
7#include "ash/system/tray/fixed_sized_image_view.h"
8#include "ash/system/tray/system_tray_item.h"
9#include "ash/system/tray/tray_constants.h"
10#include "grit/ash_resources.h"
11#include "ui/accessibility/ax_view_state.h"
12#include "ui/base/resource/resource_bundle.h"
13#include "ui/gfx/image/image.h"
14#include "ui/views/controls/image_view.h"
15#include "ui/views/controls/label.h"
16#include "ui/views/layout/box_layout.h"
17
18namespace ash {
19
20TrayItemMore::TrayItemMore(SystemTrayItem* owner, bool show_more)
21    : owner_(owner),
22      show_more_(show_more),
23      icon_(NULL),
24      label_(NULL),
25      more_(NULL) {
26  SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
27      kTrayPopupPaddingHorizontal, 0, kTrayPopupPaddingBetweenItems));
28
29  icon_ = new FixedSizedImageView(0, kTrayPopupItemHeight);
30  AddChildView(icon_);
31
32  label_ = new views::Label;
33  label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
34  AddChildView(label_);
35
36  if (show_more) {
37    more_ = new views::ImageView;
38    more_->EnableCanvasFlippingForRTLUI(true);
39    more_->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageNamed(
40        IDR_AURA_UBER_TRAY_MORE).ToImageSkia());
41    AddChildView(more_);
42  }
43}
44
45TrayItemMore::~TrayItemMore() {
46}
47
48void TrayItemMore::SetLabel(const base::string16& label) {
49  label_->SetText(label);
50  Layout();
51  SchedulePaint();
52}
53
54void TrayItemMore::SetImage(const gfx::ImageSkia* image_skia) {
55  icon_->SetImage(image_skia);
56  SchedulePaint();
57}
58
59void TrayItemMore::SetAccessibleName(const base::string16& name) {
60  accessible_name_ = name;
61}
62
63void TrayItemMore::ReplaceIcon(views::View* view) {
64  delete icon_;
65  icon_ = NULL;
66  AddChildViewAt(view, 0);
67}
68
69bool TrayItemMore::PerformAction(const ui::Event& event) {
70  if (!show_more_)
71    return false;
72
73  owner()->TransitionDetailedView();
74  return true;
75}
76
77void TrayItemMore::Layout() {
78  // Let the box-layout do the layout first. Then move the '>' arrow to right
79  // align.
80  views::View::Layout();
81
82  if (!show_more_)
83    return;
84
85  // Make sure the chevron always has the full size.
86  gfx::Size size = more_->GetPreferredSize();
87  gfx::Rect bounds(size);
88  bounds.set_x(width() - size.width() - kTrayPopupPaddingBetweenItems);
89  bounds.set_y((height() - size.height()) / 2);
90  more_->SetBoundsRect(bounds);
91
92  // Adjust the label's bounds in case it got cut off by |more_|.
93  if (label_->bounds().Intersects(more_->bounds())) {
94    gfx::Rect bounds = label_->bounds();
95    bounds.set_width(more_->x() - kTrayPopupPaddingBetweenItems - label_->x());
96    label_->SetBoundsRect(bounds);
97  }
98}
99
100void TrayItemMore::GetAccessibleState(ui::AXViewState* state) {
101  state->role = ui::AX_ROLE_BUTTON;
102  state->name = accessible_name_;
103}
104
105}  // namespace ash
106