extension_app_item.h revision f2477e01787aa58f445919b809d89e252beef54f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_icon_image.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_context_menu_delegate.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/app_list/app_list_item_model.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppListControllerDelegate; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionEnableFlow; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace app_list { 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AppContextMenu; 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContextMenuMatcher; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExtensionAppItem represents an extension app in app list. 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ExtensionAppItem : public app_list::AppListItemModel, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public extensions::IconImage::Observer, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public ExtensionEnableFlowDelegate, 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public app_list::AppContextMenuDelegate { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAppItem(Profile* profile, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id, 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_name, 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::ImageSkia& installing_icon, 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_platform_app); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionAppItem(); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reload the title and icon from the underlying extension. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Reload(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates the app item's icon, if necessary adding an overlay and/or making 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it gray. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateIcon(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Update page and app launcher ordinals to put the app in between |prev| and 518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // |next|. Note that |prev| and |next| could be NULL when the app is put at 528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // the beginning or at the end. 538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void Move(const ExtensionAppItem* prev, const ExtensionAppItem* next); 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id() const { return extension_id_; } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) static const char kAppType[]; 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets extension associated with this model. Returns NULL if extension 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // no longer exists. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* GetExtension() const; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads extension icon. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadImage(const extensions::Extension* extension); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checks if extension is disabled and if enable flow should be started. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if extension enable flow is started or there is already one 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // running. 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool RunExtensionEnableFlow(); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Private equivalent to Activate(), without refocus for already-running apps. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Launch(int event_flags); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether or not the app item has an overlay. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool HasOverlay() const; 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from extensions::IconImage::Observer: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnExtensionIconImageChanged( 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::IconImage* image) OVERRIDE; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ExtensionEnableFlowDelegate: 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ExtensionEnableFlowFinished() OVERRIDE; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ExtensionEnableFlowAborted(bool user_initiated) OVERRIDE; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Overridden from AppListItemModel: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Activate(int event_flags) OVERRIDE; 8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ui::MenuModel* GetContextMenuModel() OVERRIDE; 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual const char* GetAppType() const OVERRIDE; 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from app_list::AppContextMenuDelegate: 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void ExecuteLaunchCommand(int event_flags) OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Set the position from the extension ordering. 951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void UpdatePositionFromExtensionOrdering(); 961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Return the controller for the active desktop type. 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AppListControllerDelegate* GetController(); 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string extension_id_; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<extensions::IconImage> icon_; 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<app_list::AppContextMenu> context_menu_; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ExtensionEnableFlow> extension_enable_flow_; 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AppListControllerDelegate* extension_enable_flow_controller_; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Name to use for the extension if we can't access it. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string extension_name_; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Icon for the extension if we can't access the installed extension. 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia installing_icon_; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether or not this app is a platform app. 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_platform_app_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionAppItem); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_ 121