1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file.
44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_THEME_INSTALL_BUBBLE_VIEW_H_
64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_THEME_INSTALL_BUBBLE_VIEW_H_
74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once
84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
93f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/string16.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/gfx/canvas.h"
134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/label.h"
144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass TabContents;
164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views {
184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Widget;
194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}
204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// ThemeInstallBubbleView is a view that provides a "Loading..." bubble in the
224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// center of a browser window for use when an extension or theme is loaded.
234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// (The Browser class only calls it to install itself into the currently active
244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// browser window.)  If an extension is being applied, the bubble goes away
254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// immediately.  If a theme is being applied, it disappears when the theme has
264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// been loaded.  The purpose of this bubble is to warn the user that the browser
274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// may be unresponsive while the theme is being installed.
284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//
294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Edge case: note that if one installs a theme in one window and then switches
304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// rapidly to another window to install a theme there as well (in the short time
314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// between install begin and theme caching seizing the UI thread), the loading
324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// bubble will only appear over the first window, as there is only ever one
334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// instance of the bubble.
344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ThemeInstallBubbleView : public NotificationObserver,
354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                               public views::Label {
364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public:
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual ~ThemeInstallBubbleView();
384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // NotificationObserver
404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  virtual void Observe(NotificationType type,
414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                       const NotificationSource& source,
424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                       const NotificationDetails& details);
434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Show the loading bubble.
454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  static void Show(TabContents* tab_contents);
464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private:
484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  explicit ThemeInstallBubbleView(TabContents* tab_contents);
494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Put the popup in the correct place on the tab.
514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void Reposition();
524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Inherited from views.
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual gfx::Size GetPreferredSize();
554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Shut down the popup and remove our notifications.
574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void Close();
584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  virtual void OnPaint(gfx::Canvas* canvas);
604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The content area at the start of the animation.
624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  gfx::Rect tab_contents_bounds_;
634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Widget containing us.
654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  views::Widget* popup_;
664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Text to show warning that theme is being installed.
683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 text_;
694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // A scoped container for notification registries.
714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  NotificationRegistrar registrar_;
724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(ThemeInstallBubbleView);
744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch};
754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif  // CHROME_BROWSER_UI_VIEWS_THEME_INSTALL_BUBBLE_VIEW_H_
77