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