theme_install_bubble_view.h revision 3f50c38dc070f4bb515c1b64450dae14f316474e
1// Copyright (c) 2010 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_UI_VIEWS_THEME_INSTALL_BUBBLE_VIEW_H_
6#define CHROME_BROWSER_UI_VIEWS_THEME_INSTALL_BUBBLE_VIEW_H_
7#pragma once
8
9#include "base/string16.h"
10#include "chrome/common/notification_observer.h"
11#include "chrome/common/notification_registrar.h"
12#include "gfx/canvas.h"
13#include "views/controls/label.h"
14
15class TabContents;
16
17namespace views {
18class Widget;
19}
20
21// ThemeInstallBubbleView is a view that provides a "Loading..." bubble in the
22// center of a browser window for use when an extension or theme is loaded.
23// (The Browser class only calls it to install itself into the currently active
24// browser window.)  If an extension is being applied, the bubble goes away
25// immediately.  If a theme is being applied, it disappears when the theme has
26// been loaded.  The purpose of this bubble is to warn the user that the browser
27// may be unresponsive while the theme is being installed.
28//
29// Edge case: note that if one installs a theme in one window and then switches
30// rapidly to another window to install a theme there as well (in the short time
31// between install begin and theme caching seizing the UI thread), the loading
32// bubble will only appear over the first window, as there is only ever one
33// instance of the bubble.
34class ThemeInstallBubbleView : public NotificationObserver,
35                               public views::Label {
36 public:
37  ~ThemeInstallBubbleView();
38
39  // NotificationObserver
40  virtual void Observe(NotificationType type,
41                       const NotificationSource& source,
42                       const NotificationDetails& details);
43
44  // Show the loading bubble.
45  static void Show(TabContents* tab_contents);
46
47 private:
48  explicit ThemeInstallBubbleView(TabContents* tab_contents);
49
50  // Put the popup in the correct place on the tab.
51  void Reposition();
52
53  // Inherited from views.
54  gfx::Size GetPreferredSize();
55
56  // Shut down the popup and remove our notifications.
57  void Close();
58
59  virtual void Paint(gfx::Canvas* canvas);
60
61  // The content area at the start of the animation.
62  gfx::Rect tab_contents_bounds_;
63
64  // Widget containing us.
65  views::Widget* popup_;
66
67  // Text to show warning that theme is being installed.
68  string16 text_;
69
70  // A scoped container for notification registries.
71  NotificationRegistrar registrar_;
72
73  DISALLOW_COPY_AND_ASSIGN(ThemeInstallBubbleView);
74};
75
76#endif  // CHROME_BROWSER_UI_VIEWS_THEME_INSTALL_BUBBLE_VIEW_H_
77