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