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// This is the GTK implementation of the First Run bubble, the dialog box
6// presented on first run of Chromium. There can only ever be a single
7// bubble open, so the class presents only static methods.
8
9#ifndef CHROME_BROWSER_UI_GTK_FIRST_RUN_BUBBLE_H_
10#define CHROME_BROWSER_UI_GTK_FIRST_RUN_BUBBLE_H_
11#pragma once
12
13#include <gtk/gtk.h>
14
15#include <vector>
16
17#include "base/basictypes.h"
18#include "chrome/browser/first_run/first_run.h"
19#include "chrome/browser/ui/gtk/info_bubble_gtk.h"
20#include "content/common/notification_observer.h"
21#include "content/common/notification_registrar.h"
22
23class Profile;
24
25class FirstRunBubble : public InfoBubbleGtkDelegate,
26                       public NotificationObserver {
27 public:
28  // Shows the first run bubble, pointing at |rect|.
29  static void Show(Profile* profile,
30                   GtkWidget* anchor,
31                   const gfx::Rect& rect,
32                   FirstRun::BubbleType bubble_type);
33
34  // Implements the InfoBubbleGtkDelegate.  We are notified when the bubble
35  // is about to be closed.
36  virtual void InfoBubbleClosing(InfoBubbleGtk* info_bubble,
37                                 bool closed_by_escape);
38  virtual bool CloseOnEscape();
39
40  // Overridden from NotificationObserver:
41  virtual void Observe(NotificationType type,
42                       const NotificationSource& source,
43                       const NotificationDetails& details);
44
45 private:
46  FirstRunBubble(Profile* profile,
47                 GtkWidget* anchor,
48                 const gfx::Rect& rect,
49                 FirstRun::BubbleType bubble_type);
50  virtual ~FirstRunBubble();
51
52  // Create and pack widgets for different bubble types.
53  void InitializeContentForLarge();
54  void InitializeContentForOEM();
55  void InitializeContentForMinimal();
56
57  // Contains some common set up for the labels in the bubble. |width| is a
58  // resource that holds the desired width for the labels.
59  void InitializeLabels(int width_resource);
60
61  CHROMEGTK_CALLBACK_0(FirstRunBubble, void, HandleDestroy);
62  CHROMEGTK_CALLBACK_0(FirstRunBubble, void, HandleKeepButton);
63  CHROMEGTK_CALLBACK_0(FirstRunBubble, void, HandleChangeButton);
64
65  // Our current profile.
66  Profile* profile_;
67
68  // Provides colors and stuff.
69  GtkThemeService* theme_service_;
70
71  // The widget we anchor to, and a descendant of the toplevel window we
72  // are transient for.
73  GtkWidget* anchor_;
74
75  // We let the InfoBubble own our content, and then we delete ourself
76  // when the widget is destroyed (when the InfoBubble is destroyed).
77  GtkWidget* content_;
78
79  // The various labels in the interface. We keep track of them for theme
80  // changes.
81  std::vector<GtkWidget*> labels_;
82
83  InfoBubbleGtk* bubble_;
84
85  NotificationRegistrar registrar_;
86
87  DISALLOW_COPY_AND_ASSIGN(FirstRunBubble);
88};
89
90#endif  // CHROME_BROWSER_UI_GTK_FIRST_RUN_BUBBLE_H_
91