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