akonadi
entitytreemodel_p.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef ENTITYTREEMODELPRIVATE_H
00021 #define ENTITYTREEMODELPRIVATE_H
00022
00023 #include <akonadi/item.h>
00024 #include <KJob>
00025 #include <QTime>
00026
00027 #include <akonadi/collectionfetchjob.h>
00028 #include <akonadi/itemfetchscope.h>
00029 #include <akonadi/mimetypechecker.h>
00030
00031 #include "entitytreemodel.h"
00032
00033 #include "akonadiprivate_export.h"
00034
00035 namespace Akonadi
00036 {
00037 class ItemFetchJob;
00038 class ChangeRecorder;
00039 }
00040
00041 struct Node
00042 {
00043 Akonadi::Entity::Id id;
00044 Akonadi::Entity::Id parent;
00045
00046 enum Type
00047 {
00048 Item,
00049 Collection
00050 };
00051
00052 int type;
00053 };
00054
00055 namespace Akonadi
00056 {
00060 class AKONADI_TESTS_EXPORT EntityTreeModelPrivate
00061 {
00062 public:
00063
00064 EntityTreeModelPrivate( EntityTreeModel *parent );
00065 ~EntityTreeModelPrivate();
00066 EntityTreeModel *q_ptr;
00067
00068 enum RetrieveDepth {
00069 Base,
00070 Recursive
00071 };
00072
00073 enum ListingOrder
00074 {
00075 NotFirstListing,
00076 FirstListing
00077 };
00078
00079 void init( ChangeRecorder *monitor );
00080
00081 void fetchCollections( const Collection &collection, CollectionFetchJob::Type = CollectionFetchJob::FirstLevel, ListingOrder = NotFirstListing );
00082 void fetchItems( const Collection &collection );
00083 void collectionsFetched( const Akonadi::Collection::List& );
00084 void firstCollectionsFetched( const Akonadi::Collection::List& );
00085 void collectionListFetched( const Akonadi::Collection::List& );
00086 void itemsFetched( const Akonadi::Item::List& );
00087
00088 void monitoredCollectionAdded( const Akonadi::Collection&, const Akonadi::Collection& );
00089 void monitoredCollectionRemoved( const Akonadi::Collection& );
00090 void monitoredCollectionChanged( const Akonadi::Collection& );
00091 void monitoredCollectionStatisticsChanged( Akonadi::Collection::Id, const Akonadi::CollectionStatistics& );
00092 void monitoredCollectionMoved( const Akonadi::Collection&, const Akonadi::Collection&, const Akonadi::Collection& );
00093
00094 void collectionSubscribed( const Akonadi::Collection&, const Akonadi::Collection& );
00095 void monitoredCollectionUnsubscribed( const Akonadi::Collection& );
00096
00097 void monitoredItemAdded( const Akonadi::Item&, const Akonadi::Collection& );
00098 void monitoredItemRemoved( const Akonadi::Item& );
00099 void monitoredItemChanged( const Akonadi::Item&, const QSet<QByteArray>& );
00100 void monitoredItemMoved( const Akonadi::Item&, const Akonadi::Collection&, const Akonadi::Collection& );
00101
00102 void monitoredItemLinked( const Akonadi::Item&, const Akonadi::Collection& );
00103 void monitoredItemUnlinked( const Akonadi::Item&, const Akonadi::Collection& );
00104
00105 void monitoredMimeTypeChanged( const QString &mimeType, bool monitored );
00106 void monitoredCollectionsChanged( const Akonadi::Collection &collection, bool monitored );
00107 void monitoredResourcesChanged( const QByteArray &resource, bool monitored );
00108
00109 Collection::List getParentCollections( const Item &item ) const;
00110 Collection getParentCollection( const Collection &collection ) const;
00111 Entity::Id childAt( Collection::Id, int position, bool *ok ) const;
00112 Item getItem( Item::Id id ) const;
00113 void removeChildEntities( Collection::Id collectionId );
00114 void retrieveAncestors( const Akonadi::Collection& collection );
00115 void ancestorsFetched( const Akonadi::Collection::List& collectionList );
00116 void insertCollection( const Akonadi::Collection &collection, const Akonadi::Collection& parent );
00117 void insertPendingCollection( const Akonadi::Collection &collection, const Akonadi::Collection& parent, QMutableListIterator<Collection> &it );
00118
00119 void beginResetModel();
00120 void endResetModel();
00121 void fillModel();
00122
00123 ItemFetchJob* getItemFetchJob( const Collection &parent, const ItemFetchScope &scope ) const;
00124 ItemFetchJob* getItemFetchJob( const Item &item, const ItemFetchScope &scope ) const;
00125 void runItemFetchJob( ItemFetchJob* itemFetchJob, const Collection &parent ) const;
00126 void changeFetchState( const Collection &parent );
00127 void agentInstanceAdvancedStatusChanged( const QString&, const QVariantMap& );
00128
00129 QHash<Collection::Id, Collection> m_collections;
00130 QHash<Entity::Id, Item> m_items;
00131 QHash<Collection::Id, QList<Node*> > m_childEntities;
00132 QSet<Collection::Id> m_populatedCols;
00133
00134 QVector<Entity::Id> m_pendingCutItems;
00135 QVector<Entity::Id> m_pendingCutCollections;
00136 mutable QSet<Collection::Id> m_pendingCollectionRetrieveJobs;
00137
00138 ChangeRecorder *m_monitor;
00139 Collection m_rootCollection;
00140 Node *m_rootNode;
00141 QString m_rootCollectionDisplayName;
00142 QStringList m_mimeTypeFilter;
00143 MimeTypeChecker m_mimeChecker;
00144 EntityTreeModel::CollectionFetchStrategy m_collectionFetchStrategy;
00145 EntityTreeModel::ItemPopulationStrategy m_itemPopulation;
00146 bool m_includeUnsubscribed;
00147 bool m_includeStatistics;
00148 bool m_showRootCollection;
00149 QHash<Collection::Id, uint> m_collectionSyncProgress;
00150
00151 void rootCollectionFetched( const Collection::List &list );
00152 void startFirstListJob();
00153
00154 void serverStarted();
00155
00156 void firstFetchJobDone( KJob *job );
00157 void fetchJobDone( KJob *job );
00158 void updateJobDone( KJob *job );
00159 void pasteJobDone( KJob *job );
00160
00164 template<Node::Type Type>
00165 int indexOf( const QList<Node*> &nodes, Entity::Id id ) const
00166 {
00167 int i = 0;
00168 foreach ( const Node *node, nodes ) {
00169 if ( node->id == id && node->type == Type )
00170 {
00171 return i;
00172 }
00173 i++;
00174 }
00175
00176 return -1;
00177 }
00178
00183 static QByteArray FetchCollectionId() {
00184 return "FetchCollectionId";
00185 }
00186
00187 Session *m_session;
00188
00189 Q_DECLARE_PUBLIC( EntityTreeModel )
00190
00191 void fetchTopLevelCollections() const;
00192 void topLevelCollectionsFetched( const Akonadi::Collection::List& collectionList );
00193
00197 bool isHidden( const Entity &entity ) const;
00198
00199 bool m_showSystemEntities;
00200
00201 void ref( Collection::Id id );
00202 void deref( Collection::Id id );
00203
00207 bool shouldPurge( Collection::Id id );
00208
00212 void purgeItems( Collection::Id id );
00213
00221 QList<Node*>::iterator removeItems( QList<Node*>::iterator it, QList<Node*>::iterator end,
00222 int *pos, const Collection &col );
00223
00231 QList<Node*>::iterator skipCollections( QList<Node*>::iterator it, QList<Node*>::iterator end, int *pos );
00232
00236 void dataChanged( const QModelIndex &top, const QModelIndex &bottom );
00237
00241 QModelIndex indexForCollection( const Collection &collection ) const;
00242
00246 QModelIndexList indexesForItem( const Item &item ) const;
00247
00251 Collection collectionForId( Collection::Id id ) const;
00252
00256 Item itemForId( Item::Id id ) const;
00257
00258 bool canFetchMore( const QModelIndex & parent ) const;
00259 };
00260
00261 }
00262
00263 #endif
00264