• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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_CREATE_APPLICATION_SHORTCUT_VIEW_H_
6 #define CHROME_BROWSER_UI_VIEWS_CREATE_APPLICATION_SHORTCUT_VIEW_H_
7 
8 #include <string>
9 #include <vector>
10 
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "chrome/browser/web_applications/web_app.h"
14 #include "ui/views/controls/button/button.h"
15 #include "ui/views/window/dialog_delegate.h"
16 
17 class FaviconDownloadHelper;
18 class GURL;
19 class Profile;
20 class SkBitmap;
21 
22 namespace content {
23 class WebContents;
24 }
25 
26 namespace extensions {
27 class Extension;
28 }
29 
30 namespace views {
31 class Checkbox;
32 class Label;
33 }
34 
35 // CreateShortcutViewCommon implements a dialog that asks user where to create
36 // the shortcut for given web app.  There are two variants of this dialog:
37 // Shortcuts that load a URL in an app-like window, and shortcuts that load
38 // a chrome app (the kind you see under "apps" on the new tabs page) in an app
39 // window.  These are implemented as subclasses of CreateShortcutViewCommon.
40 class CreateApplicationShortcutView : public views::DialogDelegateView,
41                                       public views::ButtonListener {
42  public:
43   enum DialogLayout {
44     // URL shortcuts have an info frame at the top with a thumbnail, title and
45     // description.
46     DIALOG_LAYOUT_URL_SHORTCUT,
47 
48     // App shortcuts don't have an info frame, since they are launched from
49     // places where it's clear what app they are from.
50     DIALOG_LAYOUT_APP_SHORTCUT
51   };
52 
53   explicit CreateApplicationShortcutView(Profile* profile);
54   virtual ~CreateApplicationShortcutView();
55 
56   // Initialize the controls on the dialog.
57   void InitControls(DialogLayout dialog_layout);
58 
59   // Overridden from views::View:
60   virtual gfx::Size GetPreferredSize() const OVERRIDE;
61 
62   // Overridden from views::DialogDelegate:
63   virtual base::string16 GetDialogButtonLabel(
64       ui::DialogButton button) const OVERRIDE;
65   virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE;
66   virtual ui::ModalType GetModalType() const OVERRIDE;
67   virtual base::string16 GetWindowTitle() const OVERRIDE;
68   virtual bool Accept() OVERRIDE;
69 
70   // Overridden from views::ButtonListener:
71   virtual void ButtonPressed(views::Button* sender,
72                              const ui::Event& event) OVERRIDE;
73 
74  protected:
75   // Adds a new check-box as a child to the view.
76   views::Checkbox* AddCheckbox(const base::string16& text, bool checked);
77 
78   // Profile in which the shortcuts will be created.
79   Profile* profile_;
80 
81   // UI elements on the dialog.
82   // May be NULL if we are not displaying the app's info.
83   views::View* app_info_;
84   views::Label* create_shortcuts_label_;
85   views::Checkbox* desktop_check_box_;
86   views::Checkbox* menu_check_box_;
87   views::Checkbox* quick_launch_check_box_;
88 
89   // Target shortcut info.
90   web_app::ShortcutInfo shortcut_info_;
91   // If false, the shortcut will be created in the root level of the Start Menu.
92   bool create_in_chrome_apps_subdir_;
93 
94   DISALLOW_COPY_AND_ASSIGN(CreateApplicationShortcutView);
95 };
96 
97 // Create an application shortcut pointing to a URL.
98 class CreateUrlApplicationShortcutView : public CreateApplicationShortcutView {
99  public:
100   explicit CreateUrlApplicationShortcutView(content::WebContents* web_contents);
101   virtual ~CreateUrlApplicationShortcutView();
102 
103   virtual bool Accept() OVERRIDE;
104 
105  private:
106   // Fetch the largest unprocessed icon.
107   // The first largest icon downloaded and decoded successfully will be used.
108   void FetchIcon();
109 
110   // Favicon download callback.
111   void DidDownloadFavicon(
112       int requested_size,
113       int id,
114       int http_status_code,
115       const GURL& image_url,
116       const std::vector<SkBitmap>& bitmaps,
117       const std::vector<gfx::Size>& original_bitmap_sizes);
118 
119   // The tab whose URL is being turned into an app.
120   content::WebContents* web_contents_;
121 
122   // Pending app icon download tracked by us.
123   int pending_download_id_;
124 
125   // Unprocessed icons from the WebApplicationInfo passed in.
126   web_app::IconInfoList unprocessed_icons_;
127 
128   base::WeakPtrFactory<CreateUrlApplicationShortcutView> weak_ptr_factory_;
129 
130   DISALLOW_COPY_AND_ASSIGN(CreateUrlApplicationShortcutView);
131 };
132 
133 // Create an application shortcut pointing to a chrome application.
134 class CreateChromeApplicationShortcutView
135     : public CreateApplicationShortcutView {
136  public:
137   CreateChromeApplicationShortcutView(
138       Profile* profile,
139       const extensions::Extension* app,
140       const base::Callback<void(bool)>& close_callback);
141   virtual ~CreateChromeApplicationShortcutView();
142   virtual bool Accept() OVERRIDE;
143   virtual bool Cancel() OVERRIDE;
144 
145  private:
146   void OnShortcutInfoLoaded(const web_app::ShortcutInfo& shortcut_info);
147 
148   base::Callback<void(bool)> close_callback_;
149 
150   base::WeakPtrFactory<CreateChromeApplicationShortcutView> weak_ptr_factory_;
151 
152   DISALLOW_COPY_AND_ASSIGN(CreateChromeApplicationShortcutView);
153 };
154 
155 #endif  // CHROME_BROWSER_UI_VIEWS_CREATE_APPLICATION_SHORTCUT_VIEW_H_
156