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