OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/app_list/extension_app_item.h" | 5 #include "chrome/browser/ui/app_list/extension_app_item.h" |
6 | 6 |
7 #include "base/prefs/pref_service.h" | 7 #include "base/prefs/pref_service.h" |
8 #include "chrome/app/chrome_command_ids.h" | 8 #include "chrome/app/chrome_command_ids.h" |
9 #include "chrome/browser/extensions/context_menu_matcher.h" | 9 #include "chrome/browser/extensions/context_menu_matcher.h" |
10 #include "chrome/browser/extensions/extension_prefs.h" | 10 #include "chrome/browser/extensions/extension_prefs.h" |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 } | 110 } |
111 | 111 |
112 Profile* profile_; | 112 Profile* profile_; |
113 std::string extension_id_; | 113 std::string extension_id_; |
114 AppListControllerDelegate* controller_; | 114 AppListControllerDelegate* controller_; |
115 scoped_ptr<ExtensionUninstallDialog> dialog_; | 115 scoped_ptr<ExtensionUninstallDialog> dialog_; |
116 | 116 |
117 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstaller); | 117 DISALLOW_COPY_AND_ASSIGN(ExtensionUninstaller); |
118 }; | 118 }; |
119 | 119 |
120 class TabOverlayImageSource : public gfx::CanvasImageSource { | 120 // Overlays a shortcut icon over the bottom left corner of a given image. |
| 121 class ShortcutOverlayImageSource : public gfx::CanvasImageSource { |
121 public: | 122 public: |
122 TabOverlayImageSource(const gfx::ImageSkia& icon, const gfx::Size& size) | 123 explicit ShortcutOverlayImageSource(const gfx::ImageSkia& icon) |
123 : gfx::CanvasImageSource(size, false), | 124 : gfx::CanvasImageSource(icon.size(), false), |
124 icon_(icon) { | 125 icon_(icon) { |
125 if (!icon_.isNull()) { | |
126 DCHECK_EQ(extension_misc::EXTENSION_ICON_SMALL, icon_.width()); | |
127 DCHECK_EQ(extension_misc::EXTENSION_ICON_SMALL, icon_.height()); | |
128 } | |
129 } | 126 } |
130 virtual ~TabOverlayImageSource() {} | 127 virtual ~ShortcutOverlayImageSource() {} |
131 | 128 |
132 private: | 129 private: |
133 // gfx::CanvasImageSource overrides: | 130 // gfx::CanvasImageSource overrides: |
134 virtual void Draw(gfx::Canvas* canvas) OVERRIDE { | 131 virtual void Draw(gfx::Canvas* canvas) OVERRIDE { |
135 using extension_misc::EXTENSION_ICON_SMALL; | 132 canvas->DrawImageInt(icon_, 0, 0); |
136 using extension_misc::EXTENSION_ICON_MEDIUM; | |
137 | 133 |
138 const int kIconOffset = (EXTENSION_ICON_MEDIUM - EXTENSION_ICON_SMALL) / 2; | 134 // Draw the overlay in the bottom left corner of the icon. |
139 | 135 const gfx::ImageSkia& overlay = *ui::ResourceBundle::GetSharedInstance(). |
140 // The tab overlay is not vertically symmetric, to position the app in the | 136 GetImageSkiaNamed(IDR_APP_LIST_TAB_OVERLAY); |
141 // middle of the overlay we need a slight adjustment. | 137 canvas->DrawImageInt(overlay, 0, icon_.height() - overlay.height()); |
142 const int kVerticalAdjust = 4; | |
143 canvas->DrawImageInt( | |
144 *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed( | |
145 IDR_APP_LIST_TAB_OVERLAY), | |
146 0, 0); | |
147 canvas->DrawImageInt(icon_, kIconOffset, kIconOffset + kVerticalAdjust); | |
148 } | 138 } |
149 | 139 |
150 gfx::ImageSkia icon_; | 140 gfx::ImageSkia icon_; |
151 | 141 |
152 DISALLOW_COPY_AND_ASSIGN(TabOverlayImageSource); | 142 DISALLOW_COPY_AND_ASSIGN(ShortcutOverlayImageSource); |
153 }; | 143 }; |
154 | 144 |
155 extensions::ExtensionPrefs::LaunchType GetExtensionLaunchType( | 145 extensions::ExtensionPrefs::LaunchType GetExtensionLaunchType( |
156 Profile* profile, | 146 Profile* profile, |
157 const Extension* extension) { | 147 const Extension* extension) { |
158 ExtensionService* service = | 148 ExtensionService* service = |
159 extensions::ExtensionSystem::Get(profile)->extension_service(); | 149 extensions::ExtensionSystem::Get(profile)->extension_service(); |
160 return service->extension_prefs()-> | 150 return service->extension_prefs()-> |
161 GetLaunchType(extension, extensions::ExtensionPrefs::LAUNCH_DEFAULT); | 151 GetLaunchType(extension, extensions::ExtensionPrefs::LAUNCH_DEFAULT); |
162 } | 152 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
273 // TODO(xiyuan): Revisit this when implementing paging support. | 263 // TODO(xiyuan): Revisit this when implementing paging support. |
274 GetExtensionSorting(profile_)->SetPageOrdinal(extension_id_, prev_page); | 264 GetExtensionSorting(profile_)->SetPageOrdinal(extension_id_, prev_page); |
275 service->OnExtensionMoved(extension_id_, | 265 service->OnExtensionMoved(extension_id_, |
276 prev->extension_id(), | 266 prev->extension_id(), |
277 std::string()); | 267 std::string()); |
278 } | 268 } |
279 | 269 |
280 void ExtensionAppItem::UpdateIcon() { | 270 void ExtensionAppItem::UpdateIcon() { |
281 if (!GetExtension()) { | 271 if (!GetExtension()) { |
282 gfx::ImageSkia icon = installing_icon_; | 272 gfx::ImageSkia icon = installing_icon_; |
283 if (HasOverlay()) { | 273 if (HasOverlay()) |
284 // The tab overlay requires icons of a certain size. | 274 icon = gfx::ImageSkia(new ShortcutOverlayImageSource(icon), icon.size()); |
285 gfx::Size small_size(extension_misc::EXTENSION_ICON_SMALL, | |
286 extension_misc::EXTENSION_ICON_SMALL); | |
287 icon = gfx::ImageSkiaOperations::CreateResizedImage( | |
288 icon, skia::ImageOperations::RESIZE_GOOD, small_size); | |
289 | |
290 gfx::Size size(extension_misc::EXTENSION_ICON_MEDIUM, | |
291 extension_misc::EXTENSION_ICON_MEDIUM); | |
292 icon = gfx::ImageSkia(new TabOverlayImageSource(icon, size), size); | |
293 } | |
294 SetIcon(icon, !HasOverlay()); | 275 SetIcon(icon, !HasOverlay()); |
295 return; | 276 return; |
296 } | 277 } |
297 gfx::ImageSkia icon = icon_->image_skia(); | 278 gfx::ImageSkia icon = icon_->image_skia(); |
298 | 279 |
299 const ExtensionService* service = | 280 const ExtensionService* service = |
300 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 281 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
301 const bool enabled = service->IsExtensionEnabledForLauncher(extension_id_); | 282 const bool enabled = service->IsExtensionEnabledForLauncher(extension_id_); |
302 if (!enabled) { | 283 if (!enabled) { |
303 const color_utils::HSL shift = {-1, 0, 0.6}; | 284 const color_utils::HSL shift = {-1, 0, 0.6}; |
304 icon = gfx::ImageSkiaOperations::CreateHSLShiftedImage(icon, shift); | 285 icon = gfx::ImageSkiaOperations::CreateHSLShiftedImage(icon, shift); |
305 } | 286 } |
306 | 287 |
307 if (HasOverlay()) { | 288 if (HasOverlay()) |
308 const gfx::Size size(extension_misc::EXTENSION_ICON_MEDIUM, | 289 icon = gfx::ImageSkia(new ShortcutOverlayImageSource(icon), icon.size()); |
309 extension_misc::EXTENSION_ICON_MEDIUM); | |
310 icon = gfx::ImageSkia(new TabOverlayImageSource(icon, size), size); | |
311 } | |
312 | 290 |
313 SetIcon(icon, !HasOverlay()); | 291 SetIcon(icon, !HasOverlay()); |
314 } | 292 } |
315 | 293 |
316 const Extension* ExtensionAppItem::GetExtension() const { | 294 const Extension* ExtensionAppItem::GetExtension() const { |
317 const ExtensionService* service = | 295 const ExtensionService* service = |
318 extensions::ExtensionSystem::Get(profile_)->extension_service(); | 296 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
319 const Extension* extension = service->GetInstalledExtension(extension_id_); | 297 const Extension* extension = service->GetInstalledExtension(extension_id_); |
320 return extension; | 298 return extension; |
321 } | 299 } |
322 | 300 |
323 void ExtensionAppItem::LoadImage(const Extension* extension) { | 301 void ExtensionAppItem::LoadImage(const Extension* extension) { |
324 int icon_size = extension_misc::EXTENSION_ICON_MEDIUM; | |
325 if (HasOverlay()) | |
326 icon_size = extension_misc::EXTENSION_ICON_SMALL; | |
327 | |
328 icon_.reset(new extensions::IconImage( | 302 icon_.reset(new extensions::IconImage( |
329 profile_, | 303 profile_, |
330 extension, | 304 extension, |
331 extensions::IconsInfo::GetIcons(extension), | 305 extensions::IconsInfo::GetIcons(extension), |
332 icon_size, | 306 extension_misc::EXTENSION_ICON_MEDIUM, |
333 extensions::IconsInfo::GetDefaultAppIcon(), | 307 extensions::IconsInfo::GetDefaultAppIcon(), |
334 this)); | 308 this)); |
335 UpdateIcon(); | 309 UpdateIcon(); |
336 } | 310 } |
337 | 311 |
338 void ExtensionAppItem::ShowExtensionOptions() { | 312 void ExtensionAppItem::ShowExtensionOptions() { |
339 const Extension* extension = GetExtension(); | 313 const Extension* extension = GetExtension(); |
340 if (!extension) | 314 if (!extension) |
341 return; | 315 return; |
342 | 316 |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 context_menu_model_->AddItemWithStringId(DETAILS, | 580 context_menu_model_->AddItemWithStringId(DETAILS, |
607 IDS_NEW_TAB_APP_DETAILS); | 581 IDS_NEW_TAB_APP_DETAILS); |
608 context_menu_model_->AddItemWithStringId(UNINSTALL, | 582 context_menu_model_->AddItemWithStringId(UNINSTALL, |
609 is_platform_app_ ? | 583 is_platform_app_ ? |
610 IDS_APP_LIST_UNINSTALL_ITEM : | 584 IDS_APP_LIST_UNINSTALL_ITEM : |
611 IDS_EXTENSIONS_UNINSTALL); | 585 IDS_EXTENSIONS_UNINSTALL); |
612 } | 586 } |
613 | 587 |
614 return context_menu_model_.get(); | 588 return context_menu_model_.get(); |
615 } | 589 } |
OLD | NEW |