1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file. 44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_CREATE_APPLICATION_SHORTCUT_VIEW_H_ 64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_CREATE_APPLICATION_SHORTCUT_VIEW_H_ 74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once 84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 94a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include <string> 104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 11201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch#include "chrome/browser/extensions/image_loading_tracker.h" 124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/web_applications/web_app.h" 134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/controls/label.h" 144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/view.h" 154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "views/window/dialog_delegate.h" 164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "third_party/skia/include/core/SkBitmap.h" 174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views { 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Checkbox; 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Label; 214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Window; 224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; // namespace views 234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 24201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass Extension; 254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass MessageLoop; 264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Profile; 274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass TabContents; 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass TabContentsWrapper; 294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 30201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// CreateShortcutViewCommon implements a dialog that asks user where to create 31201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// the shortcut for given web app. There are two variants of this dialog: 32201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Shortcuts that load a URL in an app-like window, and shortcuts that load 33201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// a chrome app (the kind you see under "apps" on the new tabs page) in an app 34201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// window. These are implemented as subclasses of CreateShortcutViewCommon. 354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass CreateApplicationShortcutView : public views::View, 364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public views::DialogDelegate, 374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public views::ButtonListener { 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch explicit CreateApplicationShortcutView(Profile* profile); 404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~CreateApplicationShortcutView(); 414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Initialize the controls on the dialog. 43201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void InitControls(); 444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from views::View: 464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual gfx::Size GetPreferredSize(); 474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from views::DialogDelegate: 494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual std::wstring GetDialogButtonLabel( 504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch MessageBoxFlags::DialogButton button) const; 514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual bool IsDialogButtonEnabled( 524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch MessageBoxFlags::DialogButton button) const; 534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual bool CanResize() const; 544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual bool CanMaximize() const; 554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual bool IsAlwaysOnTop() const; 564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual bool HasAlwaysOnTopMenu() const; 574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual bool IsModal() const; 584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual std::wstring GetWindowTitle() const; 594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual bool Accept(); 604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual views::View* GetContentsView(); 614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 624a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Overridden from views::ButtonListener: 634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void ButtonPressed(views::Button* sender, const views::Event& event); 644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 65201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch protected: 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Adds a new check-box as a child to the view. 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::Checkbox* AddCheckbox(const std::wstring& text, bool checked); 684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 69201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Profile in which the shortcuts will be created. 70201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch Profile* profile_; 714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // UI elements on the dialog. 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::View* app_info_; 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::Label* create_shortcuts_label_; 754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::Checkbox* desktop_check_box_; 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::Checkbox* menu_check_box_; 774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::Checkbox* quick_launch_check_box_; 784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Target shortcut info. 804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ShellIntegration::ShortcutInfo shortcut_info_; 814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 82201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DISALLOW_COPY_AND_ASSIGN(CreateApplicationShortcutView); 83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}; 84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Create an application shortcut pointing to a URL. 86201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass CreateUrlApplicationShortcutView : public CreateApplicationShortcutView { 87201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public: 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen explicit CreateUrlApplicationShortcutView(TabContentsWrapper* tab_contents); 89201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual ~CreateUrlApplicationShortcutView(); 90201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 91201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual bool Accept(); 92201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 93201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private: 94201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Fetch the largest unprocessed icon. 95201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The first largest icon downloaded and decoded successfully will be used. 96201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void FetchIcon(); 97201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 98201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Callback of icon download. 99201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch void OnIconDownloaded(bool errored, const SkBitmap& image); 100201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 101201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // The tab whose URL is being turned into an app. 102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TabContentsWrapper* tab_contents_; 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Pending app icon download tracked by us. 1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch class IconDownloadCallbackFunctor; 1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch IconDownloadCallbackFunctor* pending_download_; 1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 108201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Unprocessed icons from the WebApplicationInfo passed in. 109201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch web_app::IconInfoList unprocessed_icons_; 110201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 111201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DISALLOW_COPY_AND_ASSIGN(CreateUrlApplicationShortcutView); 1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch// Create an application shortcut pointing to a chrome application. 115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass CreateChromeApplicationShortcutView 116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch : public CreateApplicationShortcutView, 117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public ImageLoadingTracker::Observer { 118201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch public: 119201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch explicit CreateChromeApplicationShortcutView(Profile* profile, 120201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const Extension* app); 121201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual ~CreateChromeApplicationShortcutView(); 122201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 123201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // Implement ImageLoadingTracker::Observer. |tracker_| is used to 124201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // load the app's icon. This method recieves the icon, and adds 125201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // it to the "Create Shortcut" dailog box. 126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch virtual void OnImageLoaded(SkBitmap* image, 127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ExtensionResource& resource, 128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch int index); 129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch private: 131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch const Extension* app_; 132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch ImageLoadingTracker tracker_; 133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch DISALLOW_COPY_AND_ASSIGN(CreateChromeApplicationShortcutView); 135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}; 136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 1384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif // CHROME_BROWSER_UI_VIEWS_CREATE_APPLICATION_SHORTCUT_VIEW_H_ 139