extension_app_item.h revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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" 1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/ui/app_list/app_context_menu_delegate.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_syncable_service.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h" 146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "extensions/browser/extension_icon_image.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/app_list/app_list_item.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AppListControllerDelegate; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionEnableFlow; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace app_list { 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class AppContextMenu; 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContextMenuMatcher; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExtensionAppItem represents an extension app in app list. 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ExtensionAppItem : public app_list::AppListItem, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public extensions::IconImage::Observer, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public ExtensionEnableFlowDelegate, 3590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) public app_list::AppContextMenuDelegate { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static const char kItemType[]; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionAppItem(Profile* profile, 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const app_list::AppListSyncableService::SyncItem* sync_item, 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_id, 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& extension_name, 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::ImageSkia& installing_icon, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_platform_app); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionAppItem(); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reload the title and icon from the underlying extension. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Reload(); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Updates the app item's icon, if necessary adding an overlay and/or making 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // it gray. 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateIcon(); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Update page and app launcher ordinals to put the app in between |prev| and 558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // |next|. Note that |prev| and |next| could be NULL when the app is put at 568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // the beginning or at the end. 578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void Move(const ExtensionAppItem* prev, const ExtensionAppItem* next); 588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id() const { return extension_id_; } 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& extension_name() const { return extension_name_; } 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Gets extension associated with this model. Returns NULL if extension 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // no longer exists. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* GetExtension() const; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Loads extension icon. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void LoadImage(const extensions::Extension* extension); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Checks if extension is disabled and if enable flow should be started. 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true if extension enable flow is started or there is already one 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // running. 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool RunExtensionEnableFlow(); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Private equivalent to Activate(), without refocus for already-running apps. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Launch(int event_flags); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Whether or not the app item needs an overlay. 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool NeedsOverlay() const; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overridden from extensions::IconImage::Observer: 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnExtensionIconImageChanged( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::IconImage* image) OVERRIDE; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ExtensionEnableFlowDelegate: 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ExtensionEnableFlowFinished() OVERRIDE; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ExtensionEnableFlowAborted(bool user_initiated) OVERRIDE; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Overridden from AppListItem: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Activate(int event_flags) OVERRIDE; 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual ui::MenuModel* GetContextMenuModel() OVERRIDE; 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Updates the icon if the overlay needs to be added/removed. 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnExtensionPreferenceChanged() OVERRIDE; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual const char* GetItemType() const OVERRIDE; 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Overridden from app_list::AppContextMenuDelegate: 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual void ExecuteLaunchCommand(int event_flags) OVERRIDE; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Set the position from the extension ordering. 1001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void UpdatePositionFromExtensionOrdering(); 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Return the controller for the active desktop type. 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AppListControllerDelegate* GetController(); 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string extension_id_; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<extensions::IconImage> icon_; 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) scoped_ptr<app_list::AppContextMenu> context_menu_; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<ExtensionEnableFlow> extension_enable_flow_; 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) AppListControllerDelegate* extension_enable_flow_controller_; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Name to use for the extension if we can't access it. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string extension_name_; 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Icon for the extension if we can't access the installed extension. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::ImageSkia installing_icon_; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Whether or not this app is a platform app. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_platform_app_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Whether this app item has an overlay. 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool has_overlay_; 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionAppItem); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_ 129