Home | History | Annotate | Download | only in tray
      1 // Copyright (c) 2013 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/special_popup_row.h"
      6 
      7 #include "ash/system/tray/hover_highlight_view.h"
      8 #include "ash/system/tray/throbber_view.h"
      9 #include "ash/system/tray/tray_constants.h"
     10 #include "ash/system/tray/tray_popup_header_button.h"
     11 #include "grit/ash_resources.h"
     12 #include "grit/ash_strings.h"
     13 #include "ui/base/resource/resource_bundle.h"
     14 #include "ui/gfx/canvas.h"
     15 #include "ui/gfx/rect.h"
     16 #include "ui/views/background.h"
     17 #include "ui/views/border.h"
     18 #include "ui/views/layout/box_layout.h"
     19 #include "ui/views/painter.h"
     20 
     21 namespace ash {
     22 namespace {
     23 
     24 const int kIconPaddingLeft = 5;
     25 const int kSpecialPopupRowHeight = 55;
     26 const int kBorderHeight = 1;
     27 const SkColor kBorderColor = SkColorSetRGB(0xaa, 0xaa, 0xaa);
     28 
     29 views::View* CreatePopupHeaderButtonsContainer() {
     30   views::View* view = new views::View;
     31   view->SetLayoutManager(new
     32       views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, -1));
     33   view->SetBorder(views::Border::CreateEmptyBorder(0, 0, 0, 5));
     34   return view;
     35 }
     36 
     37 }  // namespace
     38 
     39 SpecialPopupRow::SpecialPopupRow()
     40     : content_(NULL),
     41       button_container_(NULL) {
     42   set_background(views::Background::CreateSolidBackground(
     43       kHeaderBackgroundColor));
     44   SetBorder(views::Border::CreateSolidSidedBorder(
     45       kBorderHeight, 0, 0, 0, kBorderColor));
     46   SetLayoutManager(
     47       new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0));
     48 }
     49 
     50 SpecialPopupRow::~SpecialPopupRow() {
     51 }
     52 
     53 void SpecialPopupRow::SetTextLabel(int string_id, ViewClickListener* listener) {
     54   ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
     55   HoverHighlightView* container = new HoverHighlightView(listener);
     56   container->SetLayoutManager(new
     57       views::BoxLayout(views::BoxLayout::kHorizontal, 0, 3, kIconPaddingLeft));
     58 
     59   container->set_highlight_color(SkColorSetARGB(0, 0, 0, 0));
     60   container->set_default_color(SkColorSetARGB(0, 0, 0, 0));
     61   container->set_text_highlight_color(kHeaderTextColorHover);
     62   container->set_text_default_color(kHeaderTextColorNormal);
     63 
     64   container->AddIconAndLabel(
     65       *rb.GetImageNamed(IDR_AURA_UBER_TRAY_LESS).ToImageSkia(),
     66       rb.GetLocalizedString(string_id),
     67       gfx::Font::BOLD);
     68 
     69   container->SetBorder(
     70       views::Border::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 0));
     71 
     72   container->SetAccessibleName(
     73       rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_PREVIOUS_MENU));
     74   SetContent(container);
     75 }
     76 
     77 void SpecialPopupRow::SetContent(views::View* view) {
     78   CHECK(!content_);
     79   content_ = view;
     80   AddChildViewAt(content_, 0);
     81 }
     82 
     83 void SpecialPopupRow::AddButton(TrayPopupHeaderButton* button) {
     84   if (!button_container_) {
     85     button_container_ = CreatePopupHeaderButtonsContainer();
     86     AddChildView(button_container_);
     87   }
     88   button_container_->AddChildView(button);
     89 }
     90 
     91 void SpecialPopupRow::AddThrobber(ThrobberView* throbber) {
     92   if (!button_container_) {
     93     button_container_ = CreatePopupHeaderButtonsContainer();
     94     AddChildView(button_container_);
     95   }
     96   button_container_->AddChildView(throbber);
     97 }
     98 
     99 gfx::Size SpecialPopupRow::GetPreferredSize() const {
    100   gfx::Size size = views::View::GetPreferredSize();
    101   size.set_height(kSpecialPopupRowHeight);
    102   return size;
    103 }
    104 
    105 int SpecialPopupRow::GetHeightForWidth(int width) const {
    106   return kSpecialPopupRowHeight;
    107 }
    108 
    109 void SpecialPopupRow::Layout() {
    110   views::View::Layout();
    111   gfx::Rect content_bounds = GetContentsBounds();
    112   if (content_bounds.IsEmpty())
    113     return;
    114   if (!button_container_) {
    115     content_->SetBoundsRect(GetContentsBounds());
    116     return;
    117   }
    118 
    119   gfx::Rect bounds(button_container_->GetPreferredSize());
    120   bounds.set_height(content_bounds.height());
    121   gfx::Rect container_bounds = content_bounds;
    122   container_bounds.ClampToCenteredSize(bounds.size());
    123   container_bounds.set_x(content_bounds.width() - container_bounds.width());
    124   button_container_->SetBoundsRect(container_bounds);
    125 
    126   bounds = content_->bounds();
    127   bounds.set_width(button_container_->x());
    128   content_->SetBoundsRect(bounds);
    129 }
    130 
    131 }  // namespace ash
    132