1 // Copyright (c) 2011 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 #pragma once 8 9 #include <string> 10 11 #include "chrome/browser/extensions/image_loading_tracker.h" 12 #include "chrome/browser/web_applications/web_app.h" 13 #include "views/controls/label.h" 14 #include "views/view.h" 15 #include "views/window/dialog_delegate.h" 16 #include "third_party/skia/include/core/SkBitmap.h" 17 18 namespace views { 19 class Checkbox; 20 class Label; 21 class Window; 22 }; // namespace views 23 24 class Extension; 25 class MessageLoop; 26 class Profile; 27 class TabContents; 28 class TabContentsWrapper; 29 30 // CreateShortcutViewCommon implements a dialog that asks user where to create 31 // the shortcut for given web app. There are two variants of this dialog: 32 // Shortcuts that load a URL in an app-like window, and shortcuts that load 33 // a chrome app (the kind you see under "apps" on the new tabs page) in an app 34 // window. These are implemented as subclasses of CreateShortcutViewCommon. 35 class CreateApplicationShortcutView : public views::View, 36 public views::DialogDelegate, 37 public views::ButtonListener { 38 public: 39 explicit CreateApplicationShortcutView(Profile* profile); 40 virtual ~CreateApplicationShortcutView(); 41 42 // Initialize the controls on the dialog. 43 void InitControls(); 44 45 // Overridden from views::View: 46 virtual gfx::Size GetPreferredSize(); 47 48 // Overridden from views::DialogDelegate: 49 virtual std::wstring GetDialogButtonLabel( 50 MessageBoxFlags::DialogButton button) const; 51 virtual bool IsDialogButtonEnabled( 52 MessageBoxFlags::DialogButton button) const; 53 virtual bool CanResize() const; 54 virtual bool CanMaximize() const; 55 virtual bool IsAlwaysOnTop() const; 56 virtual bool HasAlwaysOnTopMenu() const; 57 virtual bool IsModal() const; 58 virtual std::wstring GetWindowTitle() const; 59 virtual bool Accept(); 60 virtual views::View* GetContentsView(); 61 62 // Overridden from views::ButtonListener: 63 virtual void ButtonPressed(views::Button* sender, const views::Event& event); 64 65 protected: 66 // Adds a new check-box as a child to the view. 67 views::Checkbox* AddCheckbox(const std::wstring& text, bool checked); 68 69 // Profile in which the shortcuts will be created. 70 Profile* profile_; 71 72 // UI elements on the dialog. 73 views::View* app_info_; 74 views::Label* create_shortcuts_label_; 75 views::Checkbox* desktop_check_box_; 76 views::Checkbox* menu_check_box_; 77 views::Checkbox* quick_launch_check_box_; 78 79 // Target shortcut info. 80 ShellIntegration::ShortcutInfo shortcut_info_; 81 82 DISALLOW_COPY_AND_ASSIGN(CreateApplicationShortcutView); 83 }; 84 85 // Create an application shortcut pointing to a URL. 86 class CreateUrlApplicationShortcutView : public CreateApplicationShortcutView { 87 public: 88 explicit CreateUrlApplicationShortcutView(TabContentsWrapper* tab_contents); 89 virtual ~CreateUrlApplicationShortcutView(); 90 91 virtual bool Accept(); 92 93 private: 94 // Fetch the largest unprocessed icon. 95 // The first largest icon downloaded and decoded successfully will be used. 96 void FetchIcon(); 97 98 // Callback of icon download. 99 void OnIconDownloaded(bool errored, const SkBitmap& image); 100 101 // The tab whose URL is being turned into an app. 102 TabContentsWrapper* tab_contents_; 103 104 // Pending app icon download tracked by us. 105 class IconDownloadCallbackFunctor; 106 IconDownloadCallbackFunctor* pending_download_; 107 108 // Unprocessed icons from the WebApplicationInfo passed in. 109 web_app::IconInfoList unprocessed_icons_; 110 111 DISALLOW_COPY_AND_ASSIGN(CreateUrlApplicationShortcutView); 112 }; 113 114 // Create an application shortcut pointing to a chrome application. 115 class CreateChromeApplicationShortcutView 116 : public CreateApplicationShortcutView, 117 public ImageLoadingTracker::Observer { 118 public: 119 explicit CreateChromeApplicationShortcutView(Profile* profile, 120 const Extension* app); 121 virtual ~CreateChromeApplicationShortcutView(); 122 123 // Implement ImageLoadingTracker::Observer. |tracker_| is used to 124 // load the app's icon. This method recieves the icon, and adds 125 // it to the "Create Shortcut" dailog box. 126 virtual void OnImageLoaded(SkBitmap* image, 127 const ExtensionResource& resource, 128 int index); 129 130 private: 131 const Extension* app_; 132 ImageLoadingTracker tracker_; 133 134 DISALLOW_COPY_AND_ASSIGN(CreateChromeApplicationShortcutView); 135 }; 136 137 138 #endif // CHROME_BROWSER_UI_VIEWS_CREATE_APPLICATION_SHORTCUT_VIEW_H_ 139