172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This is the GTK implementation of the First Run bubble, the dialog box
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// presented on first run of Chromium. There can only ever be a single
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// bubble open, so the class presents only static methods.
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_UI_GTK_FIRST_RUN_BUBBLE_H_
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_UI_GTK_FIRST_RUN_BUBBLE_H_
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <gtk/gtk.h>
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/first_run/first_run.h"
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/gtk/info_bubble_gtk.h"
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_observer.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/common/notification_registrar.h"
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenclass Profile;
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FirstRunBubble : public InfoBubbleGtkDelegate,
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public NotificationObserver {
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Shows the first run bubble, pointing at |rect|.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void Show(Profile* profile,
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   GtkWidget* anchor,
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   const gfx::Rect& rect,
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                   FirstRun::BubbleType bubble_type);
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Implements the InfoBubbleGtkDelegate.  We are notified when the bubble
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is about to be closed.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void InfoBubbleClosing(InfoBubbleGtk* info_bubble,
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 bool closed_by_escape);
3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual bool CloseOnEscape();
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overridden from NotificationObserver:
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FirstRunBubble(Profile* profile,
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                 GtkWidget* anchor,
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                 const gfx::Rect& rect,
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                 FirstRun::BubbleType bubble_type);
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~FirstRunBubble();
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Create and pack widgets for different bubble types.
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void InitializeContentForLarge();
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void InitializeContentForOEM();
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void InitializeContentForMinimal();
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Contains some common set up for the labels in the bubble. |width| is a
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // resource that holds the desired width for the labels.
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void InitializeLabels(int width_resource);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(FirstRunBubble, void, HandleDestroy);
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(FirstRunBubble, void, HandleKeepButton);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(FirstRunBubble, void, HandleChangeButton);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Our current profile.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Provides colors and stuff.
69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GtkThemeService* theme_service_;
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The widget we anchor to, and a descendant of the toplevel window we
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // are transient for.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* anchor_;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We let the InfoBubble own our content, and then we delete ourself
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when the widget is destroyed (when the InfoBubble is destroyed).
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* content_;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The various labels in the interface. We keep track of them for theme
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // changes.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<GtkWidget*> labels_;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  InfoBubbleGtk* bubble_;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(FirstRunBubble);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_UI_GTK_FIRST_RUN_BUBBLE_H_
91