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
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef CHROME_BROWSER_UI_GTK_CREATE_APPLICATION_SHORTCUTS_DIALOG_GTK_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define CHROME_BROWSER_UI_GTK_CREATE_APPLICATION_SHORTCUTS_DIALOG_GTK_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h"
10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/extensions/image_loading_tracker.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/shell_integration.h"
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/gtk/gtk_signal.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _GdkPixbuf GdkPixbuf;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _GtkWidget GtkWidget;
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef struct _GtkWindow GtkWindow;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass Extension;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TabContents;
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass TabContentsWrapper;
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CreateApplicationShortcutsDialogGtk
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public base::RefCountedThreadSafe<CreateApplicationShortcutsDialogGtk,
27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                                        BrowserThread::DeleteOnUIThread> {
28201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch protected:
29201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  explicit CreateApplicationShortcutsDialogGtk(GtkWindow* parent);
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~CreateApplicationShortcutsDialogGtk();
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(CreateApplicationShortcutsDialogGtk, void,
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       OnCreateDialogResponse, int);
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_1(CreateApplicationShortcutsDialogGtk, void,
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       OnErrorDialogResponse, int);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CHROMEGTK_CALLBACK_0(CreateApplicationShortcutsDialogGtk, void,
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       OnToggleCheckbox);
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void CreateDialogBox(GtkWindow* parent);
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void CreateIconPixBuf(const SkBitmap& bitmap);
43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
44201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // This method is called after a shortcut is created.
45201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Subclasses can override it to take some action at that time.
46201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void OnCreatedShortcut(void) {}
47201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CreateDesktopShortcut(
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const ShellIntegration::ShortcutInfo& shortcut_info);
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ShowErrorDialog();
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  GtkWindow* parent_;
53201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // UI elements.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* desktop_checkbox_;
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* menu_checkbox_;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ShortcutInfo for the new shortcut.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ShellIntegration::ShortcutInfo shortcut_info_;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Image associated with the site.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GdkPixbuf* favicon_pixbuf_;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Dialog box that allows the user to create an application shortcut.
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* create_dialog_;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Dialog box that shows the error message.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GtkWidget* error_dialog_;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  friend struct BrowserThread::DeleteOnThread<BrowserThread::UI>;
72201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  friend class DeleteTask<CreateApplicationShortcutsDialogGtk>;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CreateApplicationShortcutsDialogGtk);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass CreateWebApplicationShortcutsDialogGtk
77201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    : public CreateApplicationShortcutsDialogGtk {
78201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
79201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Displays the dialog box to create application shortcuts for |tab_contents|.
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  static void Show(GtkWindow* parent, TabContentsWrapper* tab_contents);
81201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CreateWebApplicationShortcutsDialogGtk(GtkWindow* parent,
83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                         TabContentsWrapper* tab_contents);
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual ~CreateWebApplicationShortcutsDialogGtk() {}
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void OnCreatedShortcut(void);
87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
88201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // TabContentsWrapper for which the shortcut will be created.
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  TabContentsWrapper* tab_contents_;
92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(CreateWebApplicationShortcutsDialogGtk);
94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass CreateChromeApplicationShortcutsDialogGtk
97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  : public CreateApplicationShortcutsDialogGtk,
98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    public ImageLoadingTracker::Observer {
99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public:
100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Displays the dialog box to create application shortcuts for |app|.
101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  static void Show(GtkWindow* parent, const Extension* app);
102201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
103201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  explicit CreateChromeApplicationShortcutsDialogGtk(GtkWindow* parent,
104201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                                     const Extension* app);
105201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual ~CreateChromeApplicationShortcutsDialogGtk() {}
106201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
107201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Implement ImageLoadingTracker::Observer.  |tracker_| is used to
108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // load the app's icon.  This method recieves the icon, and adds
109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // it to the "Create Shortcut" dailog box.
110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  virtual void OnImageLoaded(SkBitmap* image,
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             const ExtensionResource& resource,
112201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             int index);
113201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private:
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  const Extension* app_;
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  ImageLoadingTracker tracker_;
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(CreateChromeApplicationShortcutsDialogGtk);
118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch};
119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // CHROME_BROWSER_UI_GTK_CREATE_APPLICATION_SHORTCUTS_DIALOG_GTK_H_
121