// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ash/system/tray/special_popup_row.h" #include "ash/system/tray/hover_highlight_view.h" #include "ash/system/tray/throbber_view.h" #include "ash/system/tray/tray_constants.h" #include "ash/system/tray/tray_popup_header_button.h" #include "grit/ash_resources.h" #include "grit/ash_strings.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/canvas.h" #include "ui/gfx/rect.h" #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/layout/box_layout.h" #include "ui/views/painter.h" namespace ash { namespace { const int kIconPaddingLeft = 5; const int kSpecialPopupRowHeight = 55; const int kBorderHeight = 1; const SkColor kBorderColor = SkColorSetRGB(0xaa, 0xaa, 0xaa); views::View* CreatePopupHeaderButtonsContainer() { views::View* view = new views::View; view->SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, -1)); view->SetBorder(views::Border::CreateEmptyBorder(0, 0, 0, 5)); return view; } } // namespace SpecialPopupRow::SpecialPopupRow() : content_(NULL), button_container_(NULL) { set_background(views::Background::CreateSolidBackground( kHeaderBackgroundColor)); SetBorder(views::Border::CreateSolidSidedBorder( kBorderHeight, 0, 0, 0, kBorderColor)); SetLayoutManager( new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0)); } SpecialPopupRow::~SpecialPopupRow() { } void SpecialPopupRow::SetTextLabel(int string_id, ViewClickListener* listener) { ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); HoverHighlightView* container = new HoverHighlightView(listener); container->SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 3, kIconPaddingLeft)); container->set_highlight_color(SkColorSetARGB(0, 0, 0, 0)); container->set_default_color(SkColorSetARGB(0, 0, 0, 0)); container->set_text_highlight_color(kHeaderTextColorHover); container->set_text_default_color(kHeaderTextColorNormal); container->AddIconAndLabel( *rb.GetImageNamed(IDR_AURA_UBER_TRAY_LESS).ToImageSkia(), rb.GetLocalizedString(string_id), gfx::Font::BOLD); container->SetBorder( views::Border::CreateEmptyBorder(0, kTrayPopupPaddingHorizontal, 0, 0)); container->SetAccessibleName( rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_PREVIOUS_MENU)); SetContent(container); } void SpecialPopupRow::SetContent(views::View* view) { CHECK(!content_); content_ = view; AddChildViewAt(content_, 0); } void SpecialPopupRow::AddButton(TrayPopupHeaderButton* button) { if (!button_container_) { button_container_ = CreatePopupHeaderButtonsContainer(); AddChildView(button_container_); } button_container_->AddChildView(button); } void SpecialPopupRow::AddThrobber(ThrobberView* throbber) { if (!button_container_) { button_container_ = CreatePopupHeaderButtonsContainer(); AddChildView(button_container_); } button_container_->AddChildView(throbber); } gfx::Size SpecialPopupRow::GetPreferredSize() const { gfx::Size size = views::View::GetPreferredSize(); size.set_height(kSpecialPopupRowHeight); return size; } int SpecialPopupRow::GetHeightForWidth(int width) const { return kSpecialPopupRowHeight; } void SpecialPopupRow::Layout() { views::View::Layout(); gfx::Rect content_bounds = GetContentsBounds(); if (content_bounds.IsEmpty()) return; if (!button_container_) { content_->SetBoundsRect(GetContentsBounds()); return; } gfx::Rect bounds(button_container_->GetPreferredSize()); bounds.set_height(content_bounds.height()); gfx::Rect container_bounds = content_bounds; container_bounds.ClampToCenteredSize(bounds.size()); container_bounds.set_x(content_bounds.width() - container_bounds.width()); button_container_->SetBoundsRect(container_bounds); bounds = content_->bounds(); bounds.set_width(button_container_->x()); content_->SetBoundsRect(bounds); } } // namespace ash