Home | History | Annotate | Download | only in views
      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