Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3762)

Unified Diff: chrome/browser/ui/views/create_application_shortcut_view.cc

Issue 5273004: Add "create Application Shortcut" to the app menu on NTP. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase for commit. Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/views/create_application_shortcut_view.cc
diff --git a/chrome/browser/ui/views/create_application_shortcut_view.cc b/chrome/browser/ui/views/create_application_shortcut_view.cc
index f0ec8eea32fbcf27645d217a78718fc41ec0cf32..2867c9a61ece9d6c67ddc2175a75842326ef0e56 100644
--- a/chrome/browser/ui/views/create_application_shortcut_view.cc
+++ b/chrome/browser/ui/views/create_application_shortcut_view.cc
@@ -14,6 +14,8 @@
#include "chrome/browser/tab_contents/tab_contents.h"
#include "chrome/browser/tab_contents/tab_contents_delegate.h"
#include "chrome/common/chrome_constants.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_resource.h"
#include "chrome/common/pref_names.h"
#include "gfx/canvas_skia.h"
#include "gfx/codec/png_codec.h"
@@ -30,6 +32,7 @@
#include "views/standard_layout.h"
#include "views/window/window.h"
+
#if defined(OS_WIN)
#include "base/win_util.h"
#endif // defined(OS_WIN)
@@ -188,21 +191,28 @@ void AppInfoView::Paint(gfx::Canvas* canvas) {
inner_rect, SkIntToScalar(1.5), SkIntToScalar(1.5), inner_paint);
}
-}; // namespace
+} // namespace
namespace browser {
-void ShowCreateShortcutsDialog(gfx::NativeWindow parent_window,
- TabContents* tab_contents) {
+void ShowCreateWebAppShortcutsDialog(gfx::NativeWindow parent_window,
+ TabContents* tab_contents) {
+ views::Window::CreateChromeWindow(parent_window, gfx::Rect(),
+ new CreateUrlApplicationShortcutView(tab_contents))->Show();
+}
+
+void ShowCreateChromeAppShortcutsDialog(gfx::NativeWindow parent_window,
+ Profile* profile,
+ const Extension* app) {
views::Window::CreateChromeWindow(parent_window, gfx::Rect(),
- new CreateApplicationShortcutView(tab_contents))->Show();
+ new CreateChromeApplicationShortcutView(profile, app))->Show();
}
-}; // namespace browser
+} // namespace browser
-class CreateApplicationShortcutView::IconDownloadCallbackFunctor {
+class CreateUrlApplicationShortcutView::IconDownloadCallbackFunctor {
public:
- explicit IconDownloadCallbackFunctor(CreateApplicationShortcutView* owner)
+ explicit IconDownloadCallbackFunctor(CreateUrlApplicationShortcutView* owner)
: owner_(owner) {
}
@@ -217,31 +227,15 @@ class CreateApplicationShortcutView::IconDownloadCallbackFunctor {
}
private:
- CreateApplicationShortcutView* owner_;
+ CreateUrlApplicationShortcutView* owner_;
};
-CreateApplicationShortcutView::CreateApplicationShortcutView(
- TabContents* tab_contents)
- : tab_contents_(tab_contents),
- pending_download_(NULL) {
- Init();
-}
-
-CreateApplicationShortcutView::~CreateApplicationShortcutView() {
- if (pending_download_)
- pending_download_->Cancel();
-}
-
-void CreateApplicationShortcutView::Init() {
- // Prepare data
- web_app::GetShortcutInfoForTab(tab_contents_, &shortcut_info_);
+CreateApplicationShortcutView::CreateApplicationShortcutView(Profile* profile)
+ : profile_(profile) {}
- const WebApplicationInfo& app_info = tab_contents_->web_app_info();
- if (!app_info.icons.empty()) {
- web_app::GetIconsInfo(app_info, &unprocessed_icons_);
- FetchIcon();
- }
+CreateApplicationShortcutView::~CreateApplicationShortcutView() {}
+void CreateApplicationShortcutView::InitControls() {
// Create controls
app_info_ = new AppInfoView(shortcut_info_.title, shortcut_info_.description,
shortcut_info_.favicon);
@@ -249,11 +243,9 @@ void CreateApplicationShortcutView::Init() {
l10n_util::GetString(IDS_CREATE_SHORTCUTS_LABEL));
create_shortcuts_label_->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
- Profile* profile = tab_contents_->profile();
-
desktop_check_box_ = AddCheckbox(
l10n_util::GetString(IDS_CREATE_SHORTCUTS_DESKTOP_CHKBOX),
- profile->GetPrefs()->GetBoolean(prefs::kWebAppCreateOnDesktop));
+ profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateOnDesktop));
menu_check_box_ = NULL;
quick_launch_check_box_ = NULL;
@@ -261,17 +253,17 @@ void CreateApplicationShortcutView::Init() {
#if defined(OS_WIN)
menu_check_box_ = AddCheckbox(
l10n_util::GetString(IDS_CREATE_SHORTCUTS_START_MENU_CHKBOX),
- profile->GetPrefs()->GetBoolean(prefs::kWebAppCreateInAppsMenu));
+ profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateInAppsMenu));
quick_launch_check_box_ = AddCheckbox(
(base::win::GetVersion() >= base::win::VERSION_WIN7) ?
l10n_util::GetString(IDS_PIN_TO_TASKBAR_CHKBOX) :
l10n_util::GetString(IDS_CREATE_SHORTCUTS_QUICK_LAUNCH_BAR_CHKBOX),
- profile->GetPrefs()->GetBoolean(prefs::kWebAppCreateInQuickLaunchBar));
+ profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateInQuickLaunchBar));
#elif defined(OS_LINUX)
menu_check_box_ = AddCheckbox(
l10n_util::GetString(IDS_CREATE_SHORTCUTS_MENU_CHKBOX),
- profile->GetPrefs()->GetBoolean(prefs::kWebAppCreateInAppsMenu));
+ profile_->GetPrefs()->GetBoolean(prefs::kWebAppCreateInAppsMenu));
#endif
// Layout controls
@@ -367,9 +359,8 @@ std::wstring CreateApplicationShortcutView::GetWindowTitle() const {
}
bool CreateApplicationShortcutView::Accept() {
- if (!IsDialogButtonEnabled(MessageBoxFlags::DIALOGBUTTON_OK)) {
+ if (!IsDialogButtonEnabled(MessageBoxFlags::DIALOGBUTTON_OK))
return false;
- }
shortcut_info_.create_on_desktop = desktop_check_box_->checked();
shortcut_info_.create_in_applications_menu = menu_check_box_ == NULL ? false :
@@ -384,16 +375,13 @@ bool CreateApplicationShortcutView::Accept() {
shortcut_info_.create_in_quick_launch_bar = false;
#endif
- web_app::CreateShortcut(tab_contents_->profile()->GetPath(),
+ web_app::CreateShortcut(profile_->GetPath(),
shortcut_info_,
NULL);
-
- tab_contents_->SetAppIcon(shortcut_info_.favicon);
- if (tab_contents_->delegate())
- tab_contents_->delegate()->ConvertContentsToApplication(tab_contents_);
return true;
}
+
views::View* CreateApplicationShortcutView::GetContentsView() {
return this;
}
@@ -406,14 +394,59 @@ views::Checkbox* CreateApplicationShortcutView::AddCheckbox(
return checkbox;
}
-void CreateApplicationShortcutView::FetchIcon() {
+void CreateApplicationShortcutView::ButtonPressed(views::Button* sender,
+ const views::Event& event) {
+ if (sender == desktop_check_box_)
+ profile_->GetPrefs()->SetBoolean(prefs::kWebAppCreateOnDesktop,
+ desktop_check_box_->checked() ? true : false);
+ else if (sender == menu_check_box_)
+ profile_->GetPrefs()->SetBoolean(prefs::kWebAppCreateInAppsMenu,
+ menu_check_box_->checked() ? true : false);
+ else if (sender == quick_launch_check_box_)
+ profile_->GetPrefs()->SetBoolean(prefs::kWebAppCreateInQuickLaunchBar,
+ quick_launch_check_box_->checked() ? true : false);
+
+ // When no checkbox is checked we should not have the action button enabled.
+ GetDialogClientView()->UpdateDialogButtons();
+}
+
+CreateUrlApplicationShortcutView::CreateUrlApplicationShortcutView(
+ TabContents* tab_contents)
+ : CreateApplicationShortcutView(tab_contents->profile()),
+ tab_contents_(tab_contents),
+ pending_download_(NULL) {
+
+ web_app::GetShortcutInfoForTab(tab_contents_, &shortcut_info_);
+ const WebApplicationInfo& app_info = tab_contents_->web_app_info();
+ if (!app_info.icons.empty()) {
+ web_app::GetIconsInfo(app_info, &unprocessed_icons_);
+ FetchIcon();
+ }
+
+ InitControls();
+}
+
+CreateUrlApplicationShortcutView::~CreateUrlApplicationShortcutView() {
+ if (pending_download_)
+ pending_download_->Cancel();
+}
+
+bool CreateUrlApplicationShortcutView::Accept() {
+ if (!CreateApplicationShortcutView::Accept())
+ return false;
+
+ tab_contents_->SetAppIcon(shortcut_info_.favicon);
+ if (tab_contents_->delegate())
+ tab_contents_->delegate()->ConvertContentsToApplication(tab_contents_);
+ return true;
+}
+
+void CreateUrlApplicationShortcutView::FetchIcon() {
// There should only be fetch job at a time.
DCHECK(pending_download_ == NULL);
- if (unprocessed_icons_.empty()) {
- // No icons to fetch.
+ if (unprocessed_icons_.empty()) // No icons to fetch.
return;
- }
pending_download_ = new IconDownloadCallbackFunctor(this);
DCHECK(pending_download_);
@@ -427,25 +460,8 @@ void CreateApplicationShortcutView::FetchIcon() {
unprocessed_icons_.pop_back();
}
-void CreateApplicationShortcutView::ButtonPressed(views::Button* sender,
- const views::Event& event) {
- Profile* profile = tab_contents_->profile();
- if (sender == desktop_check_box_)
- profile->GetPrefs()->SetBoolean(prefs::kWebAppCreateOnDesktop,
- desktop_check_box_->checked() ? true : false);
- else if (sender == menu_check_box_)
- profile->GetPrefs()->SetBoolean(prefs::kWebAppCreateInAppsMenu,
- menu_check_box_->checked() ? true : false);
- else if (sender == quick_launch_check_box_)
- profile->GetPrefs()->SetBoolean(prefs::kWebAppCreateInQuickLaunchBar,
- quick_launch_check_box_->checked() ? true : false);
-
- // When no checkbox is checked we should not have the action button enabled.
- GetDialogClientView()->UpdateDialogButtons();
-}
-
-void CreateApplicationShortcutView::OnIconDownloaded(bool errored,
- const SkBitmap& image) {
+void CreateUrlApplicationShortcutView::OnIconDownloaded(bool errored,
+ const SkBitmap& image) {
pending_download_ = NULL;
if (!errored && !image.isNull()) {
@@ -455,3 +471,56 @@ void CreateApplicationShortcutView::OnIconDownloaded(bool errored,
FetchIcon();
}
}
+
+CreateChromeApplicationShortcutView::CreateChromeApplicationShortcutView(
+ Profile* profile,
+ const Extension* app) :
+ CreateApplicationShortcutView(profile),
+ app_(app),
+ ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)) {
+
+ shortcut_info_.extension_id = UTF8ToUTF16(app_->id());
+ shortcut_info_.url = GURL(app_->launch_web_url());
+ shortcut_info_.title = UTF8ToUTF16(app_->name());
+ shortcut_info_.description = UTF8ToUTF16(app_->description());
+
+ // The icon will be resized to |max_size|.
+ const gfx::Size max_size(kAppIconSize, kAppIconSize);
+
+ // Look for an icon. If there is no icon at the ideal size,
+ // we will resize whatever we can get. Making a large icon smaller
+ // is prefered to making a small icon larger, so look for a larger
+ // icon first:
+ ExtensionResource icon_resource = app_->GetIconResource(
+ kAppIconSize,
+ ExtensionIconSet::MATCH_BIGGER);
+
+ // If no icon exists that is the desired size or larger, get the
+ // largest icon available:
+ if (icon_resource.empty()) {
+ icon_resource = app_->GetIconResource(
+ kAppIconSize,
+ ExtensionIconSet::MATCH_SMALLER);
+ }
+
+ tracker_.LoadImage(app_,
+ icon_resource,
+ max_size,
+ ImageLoadingTracker::DONT_CACHE);
+
+ InitControls();
+}
+
+CreateChromeApplicationShortcutView::~CreateChromeApplicationShortcutView() {}
+
+// Called by tracker_ when the app's icon is loaded.
+void CreateChromeApplicationShortcutView::OnImageLoaded(
+ SkBitmap* image, ExtensionResource resource, int index) {
+ if (image->isNull()) {
+ NOTREACHED() << "Corrupt image in profile?";
+ return;
+ }
+ shortcut_info_.favicon = *image;
+ static_cast<AppInfoView*>(app_info_)->UpdateIcon(shortcut_info_.favicon);
+}
+
« no previous file with comments | « chrome/browser/ui/views/create_application_shortcut_view.h ('k') | chrome/browser/ui/views/frame/browser_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698