Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2011 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_EXTENSIONS_EXTENSION_TOOLBAR_MODEL_H_
      6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_TOOLBAR_MODEL_H_
      7 #pragma once
      8 
      9 #include "base/observer_list.h"
     10 #include "chrome/common/extensions/extension.h"
     11 #include "content/common/notification_observer.h"
     12 #include "content/common/notification_registrar.h"
     13 
     14 class ExtensionService;
     15 class PrefService;
     16 
     17 // Model for the browser actions toolbar.
     18 class ExtensionToolbarModel : public NotificationObserver {
     19  public:
     20   explicit ExtensionToolbarModel(ExtensionService* service);
     21   ~ExtensionToolbarModel();
     22 
     23   // Notifies the toolbar model that the Profile that suplied its
     24   // prefs is being destroyed.
     25   void DestroyingProfile();
     26 
     27   // A class which is informed of changes to the model; represents the view of
     28   // MVC.
     29   class Observer {
     30    public:
     31     // An extension with a browser action button has been added, and should go
     32     // in the toolbar at |index|.
     33     virtual void BrowserActionAdded(const Extension* extension, int index) {}
     34 
     35     // The browser action button for |extension| should no longer show.
     36     virtual void BrowserActionRemoved(const Extension* extension) {}
     37 
     38     // The browser action button for |extension| has been moved to |index|.
     39     virtual void BrowserActionMoved(const Extension* extension, int index) {}
     40 
     41     // Called when the model has finished loading.
     42     virtual void ModelLoaded() {}
     43 
     44    protected:
     45     virtual ~Observer() {}
     46   };
     47 
     48   // Functions called by the view.
     49   void AddObserver(Observer* observer);
     50   void RemoveObserver(Observer* observer);
     51   void MoveBrowserAction(const Extension* extension, int index);
     52   // If count == size(), this will set the visible icon count to -1, meaning
     53   // "show all actions".
     54   void SetVisibleIconCount(int count);
     55   // As above, a return value of -1 represents "show all actions".
     56   int GetVisibleIconCount() { return visible_icon_count_; }
     57 
     58   bool extensions_initialized() const { return extensions_initialized_; }
     59 
     60   size_t size() const {
     61     return toolitems_.size();
     62   }
     63 
     64   ExtensionList::iterator begin() {
     65     return toolitems_.begin();
     66   }
     67 
     68   ExtensionList::iterator end() {
     69     return toolitems_.end();
     70   }
     71 
     72   const Extension* GetExtensionByIndex(int index) const;
     73 
     74   // Utility functions for converting between an index into the list of
     75   // incognito-enabled browser actions, and the list of all browser actions.
     76   int IncognitoIndexToOriginal(int incognito_index);
     77   int OriginalIndexToIncognito(int original_index);
     78 
     79  private:
     80   // NotificationObserver implementation.
     81   virtual void Observe(NotificationType type,
     82                        const NotificationSource& source,
     83                        const NotificationDetails& details);
     84 
     85   // To be called after the extension service is ready; gets loaded extensions
     86   // from the extension service and their saved order from the pref service
     87   // and constructs |toolitems_| from these data.
     88   void InitializeExtensionList();
     89 
     90   // Save the model to prefs.
     91   void UpdatePrefs();
     92 
     93   // Our observers.
     94   ObserverList<Observer> observers_;
     95 
     96   void AddExtension(const Extension* extension);
     97   void RemoveExtension(const Extension* extension);
     98 
     99   // Our ExtensionService, guaranteed to outlive us.
    100   ExtensionService* service_;
    101 
    102   PrefService* prefs_;
    103 
    104   // True if we've handled the initial EXTENSIONS_READY notification.
    105   bool extensions_initialized_;
    106 
    107   // Ordered list of browser action buttons.
    108   ExtensionList toolitems_;
    109 
    110   // Keeps track of what the last extension to get disabled was.
    111   std::string last_extension_removed_;
    112 
    113   // Keeps track of where the last extension to get disabled was in the list.
    114   size_t last_extension_removed_index_;
    115 
    116   // The number of icons visible (the rest should be hidden in the overflow
    117   // chevron).
    118   int visible_icon_count_;
    119 
    120   NotificationRegistrar registrar_;
    121 };
    122 
    123 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_TOOLBAR_MODEL_H_
    124