Build with clang.
[kdepim.git] / mailcommon / snippetsmodel.cpp
blob24dc6a37fa2d3101f45b934e045332e5b91d26cf
1 /*
2 Copyright (C) 2010 Klarälvdalens Datakonsult AB,
3 a KDAB Group company, info@kdab.net,
4 author Tobias Koenig <tokoe@kdab.com>
6 This library is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Library General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or (at your
9 option) any later version.
11 This library is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
14 License for more details.
16 You should have received a copy of the GNU Library General Public License
17 along with this library; see the file COPYING.LIB. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 02110-1301, USA.
22 #include "snippetsmodel_p.h"
24 #include <QtCore/QDebug>
25 #include <QtCore/QMimeData>
26 #include <QtCore/QStringList>
28 using namespace MailCommon;
30 class MailCommon::SnippetItem
32 public:
33 SnippetItem( bool isGroup = false, SnippetItem *parent = 0 );
34 ~SnippetItem();
36 bool isGroup() const;
38 void setName( const QString &name );
39 QString name() const;
41 void setText( const QString &text );
42 QString text() const;
44 void setKeySequence( const QString &sequence );
45 QString keySequence() const;
47 void appendChild( SnippetItem *child );
48 void removeChild( SnippetItem *child );
49 SnippetItem *child( int row ) const;
50 int childCount() const;
51 int row() const;
52 SnippetItem *parent() const;
54 private:
55 QList<SnippetItem*> mChildItems;
56 SnippetItem *mParentItem;
58 bool mIsGroup;
59 QString mName;
60 QString mText;
61 QString mKeySequence;
64 SnippetItem::SnippetItem( bool isGroup, SnippetItem *parent )
65 : mParentItem( parent ), mIsGroup( isGroup )
69 SnippetItem::~SnippetItem()
71 qDeleteAll( mChildItems );
74 bool SnippetItem::isGroup() const
76 return mIsGroup;
79 void SnippetItem::setName( const QString &name )
81 mName = name;
84 QString SnippetItem::name() const
86 return mName;
89 void SnippetItem::setText( const QString &text )
91 mText = text;
94 QString SnippetItem::text() const
96 return mText;
99 void SnippetItem::setKeySequence( const QString &sequence )
101 mKeySequence = sequence;
104 QString SnippetItem::keySequence() const
106 return mKeySequence;
109 void SnippetItem::appendChild( SnippetItem *item )
111 mChildItems.append( item );
114 void SnippetItem::removeChild( SnippetItem *item )
116 mChildItems.removeAll( item );
117 delete item;
120 SnippetItem *SnippetItem::child( int row ) const
122 return mChildItems.value( row );
125 int SnippetItem::childCount() const
127 return mChildItems.count();
130 SnippetItem *SnippetItem::parent() const
132 return mParentItem;
135 int SnippetItem::row() const
137 if ( mParentItem )
138 return mParentItem->mChildItems.indexOf( const_cast<SnippetItem*>( this ) );
140 return 0;
144 SnippetsModel::SnippetsModel( QObject *parent )
145 : QAbstractItemModel( parent )
147 mRootItem = new SnippetItem( true );
149 QHash<int, QByteArray> names = roleNames();
151 names.insert( IsGroupRole, "isSnippetGroup" );
153 setRoleNames( names );
156 SnippetsModel::~SnippetsModel()
158 delete mRootItem;
161 int SnippetsModel::columnCount( const QModelIndex& ) const
163 return 1;
166 bool SnippetsModel::setData( const QModelIndex &index, const QVariant &value, int role )
168 if ( !index.isValid() )
169 return false;
171 SnippetItem *item = static_cast<SnippetItem*>( index.internalPointer() );
172 Q_ASSERT( item );
174 switch ( role ) {
175 case NameRole:
176 item->setName( value.toString() );
177 emit dataChanged( index, index );
178 return true;
179 break;
180 case TextRole:
181 item->setText( value.toString() );
182 emit dataChanged( index, index );
183 return true;
184 break;
185 case KeySequenceRole:
186 item->setKeySequence( value.toString() );
187 emit dataChanged( index, index );
188 return true;
189 break;
190 default:
191 return false;
192 break;
195 return false;
198 QVariant SnippetsModel::data( const QModelIndex &index, int role ) const
200 if ( !index.isValid() )
201 return QVariant();
203 SnippetItem *item = static_cast<SnippetItem*>( index.internalPointer() );
205 switch ( role ) {
206 case Qt::DisplayRole:
207 return item->name();
208 break;
209 case IsGroupRole:
210 return item->isGroup();
211 break;
212 case NameRole:
213 return item->name();
214 break;
215 case TextRole:
216 return item->text();
217 break;
218 case KeySequenceRole:
219 return item->keySequence();
220 break;
223 return QVariant();
226 Qt::ItemFlags SnippetsModel::flags( const QModelIndex &index ) const
228 Qt::ItemFlags defaultFlags = QAbstractItemModel::flags( index );
230 if ( index.isValid() ) {
231 const SnippetItem *item = static_cast<SnippetItem*>( index.internalPointer() );
232 if ( !item->isGroup() )
233 return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
236 return Qt::ItemIsDropEnabled | defaultFlags;
239 QModelIndex SnippetsModel::index( int row, int column, const QModelIndex &parent ) const
241 if ( !hasIndex( row, column, parent ) )
242 return QModelIndex();
244 SnippetItem *parentItem;
246 if ( !parent.isValid() )
247 parentItem = mRootItem;
248 else
249 parentItem = static_cast<SnippetItem*>( parent.internalPointer() );
251 SnippetItem *childItem = parentItem->child( row );
252 if (childItem)
253 return createIndex( row, column, childItem );
254 else
255 return QModelIndex();
258 QModelIndex SnippetsModel::parent( const QModelIndex &index ) const
260 if ( !index.isValid() )
261 return QModelIndex();
263 SnippetItem *childItem = static_cast<SnippetItem*>( index.internalPointer() );
264 SnippetItem *parentItem = childItem->parent();
266 if ( parentItem == mRootItem )
267 return QModelIndex();
269 return createIndex( parentItem->row(), 0, parentItem );
272 int SnippetsModel::rowCount( const QModelIndex &parent ) const
274 SnippetItem *parentItem;
275 if ( parent.column() > 0 )
276 return 0;
278 if ( !parent.isValid() )
279 parentItem = mRootItem;
280 else
281 parentItem = static_cast<SnippetItem*>( parent.internalPointer() );
283 return parentItem->childCount();
286 bool SnippetsModel::insertRows( int row, int count, const QModelIndex &parent )
288 SnippetItem *parentItem;
290 if ( !parent.isValid() )
291 parentItem = mRootItem;
292 else
293 parentItem = static_cast<SnippetItem*>( parent.internalPointer() );
295 beginInsertRows( parent, row, row + count - 1 );
296 for ( int i = 0; i < count; ++i ) {
297 SnippetItem * snippet = new SnippetItem( !parent.isValid(), parentItem );
298 parentItem->appendChild( snippet );
300 endInsertRows();
302 return true;
305 bool SnippetsModel::removeRows( int row, int count, const QModelIndex &parent )
307 SnippetItem *parentItem;
309 if ( !parent.isValid() )
310 parentItem = mRootItem;
311 else
312 parentItem = static_cast<SnippetItem*>( parent.internalPointer() );
314 beginRemoveRows( parent, row, row + count - 1 );
315 for ( int i = 0; i < count; ++i )
316 parentItem->removeChild( parentItem->child( row ) );
317 endRemoveRows();
319 return true;
322 QStringList SnippetsModel::mimeTypes() const
324 return QStringList() << QLatin1String( "text/x-kmail-textsnippet" ) << QLatin1String( "text/plain" );
327 QMimeData* SnippetsModel::mimeData( const QModelIndexList &indexes ) const
329 if ( indexes.isEmpty() )
330 return 0;
332 const QModelIndex index = indexes.first();
334 SnippetItem *item = static_cast<SnippetItem*>( index.internalPointer() );
335 if ( item->isGroup() )
336 return 0;
338 QMimeData *mimeData = new QMimeData();
339 mimeData->setData( QLatin1String( "text/x-kmail-textsnippet" ), item->text().toUtf8() );
340 mimeData->setText( item->text() );
342 return mimeData;
345 bool SnippetsModel::dropMimeData( const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent )
347 if ( action == Qt::IgnoreAction )
348 return true;
350 if ( !data->hasFormat( QLatin1String( "text/x-kmail-textsnippet" ) ) &&
351 !data->hasText() )
352 return false;
354 if ( column > 1 )
355 return false;
357 const QModelIndex groupIndex = index( row, column, parent );
358 if ( !groupIndex.isValid() )
359 return false;
361 SnippetItem *item = static_cast<SnippetItem*>( groupIndex.internalPointer() );
362 if ( !item->isGroup() )
363 return false;
365 //TODO: forward to manager
366 return true;