Home | History | Annotate | Download | only in tray
      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