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 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_ 6 #define CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_ 7 8 #include <string> 9 10 #include "base/memory/scoped_ptr.h" 11 #include "chrome/browser/ui/app_list/app_context_menu_delegate.h" 12 #include "chrome/browser/ui/app_list/app_list_syncable_service.h" 13 #include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h" 14 #include "extensions/browser/extension_icon_image.h" 15 #include "ui/app_list/app_list_item.h" 16 #include "ui/gfx/image/image_skia.h" 17 18 class AppListControllerDelegate; 19 class ExtensionEnableFlow; 20 class Profile; 21 22 namespace app_list { 23 class AppContextMenu; 24 } 25 26 namespace extensions { 27 class ContextMenuMatcher; 28 class Extension; 29 } 30 31 // ExtensionAppItem represents an extension app in app list. 32 class ExtensionAppItem : public app_list::AppListItem, 33 public extensions::IconImage::Observer, 34 public ExtensionEnableFlowDelegate, 35 public app_list::AppContextMenuDelegate { 36 public: 37 static const char kItemType[]; 38 39 ExtensionAppItem(Profile* profile, 40 const app_list::AppListSyncableService::SyncItem* sync_item, 41 const std::string& extension_id, 42 const std::string& extension_name, 43 const gfx::ImageSkia& installing_icon, 44 bool is_platform_app); 45 virtual ~ExtensionAppItem(); 46 47 // Reload the title and icon from the underlying extension. 48 void Reload(); 49 50 // Updates the app item's icon, if necessary adding an overlay and/or making 51 // it gray. 52 void UpdateIcon(); 53 54 // Update page and app launcher ordinals to put the app in between |prev| and 55 // |next|. Note that |prev| and |next| could be NULL when the app is put at 56 // the beginning or at the end. 57 void Move(const ExtensionAppItem* prev, const ExtensionAppItem* next); 58 59 const std::string& extension_id() const { return extension_id_; } 60 const std::string& extension_name() const { return extension_name_; } 61 62 private: 63 // Gets extension associated with this model. Returns NULL if extension 64 // no longer exists. 65 const extensions::Extension* GetExtension() const; 66 67 // Loads extension icon. 68 void LoadImage(const extensions::Extension* extension); 69 70 // Checks if extension is disabled and if enable flow should be started. 71 // Returns true if extension enable flow is started or there is already one 72 // running. 73 bool RunExtensionEnableFlow(); 74 75 // Private equivalent to Activate(), without refocus for already-running apps. 76 void Launch(int event_flags); 77 78 // Whether or not the app item needs an overlay. 79 bool NeedsOverlay() const; 80 81 // Overridden from extensions::IconImage::Observer: 82 virtual void OnExtensionIconImageChanged( 83 extensions::IconImage* image) OVERRIDE; 84 85 // Overridden from ExtensionEnableFlowDelegate: 86 virtual void ExtensionEnableFlowFinished() OVERRIDE; 87 virtual void ExtensionEnableFlowAborted(bool user_initiated) OVERRIDE; 88 89 // Overridden from AppListItem: 90 virtual void Activate(int event_flags) OVERRIDE; 91 virtual ui::MenuModel* GetContextMenuModel() OVERRIDE; 92 // Updates the icon if the overlay needs to be added/removed. 93 virtual void OnExtensionPreferenceChanged() OVERRIDE; 94 virtual const char* GetItemType() const OVERRIDE; 95 96 // Overridden from app_list::AppContextMenuDelegate: 97 virtual void ExecuteLaunchCommand(int event_flags) OVERRIDE; 98 99 // Set the position from the extension ordering. 100 void UpdatePositionFromExtensionOrdering(); 101 102 // Return the controller for the active desktop type. 103 AppListControllerDelegate* GetController(); 104 105 Profile* profile_; 106 const std::string extension_id_; 107 108 scoped_ptr<extensions::IconImage> icon_; 109 scoped_ptr<app_list::AppContextMenu> context_menu_; 110 scoped_ptr<ExtensionEnableFlow> extension_enable_flow_; 111 AppListControllerDelegate* extension_enable_flow_controller_; 112 113 // Name to use for the extension if we can't access it. 114 std::string extension_name_; 115 116 // Icon for the extension if we can't access the installed extension. 117 gfx::ImageSkia installing_icon_; 118 119 // Whether or not this app is a platform app. 120 bool is_platform_app_; 121 122 // Whether this app item has an overlay. 123 bool has_overlay_; 124 125 DISALLOW_COPY_AND_ASSIGN(ExtensionAppItem); 126 }; 127 128 #endif // CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_ 129