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
14template <class V>
15class 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
52template <class V>
53class 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:
66template <class V>
67ViewScreen<V>::ViewScreen(WizardScreenDelegate* delegate)
68    : WizardScreen(delegate),
69      view_(NULL),
70      size_(chromeos::login::kWizardScreenWidth,
71            chromeos::login::kWizardScreenHeight) {
72}
73
74template <class V>
75ViewScreen<V>::ViewScreen(WizardScreenDelegate* delegate, int width, int height)
76    : WizardScreen(delegate),
77      view_(NULL),
78      size_(width, height) {
79}
80
81template <class V>
82ViewScreen<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:
93template <class V>
94void 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
105template <class V>
106void 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:
118template <class V>
119void 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