extension_app_item.h revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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/extensions/extension_icon_image.h"
12#include "chrome/browser/ui/app_list/app_context_menu_delegate.h"
13#include "chrome/browser/ui/app_list/chrome_app_list_item.h"
14#include "chrome/browser/ui/extensions/extension_enable_flow_delegate.h"
15#include "sync/api/string_ordinal.h"
16#include "ui/gfx/image/image_skia.h"
17
18class AppListControllerDelegate;
19class ExtensionEnableFlow;
20class Profile;
21
22namespace app_list {
23class AppContextMenu;
24}
25
26namespace extensions {
27class ContextMenuMatcher;
28class Extension;
29}
30
31// ExtensionAppItem represents an extension app in app list.
32class ExtensionAppItem : public ChromeAppListItem,
33                         public extensions::IconImage::Observer,
34                         public ExtensionEnableFlowDelegate,
35                         public app_list::AppContextMenuDelegate {
36 public:
37  ExtensionAppItem(Profile* profile,
38                   const std::string& extension_id,
39                   AppListControllerDelegate* controller,
40                   const std::string& extension_name,
41                   const gfx::ImageSkia& installing_icon,
42                   bool is_platform_app);
43  virtual ~ExtensionAppItem();
44
45  // Reload the title and icon from the underlying extension.
46  void Reload();
47
48  syncer::StringOrdinal GetPageOrdinal() const;
49  syncer::StringOrdinal GetAppLaunchOrdinal() const;
50
51  // Update page and app launcher ordinals to put the app in between |prev| and
52  // |next|. Note that |prev| and |next| could be NULL when the app is put at
53  // the beginning or at the end.
54  void Move(const ExtensionAppItem* prev, const ExtensionAppItem* next);
55
56  // Updates the app item's icon, if necessary adding an overlay and/or making
57  // it gray.
58  void UpdateIcon();
59
60  const std::string& extension_id() const { return extension_id_; }
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 has an overlay.
79  bool HasOverlay() 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 ChromeAppListItem:
90  virtual void Activate(int event_flags) OVERRIDE;
91  virtual ui::MenuModel* GetContextMenuModel() OVERRIDE;
92
93  // Overridden from app_list::AppContextMenuDelegate:
94  virtual void ExecuteLaunchCommand(int event_flags) OVERRIDE;
95
96  Profile* profile_;
97  const std::string extension_id_;
98  AppListControllerDelegate* controller_;
99
100  scoped_ptr<extensions::IconImage> icon_;
101  scoped_ptr<app_list::AppContextMenu> context_menu_;
102  scoped_ptr<ExtensionEnableFlow> extension_enable_flow_;
103
104  // Name to use for the extension if we can't access it.
105  std::string extension_name_;
106
107  // Icon for the extension if we can't access the installed extension.
108  gfx::ImageSkia installing_icon_;
109
110  // Whether or not this app is a platform app.
111  bool is_platform_app_;
112
113  DISALLOW_COPY_AND_ASSIGN(ExtensionAppItem);
114};
115
116#endif  // CHROME_BROWSER_UI_APP_LIST_EXTENSION_APP_ITEM_H_
117