• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdepim API Reference
  • KDE Home
  • Contact Us
 

mailcommon

  • sources
  • kde-4.12
  • kdepim
  • mailcommon
  • snippets
snippetsmodel.cpp
Go to the documentation of this file.
1 /*
2  Copyright (C) 2010 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.net,
3  Author: Tobias Koenig <tokoe@kdab.com>
4 
5  This library is free software; you can redistribute it and/or modify it
6  under the terms of the GNU Library General Public License as published by
7  the Free Software Foundation; either version 2 of the License, or (at your
8  option) any later version.
9 
10  This library is distributed in the hope that it will be useful, but WITHOUT
11  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
13  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 the
17  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18  02110-1301, USA.
19 */
20 
21 #include "snippetsmodel_p.h"
22 
23 #include <QMimeData>
24 #include <QStringList>
25 
26 using namespace MailCommon;
27 
28 class MailCommon::SnippetItem
29 {
30  public:
31  SnippetItem( bool isGroup = false, SnippetItem *parent = 0 );
32  ~SnippetItem();
33 
34  bool isGroup() const;
35 
36  void setName( const QString &name );
37  QString name() const;
38 
39  void setText( const QString &text );
40  QString text() const;
41 
42  void setKeySequence( const QString &sequence );
43  QString keySequence() const;
44 
45  void appendChild( SnippetItem *child );
46  void removeChild( SnippetItem *child );
47  SnippetItem *child( int row ) const;
48  int childCount() const;
49  int row() const;
50  SnippetItem *parent() const;
51 
52  private:
53  QList<SnippetItem*> mChildItems;
54  SnippetItem *mParentItem;
55 
56  bool mIsGroup;
57  QString mName;
58  QString mText;
59  QString mKeySequence;
60 };
61 
62 SnippetItem::SnippetItem( bool isGroup, SnippetItem *parent )
63  : mParentItem( parent ), mIsGroup( isGroup )
64 {
65 }
66 
67 SnippetItem::~SnippetItem()
68 {
69  qDeleteAll( mChildItems );
70  mChildItems.clear();
71 }
72 
73 bool SnippetItem::isGroup() const
74 {
75  return mIsGroup;
76 }
77 
78 void SnippetItem::setName( const QString &name )
79 {
80  mName = name;
81 }
82 
83 QString SnippetItem::name() const
84 {
85  return mName;
86 }
87 
88 void SnippetItem::setText( const QString &text )
89 {
90  mText = text;
91 }
92 
93 QString SnippetItem::text() const
94 {
95  return mText;
96 }
97 
98 void SnippetItem::setKeySequence( const QString &sequence )
99 {
100  mKeySequence = sequence;
101 }
102 
103 QString SnippetItem::keySequence() const
104 {
105  return mKeySequence;
106 }
107 
108 void SnippetItem::appendChild( SnippetItem *item )
109 {
110  mChildItems.append( item );
111 }
112 
113 void SnippetItem::removeChild( SnippetItem *item )
114 {
115  mChildItems.removeAll( item );
116  delete item;
117 }
118 
119 SnippetItem *SnippetItem::child( int row ) const
120 {
121  return mChildItems.value( row );
122 }
123 
124 int SnippetItem::childCount() const
125 {
126  return mChildItems.count();
127 }
128 
129 SnippetItem *SnippetItem::parent() const
130 {
131  return mParentItem;
132 }
133 
134 int SnippetItem::row() const
135 {
136  if ( mParentItem ) {
137  return mParentItem->mChildItems.indexOf( const_cast<SnippetItem*>( this ) );
138  }
139 
140  return 0;
141 }
142 
143 SnippetsModel::SnippetsModel( QObject *parent )
144  : QAbstractItemModel( parent )
145 {
146  mRootItem = new SnippetItem( true );
147 
148  QHash<int, QByteArray> names = roleNames();
149 
150  names.insert( IsGroupRole, "isSnippetGroup" );
151 
152  setRoleNames( names );
153 }
154 
155 SnippetsModel::~SnippetsModel()
156 {
157  delete mRootItem;
158 }
159 
160 int SnippetsModel::columnCount( const QModelIndex & ) const
161 {
162  return 1;
163 }
164 
165 bool SnippetsModel::setData( const QModelIndex &index, const QVariant &value, int role )
166 {
167  if ( !index.isValid() ) {
168  return false;
169  }
170 
171  SnippetItem *item = static_cast<SnippetItem*>( index.internalPointer() );
172  Q_ASSERT( item );
173 
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;
193  }
194 
195  return false;
196 }
197 
198 QVariant SnippetsModel::data( const QModelIndex &index, int role ) const
199 {
200  if ( !index.isValid() ) {
201  return QVariant();
202  }
203 
204  SnippetItem *item = static_cast<SnippetItem*>( index.internalPointer() );
205 
206  switch ( role ) {
207  case Qt::DisplayRole:
208  return item->name();
209  break;
210  case IsGroupRole:
211  return item->isGroup();
212  break;
213  case NameRole:
214  return item->name();
215  break;
216  case TextRole:
217  return item->text();
218  break;
219  case KeySequenceRole:
220  return item->keySequence();
221  break;
222  }
223 
224  return QVariant();
225 }
226 
227 Qt::ItemFlags SnippetsModel::flags( const QModelIndex &index ) const
228 {
229  Qt::ItemFlags defaultFlags = QAbstractItemModel::flags( index );
230 
231  if ( index.isValid() ) {
232  const SnippetItem *item = static_cast<SnippetItem*>( index.internalPointer() );
233  if ( !item->isGroup() ) {
234  return Qt::ItemIsDragEnabled | Qt::ItemIsDropEnabled | defaultFlags;
235  }
236  }
237 
238  return Qt::ItemIsDropEnabled | defaultFlags;
239 }
240 
241 QModelIndex SnippetsModel::index( int row, int column, const QModelIndex &parent ) const
242 {
243  if ( !hasIndex( row, column, parent ) ) {
244  return QModelIndex();
245  }
246 
247  SnippetItem *parentItem;
248 
249  if ( !parent.isValid() ) {
250  parentItem = mRootItem;
251  } else {
252  parentItem = static_cast<SnippetItem*>( parent.internalPointer() );
253  }
254 
255  SnippetItem *childItem = parentItem->child( row );
256  if ( childItem ) {
257  return createIndex( row, column, childItem );
258  } else {
259  return QModelIndex();
260  }
261 }
262 
263 QModelIndex SnippetsModel::parent( const QModelIndex &index ) const
264 {
265  if ( !index.isValid() ) {
266  return QModelIndex();
267  }
268 
269  SnippetItem *childItem = static_cast<SnippetItem*>( index.internalPointer() );
270  SnippetItem *parentItem = childItem->parent();
271 
272  if ( parentItem == mRootItem ) {
273  return QModelIndex();
274  }
275 
276  return createIndex( parentItem->row(), 0, parentItem );
277 }
278 
279 int SnippetsModel::rowCount( const QModelIndex &parent ) const
280 {
281  SnippetItem *parentItem;
282  if ( parent.column() > 0 ) {
283  return 0;
284  }
285 
286  if ( !parent.isValid() ) {
287  parentItem = mRootItem;
288  } else {
289  parentItem = static_cast<SnippetItem*>( parent.internalPointer() );
290  }
291 
292  return parentItem->childCount();
293 }
294 
295 bool SnippetsModel::insertRows( int row, int count, const QModelIndex &parent )
296 {
297  SnippetItem *parentItem;
298 
299  if ( !parent.isValid() ) {
300  parentItem = mRootItem;
301  } else {
302  parentItem = static_cast<SnippetItem*>( parent.internalPointer() );
303  }
304 
305  beginInsertRows( parent, row, row + count - 1 );
306  for ( int i = 0; i < count; ++i ) {
307  SnippetItem * snippet = new SnippetItem( !parent.isValid(), parentItem );
308  parentItem->appendChild( snippet );
309  }
310  endInsertRows();
311 
312  return true;
313 }
314 
315 bool SnippetsModel::removeRows( int row, int count, const QModelIndex &parent )
316 {
317  SnippetItem *parentItem;
318 
319  if ( !parent.isValid() ) {
320  parentItem = mRootItem;
321  } else {
322  parentItem = static_cast<SnippetItem*>( parent.internalPointer() );
323  }
324 
325  beginRemoveRows( parent, row, row + count - 1 );
326  for ( int i = 0; i < count; ++i ) {
327  parentItem->removeChild( parentItem->child( row ) );
328  }
329  endRemoveRows();
330 
331  return true;
332 }
333 
334 QStringList SnippetsModel::mimeTypes() const
335 {
336  return
337  QStringList() << QLatin1String( "text/x-kmail-textsnippet" )
338  << QLatin1String( "text/plain" );
339 }
340 
341 QMimeData *SnippetsModel::mimeData( const QModelIndexList &indexes ) const
342 {
343  if ( indexes.isEmpty() ) {
344  return 0;
345  }
346 
347  const QModelIndex index = indexes.first();
348 
349  SnippetItem *item = static_cast<SnippetItem*>( index.internalPointer() );
350  if ( item->isGroup() ) {
351  return 0;
352  }
353 
354  QMimeData *mimeData = new QMimeData();
355 
356  QByteArray encodedData;
357  QDataStream stream( &encodedData, QIODevice::WriteOnly );
358  stream << index.parent().internalId()<< item->name() << item->text() <<item->keySequence();
359 
360  mimeData->setData( QLatin1String( "text/x-kmail-textsnippet" ), encodedData );
361  mimeData->setText( item->text() );
362 
363  return mimeData;
364 }
365 
366 bool SnippetsModel::dropMimeData( const QMimeData *data, Qt::DropAction action,
367  int row, int column, const QModelIndex &parent )
368 {
369  Q_UNUSED( row );
370 
371  if ( action == Qt::IgnoreAction ) {
372  return true;
373  }
374 
375  if ( !parent.isValid() ) {
376  return false;
377  }
378 
379  if ( !data->hasFormat( QLatin1String( "text/x-kmail-textsnippet" ) ) ) {
380  return false;
381  }
382 
383  if ( column > 1 ) {
384  return false;
385  }
386 
387  SnippetItem *item = static_cast<SnippetItem*>( parent.internalPointer() );
388 
389  if ( !item->isGroup() ) {
390  return false;
391  }
392 
393  QByteArray encodedData = data->data( QLatin1String( "text/x-kmail-textsnippet" ) );
394  QDataStream stream( &encodedData, QIODevice::ReadOnly );
395 
396  qint64 id;
397  QString name;
398  QString text;
399  QString keySequence;
400  stream >> id >> name >> text >> keySequence;
401 
402  if ( parent.internalId() == id ) {
403  return false;
404  }
405 
406  insertRow( rowCount( parent ), parent );
407 
408  const QModelIndex idx = index( rowCount( parent )-1, 0, parent );
409 
410  setData( idx, name, SnippetsModel::NameRole );
411  setData( idx, text, SnippetsModel::TextRole );
412  setData( idx, keySequence, SnippetsModel::KeySequenceRole );
413  emit dndDone();
414  return true;
415 }
416 
417 Qt::DropActions SnippetsModel::supportedDropActions () const
418 {
419  return Qt::CopyAction|Qt::MoveAction;
420 }
421 
MailCommon::SnippetsModel::columnCount
virtual int columnCount(const QModelIndex &parent=QModelIndex()) const
Definition: snippetsmodel.cpp:160
MailCommon::SnippetsModel::setData
virtual bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole)
Definition: snippetsmodel.cpp:165
MailCommon::SnippetsModel::IsGroupRole
Returns whether the index represents a group.
Definition: snippetsmodel_p.h:35
snippetsmodel_p.h
MailCommon::SnippetsModel::KeySequenceRole
The key sequence to activate a snippet.
Definition: snippetsmodel_p.h:38
MailCommon::SnippetsModel::dropMimeData
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)
Definition: snippetsmodel.cpp:366
MailCommon::SnippetsModel::dndDone
void dndDone()
text
const char * text
Definition: mdnadvicedialog.cpp:52
MailCommon::SnippetsModel::flags
virtual Qt::ItemFlags flags(const QModelIndex &index) const
Definition: snippetsmodel.cpp:227
id
SearchRule::Function id
Definition: daterulewidgethandler.cpp:34
QObject
MailCommon::SnippetsModel::NameRole
The name of a snippet or group.
Definition: snippetsmodel_p.h:36
MailCommon::SnippetsModel::removeRows
virtual bool removeRows(int row, int count, const QModelIndex &parent=QModelIndex())
Definition: snippetsmodel.cpp:315
MailCommon::SnippetsModel::parent
virtual QModelIndex parent(const QModelIndex &index) const
Definition: snippetsmodel.cpp:263
QAbstractItemModel
MailCommon::SnippetsModel::rowCount
virtual int rowCount(const QModelIndex &parent=QModelIndex()) const
Definition: snippetsmodel.cpp:279
MailCommon::SnippetsModel::insertRows
virtual bool insertRows(int row, int count, const QModelIndex &parent=QModelIndex())
Definition: snippetsmodel.cpp:295
MailCommon::SnippetsModel::mimeTypes
virtual QStringList mimeTypes() const
Definition: snippetsmodel.cpp:334
MailCommon::SnippetsModel::SnippetsModel
SnippetsModel(QObject *parent=0)
Definition: snippetsmodel.cpp:143
MailCommon::SnippetsModel::TextRole
The text of a snippet.
Definition: snippetsmodel_p.h:37
MailCommon::SnippetsModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: snippetsmodel.cpp:241
MailCommon::SnippetsModel::data
virtual QVariant data(const QModelIndex &index, int role) const
Definition: snippetsmodel.cpp:198
MailCommon::SnippetsModel::mimeData
virtual QMimeData * mimeData(const QModelIndexList &indexes) const
Definition: snippetsmodel.cpp:341
MailCommon::SnippetsModel::~SnippetsModel
~SnippetsModel()
Definition: snippetsmodel.cpp:155
QList
MailCommon::SnippetsModel::supportedDropActions
virtual Qt::DropActions supportedDropActions() const
Definition: snippetsmodel.cpp:417
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:55:15 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

mailcommon

Skip menu "mailcommon"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal