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

libkdepim

  • sources
  • kde-4.14
  • kdepim
  • libkdepim
  • addressline
  • completionorder
completionorderwidget.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 2015 Montel Laurent <montel@kde.org>
3 
4  This library is free software; you can redistribute it and/or modify it
5  under the terms of the GNU Library General Public License as published by
6  the Free Software Foundation; either version 2 of the License, or (at your
7  option) any later version.
8 
9  This library is distributed in the hope that it will be useful, but WITHOUT
10  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
12  License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to the
16  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  02110-1301, USA.
18 
19 */
20 
21 #include "completionorderwidget.h"
22 
23 #include <kdescendantsproxymodel.h>
24 #include "ldap/ldapclient.h"
25 #include "ldap/ldapclientsearch.h"
26 #include "ldap/ldapclientsearchconfig.h"
27 
28 #include <akonadi/changerecorder.h>
29 #include <akonadi/collectionfilterproxymodel.h>
30 #include <akonadi/entitytreemodel.h>
31 #include <akonadi/monitor.h>
32 
33 #include <kabc/addressee.h>
34 #include <kabc/contactgroup.h>
35 #include <kldap/ldapserver.h>
36 
37 #include <KConfigGroup>
38 #include <KLocalizedString>
39 #include <QTreeWidget>
40 #include <QTreeWidgetItem>
41 #include <khbox.h>
42 #include <kpushbutton.h>
43 #include <kvbox.h>
44 #include <QToolButton>
45 #include <QDBusConnection>
46 #include <QHBoxLayout>
47 
48 using namespace KPIM;
49 
50 CompletionOrderEditorAdaptor::CompletionOrderEditorAdaptor( QObject *parent )
51  : QDBusAbstractAdaptor( parent )
52 {
53  setAutoRelaySignals( true );
54 }
55 
56 
57 class LDAPCompletionItem : public CompletionItem
58 {
59 public:
60  LDAPCompletionItem( KLDAP::LdapClient *ldapClient )
61  : mLdapClient( ldapClient )
62  {
63  mWeight = mLdapClient->completionWeight();
64  }
65 
66  virtual QString label() const
67  {
68  return i18n( "LDAP server %1", mLdapClient->server().host() );
69  }
70 
71  virtual QIcon icon() const
72  {
73  return KIcon( QLatin1String("view-ldap-resource") );
74  }
75 
76  virtual int completionWeight() const
77  {
78  return mWeight;
79  }
80 
81  virtual void save( CompletionOrderWidget* )
82  {
83  KConfig *config = KLDAP::LdapClientSearchConfig::config();
84  KConfigGroup group( config, "LDAP" );
85  group.writeEntry( QString::fromLatin1("SelectedCompletionWeight%1" ).arg( mLdapClient->clientNumber() ),
86  mWeight );
87  group.sync();
88  }
89 
90 protected:
91  virtual void setCompletionWeight( int weight )
92  {
93  mWeight = weight;
94  }
95 
96 private:
97  KLDAP::LdapClient *mLdapClient;
98  int mWeight;
99 };
100 
101 class SimpleCompletionItem : public CompletionItem
102 {
103 public:
104  SimpleCompletionItem( CompletionOrderWidget* editor, const QString& label, const QString& identifier, int weight )
105  : mLabel( label ), mIdentifier( identifier )
106  {
107  KConfigGroup group( editor->configFile(), "CompletionWeights" );
108  mWeight = group.readEntry( mIdentifier, weight );
109  }
110 
111  void setIcon( const QIcon &icon )
112  {
113  mIcon = icon;
114  }
115 
116  virtual QString label() const
117  {
118  return mLabel;
119  }
120 
121  virtual QIcon icon() const
122  {
123  return mIcon;
124  }
125 
126  virtual int completionWeight() const
127  {
128  return mWeight;
129  }
130 
131  virtual void save( CompletionOrderWidget *editor )
132  {
133  KConfigGroup group( editor->configFile(), "CompletionWeights" );
134  group.writeEntry( mIdentifier, mWeight );
135  }
136 
137 protected:
138  virtual void setCompletionWeight( int weight )
139  {
140  mWeight = weight;
141  }
142 
143 private:
144  QString mLabel;
145  QString mIdentifier;
146  int mWeight;
147  QIcon mIcon;
148 };
149 
151 
152 class CompletionViewItem : public QTreeWidgetItem
153 {
154 public:
155  CompletionViewItem( QTreeWidget *parent, CompletionItem* item, QTreeWidgetItem *preceding )
156  : QTreeWidgetItem( parent, preceding )
157  {
158  setItem( item );
159  }
160 
161  void setItem( CompletionItem *item )
162  {
163  mItem = item;
164  setText( 0, mItem->label() );
165  setIcon( 0, mItem->icon() );
166  }
167 
168  CompletionItem* item() const
169  {
170  return mItem;
171  }
172 
173  bool operator<( const QTreeWidgetItem &other ) const
174  {
175  const QTreeWidgetItem *otherItem = &other;
176  const CompletionViewItem *completionItem = static_cast<const CompletionViewItem*>( otherItem );
177  // item with weight 100 should be on the top -> reverse sorting
178  return (mItem->completionWeight() > completionItem->item()->completionWeight());
179  }
180 
181 private:
182  CompletionItem* mItem;
183 };
184 
185 
186 CompletionOrderWidget::CompletionOrderWidget(QWidget *parent)
187  : QWidget(parent),
188  mConfig( QLatin1String("kpimcompletionorder") ),
189  mLdapSearch( 0 ),
190  mDirty( false )
191 {
192  new CompletionOrderEditorAdaptor( this );
193  QDBusConnection::sessionBus().registerObject( QLatin1String("/"), this, QDBusConnection::ExportAdaptors );
194 
195  QHBoxLayout *hbox = new QHBoxLayout;
196  setLayout(hbox);
197 
198  KHBox* page = new KHBox( this );
199  hbox->addWidget(page);
200  mListView = new QTreeWidget( page );
201  mListView->setObjectName(QLatin1String("listview"));
202  mListView->setColumnCount( 1 );
203  mListView->setAlternatingRowColors( true );
204  mListView->setIndentation( 0 );
205  mListView->setAllColumnsShowFocus( true );
206  mListView->setHeaderHidden ( true );
207  mListView->setSortingEnabled( true );
208 
209  KVBox* upDownBox = new KVBox( page );
210  mUpButton = new KPushButton( upDownBox );
211  mUpButton->setAutoRepeat(true);
212  mUpButton->setObjectName( QLatin1String("mUpButton") );
213  mUpButton->setIcon( KIcon(QLatin1String("go-up")) );
214  mUpButton->setEnabled( false ); // b/c no item is selected yet
215  mUpButton->setFocusPolicy( Qt::StrongFocus );
216 
217  mDownButton = new KPushButton( upDownBox );
218  mDownButton->setAutoRepeat(true);
219  mDownButton->setObjectName( QLatin1String("mDownButton") );
220  mDownButton->setIcon( KIcon(QLatin1String("go-down")) );
221  mDownButton->setEnabled( false ); // b/c no item is selected yet
222  mDownButton->setFocusPolicy( Qt::StrongFocus );
223 
224  QWidget* spacer = new QWidget( upDownBox );
225  upDownBox->setStretchFactor( spacer, 100 );
226 
227  connect( mListView, SIGNAL(itemSelectionChanged()),
228  SLOT(slotSelectionChanged()) );
229  connect( mListView, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
230  SLOT(slotSelectionChanged()) );
231  connect( mUpButton, SIGNAL(clicked()), this, SLOT(slotMoveUp()) );
232  connect( mDownButton, SIGNAL(clicked()), this, SLOT(slotMoveDown()) );
233 }
234 
235 CompletionOrderWidget::~CompletionOrderWidget()
236 {
237 }
238 
239 void CompletionOrderWidget::save()
240 {
241  if ( mDirty ) {
242  int w = 100;
243  //Clean up order
244  KConfigGroup group( configFile(), "CompletionWeights" );
245  group.deleteGroup();
246 
247  for ( int itemIndex = 0; itemIndex < mListView->topLevelItemCount(); ++itemIndex ) {
248  CompletionViewItem *item =
249  static_cast<CompletionViewItem *>( mListView->topLevelItem( itemIndex ) );
250  item->item()->setCompletionWeight( w );
251  item->item()->save( this );
252  --w;
253  }
254  emit completionOrderChanged();
255  }
256 }
257 
258 void CompletionOrderWidget::addRecentAddressItem()
259 {
260  //Be default it's the first.
261  SimpleCompletionItem *item = new SimpleCompletionItem( this, i18n( "Recent Addresses" ), QLatin1String("Recent Addresses"), 10 );
262  item->setIcon( KIcon(QLatin1String("kmail")) );
263  new CompletionViewItem( mListView, item, 0 );
264 }
265 
266 void CompletionOrderWidget::addCompletionItemForCollection( const QModelIndex &index )
267 {
268  const Akonadi::Collection collection = index.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
269  if ( !collection.isValid() )
270  return;
271 
272  SimpleCompletionItem *item = new SimpleCompletionItem( this, index.data().toString(), QString::number( collection.id() ), 60 );
273  item->setIcon( index.data( Qt::DecorationRole ).value<QIcon>() );
274 
275  new CompletionViewItem( mListView, item, 0 );
276 }
277 
278 void CompletionOrderWidget::loadCompletionItems()
279 {
280  if (mLdapSearch) {
281  // The first step is to gather all the data, creating CompletionItem objects
282  foreach ( KLDAP::LdapClient *client, mLdapSearch->clients() ) {
283  new CompletionViewItem( mListView, new LDAPCompletionItem( client ), 0 );
284  }
285  }
286 
287  Akonadi::ChangeRecorder *monitor = new Akonadi::ChangeRecorder( this );
288  monitor->fetchCollection( true );
289  monitor->setCollectionMonitored( Akonadi::Collection::root() );
290  monitor->setMimeTypeMonitored( KABC::Addressee::mimeType(), true );
291  monitor->setMimeTypeMonitored( KABC::ContactGroup::mimeType(), true );
292 
293  Akonadi::EntityTreeModel *model = new Akonadi::EntityTreeModel( monitor, this );
294  model->setItemPopulationStrategy( Akonadi::EntityTreeModel::NoItemPopulation );
295 
296  KDescendantsProxyModel *descendantsProxy = new KDescendantsProxyModel( this );
297  descendantsProxy->setDisplayAncestorData( true );
298  descendantsProxy->setSourceModel( model );
299 
300  Akonadi::CollectionFilterProxyModel *mimeTypeProxy = new Akonadi::CollectionFilterProxyModel( this );
301  mimeTypeProxy->addMimeTypeFilters( QStringList() << KABC::Addressee::mimeType()
302  << KABC::ContactGroup::mimeType() );
303  mimeTypeProxy->setSourceModel( descendantsProxy );
304  mimeTypeProxy->setExcludeVirtualCollections( true );
305 
306  mCollectionModel = mimeTypeProxy;
307 
308  connect( mimeTypeProxy, SIGNAL(rowsInserted(QModelIndex,int,int)),
309  this, SLOT(rowsInserted(QModelIndex,int,int)) );
310 
311  for ( int row = 0; row < mCollectionModel->rowCount(); ++row )
312  addCompletionItemForCollection( mCollectionModel->index( row, 0 ) );
313 
314  addRecentAddressItem();
315 
316  mListView->sortItems( 0, Qt::AscendingOrder );
317 }
318 
319 void CompletionOrderWidget::setLdapClientSearch(KLDAP::LdapClientSearch *ldapSearch)
320 {
321  mLdapSearch = ldapSearch;
322 }
323 
324 void CompletionOrderWidget::rowsInserted( const QModelIndex &parent, int start, int end )
325 {
326  for ( int row = start; row <= end; ++row )
327  addCompletionItemForCollection( mCollectionModel->index( row, 0, parent ) );
328 
329  mListView->sortItems( 0, Qt::AscendingOrder );
330 }
331 
332 void CompletionOrderWidget::slotSelectionChanged()
333 {
334  QTreeWidgetItem *item = mListView->currentItem();
335  mDownButton->setEnabled( item && mListView->itemBelow( item ) );
336  mUpButton->setEnabled( item && mListView->itemAbove( item ) );
337 }
338 
339 static void swapItems( CompletionViewItem *one, CompletionViewItem *other )
340 {
341  CompletionItem* oneCompletion = one->item();
342  CompletionItem* otherCompletion = other->item();
343 
344  int weight = otherCompletion->completionWeight();
345  otherCompletion->setCompletionWeight( oneCompletion->completionWeight() );
346  oneCompletion->setCompletionWeight( weight );
347 
348  one->setItem( otherCompletion );
349  other->setItem( oneCompletion );
350 }
351 
352 void CompletionOrderWidget::slotMoveUp()
353 {
354  CompletionViewItem *item = static_cast<CompletionViewItem *>( mListView->currentItem() );
355  if ( !item ) return;
356  CompletionViewItem *above = static_cast<CompletionViewItem *>( mListView->itemAbove( item ) );
357  if ( !above ) return;
358  swapItems( item, above );
359  mListView->setCurrentItem( above, 0, QItemSelectionModel::Select | QItemSelectionModel::Current );
360  mListView->sortItems( 0, Qt::AscendingOrder );
361  mDirty = true;
362 }
363 
364 void CompletionOrderWidget::slotMoveDown()
365 {
366  CompletionViewItem *item = static_cast<CompletionViewItem *>( mListView->currentItem() );
367  if ( !item ) return;
368  CompletionViewItem *below = static_cast<CompletionViewItem *>( mListView->itemBelow( item ) );
369  if ( !below ) return;
370  swapItems( item, below );
371  mListView->setCurrentItem( below );
372  mListView->setCurrentItem( below, 0, QItemSelectionModel::Select | QItemSelectionModel::Current );
373  mListView->sortItems( 0, Qt::AscendingOrder );
374  mDirty = true;
375 }
QModelIndex
QDBusAbstractAdaptor::setAutoRelaySignals
void setAutoRelaySignals(bool enable)
QWidget
QAbstractItemModel::rowCount
virtual int rowCount(const QModelIndex &parent) const =0
KPIM::CompletionOrderWidget::loadCompletionItems
void loadCompletionItems()
Definition: completionorderwidget.cpp:278
KVBox
QAbstractItemModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent) const =0
QAbstractItemView::setAlternatingRowColors
void setAlternatingRowColors(bool enable)
swapItems
static void swapItems(CompletionViewItem *one, CompletionViewItem *other)
Definition: completionorderwidget.cpp:339
ldapclientsearch.h
KPIM::CompletionOrderEditorAdaptor
Definition: completionorderwidget.h:40
KLDAP::LdapClientSearch
Definition: ldapclientsearch.h:68
KPIM::CompletionOrderWidget::completionOrderChanged
void completionOrderChanged()
QDBusConnection::registerObject
bool registerObject(const QString &path, QObject *object, QFlags< QDBusConnection::RegisterOption > options)
KPIM::CompletionOrderWidget::setLdapClientSearch
void setLdapClientSearch(KLDAP::LdapClientSearch *ldapSearch)
Definition: completionorderwidget.cpp:319
QHBoxLayout
QVariant::value
T value() const
QTreeWidget::itemBelow
QTreeWidgetItem * itemBelow(const QTreeWidgetItem *item) const
QDBusConnection::sessionBus
QDBusConnection sessionBus()
KPIM::CompletionItem::setCompletionWeight
virtual void setCompletionWeight(int weight)=0
KPIM::CompletionOrderWidget::CompletionOrderWidget
CompletionOrderWidget(QWidget *parent=0)
Definition: completionorderwidget.cpp:186
KLDAP::LdapClientSearch::clients
QList< LdapClient * > clients() const
Returns the list of configured LDAP clients.
Definition: ldapclientsearch.cpp:137
QDBusAbstractAdaptor
ldapclient.h
QTreeWidget
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, QFlags< Qt::AlignmentFlag > alignment)
QString::number
QString number(int n, int base)
KPIM::CompletionOrderWidget
Definition: completionorderwidget.h:66
QWidget::setLayout
void setLayout(QLayout *layout)
QObject
ldapclientsearchconfig.h
QObject::setObjectName
void setObjectName(const QString &name)
KPIM::CompletionOrderWidget::~CompletionOrderWidget
~CompletionOrderWidget()
Definition: completionorderwidget.cpp:235
QTreeView::setAllColumnsShowFocus
void setAllColumnsShowFocus(bool enable)
QTreeWidget::currentItem
QTreeWidgetItem * currentItem() const
QString
QTreeView::setIndentation
void setIndentation(int i)
QTreeWidget::setColumnCount
void setColumnCount(int columns)
QTreeWidget::sortItems
void sortItems(int column, Qt::SortOrder order)
QStringList
QTreeWidget::itemAbove
QTreeWidgetItem * itemAbove(const QTreeWidgetItem *item) const
QTreeWidget::setCurrentItem
void setCurrentItem(QTreeWidgetItem *item)
QTreeView::setSortingEnabled
void setSortingEnabled(bool enable)
KPIM::CompletionItem::completionWeight
virtual int completionWeight() const =0
QModelIndex::data
QVariant data(int role) const
QTreeWidgetItem
QLatin1String
QTreeView::setHeaderHidden
void setHeaderHidden(bool hide)
KPIM::CompletionItem
Definition: completionorderwidget.h:54
QWidget::QWidget
QWidget(QWidget *parent, QFlags< Qt::WindowType > f)
QString::fromLatin1
QString fromLatin1(const char *str, int size)
KHBox
QTreeWidget::topLevelItem
QTreeWidgetItem * topLevelItem(int index) const
completionorderwidget.h
QTreeWidget::topLevelItemCount
topLevelItemCount
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
KPIM::CompletionOrderWidget::save
void save()
Definition: completionorderwidget.cpp:239
KLDAP::LdapClient
An object that represents a configured LDAP server.
Definition: ldapclient.h:46
QVariant::toString
QString toString() const
QIcon
KPIM::CompletionOrderEditorAdaptor::CompletionOrderEditorAdaptor
CompletionOrderEditorAdaptor(QObject *parent)
Definition: completionorderwidget.cpp:50
KPIM::CompletionOrderWidget::configFile
KConfig * configFile()
Definition: completionorderwidget.h:74
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:33:50 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

libkdepim

Skip menu "libkdepim"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Modules

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
  • pimprint

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