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