1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_VIEW_SCREEN_H_ 6 #define CHROME_BROWSER_CHROMEOS_LOGIN_VIEW_SCREEN_H_ 7 #pragma once 8 9 #include "base/message_loop.h" 10 #include "chrome/browser/chromeos/login/helper.h" 11 #include "chrome/browser/chromeos/login/wizard_screen.h" 12 #include "ui/gfx/size.h" 13 14 template <class V> 15 class ViewScreen : public WizardScreen { 16 public: 17 // Create screen with default size. 18 explicit ViewScreen(WizardScreenDelegate* delegate); 19 20 // Create screen with the specified size. 21 ViewScreen(WizardScreenDelegate* delegate, int width, int height); 22 virtual ~ViewScreen(); 23 24 // Overridden from WizardScreen: 25 virtual void Show(); 26 virtual void Hide(); 27 virtual gfx::Size GetScreenSize() const { return size_; } 28 29 V* view() { return view_; } 30 31 protected: 32 // Creates view object and adds it to views hierarchy. 33 virtual void CreateView(); 34 // Creates view object. 35 virtual V* AllocateView() = 0; 36 37 // Refresh screen state. 38 virtual void Refresh() {} 39 40 private: 41 // For testing automation 42 friend class AutomationProvider; 43 44 V* view_; 45 46 // Size of the screen. 47 gfx::Size size_; 48 49 DISALLOW_COPY_AND_ASSIGN(ViewScreen); 50 }; 51 52 template <class V> 53 class DefaultViewScreen : public ViewScreen<V> { 54 public: 55 explicit DefaultViewScreen(WizardScreenDelegate* delegate) 56 : ViewScreen<V>(delegate) {} 57 DefaultViewScreen(WizardScreenDelegate* delegate, int width, int height) 58 : ViewScreen<V>(delegate, width, height) {} 59 V* AllocateView() { 60 return new V(ViewScreen<V>::delegate()->GetObserver(this)); 61 } 62 }; 63 64 /////////////////////////////////////////////////////////////////////////////// 65 // ViewScreen, public: 66 template <class V> 67 ViewScreen<V>::ViewScreen(WizardScreenDelegate* delegate) 68 : WizardScreen(delegate), 69 view_(NULL), 70 size_(chromeos::login::kWizardScreenWidth, 71 chromeos::login::kWizardScreenHeight) { 72 } 73 74 template <class V> 75 ViewScreen<V>::ViewScreen(WizardScreenDelegate* delegate, int width, int height) 76 : WizardScreen(delegate), 77 view_(NULL), 78 size_(width, height) { 79 } 80 81 template <class V> 82 ViewScreen<V>::~ViewScreen() { 83 // Delete the view now. So we do not worry the View outlives its 84 // controller. 85 if (view_) { 86 delete view_; 87 view_ = NULL; 88 } 89 } 90 91 /////////////////////////////////////////////////////////////////////////////// 92 // ViewScreen, WizardScreen implementation: 93 template <class V> 94 void ViewScreen<V>::Show() { 95 if (!view_) { 96 CreateView(); 97 } 98 view_->SetVisible(true); 99 // After screen is initialized and shown refresh its model. 100 // Refresh() is called after SetVisible(true) because screen handler 101 // could exit right away. 102 Refresh(); 103 } 104 105 template <class V> 106 void ViewScreen<V>::Hide() { 107 if (view_) { 108 delegate()->GetWizardView()->RemoveChildView(view_); 109 // RemoveChildView doesn't delete the view and we also can't delete it here 110 // becuase we are in message processing for the view. 111 MessageLoop::current()->DeleteSoon(FROM_HERE, view_); 112 view_ = NULL; 113 } 114 } 115 116 /////////////////////////////////////////////////////////////////////////////// 117 // ViewScreen, protected: 118 template <class V> 119 void ViewScreen<V>::CreateView() { 120 view_ = AllocateView(); 121 view_->set_parent_owned(false); // ViewScreen owns the view. 122 delegate()->GetWizardView()->AddChildView(view_); 123 view_->Init(); 124 view_->SetVisible(false); 125 } 126 127 #endif // CHROME_BROWSER_CHROMEOS_LOGIN_VIEW_SCREEN_H_ 128