~ubuntu-branches/ubuntu/karmic/kdepim/karmic-backports

« back to all changes in this revision

Viewing changes to akonadi/kresources/shared/subresourcemodel.h

  • Committer: Bazaar Package Importer
  • Author(s): Christian Mangold
  • Date: 2009-07-10 06:34:50 UTC
  • mfrom: (1.1.40 upstream)
  • Revision ID: james.westby@ubuntu.com-20090710063450-neojgew2fh0n3y0u
Tags: 4:4.2.96-0ubuntu1
* New upstream release
* Bump kde build-deps to 4.2.96

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
    This file is part of kdepim.
3
 
    Copyright (c) 2009 Kevin Krammer <kevin.krammer@gmx.at>
4
 
 
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.
9
 
 
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.
14
 
 
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.
19
 
*/
20
 
 
21
 
#ifndef KRES_AKONADI_SUBRESOURCEMODEL_H
22
 
#define KRES_AKONADI_SUBRESOURCEMODEL_H
23
 
 
24
 
#include "abstractsubresourcemodel.h"
25
 
#include "subresourcebase.h"
26
 
 
27
 
#include <akonadi/item.h>
28
 
#include <akonadi/collection.h>
29
 
#include <akonadi/mimetypechecker.h>
30
 
 
31
 
#include <QtCore/QHash>
32
 
#include <QtCore/QSet>
33
 
 
34
 
template <class SubResourceClass>
35
 
class SubResourceModel : public AbstractSubResourceModel
36
 
{
37
 
  public:
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;
42
 
 
43
 
    explicit SubResourceModel( QObject *parent )
44
 
      : AbstractSubResourceModel( SubResourceClass::supportedMimeTypes(), parent )
45
 
    {
46
 
    }
47
 
 
48
 
    void writeConfig( KConfigGroup &config ) const
49
 
    {
50
 
      foreach ( const SubResourceClass *subResource, mSubResourcesByColId ) {
51
 
        subResource->writeConfig( config );
52
 
      }
53
 
    }
54
 
 
55
 
    SubResourceClass *subResource( Akonadi::Collection::Id colId ) const
56
 
    {
57
 
      return mSubResourcesByColId.value( colId, 0 );
58
 
    }
59
 
 
60
 
    SubResourceClass *subResource( const QString &kresId ) const
61
 
    {
62
 
      return mSubResourcesByKResId.value( kresId, 0 );
63
 
    }
64
 
 
65
 
    SubResourceBase *subResourceBase( Akonadi::Collection::Id colId ) const
66
 
    {
67
 
      return subResource( colId );
68
 
    }
69
 
 
70
 
    QList<SubResourceClass*> writableSubResourcesForMimeType( const QString &mimeType ) const
71
 
    {
72
 
      Akonadi::MimeTypeChecker mimeChecker;
73
 
      mimeChecker.addWantedMimeType( mimeType );
74
 
 
75
 
      QList<SubResourceClass*> result;
76
 
      foreach ( SubResourceClass *subResource, mSubResourcesByColId ) {
77
 
        if ( subResource->isWritable() && mimeChecker.isWantedCollection( subResource->collection() ) ) {
78
 
          result << subResource;
79
 
        }
80
 
      }
81
 
 
82
 
      return result;
83
 
    }
84
 
 
85
 
    QList<const SubResourceBase*> writableSubResourceBasesForMimeType( const QString &mimeType ) const
86
 
    {
87
 
      Akonadi::MimeTypeChecker mimeChecker;
88
 
      mimeChecker.addWantedMimeType( mimeType );
89
 
 
90
 
      QList<const SubResourceBase*> result;
91
 
      foreach ( const SubResourceClass *subResource, mSubResourcesByColId ) {
92
 
        if ( subResource->isWritable() && mimeChecker.isWantedCollection( subResource->collection() ) ) {
93
 
          result << subResource;
94
 
        }
95
 
      }
96
 
 
97
 
      return result;
98
 
    }
99
 
 
100
 
    SubResourceClass *findSubResourceForMappedItem( const QString &kresId ) const
101
 
    {
102
 
      foreach ( SubResourceClass *subResource, mSubResourcesByColId ) {
103
 
        if ( subResource->hasMappedItem( kresId ) ) {
104
 
          return subResource;
105
 
        }
106
 
      }
107
 
 
108
 
      return 0;
109
 
    }
110
 
 
111
 
  protected:
112
 
    SubResByColId mSubResourcesByColId;
113
 
    SubResByKResId mSubResourcesByKResId;
114
 
    ColIdsByItemId mCollectionsByItemId;
115
 
 
116
 
  protected:
117
 
    void clearModel()
118
 
    {
119
 
      qDeleteAll( mSubResourcesByColId );
120
 
      mSubResourcesByColId.clear();
121
 
      mSubResourcesByKResId.clear();
122
 
      mCollectionsByItemId.clear();
123
 
    }
124
 
 
125
 
  protected:
126
 
    void collectionAdded( const Akonadi::Collection &collection )
127
 
    {
128
 
      if ( mSubResourcesByColId.value( collection.id(), 0 ) == 0 ) {
129
 
        SubResourceClass *subResource = new SubResourceClass( collection );
130
 
 
131
 
        mSubResourcesByColId.insert( collection.id(), subResource );
132
 
        mSubResourcesByKResId.insert( subResource->subResourceIdentifier(), subResource );
133
 
        mSubResourceIdentifiers.insert( subResource->subResourceIdentifier() );
134
 
 
135
 
        emit subResourceAdded( subResource );
136
 
      } else
137
 
        collectionChanged( collection );
138
 
    }
139
 
 
140
 
    void collectionChanged( const Akonadi::Collection &collection )
141
 
    {
142
 
      SubResourceClass *subResource = mSubResourcesByColId.value( collection.id(), 0 );
143
 
      if ( subResource != 0 ) {
144
 
        subResource->changeCollection( collection );
145
 
      } else {
146
 
        collectionAdded( collection );
147
 
      }
148
 
    }
149
 
 
150
 
    void collectionRemoved( const Akonadi::Collection &collection )
151
 
    {
152
 
      SubResourceClass *subResource = mSubResourcesByColId.take( collection.id() );
153
 
      if ( subResource == 0 ) {
154
 
        return;
155
 
      }
156
 
 
157
 
      mSubResourcesByKResId.remove( subResource->subResourceIdentifier() );
158
 
      mSubResourceIdentifiers.remove( subResource->subResourceIdentifier() );
159
 
 
160
 
      emit subResourceRemoved( subResource );
161
 
 
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() );
167
 
 
168
 
        if ( colIds.isEmpty() ) {
169
 
          it = mCollectionsByItemId.erase( it );
170
 
        } else {
171
 
          ++it;
172
 
        }
173
 
      }
174
 
 
175
 
      delete subResource;
176
 
    }
177
 
 
178
 
    void itemAdded( const Akonadi::Item &item,
179
 
                    const Akonadi::Collection &collection )
180
 
    {
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()
189
 
                        << ")";
190
 
      } else {
191
 
        subResource->addItem( item );
192
 
 
193
 
        // insert if not present yet
194
 
        mCollectionsByItemId[ item.id() ].insert( collection.id() );
195
 
      }
196
 
    }
197
 
 
198
 
    void itemChanged( const Akonadi::Item &item )
199
 
    {
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 );
204
 
 
205
 
        subResource->changeItem( item );
206
 
      }
207
 
    }
208
 
 
209
 
    void itemRemoved( const Akonadi::Item &item )
210
 
    {
211
 
      ColIdsByItemId::iterator findIt = mCollectionsByItemId.find( item.id() );
212
 
      if ( findIt == mCollectionsByItemId.end() ) {
213
 
        return;
214
 
      }
215
 
 
216
 
      foreach ( const Akonadi::Collection::Id id, findIt.value() ) {
217
 
        SubResourceClass *subResource = mSubResourcesByColId.value( id, 0 );
218
 
        Q_ASSERT( subResource != 0 );
219
 
 
220
 
        subResource->removeItem( item );
221
 
      }
222
 
 
223
 
      mCollectionsByItemId.erase( findIt );
224
 
    }
225
 
};
226
 
 
227
 
#endif
228
 
 
229
 
// kate: space-indent on; indent-width 2; replace-tabs on;