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" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_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) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayItemMore::TrayItemMore(SystemTrayItem* owner, bool show_more) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : owner_(owner), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) show_more_(show_more), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_(NULL), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_(NULL), 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_(NULL) { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTrayPopupPaddingHorizontal, 0, kTrayPopupPaddingBetweenItems)); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_ = new FixedSizedImageView(0, kTrayPopupItemHeight); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(icon_); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_ = new views::Label; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(label_); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (show_more) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_ = new views::ImageView; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_->EnableCanvasFlippingForRTLUI(true); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageNamed( 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDR_AURA_UBER_TRAY_MORE).ToImageSkia()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(more_); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TrayItemMore::~TrayItemMore() { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TrayItemMore::SetLabel(const base::string16& label) { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_->SetText(label); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layout(); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayItemMore::SetImage(const gfx::ImageSkia* image_skia) { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_->SetImage(image_skia); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SchedulePaint(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TrayItemMore::SetAccessibleName(const base::string16& name) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) accessible_name_ = name; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayItemMore::ReplaceIcon(views::View* view) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete icon_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) icon_ = NULL; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildViewAt(view, 0); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TrayItemMore::PerformAction(const ui::Event& event) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!show_more_) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) owner()->TransitionDetailedView(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TrayItemMore::Layout() { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Let the box-layout do the layout first. Then move the '>' arrow to right 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // align. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::View::Layout(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!show_more_) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make sure the chevron always has the full size. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size = more_->GetPreferredSize(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds(size); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x(width() - size.width() - kTrayPopupPaddingBetweenItems); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_y((height() - size.height()) / 2); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) more_->SetBoundsRect(bounds); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adjust the label's bounds in case it got cut off by |more_|. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (label_->bounds().Intersects(more_->bounds())) { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = label_->bounds(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_width(more_->x() - kTrayPopupPaddingBetweenItems - label_->x()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) label_->SetBoundsRect(bounds); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void TrayItemMore::GetAccessibleState(ui::AXViewState* state) { 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) state->role = ui::AX_ROLE_BUTTON; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->name = accessible_name_; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 106