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
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
33 SnippetItem( bool isGroup
= false, SnippetItem
*parent
= 0 );
38 void setName( const QString
&name
);
41 void setText( const QString
&text
);
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;
52 SnippetItem
*parent() const;
55 QList
<SnippetItem
*> mChildItems
;
56 SnippetItem
*mParentItem
;
64 SnippetItem::SnippetItem( bool isGroup
, SnippetItem
*parent
)
65 : mParentItem( parent
), mIsGroup( isGroup
)
69 SnippetItem::~SnippetItem()
71 qDeleteAll( mChildItems
);
74 bool SnippetItem::isGroup() const
79 void SnippetItem::setName( const QString
&name
)
84 QString
SnippetItem::name() const
89 void SnippetItem::setText( const QString
&text
)
94 QString
SnippetItem::text() const
99 void SnippetItem::setKeySequence( const QString
&sequence
)
101 mKeySequence
= sequence
;
104 QString
SnippetItem::keySequence() const
109 void SnippetItem::appendChild( SnippetItem
*item
)
111 mChildItems
.append( item
);
114 void SnippetItem::removeChild( SnippetItem
*item
)
116 mChildItems
.removeAll( 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
135 int SnippetItem::row() const
138 return mParentItem
->mChildItems
.indexOf( const_cast<SnippetItem
*>( this ) );
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()
161 int SnippetsModel::columnCount( const QModelIndex
& ) const
166 bool SnippetsModel::setData( const QModelIndex
&index
, const QVariant
&value
, int role
)
168 if ( !index
.isValid() )
171 SnippetItem
*item
= static_cast<SnippetItem
*>( index
.internalPointer() );
176 item
->setName( value
.toString() );
177 emit
dataChanged( index
, index
);
181 item
->setText( value
.toString() );
182 emit
dataChanged( index
, index
);
185 case KeySequenceRole
:
186 item
->setKeySequence( value
.toString() );
187 emit
dataChanged( index
, index
);
198 QVariant
SnippetsModel::data( const QModelIndex
&index
, int role
) const
200 if ( !index
.isValid() )
203 SnippetItem
*item
= static_cast<SnippetItem
*>( index
.internalPointer() );
206 case Qt::DisplayRole
:
210 return item
->isGroup();
218 case KeySequenceRole
:
219 return item
->keySequence();
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
;
249 parentItem
= static_cast<SnippetItem
*>( parent
.internalPointer() );
251 SnippetItem
*childItem
= parentItem
->child( row
);
253 return createIndex( row
, column
, childItem
);
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 )
278 if ( !parent
.isValid() )
279 parentItem
= mRootItem
;
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
;
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
);
305 bool SnippetsModel::removeRows( int row
, int count
, const QModelIndex
&parent
)
307 SnippetItem
*parentItem
;
309 if ( !parent
.isValid() )
310 parentItem
= mRootItem
;
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
) );
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() )
332 const QModelIndex index
= indexes
.first();
334 SnippetItem
*item
= static_cast<SnippetItem
*>( index
.internalPointer() );
335 if ( item
->isGroup() )
338 QMimeData
*mimeData
= new QMimeData();
339 mimeData
->setData( QLatin1String( "text/x-kmail-textsnippet" ), item
->text().toUtf8() );
340 mimeData
->setText( item
->text() );
345 bool SnippetsModel::dropMimeData( const QMimeData
*data
, Qt::DropAction action
, int row
, int column
, const QModelIndex
&parent
)
347 if ( action
== Qt::IgnoreAction
)
350 if ( !data
->hasFormat( QLatin1String( "text/x-kmail-textsnippet" ) ) &&
357 const QModelIndex groupIndex
= index( row
, column
, parent
);
358 if ( !groupIndex
.isValid() )
361 SnippetItem
*item
= static_cast<SnippetItem
*>( groupIndex
.internalPointer() );
362 if ( !item
->isGroup() )
365 //TODO: forward to manager