1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_CUSTOM_HOME_PAGES_TABLE_MODEL_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CUSTOM_HOME_PAGES_TABLE_MODEL_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/compiler_specific.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/favicon_service.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/models/table_model.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass GURL;
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SkBitmap;
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace ui {
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TableModelObserver;
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CustomHomePagesTableModel is the model for the TableView showing the list
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// of pages the user wants opened on startup.
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass CustomHomePagesTableModel : public ui::TableModel {
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit CustomHomePagesTableModel(Profile* profile);
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual ~CustomHomePagesTableModel();
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the set of urls that this model contains.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetURLs(const std::vector<GURL>& urls);
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds an entry at the specified index.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Add(int index, const GURL& url);
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes the entry at the specified index.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Remove(int index);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clears any entries and fills the list with pages currently opened in the
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // browser.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetToCurrentlyOpenPages();
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the set of urls this model contains.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<GURL> GetURLs();
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TableModel overrides:
503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual int RowCount() OVERRIDE;
513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual string16 GetText(int row, int column_id) OVERRIDE;
523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual SkBitmap GetIcon(int row) OVERRIDE;
533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual string16 GetTooltip(int row) OVERRIDE;
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  virtual void SetObserver(ui::TableModelObserver* observer) OVERRIDE;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Each item in the model is represented as an Entry. Entry stores the URL,
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // title, and favicon of the page.
593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  struct Entry;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Loads the title and favicon for the specified entry.
62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void LoadTitleAndFavicon(Entry* entry);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback from history service. Updates the title of the Entry whose
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |title_handle| matches |handle| and notifies the observer of the change.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnGotTitle(HistoryService::Handle handle,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  bool found_url,
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const history::URLRow* row,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  history::VisitVector* visits);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Callback from history service. Updates the icon of the Entry whose
72ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // |favicon_handle| matches |handle| and notifies the observer of the change.
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void OnGotFavicon(FaviconService::Handle handle,
74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    history::FaviconData favicon);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the entry whose |member| matches |handle| and sets |entry_index| to
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the index of the entry.
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Entry* GetEntryByLoadHandle(CancelableRequestProvider::Handle Entry::* member,
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              CancelableRequestProvider::Handle handle,
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              int* entry_index);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the URL for a particular row, formatted for display to the user.
833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 FormattedURL(int row) const;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set of entries we're showing.
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<Entry> entries_;
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Default icon to show when one can't be found for the URL.
893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SkBitmap* default_favicon_;
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Profile used to load titles and icons.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::TableModelObserver* observer_;
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used in loading titles and favicons.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CancelableRequestConsumer query_consumer_;
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(CustomHomePagesTableModel);
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CUSTOM_HOME_PAGES_TABLE_MODEL_H_
103