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

libkdepim

  • sources
  • kde-4.12
  • kdepim
  • libkdepim
  • addressline
completionordereditor.cpp
Go to the documentation of this file.
1 
32 #include "completionordereditor.h"
33 #include "completionordereditor_p.h"
34 #include <kdescendantsproxymodel.h>
35 #include "ldap/ldapclient.h"
36 #include "ldap/ldapclientsearch.h"
37 #include "ldap/ldapclientsearchconfig.h"
38 
39 #include <akonadi/changerecorder.h>
40 #include <akonadi/collectionfilterproxymodel.h>
41 #include <akonadi/entitytreemodel.h>
42 #include <akonadi/monitor.h>
43 
44 #include <kabc/addressee.h>
45 #include <kabc/contactgroup.h>
46 #include <kldap/ldapserver.h>
47 
48 #include <KDE/KConfigGroup>
49 #include <KDE/KHBox>
50 #include <KDE/KIcon>
51 #include <KDE/KLocale>
52 #include <KDE/KPushButton>
53 #include <KDE/KVBox>
54 
55 #include <QtDBus/QDBusConnection>
56 #include <QToolButton>
57 #include <QTreeWidget>
58 
59 using namespace KPIM;
60 
61 CompletionOrderEditorAdaptor::CompletionOrderEditorAdaptor( QObject *parent )
62  : QDBusAbstractAdaptor( parent )
63 {
64  setAutoRelaySignals( true );
65 }
66 
67 class LDAPCompletionItem : public CompletionItem
68 {
69  public:
70  LDAPCompletionItem( KLDAP::LdapClient *ldapClient )
71  : mLdapClient( ldapClient ), mWeight(0)
72  {
73  }
74 
75  virtual QString label() const
76  {
77  return i18n( "LDAP server %1", mLdapClient->server().host() );
78  }
79 
80  virtual QIcon icon() const
81  {
82  return KIcon( QLatin1String("view-ldap-resource") );
83  }
84 
85  virtual int completionWeight() const
86  {
87  return mLdapClient->completionWeight();
88  }
89 
90  virtual void save( CompletionOrderEditor* )
91  {
92  KConfig *config = KLDAP::LdapClientSearchConfig::config();
93  KConfigGroup group( config, "LDAP" );
94  group.writeEntry( QString::fromLatin1("SelectedCompletionWeight%1" ).arg( mLdapClient->clientNumber() ),
95  mWeight );
96  group.sync();
97  }
98 
99  protected:
100  virtual void setCompletionWeight( int weight )
101  {
102  mWeight = weight;
103  }
104 
105  private:
106  KLDAP::LdapClient *mLdapClient;
107  int mWeight;
108 };
109 
110 class SimpleCompletionItem : public CompletionItem
111 {
112  public:
113  SimpleCompletionItem( CompletionOrderEditor* editor, const QString& label, const QString& identifier, int weight )
114  : mLabel( label ), mIdentifier( identifier )
115  {
116  KConfigGroup group( editor->configFile(), "CompletionWeights" );
117  mWeight = group.readEntry( mIdentifier, weight );
118  }
119 
120  void setIcon( const QIcon &icon )
121  {
122  mIcon = icon;
123  }
124 
125  virtual QString label() const
126  {
127  return mLabel;
128  }
129 
130  virtual QIcon icon() const
131  {
132  return mIcon;
133  }
134 
135  virtual int completionWeight() const
136  {
137  return mWeight;
138  }
139 
140  virtual void save( CompletionOrderEditor *editor )
141  {
142  KConfigGroup group( editor->configFile(), "CompletionWeights" );
143  group.writeEntry( mIdentifier, mWeight );
144  }
145 
146  protected:
147  virtual void setCompletionWeight( int weight )
148  {
149  mWeight = weight;
150  }
151 
152  private:
153  QString mLabel;
154  QString mIdentifier;
155  int mWeight;
156  QIcon mIcon;
157 };
158 
160 
161 class CompletionViewItem : public QTreeWidgetItem
162 {
163  public:
164  CompletionViewItem( QTreeWidget *parent, CompletionItem* item, QTreeWidgetItem *preceding )
165  : QTreeWidgetItem( parent, preceding )
166  {
167  setItem( item );
168  }
169 
170  void setItem( CompletionItem *item )
171  {
172  mItem = item;
173  setText( 0, mItem->label() );
174  setIcon( 0, mItem->icon() );
175  }
176 
177  CompletionItem* item() const
178  {
179  return mItem;
180  }
181 
182  bool operator<( const QTreeWidgetItem &other ) const
183  {
184  const QTreeWidgetItem *otherItem = &other;
185  const CompletionViewItem *completionItem = static_cast<const CompletionViewItem*>( otherItem );
186  // item with weight 100 should be on the top -> reverse sorting
187  return (mItem->completionWeight() > completionItem->item()->completionWeight());
188  }
189 
190  private:
191  CompletionItem* mItem;
192 };
193 
194 CompletionOrderEditor::CompletionOrderEditor( KLDAP::LdapClientSearch* ldapSearch,
195  QWidget* parent )
196  : KDialog( parent ), mConfig( QLatin1String("kpimcompletionorder") ), mLdapSearch( ldapSearch ), mDirty( false )
197 {
198  setCaption( i18n( "Edit Completion Order" ) );
199  setButtons( Ok|Cancel );
200  setDefaultButton( Ok );
201  setModal( true );
202  showButtonSeparator( true );
203  new CompletionOrderEditorAdaptor( this );
204  QDBusConnection::sessionBus().registerObject( QLatin1String("/"), this, QDBusConnection::ExportAdaptors );
205 
206  KHBox* page = new KHBox( this );
207  setMainWidget( page );
208  mListView = new QTreeWidget( page );
209  mListView->setColumnCount( 1 );
210  mListView->setAlternatingRowColors( true );
211  mListView->setIndentation( 0 );
212  mListView->setAllColumnsShowFocus( true );
213  mListView->setHeaderHidden ( true );
214  mListView->setSortingEnabled( true );
215 
216  KVBox* upDownBox = new KVBox( page );
217  mUpButton = new KPushButton( upDownBox );
218  mUpButton->setAutoRepeat(true);
219  mUpButton->setObjectName( QLatin1String("mUpButton") );
220  mUpButton->setIcon( KIcon(QLatin1String("go-up")) );
221  mUpButton->setEnabled( false ); // b/c no item is selected yet
222  mUpButton->setFocusPolicy( Qt::StrongFocus );
223 
224  mDownButton = new KPushButton( upDownBox );
225  mDownButton->setAutoRepeat(true);
226  mDownButton->setObjectName( QLatin1String("mDownButton") );
227  mDownButton->setIcon( KIcon(QLatin1String("go-down")) );
228  mDownButton->setEnabled( false ); // b/c no item is selected yet
229  mDownButton->setFocusPolicy( Qt::StrongFocus );
230 
231  QWidget* spacer = new QWidget( upDownBox );
232  upDownBox->setStretchFactor( spacer, 100 );
233 
234  connect( mListView, SIGNAL(itemSelectionChanged()),
235  SLOT(slotSelectionChanged()) );
236  connect( mListView, SIGNAL(currentItemChanged(QTreeWidgetItem*,QTreeWidgetItem*)),
237  SLOT(slotSelectionChanged()) );
238  connect( mUpButton, SIGNAL(clicked()), this, SLOT(slotMoveUp()) );
239  connect( mDownButton, SIGNAL(clicked()), this, SLOT(slotMoveDown()) );
240  connect( this, SIGNAL(okClicked()), this, SLOT(slotOk()));
241 
242  loadCompletionItems();
243  readConfig();
244 }
245 
246 CompletionOrderEditor::~CompletionOrderEditor()
247 {
248  writeConfig();
249 }
250 
251 void CompletionOrderEditor::readConfig()
252 {
253  KConfigGroup group( KGlobal::config(), "CompletionOrderEditor" );
254  const QSize size = group.readEntry( "Size", QSize(600, 400) );
255  if ( size.isValid() ) {
256  resize( size );
257  }
258 }
259 
260 void CompletionOrderEditor::writeConfig()
261 {
262  KConfigGroup group( KGlobal::config(), "CompletionOrderEditor" );
263  group.writeEntry( "Size", size() );
264  group.sync();
265 }
266 
267 
268 void CompletionOrderEditor::addCompletionItemForIndex( const QModelIndex &index )
269 {
270  const Akonadi::Collection collection = index.data( Akonadi::EntityTreeModel::CollectionRole ).value<Akonadi::Collection>();
271  if ( !collection.isValid() )
272  return;
273 
274  SimpleCompletionItem *item = new SimpleCompletionItem( this, index.data().toString(), QString::number( collection.id() ), 60 );
275  item->setIcon( index.data( Qt::DecorationRole ).value<QIcon>() );
276 
277  new CompletionViewItem( mListView, item, 0 );
278 }
279 
280 void CompletionOrderEditor::loadCompletionItems()
281 {
282  // The first step is to gather all the data, creating CompletionItem objects
283  foreach ( KLDAP::LdapClient *client, mLdapSearch->clients() ) {
284  new CompletionViewItem( mListView, new LDAPCompletionItem( client ), 0 );
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  addCompletionItemForIndex( mCollectionModel->index( row, 0 ) );
313 
314  mListView->sortItems( 0, Qt::AscendingOrder );
315 }
316 
317 void CompletionOrderEditor::rowsInserted( const QModelIndex &parent, int start, int end )
318 {
319  for ( int row = start; row <= end; ++row )
320  addCompletionItemForIndex( mCollectionModel->index( row, 0, parent ) );
321 
322  mListView->sortItems( 0, Qt::AscendingOrder );
323 }
324 
325 void CompletionOrderEditor::slotSelectionChanged()
326 {
327  QTreeWidgetItem *item = mListView->currentItem();
328  mDownButton->setEnabled( item && mListView->itemBelow( item ) );
329  mUpButton->setEnabled( item && mListView->itemAbove( item ) );
330 }
331 
332 static void swapItems( CompletionViewItem *one, CompletionViewItem *other )
333 {
334  CompletionItem* oneCompletion = one->item();
335  CompletionItem* otherCompletion = other->item();
336 
337  int weight = otherCompletion->completionWeight();
338  otherCompletion->setCompletionWeight( oneCompletion->completionWeight() );
339  oneCompletion->setCompletionWeight( weight );
340 
341  one->setItem( otherCompletion );
342  other->setItem( oneCompletion );
343 }
344 
345 void CompletionOrderEditor::slotMoveUp()
346 {
347  CompletionViewItem *item = static_cast<CompletionViewItem *>( mListView->currentItem() );
348  if ( !item ) return;
349  CompletionViewItem *above = static_cast<CompletionViewItem *>( mListView->itemAbove( item ) );
350  if ( !above ) return;
351  swapItems( item, above );
352  mListView->setCurrentItem( above, 0, QItemSelectionModel::Select | QItemSelectionModel::Current );
353  mListView->sortItems( 0, Qt::AscendingOrder );
354  mDirty = true;
355 }
356 
357 void CompletionOrderEditor::slotMoveDown()
358 {
359  CompletionViewItem *item = static_cast<CompletionViewItem *>( mListView->currentItem() );
360  if ( !item ) return;
361  CompletionViewItem *below = static_cast<CompletionViewItem *>( mListView->itemBelow( item ) );
362  if ( !below ) return;
363  swapItems( item, below );
364  mListView->setCurrentItem( below );
365  mListView->setCurrentItem( below, 0, QItemSelectionModel::Select | QItemSelectionModel::Current );
366  mListView->sortItems( 0, Qt::AscendingOrder );
367  mDirty = true;
368 }
369 
370 void CompletionOrderEditor::slotOk()
371 {
372  if ( mDirty ) {
373  int w = 100;
374  for ( int itemIndex = 0; itemIndex < mListView->topLevelItemCount(); ++itemIndex ) {
375  CompletionViewItem *item =
376  static_cast<CompletionViewItem *>( mListView->topLevelItem( itemIndex ) );
377  item->item()->setCompletionWeight( w );
378  item->item()->save( this );
379  --w;
380  }
381  emit completionOrderChanged();
382  }
383  KDialog::accept();
384 }
385 
386 #include "completionordereditor_p.moc"
387 #include "completionordereditor.moc"
KPIM::CompletionOrderEditor
Definition: completionordereditor.h:65
KVBox
ldapclientsearch.h
QDBusAbstractAdaptor
KPIM::CompletionOrderEditorAdaptor
Definition: completionordereditor_p.h:38
KLDAP::LdapClientSearch
Definition: ldapclientsearch.h:60
QWidget
KDialog
QObject
completionordereditor_p.h
KPIM::CompletionOrderEditor::configFile
KConfig * configFile()
Definition: completionordereditor.h:73
KPIM::CompletionItem::setCompletionWeight
virtual void setCompletionWeight(int weight)=0
KLDAP::LdapClientSearch::clients
QList< LdapClient * > clients() const
Returns the list of configured LDAP clients.
Definition: ldapclientsearch.cpp:133
ldapclient.h
KPIM::CompletionOrderEditor::CompletionOrderEditor
CompletionOrderEditor(KLDAP::LdapClientSearch *ldapSearch, QWidget *parent)
Definition: completionordereditor.cpp:194
ldapclientsearchconfig.h
swapItems
static void swapItems(CompletionViewItem *one, CompletionViewItem *other)
Definition: completionordereditor.cpp:332
completionordereditor.h
KPIM::CompletionOrderEditor::~CompletionOrderEditor
~CompletionOrderEditor()
Definition: completionordereditor.cpp:246
KPIM::CompletionItem::completionWeight
virtual int completionWeight() const =0
KPIM::CompletionItem
Definition: completionordereditor.h:53
KHBox
KPIM::CompletionOrderEditor::completionOrderChanged
void completionOrderChanged()
KLDAP::LdapClient
An object that represents a configured LDAP server.
Definition: ldapclient.h:48
KPIM::CompletionOrderEditorAdaptor::CompletionOrderEditorAdaptor
CompletionOrderEditorAdaptor(QObject *parent)
Definition: completionordereditor.cpp:61
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:58:03 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

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