summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_shelf_model.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/extension_shelf_model.h')
-rw-r--r--chrome/browser/extensions/extension_shelf_model.h167
1 files changed, 167 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_shelf_model.h b/chrome/browser/extensions/extension_shelf_model.h
new file mode 100644
index 0000000..934ec3b
--- /dev/null
+++ b/chrome/browser/extensions/extension_shelf_model.h
@@ -0,0 +1,167 @@
+// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_SHELF_MODEL_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_SHELF_MODEL_H_
+
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/observer_list.h"
+#include "chrome/browser/extensions/extension_host.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/notification_observer.h"
+#include "chrome/common/notification_registrar.h"
+
+class Browser;
+class ExtensionPrefs;
+class ExtensionShelfModelObserver;
+
+// The model representing the toolstrips on an ExtensionShelf. The order of
+// the toolstrips is common across all of the models for a given Profile,
+// but there are multiple models. Each model contains the hosts/views which
+// are specific to a Browser.
+class ExtensionShelfModel : public NotificationObserver {
+ public:
+ explicit ExtensionShelfModel(Browser* browser);
+ virtual ~ExtensionShelfModel();
+
+ struct ToolstripItem {
+ ExtensionHost* host;
+ Extension::ToolstripInfo info;
+ void* data;
+ int height;
+ GURL url;
+ };
+
+ typedef std::vector<ToolstripItem> ToolstripList;
+ typedef ToolstripList::iterator iterator;
+
+ // Add and remove observers to changes within this ExtensionShelfModel.
+ void AddObserver(ExtensionShelfModelObserver* observer);
+ void RemoveObserver(ExtensionShelfModelObserver* observer);
+
+ // The number of toolstrips in the model.
+ int count() const { return static_cast<int>(toolstrips_.size()); }
+ bool empty() const { return toolstrips_.empty(); }
+
+ // Iterators for the toolstrips in the model.
+ iterator begin() { return toolstrips_.begin(); }
+ ExtensionShelfModel::iterator end() { return toolstrips_.end(); }
+
+ // Add |toolstrip| to the end of the shelf.
+ void AppendToolstrip(const ToolstripItem& toolstrip);
+
+ // Insert |toolstrip| and |data| at |index|.
+ void InsertToolstripAt(int index, const ToolstripItem& toolstrip);
+
+ // Remove the toolstrip at |index|.
+ void RemoveToolstripAt(int index);
+
+ // Move the toolstrip at |index| to |to_index|.
+ void MoveToolstripAt(int index, int to_index);
+
+ // Lookup the index of |host|. Returns -1 if not present.
+ int IndexOfHost(ExtensionHost* host);
+
+ // Return the toolstrip at |index|.
+ const ToolstripItem& ToolstripAt(int index);
+
+ // Return the ToolstripItem associated with |host| or NULL if it's not
+ // present.
+ ToolstripList::iterator ToolstripForHost(ExtensionHost* host);
+
+ // Set some arbitrary data associated with a particular toolstrip.
+ void SetToolstripDataAt(int index, void* data);
+
+ // Update the ToolstripItem for |toolstrip| to set its |url| and |height|
+ // and then call ToolstripChanged for all observers.
+ // If |url| is empty, no navigation is requested.
+ void ExpandToolstrip(iterator toolstrip, const GURL& url, int height);
+
+ // Update the ToolstripItem for |toolstrip| to set its |url| and its height
+ // to 0, and then call ToolstripChanged for all observers.
+ // If |url| is empty, no navigation is requested.
+ void CollapseToolstrip(iterator toolstrip, const GURL& url);
+
+ // NotificationObserver
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
+ private:
+ // Add all of the toolstrips from |extension|.
+ void AddExtension(Extension* extension);
+
+ // Add all of the toolstrips from each extension in |extensions|.
+ void AddExtensions(const ExtensionList* extensions);
+
+ // Remove all of the toolstrips in |extension| from the shelf.
+ void RemoveExtension(Extension* extension);
+
+ // Update prefs with the most recent changes.
+ void UpdatePrefs();
+
+ // Reloads order from prefs.
+ void SortToolstrips();
+
+ // The browser that this model is attached to.
+ Browser* browser_;
+
+ // The preferences that this model uses.
+ ExtensionPrefs* prefs_;
+
+ // Manages our notification registrations.
+ NotificationRegistrar registrar_;
+
+ // The Toolstrips loaded in this model. The model owns these objects.
+ ToolstripList toolstrips_;
+
+ // Our observers.
+ typedef ObserverList<ExtensionShelfModelObserver>
+ ExtensionShelfModelObservers;
+ ExtensionShelfModelObservers observers_;
+
+ // Whether the model has received an EXTENSIONS_READY notification.
+ bool ready_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionShelfModel);
+};
+
+// Objects implement this interface when they wish to be notified of changes to
+// the ExtensionShelfModel.
+//
+// Register your ExtensionShelfModelObserver with the ExtensionShelfModel using
+// Add/RemoveObserver methods.
+class ExtensionShelfModelObserver {
+ public:
+ // A new toolstrip was inserted into ExtensionShelfModel at |index|.
+ virtual void ToolstripInsertedAt(ExtensionHost* toolstrip, int index) {}
+
+ // The specified toolstrip is being removed and destroyed.
+ virtual void ToolstripRemovingAt(ExtensionHost* toolstrip, int index) {}
+
+ // |toolstrip| moved from |from_index| to |to_index|.
+ virtual void ToolstripMoved(ExtensionHost* toolstrip,
+ int from_index,
+ int to_index) {}
+
+ // The specified toolstrip changed in some way (currently only size changes)
+ virtual void ToolstripChanged(ExtensionShelfModel::iterator toolstrip) {}
+
+ // There are no more toolstrips in the model.
+ virtual void ExtensionShelfEmpty() {}
+
+ // The entire model may have changed.
+ virtual void ShelfModelReloaded() {}
+
+ // The model is being destroyed.
+ virtual void ShelfModelDeleting() {}
+
+ protected:
+ virtual ~ExtensionShelfModelObserver() {}
+};
+
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_SHELF_MODEL_H_