15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_item_more.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/system/tray/fixed_sized_image_view.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/system_tray_item.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/system/tray/tray_constants.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/ash_resources.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accessibility/accessible_view_state.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/image/image.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/box_layout.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayItemMore::TrayItemMore(SystemTrayItem* owner, bool show_more) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : owner_(owner), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show_more_(show_more), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_(NULL), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_(NULL), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_(NULL) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayPopupPaddingHorizontal, 0, kTrayPopupPaddingBetweenItems)); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_ = new FixedSizedImageView(0, kTrayPopupItemHeight); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(icon_); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_ = new views::Label; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(label_); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (show_more) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_ = new views::ImageView; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_->EnableCanvasFlippingForRTLUI(true); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageNamed( 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_AURA_UBER_TRAY_MORE).ToImageSkia()); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(more_); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayItemMore::~TrayItemMore() { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TrayItemMore::SetLabel(const base::string16& label) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_->SetText(label); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayItemMore::SetImage(const gfx::ImageSkia* image_skia) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->SetImage(image_skia); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TrayItemMore::SetAccessibleName(const base::string16& name) { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessible_name_ = name; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayItemMore::ReplaceIcon(views::View* view) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete icon_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_ = NULL; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildViewAt(view, 0); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayItemMore::PerformAction(const ui::Event& event) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!show_more_) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner()->TransitionDetailedView(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayItemMore::Layout() { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the box-layout do the layout first. Then move the '>' arrow to right 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // align. 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::Layout(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!show_more_) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the chevron always has the full size. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = more_->GetPreferredSize(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(size); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(width() - size.width() - kTrayPopupPaddingBetweenItems); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_y((height() - size.height()) / 2); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_->SetBoundsRect(bounds); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adjust the label's bounds in case it got cut off by |more_|. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (label_->bounds().Intersects(more_->bounds())) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = label_->bounds(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_width(more_->x() - kTrayPopupPaddingBetweenItems - label_->x()); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_->SetBoundsRect(bounds); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayItemMore::GetAccessibleState(ui::AccessibleViewState* state) { 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->role = ui::AccessibilityTypes::ROLE_PUSHBUTTON; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->name = accessible_name_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace internal 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 108