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