src/gui/itemviews/qtreewidget_p.h
changeset 0 1918ee327afb
child 4 3b1da2848fc7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/itemviews/qtreewidget_p.h	Mon Jan 11 14:00:40 2010 +0000
@@ -0,0 +1,248 @@
+/****************************************************************************
+**
+** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QTREEWIDGET_P_H
+#define QTREEWIDGET_P_H
+
+//
+//  W A R N I N G
+//  -------------
+//
+// This file is not part of the Qt API. This header file may change
+// from version to version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <QtCore/qabstractitemmodel.h>
+#include <private/qabstractitemmodel_p.h>
+#include <QtCore/qpair.h>
+#include <QtCore/qbasictimer.h>
+#include <QtGui/qtreewidget.h>
+#include <private/qtreeview_p.h>
+#include <QtGui/qheaderview.h>
+
+#ifndef QT_NO_TREEWIDGET
+
+QT_BEGIN_NAMESPACE
+
+class QTreeWidgetItem;
+class QTreeWidgetItemIterator;
+class QTreeModelPrivate;
+
+class QTreeModel : public QAbstractItemModel
+{
+    Q_OBJECT
+    friend class QTreeWidget;
+    friend class QTreeWidgetPrivate;
+    friend class QTreeWidgetItem;
+    friend class QTreeWidgetItemPrivate;
+    friend class QTreeWidgetItemIterator;
+    friend class QTreeWidgetItemIteratorPrivate;
+
+public:
+    explicit QTreeModel(int columns = 0, QTreeWidget *parent = 0);
+    ~QTreeModel();
+
+    inline QTreeWidget *view() const
+        { return qobject_cast<QTreeWidget*>(QObject::parent()); }
+
+    void clear();
+    void setColumnCount(int columns);
+
+    QTreeWidgetItem *item(const QModelIndex &index) const;
+    void itemChanged(QTreeWidgetItem *item);
+
+    QModelIndex index(const QTreeWidgetItem *item, int column) const;
+    QModelIndex index(int row, int column, const QModelIndex &parent) const;
+    QModelIndex parent(const QModelIndex &child) const;
+    int rowCount(const QModelIndex &parent) const;
+    int columnCount(const QModelIndex &parent = QModelIndex()) const;
+    bool hasChildren(const QModelIndex &parent) const;
+
+    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
+    bool setData(const QModelIndex &index, const QVariant &value, int role);
+
+    QMap<int, QVariant> itemData(const QModelIndex &index) const;
+
+    QVariant headerData(int section, Qt::Orientation orientation, int role) const;
+    bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value,
+                       int role);
+
+    Qt::ItemFlags flags(const QModelIndex &index) const;
+
+    void sort(int column, Qt::SortOrder order);
+    void ensureSorted(int column, Qt::SortOrder order,
+                      int start, int end, const QModelIndex &parent);
+    static bool itemLessThan(const QPair<QTreeWidgetItem*,int> &left,
+                             const QPair<QTreeWidgetItem*,int> &right);
+    static bool itemGreaterThan(const QPair<QTreeWidgetItem*,int> &left,
+                                const QPair<QTreeWidgetItem*,int> &right);
+    static QList<QTreeWidgetItem*>::iterator sortedInsertionIterator(
+        const QList<QTreeWidgetItem*>::iterator &begin,
+        const QList<QTreeWidgetItem*>::iterator &end,
+        Qt::SortOrder order, QTreeWidgetItem *item);
+
+    bool insertRows(int row, int count, const QModelIndex &);
+    bool insertColumns(int column, int count, const QModelIndex &);
+
+    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());
+
+    // dnd
+    QStringList mimeTypes() const;
+    QMimeData *mimeData(const QModelIndexList &indexes) const;
+    bool dropMimeData(const QMimeData *data, Qt::DropAction action,
+                      int row, int column, const QModelIndex &parent);
+    Qt::DropActions supportedDropActions() const;
+
+    QMimeData *internalMimeData() const;
+
+    inline QModelIndex createIndexFromItem(int row, int col, QTreeWidgetItem *item) const
+    { return createIndex(row, col, item); }
+
+protected:
+    QTreeModel(QTreeModelPrivate &, QTreeWidget *parent = 0);
+    void emitDataChanged(QTreeWidgetItem *item, int column);
+    void beginInsertItems(QTreeWidgetItem *parent, int row, int count);
+    void endInsertItems();
+    void beginRemoveItems(QTreeWidgetItem *parent, int row, int count);
+    void endRemoveItems();
+    void sortItems(QList<QTreeWidgetItem*> *items, int column, Qt::SortOrder order);
+    void timerEvent(QTimerEvent *);
+
+private:
+    QTreeWidgetItem *rootItem;
+    QTreeWidgetItem *headerItem;
+
+    mutable QModelIndexList cachedIndexes;
+    QList<QTreeWidgetItemIterator*> iterators;
+
+    mutable QBasicTimer sortPendingTimer;
+    mutable bool skipPendingSort; //while doing internal operation we don't care about sorting
+    bool inline executePendingSort() const;
+
+    bool isChanging() const;
+
+private:
+    Q_DECLARE_PRIVATE(QTreeModel)
+public:
+    struct SkipSorting
+    {
+        const QTreeModel * const model;
+        const bool previous;
+        SkipSorting(const QTreeModel *m) : model(m), previous(model->skipPendingSort)
+        { model->skipPendingSort = true; }
+        ~SkipSorting() { model->skipPendingSort = previous; }
+    };
+    friend struct SkipSorting;
+};
+
+QT_BEGIN_INCLUDE_NAMESPACE
+#include "private/qabstractitemmodel_p.h"
+QT_END_INCLUDE_NAMESPACE
+
+class QTreeModelPrivate : public QAbstractItemModelPrivate
+{
+    Q_DECLARE_PUBLIC(QTreeModel)
+};
+
+class QTreeWidgetItemPrivate
+{
+public:
+    QTreeWidgetItemPrivate(QTreeWidgetItem *item)
+        : q(item), disabled(false), selected(false), rowGuess(-1), policy(QTreeWidgetItem::DontShowIndicatorWhenChildless) {}
+    void propagateDisabled(QTreeWidgetItem *item);
+    void sortChildren(int column, Qt::SortOrder order, bool climb);
+    QTreeWidgetItem *q;
+    QVariantList display;
+    uint disabled : 1;
+    uint selected : 1;
+    int rowGuess;
+    QTreeWidgetItem::ChildIndicatorPolicy policy;
+};
+
+
+inline bool QTreeModel::executePendingSort() const
+{
+    if (!skipPendingSort && sortPendingTimer.isActive() && !isChanging()) {
+        sortPendingTimer.stop();
+        int column = view()->header()->sortIndicatorSection();
+        Qt::SortOrder order = view()->header()->sortIndicatorOrder();
+        QTreeModel *that = const_cast<QTreeModel*>(this);
+        that->sort(column, order);
+        return true;
+    }
+    return false;
+}
+
+class QTreeWidgetPrivate : public QTreeViewPrivate
+{
+    friend class QTreeModel;
+    Q_DECLARE_PUBLIC(QTreeWidget)
+public:
+    QTreeWidgetPrivate() : QTreeViewPrivate(), explicitSortColumn(-1) {}
+    inline QTreeModel *treeModel() const { return qobject_cast<QTreeModel*>(model); }
+    inline QModelIndex index(const QTreeWidgetItem *item, int column = 0) const
+        { return treeModel()->index(item, column); }
+    inline QTreeWidgetItem *item(const QModelIndex &index) const
+        { return treeModel()->item(index); }
+    void _q_emitItemPressed(const QModelIndex &index);
+    void _q_emitItemClicked(const QModelIndex &index);
+    void _q_emitItemDoubleClicked(const QModelIndex &index);
+    void _q_emitItemActivated(const QModelIndex &index);
+    void _q_emitItemEntered(const QModelIndex &index);
+    void _q_emitItemChanged(const QModelIndex &index);
+    void _q_emitItemExpanded(const QModelIndex &index);
+    void _q_emitItemCollapsed(const QModelIndex &index);
+    void _q_emitCurrentItemChanged(const QModelIndex &previous, const QModelIndex &index);
+    void _q_sort();
+    void _q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight);
+    void _q_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+
+     // used by QTreeWidgetItem::sortChildren to make sure the column argument is used
+    int explicitSortColumn;
+};
+
+QT_END_NAMESPACE
+
+#endif // QT_NO_TREEWIDGET
+
+#endif // QTREEWIDGET_P_H