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) 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ash/session/session_state_delegate.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell/example_factory.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/shell_window_ids.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_event_dispatcher.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/font_list.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/geometry/rect.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/text_utils.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/corewm/tooltip_controller.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget_delegate.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ash::Shell; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace shell { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LockView : public views::WidgetDelegateView, 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public views::ButtonListener { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) LockView() : unlock_button_(new views::LabelButton( 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this, base::ASCIIToUTF16("Unlock"))) { 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unlock_button_->SetStyle(views::Button::STYLE_BUTTON); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddChildView(unlock_button_); 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unlock_button_->SetFocusable(true); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~LockView() {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View: 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(500, 400); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::View: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->FillRect(GetLocalBounds(), SK_ColorYELLOW); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text = base::ASCIIToUTF16("LOCKED!"); 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int string_width = gfx::GetStringWidth(text, font_list_); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) canvas->DrawStringRect(text, font_list_, SK_ColorRED, 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Rect((width() - string_width)/ 2, 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (height() - font_list_.GetHeight()) / 2, 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) string_width, font_list_.GetHeight())); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Layout() OVERRIDE { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = GetLocalBounds(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size ps = unlock_button_->GetPreferredSize(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_y(bounds.bottom() - ps.height() - 5); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_x((bounds.width() - ps.width()) / 2); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_size(ps); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unlock_button_->SetBoundsRect(bounds); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 61a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual void ViewHierarchyChanged( 62a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ViewHierarchyChangedDetails& details) OVERRIDE { 63a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (details.is_add && details.child == this) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unlock_button_->RequestFocus(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::WidgetDelegateView: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WindowClosing() OVERRIDE { 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) Shell::GetInstance()->session_state_delegate()->UnlockScreen(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from views::ButtonListener: 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ButtonPressed(views::Button* sender, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event) OVERRIDE { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(sender == unlock_button_); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->Close(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::FontList font_list_; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::LabelButton* unlock_button_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(LockView); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CreateLockScreen() { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LockView* lock_view = new LockView; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* widget = new views::Widget; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams params( 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size ps = lock_view->GetPreferredSize(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size root_window_size = Shell::GetPrimaryRootWindow()->bounds().size(); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect((root_window_size.width() - ps.width()) / 2, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (root_window_size.height() - ps.height()) / 2, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ps.width(), ps.height()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.delegate = lock_view; 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch params.parent = Shell::GetContainer(Shell::GetPrimaryRootWindow(), 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch kShellWindowId_LockScreenContainer); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Init(params); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->SetContentsView(lock_view); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->Show(); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetNativeView()->SetName("LockView"); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetNativeView()->Focus(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO: it shouldn't be necessary to invoke UpdateTooltip() here. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Shell::GetInstance()->tooltip_controller()->UpdateTooltip( 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget->GetNativeView()); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace shell 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 112