// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_CHROMEOS_LOGIN_VIEW_SCREEN_H_ #define CHROME_BROWSER_CHROMEOS_LOGIN_VIEW_SCREEN_H_ #pragma once #include "base/message_loop.h" #include "chrome/browser/chromeos/login/helper.h" #include "chrome/browser/chromeos/login/wizard_screen.h" #include "ui/gfx/size.h" template <class V> class ViewScreen : public WizardScreen { public: // Create screen with default size. explicit ViewScreen(WizardScreenDelegate* delegate); // Create screen with the specified size. ViewScreen(WizardScreenDelegate* delegate, int width, int height); virtual ~ViewScreen(); // Overridden from WizardScreen: virtual void Show(); virtual void Hide(); virtual gfx::Size GetScreenSize() const { return size_; } V* view() { return view_; } protected: // Creates view object and adds it to views hierarchy. virtual void CreateView(); // Creates view object. virtual V* AllocateView() = 0; // Refresh screen state. virtual void Refresh() {} private: // For testing automation friend class AutomationProvider; V* view_; // Size of the screen. gfx::Size size_; DISALLOW_COPY_AND_ASSIGN(ViewScreen); }; template <class V> class DefaultViewScreen : public ViewScreen<V> { public: explicit DefaultViewScreen(WizardScreenDelegate* delegate) : ViewScreen<V>(delegate) {} DefaultViewScreen(WizardScreenDelegate* delegate, int width, int height) : ViewScreen<V>(delegate, width, height) {} V* AllocateView() { return new V(ViewScreen<V>::delegate()->GetObserver(this)); } }; /////////////////////////////////////////////////////////////////////////////// // ViewScreen, public: template <class V> ViewScreen<V>::ViewScreen(WizardScreenDelegate* delegate) : WizardScreen(delegate), view_(NULL), size_(chromeos::login::kWizardScreenWidth, chromeos::login::kWizardScreenHeight) { } template <class V> ViewScreen<V>::ViewScreen(WizardScreenDelegate* delegate, int width, int height) : WizardScreen(delegate), view_(NULL), size_(width, height) { } template <class V> ViewScreen<V>::~ViewScreen() { // Delete the view now. So we do not worry the View outlives its // controller. if (view_) { delete view_; view_ = NULL; } } /////////////////////////////////////////////////////////////////////////////// // ViewScreen, WizardScreen implementation: template <class V> void ViewScreen<V>::Show() { if (!view_) { CreateView(); } view_->SetVisible(true); // After screen is initialized and shown refresh its model. // Refresh() is called after SetVisible(true) because screen handler // could exit right away. Refresh(); } template <class V> void ViewScreen<V>::Hide() { if (view_) { delegate()->GetWizardView()->RemoveChildView(view_); // RemoveChildView doesn't delete the view and we also can't delete it here // becuase we are in message processing for the view. MessageLoop::current()->DeleteSoon(FROM_HERE, view_); view_ = NULL; } } /////////////////////////////////////////////////////////////////////////////// // ViewScreen, protected: template <class V> void ViewScreen<V>::CreateView() { view_ = AllocateView(); view_->set_parent_owned(false); // ViewScreen owns the view. delegate()->GetWizardView()->AddChildView(view_); view_->Init(); view_->SetVisible(false); } #endif // CHROME_BROWSER_CHROMEOS_LOGIN_VIEW_SCREEN_H_