diff -r 000000000000 -r 1918ee327afb src/gui/itemviews/qtreewidget_p.h --- /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 +#include +#include +#include +#include +#include +#include + +#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(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 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 &left, + const QPair &right); + static bool itemGreaterThan(const QPair &left, + const QPair &right); + static QList::iterator sortedInsertionIterator( + const QList::iterator &begin, + const QList::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 *items, int column, Qt::SortOrder order); + void timerEvent(QTimerEvent *); + +private: + QTreeWidgetItem *rootItem; + QTreeWidgetItem *headerItem; + + mutable QModelIndexList cachedIndexes; + QList 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(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(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