history.h
上传用户:huahtool
上传日期:2015-12-10
资源大小:1089k
文件大小:11k
源码类别:

浏览器

开发平台:

Visual C++

  1. /****************************************************************************
  2. **
  3. ** Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies).
  4. ** Contact: Qt Software Information (qt-info@nokia.com)
  5. **
  6. ** This file is part of the demonstration applications of the Qt Toolkit.
  7. **
  8. ** Commercial Usage
  9. ** Licensees holding valid Qt Commercial licenses may use this file in
  10. ** accordance with the Qt Commercial License Agreement provided with the
  11. ** Software or, alternatively, in accordance with the terms contained in
  12. ** a written agreement between you and Nokia.
  13. **
  14. **
  15. ** GNU General Public License Usage
  16. ** Alternatively, this file may be used under the terms of the GNU
  17. ** General Public License versions 2.0 or 3.0 as published by the Free
  18. ** Software Foundation and appearing in the file LICENSE.GPL included in
  19. ** the packaging of this file.  Please review the following information
  20. ** to ensure GNU General Public Licensing requirements will be met:
  21. ** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
  22. ** http://www.gnu.org/copyleft/gpl.html.  In addition, as a special
  23. ** exception, Nokia gives you certain additional rights. These rights
  24. ** are described in the Nokia Qt GPL Exception version 1.3, included in
  25. ** the file GPL_EXCEPTION.txt in this package.
  26. **
  27. ** Qt for Windows(R) Licensees
  28. ** As a special exception, Nokia, as the sole copyright holder for Qt
  29. ** Designer, grants users of the Qt/Eclipse Integration plug-in the
  30. ** right for the Qt/Eclipse Integration to link to functionality
  31. ** provided by Qt Designer and its related libraries.
  32. **
  33. ** If you are unsure which license is appropriate for your use, please
  34. ** contact the sales department at qt-sales@nokia.com.
  35. **
  36. ****************************************************************************/
  37. #ifndef HISTORY_H
  38. #define HISTORY_H
  39. #include "modelmenu.h"
  40. #include <QtCore/QDateTime>
  41. #include <QtCore/QHash>
  42. #include <QtCore/QObject>
  43. #include <QtCore/QTimer>
  44. #include <QtCore/QUrl>
  45. #include <QtGui/QSortFilterProxyModel>
  46. #include <QWebHistoryInterface>
  47. class HistoryItem
  48. {
  49. public:
  50.     HistoryItem() {}
  51.     HistoryItem(const QString &u,
  52.                 const QDateTime &d = QDateTime(), const QString &t = QString())
  53.         : title(t), url(u), dateTime(d) {}
  54.     inline bool operator==(const HistoryItem &other) const
  55.         { return other.title == title
  56.           && other.url == url && other.dateTime == dateTime; }
  57.     // history is sorted in reverse
  58.     inline bool operator <(const HistoryItem &other) const
  59.         { return dateTime > other.dateTime; }
  60.     QString title;
  61.     QString url;
  62.     QDateTime dateTime;
  63. };
  64. class AutoSaver;
  65. class HistoryModel;
  66. class HistoryFilterModel;
  67. class HistoryTreeModel;
  68. class HistoryManager : public QWebHistoryInterface
  69. {
  70.     Q_OBJECT
  71.     Q_PROPERTY(int historyLimit READ historyLimit WRITE setHistoryLimit)
  72. signals:
  73.     void historyReset();
  74.     void entryAdded(const HistoryItem &item);
  75.     void entryRemoved(const HistoryItem &item);
  76.     void entryUpdated(int offset);
  77. public:
  78.     HistoryManager(QObject *parent = 0);
  79.     ~HistoryManager();
  80.     bool historyContains(const QString &url) const;
  81.     void addHistoryEntry(const QString &url);
  82.     void updateHistoryItem(const QUrl &url, const QString &title);
  83.     int historyLimit() const;
  84.     void setHistoryLimit(int limit);
  85.     QList<HistoryItem> history() const;
  86.     void setHistory(const QList<HistoryItem> &history, bool loadedAndSorted = false);
  87.     // History manager keeps around these models for use by the completer and other classes
  88.     HistoryModel *historyModel() const;
  89.     HistoryFilterModel *historyFilterModel() const;
  90.     HistoryTreeModel *historyTreeModel() const;
  91. public slots:
  92.     void clear();
  93.     void loadSettings();
  94. private slots:
  95.     void save();
  96.     void checkForExpired();
  97. protected:
  98.     void addHistoryItem(const HistoryItem &item);
  99. private:
  100.     void load();
  101.     AutoSaver *m_saveTimer;
  102.     int m_historyLimit;
  103.     QTimer m_expiredTimer;
  104.     QList<HistoryItem> m_history;
  105.     QString m_lastSavedUrl;
  106.     HistoryModel *m_historyModel;
  107.     HistoryFilterModel *m_historyFilterModel;
  108.     HistoryTreeModel *m_historyTreeModel;
  109. };
  110. class HistoryModel : public QAbstractTableModel
  111. {
  112.     Q_OBJECT
  113. public slots:
  114.     void historyReset();
  115.     void entryAdded();
  116.     void entryUpdated(int offset);
  117. public:
  118.     enum Roles {
  119.         DateRole = Qt::UserRole + 1,
  120.         DateTimeRole = Qt::UserRole + 2,
  121.         UrlRole = Qt::UserRole + 3,
  122.         UrlStringRole = Qt::UserRole + 4
  123.     };
  124.     HistoryModel(HistoryManager *history, QObject *parent = 0);
  125.     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
  126.     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
  127.     int columnCount(const QModelIndex &parent = QModelIndex()) const;
  128.     int rowCount(const QModelIndex &parent = QModelIndex()) const;
  129.     bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
  130. private:
  131.     HistoryManager *m_history;
  132. };
  133. /*!
  134.     Proxy model that will remove any duplicate entries.
  135.     Both m_sourceRow and m_historyHash store their offsets not from
  136.     the front of the list, but as offsets from the back.
  137.   */
  138. class HistoryFilterModel : public QAbstractProxyModel
  139. {
  140.     Q_OBJECT
  141. public:
  142.     HistoryFilterModel(QAbstractItemModel *sourceModel, QObject *parent = 0);
  143.     inline bool historyContains(const QString &url) const
  144.         { load(); return m_historyHash.contains(url); }
  145.     int historyLocation(const QString &url) const;
  146.     QModelIndex mapFromSource(const QModelIndex &sourceIndex) const;
  147.     QModelIndex mapToSource(const QModelIndex &proxyIndex) const;
  148.     void setSourceModel(QAbstractItemModel *sourceModel);
  149.     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
  150.     int rowCount(const QModelIndex &parent = QModelIndex()) const;
  151.     int columnCount(const QModelIndex &parent = QModelIndex()) const;
  152.     QModelIndex index(int, int, const QModelIndex& = QModelIndex()) const;
  153.     QModelIndex parent(const QModelIndex& index= QModelIndex()) const;
  154.     bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
  155.     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
  156. private slots:
  157.     void sourceReset();
  158.     void sourceDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
  159.     void sourceRowsInserted(const QModelIndex &parent, int start, int end);
  160.     void sourceRowsRemoved(const QModelIndex &, int, int);
  161. private:
  162.     void load() const;
  163.     mutable QList<int> m_sourceRow;
  164.     mutable QHash<QString, int> m_historyHash;
  165.     mutable bool m_loaded;
  166. };
  167. /*
  168.     The history menu
  169.     - Removes the first twenty entries and puts them as children of the top level.
  170.     - If there are less then twenty entries then the first folder is also removed.
  171.     The mapping is done by knowing that HistoryTreeModel is over a table
  172.     We store that row offset in our index's private data.
  173. */
  174. class HistoryMenuModel : public QAbstractProxyModel
  175. {
  176.     Q_OBJECT
  177. public:
  178.     HistoryMenuModel(HistoryTreeModel *sourceModel, QObject *parent = 0);
  179.     int columnCount(const QModelIndex &parent) const;
  180.     int rowCount(const QModelIndex &parent = QModelIndex()) const;
  181.     QModelIndex mapFromSource(const QModelIndex & sourceIndex) const;
  182.     QModelIndex mapToSource(const QModelIndex & proxyIndex) const;
  183.     QModelIndex index(int, int, const QModelIndex &parent = QModelIndex()) const;
  184.     QModelIndex parent(const QModelIndex &index = QModelIndex()) const;
  185.     int bumpedRows() const;
  186. private:
  187.     HistoryTreeModel *m_treeModel;
  188. };
  189. // Menu that is dynamically populated from the history
  190. class HistoryMenu : public ModelMenu
  191. {
  192.     Q_OBJECT
  193. signals:
  194.     void openUrl(const QUrl &url);
  195. public:
  196.      HistoryMenu(QWidget *parent = 0);
  197.      void setInitialActions(QList<QAction*> actions);
  198. protected:
  199.     bool prePopulated();
  200.     void postPopulated();
  201. private slots:
  202.     void activated(const QModelIndex &index);
  203.     void showHistoryDialog();
  204. private:
  205.     HistoryManager *m_history;
  206.     HistoryMenuModel *m_historyMenuModel;
  207.     QList<QAction*> m_initialActions;
  208. };
  209. // proxy model for the history model that
  210. // exposes each url http://www.foo.com and it url starting at the host www.foo.com
  211. class HistoryCompletionModel : public QAbstractProxyModel
  212. {
  213.     Q_OBJECT
  214. public:
  215.     HistoryCompletionModel(QObject *parent = 0);
  216.     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
  217.     int rowCount(const QModelIndex &parent = QModelIndex()) const;
  218.     int columnCount(const QModelIndex &parent = QModelIndex()) const;
  219.     QModelIndex mapFromSource(const QModelIndex &sourceIndex) const;
  220.     QModelIndex mapToSource(const QModelIndex &proxyIndex) const;
  221.     QModelIndex index(int, int, const QModelIndex& = QModelIndex()) const;
  222.     QModelIndex parent(const QModelIndex& index= QModelIndex()) const;
  223.     void setSourceModel(QAbstractItemModel *sourceModel);
  224. private slots:
  225.     void sourceReset();
  226. };
  227. // proxy model for the history model that converts the list
  228. // into a tree, one top level node per day.
  229. // Used in the HistoryDialog.
  230. class HistoryTreeModel : public QAbstractProxyModel
  231. {
  232.     Q_OBJECT
  233. public:
  234.     HistoryTreeModel(QAbstractItemModel *sourceModel, QObject *parent = 0);
  235.     QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
  236.     int columnCount(const QModelIndex &parent) const;
  237.     int rowCount(const QModelIndex &parent = QModelIndex()) const;
  238.     QModelIndex mapFromSource(const QModelIndex &sourceIndex) const;
  239.     QModelIndex mapToSource(const QModelIndex &proxyIndex) const;
  240.     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const;
  241.     QModelIndex parent(const QModelIndex &index= QModelIndex()) const;
  242.     bool hasChildren(const QModelIndex &parent = QModelIndex()) const;
  243.     Qt::ItemFlags flags(const QModelIndex &index) const;
  244.     bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
  245.     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
  246.     void setSourceModel(QAbstractItemModel *sourceModel);
  247. private slots:
  248.     void sourceReset();
  249.     void sourceRowsInserted(const QModelIndex &parent, int start, int end);
  250.     void sourceRowsRemoved(const QModelIndex &parent, int start, int end);
  251. private:
  252.     int sourceDateRow(int row) const;
  253.     mutable QList<int> m_sourceRowCache;
  254. };
  255. // A modified QSortFilterProxyModel that always accepts the root nodes in the tree
  256. // so filtering is only done on the children.
  257. // Used in the HistoryDialog
  258. class TreeProxyModel : public QSortFilterProxyModel
  259. {
  260.     Q_OBJECT
  261. public:
  262.     TreeProxyModel(QObject *parent = 0);
  263. protected:
  264.     bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
  265. };
  266. #include "ui_history.h"
  267. class HistoryDialog : public QDialog, public Ui_HistoryDialog
  268. {
  269.     Q_OBJECT
  270. signals:
  271.     void openUrl(const QUrl &url);
  272. public:
  273.     HistoryDialog(QWidget *parent = 0, HistoryManager *history = 0);
  274. private slots:
  275.     void customContextMenuRequested(const QPoint &pos);
  276.     void open();
  277.     void copy();
  278. };
  279. #endif // HISTORY_H