2
This file is part of kdepim.
3
Copyright (c) 2009 Kevin Krammer <kevin.krammer@gmx.at>
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Library General Public
7
License as published by the Free Software Foundation; either
8
version 2 of the License, or (at your option) any later version.
10
This library is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Library General Public License for more details.
15
You should have received a copy of the GNU Library General Public License
16
along with this library; see the file COPYING.LIB. If not, write to
17
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18
Boston, MA 02110-1301, USA.
21
#ifndef KRES_AKONADI_SUBRESOURCEMODEL_H
22
#define KRES_AKONADI_SUBRESOURCEMODEL_H
24
#include "abstractsubresourcemodel.h"
25
#include "subresourcebase.h"
27
#include <akonadi/item.h>
28
#include <akonadi/collection.h>
29
#include <akonadi/mimetypechecker.h>
31
#include <QtCore/QHash>
32
#include <QtCore/QSet>
34
template <class SubResourceClass>
35
class SubResourceModel : public AbstractSubResourceModel
38
typedef QHash<Akonadi::Collection::Id, SubResourceClass*> SubResByColId;
39
typedef QHash<QString, SubResourceClass*> SubResByKResId;
40
typedef QSet<Akonadi::Collection::Id> ColIdSet;
41
typedef QHash<Akonadi::Item::Id, ColIdSet> ColIdsByItemId;
43
explicit SubResourceModel( QObject *parent )
44
: AbstractSubResourceModel( SubResourceClass::supportedMimeTypes(), parent )
48
void writeConfig( KConfigGroup &config ) const
50
foreach ( const SubResourceClass *subResource, mSubResourcesByColId ) {
51
subResource->writeConfig( config );
55
SubResourceClass *subResource( Akonadi::Collection::Id colId ) const
57
return mSubResourcesByColId.value( colId, 0 );
60
SubResourceClass *subResource( const QString &kresId ) const
62
return mSubResourcesByKResId.value( kresId, 0 );
65
SubResourceBase *subResourceBase( Akonadi::Collection::Id colId ) const
67
return subResource( colId );
70
QList<SubResourceClass*> writableSubResourcesForMimeType( const QString &mimeType ) const
72
Akonadi::MimeTypeChecker mimeChecker;
73
mimeChecker.addWantedMimeType( mimeType );
75
QList<SubResourceClass*> result;
76
foreach ( SubResourceClass *subResource, mSubResourcesByColId ) {
77
if ( subResource->isWritable() && mimeChecker.isWantedCollection( subResource->collection() ) ) {
78
result << subResource;
85
QList<const SubResourceBase*> writableSubResourceBasesForMimeType( const QString &mimeType ) const
87
Akonadi::MimeTypeChecker mimeChecker;
88
mimeChecker.addWantedMimeType( mimeType );
90
QList<const SubResourceBase*> result;
91
foreach ( const SubResourceClass *subResource, mSubResourcesByColId ) {
92
if ( subResource->isWritable() && mimeChecker.isWantedCollection( subResource->collection() ) ) {
93
result << subResource;
100
SubResourceClass *findSubResourceForMappedItem( const QString &kresId ) const
102
foreach ( SubResourceClass *subResource, mSubResourcesByColId ) {
103
if ( subResource->hasMappedItem( kresId ) ) {
112
SubResByColId mSubResourcesByColId;
113
SubResByKResId mSubResourcesByKResId;
114
ColIdsByItemId mCollectionsByItemId;
119
qDeleteAll( mSubResourcesByColId );
120
mSubResourcesByColId.clear();
121
mSubResourcesByKResId.clear();
122
mCollectionsByItemId.clear();
126
void collectionAdded( const Akonadi::Collection &collection )
128
if ( mSubResourcesByColId.value( collection.id(), 0 ) == 0 ) {
129
SubResourceClass *subResource = new SubResourceClass( collection );
131
mSubResourcesByColId.insert( collection.id(), subResource );
132
mSubResourcesByKResId.insert( subResource->subResourceIdentifier(), subResource );
133
mSubResourceIdentifiers.insert( subResource->subResourceIdentifier() );
135
emit subResourceAdded( subResource );
137
collectionChanged( collection );
140
void collectionChanged( const Akonadi::Collection &collection )
142
SubResourceClass *subResource = mSubResourcesByColId.value( collection.id(), 0 );
143
if ( subResource != 0 ) {
144
subResource->changeCollection( collection );
146
collectionAdded( collection );
150
void collectionRemoved( const Akonadi::Collection &collection )
152
SubResourceClass *subResource = mSubResourcesByColId.take( collection.id() );
153
if ( subResource == 0 ) {
157
mSubResourcesByKResId.remove( subResource->subResourceIdentifier() );
158
mSubResourceIdentifiers.remove( subResource->subResourceIdentifier() );
160
emit subResourceRemoved( subResource );
162
ColIdsByItemId::iterator it = mCollectionsByItemId.begin();
163
ColIdsByItemId::iterator endIt = mCollectionsByItemId.end();
164
while ( it != endIt ) {
165
ColIdSet colIds = it.value();
166
colIds.remove( collection.id() );
168
if ( colIds.isEmpty() ) {
169
it = mCollectionsByItemId.erase( it );
178
void itemAdded( const Akonadi::Item &item,
179
const Akonadi::Collection &collection )
181
SubResourceClass *subResource = mSubResourcesByColId.value( collection.id(), 0 );
182
if ( subResource == 0 ) {
183
kWarning( 5650 ) << "Item id=" << item.id()
184
<< ", remoteId=" << item.remoteId()
185
<< ", mimeType=" << item.mimeType()
186
<< "added to an unknown collection"
187
<< "(id=" << collection.id()
188
<< ", remoteId=" << collection.remoteId()
191
subResource->addItem( item );
193
// insert if not present yet
194
mCollectionsByItemId[ item.id() ].insert( collection.id() );
198
void itemChanged( const Akonadi::Item &item )
200
const ColIdSet colIds = mCollectionsByItemId.value( item.id() );
201
foreach ( const Akonadi::Collection::Id id, colIds ) {
202
SubResourceClass *subResource = mSubResourcesByColId.value( id, 0 );
203
Q_ASSERT( subResource != 0 );
205
subResource->changeItem( item );
209
void itemRemoved( const Akonadi::Item &item )
211
ColIdsByItemId::iterator findIt = mCollectionsByItemId.find( item.id() );
212
if ( findIt == mCollectionsByItemId.end() ) {
216
foreach ( const Akonadi::Collection::Id id, findIt.value() ) {
217
SubResourceClass *subResource = mSubResourcesByColId.value( id, 0 );
218
Q_ASSERT( subResource != 0 );
220
subResource->removeItem( item );
223
mCollectionsByItemId.erase( findIt );
229
// kate: space-indent on; indent-width 2; replace-tabs on;