// Copyright (c) 2012 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_UI_SEARCH_ENGINES_TEMPLATE_URL_TABLE_MODEL_H_ #define CHROME_BROWSER_UI_SEARCH_ENGINES_TEMPLATE_URL_TABLE_MODEL_H_ #include <string> #include <vector> #include "base/compiler_specific.h" #include "base/memory/scoped_ptr.h" #include "base/strings/string16.h" #include "chrome/browser/search_engines/template_url_service_observer.h" #include "ui/base/models/table_model.h" class ModelEntry; class TemplateURL; class TemplateURLService; namespace gfx { class ImageSkia; } // TemplateURLTableModel is the TableModel implementation used by // KeywordEditorView to show the keywords in a TableView. // // TemplateURLTableModel has two columns, the first showing the description, // the second the keyword. // // TemplateURLTableModel maintains a vector of ModelEntrys that correspond to // each row in the tableview. Each ModelEntry wraps a TemplateURL, providing // the favicon. The entries in the model are sorted such that non-generated // appear first (grouped together) and are followed by generated keywords. class TemplateURLTableModel : public ui::TableModel, TemplateURLServiceObserver { public: explicit TemplateURLTableModel(TemplateURLService* template_url_service); virtual ~TemplateURLTableModel(); // Reloads the entries from the TemplateURLService. This should ONLY be // invoked if the TemplateURLService wasn't initially loaded and has been // loaded. void Reload(); // ui::TableModel overrides. virtual int RowCount() OVERRIDE; virtual base::string16 GetText(int row, int column) OVERRIDE; virtual gfx::ImageSkia GetIcon(int row) OVERRIDE; virtual void SetObserver(ui::TableModelObserver* observer) OVERRIDE; virtual bool HasGroups() OVERRIDE; virtual Groups GetGroups() OVERRIDE; virtual int GetGroupID(int row) OVERRIDE; // Removes the entry at the specified index. void Remove(int index); // Adds a new entry at the specified index. void Add(int index, const base::string16& short_name, const base::string16& keyword, const std::string& url); // Update the entry at the specified index. void ModifyTemplateURL(int index, const base::string16& title, const base::string16& keyword, const std::string& url); // Reloads the icon at the specified index. void ReloadIcon(int index); // Returns the TemplateURL at the specified index. TemplateURL* GetTemplateURL(int index); // Returns the index of the TemplateURL, or -1 if it the TemplateURL is not // found. int IndexOfTemplateURL(const TemplateURL* template_url); // Moves the keyword at the specified index to be at the end of the main // group. Returns the new index. If the entry is already in the main group, // no action is taken, and the current index is returned. int MoveToMainGroup(int index); // Make the TemplateURL at |index| the default. Returns the new index, or -1 // if the index is invalid or it is already the default. int MakeDefaultTemplateURL(int index); // If there is an observer, it's notified the selected row has changed. void NotifyChanged(int index); TemplateURLService* template_url_service() const { return template_url_service_; } // Returns the index of the last entry shown in the search engines group. int last_search_engine_index() const { return last_search_engine_index_; } // Returns the index of the last entry shown in the other search engines // group. int last_other_engine_index() const { return last_other_engine_index_; } private: friend class ModelEntry; // Notification that a model entry has fetched its icon. void FaviconAvailable(ModelEntry* entry); // TemplateURLServiceObserver notification. virtual void OnTemplateURLServiceChanged() OVERRIDE; // Removes the entry at |index| from |entries_| and returns the removed item. scoped_ptr<ModelEntry> RemoveEntry(int index); // Adds |entry| to |entries_| at |index| and takes ownership. void AddEntry(int index, scoped_ptr<ModelEntry> entry); ui::TableModelObserver* observer_; // The entries. std::vector<ModelEntry*> entries_; // The model we're displaying entries from. TemplateURLService* template_url_service_; // Index of the last search engine in entries_. This is used to determine the // group boundaries. int last_search_engine_index_; // Index of the last other engine in entries_. This is used to determine the // group boundaries. int last_other_engine_index_; DISALLOW_COPY_AND_ASSIGN(TemplateURLTableModel); }; #endif // CHROME_BROWSER_UI_SEARCH_ENGINES_TEMPLATE_URL_TABLE_MODEL_H_