Home | History | Annotate | Download | only in login
      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