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 18 namespace ash { 19 20 TrayItemMore::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 45 TrayItemMore::~TrayItemMore() { 46 } 47 48 void TrayItemMore::SetLabel(const base::string16& label) { 49 label_->SetText(label); 50 Layout(); 51 SchedulePaint(); 52 } 53 54 void TrayItemMore::SetImage(const gfx::ImageSkia* image_skia) { 55 icon_->SetImage(image_skia); 56 SchedulePaint(); 57 } 58 59 void TrayItemMore::SetAccessibleName(const base::string16& name) { 60 accessible_name_ = name; 61 } 62 63 void TrayItemMore::ReplaceIcon(views::View* view) { 64 delete icon_; 65 icon_ = NULL; 66 AddChildViewAt(view, 0); 67 } 68 69 bool TrayItemMore::PerformAction(const ui::Event& event) { 70 if (!show_more_) 71 return false; 72 73 owner()->TransitionDetailedView(); 74 return true; 75 } 76 77 void 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 100 void TrayItemMore::GetAccessibleState(ui::AXViewState* state) { 101 state->role = ui::AX_ROLE_BUTTON; 102 state->name = accessible_name_; 103 } 104 105 } // namespace ash 106