libkdepim Library API Documentation

completionordereditor.cpp

00001 00031 #include "completionordereditor.h" 00032 #include "ldapclient.h" 00033 #include "resourceabc.h" 00034 00035 #include <kabc/stdaddressbook.h> 00036 #include <kabc/resource.h> 00037 00038 #include <kdebug.h> 00039 #include <klocale.h> 00040 #include <kiconloader.h> 00041 #include <klistview.h> 00042 00043 #include <qhbox.h> 00044 #include <qvbox.h> 00045 #include <qheader.h> 00046 #include <qtoolbutton.h> 00047 00048 /* 00049 00050 Several items are used in addresseelineedit's completion object: 00051 LDAP servers, KABC resources (imap and non-imap), Recent addresses (in kmail only). 00052 00053 The default completion weights are as follow: 00054 LDAP: 50, 49, 48 etc. (see ldapclient.cpp) 00055 KABC non-imap resources: 60 (see addresseelineedit.cpp and SimpleCompletionItem here) 00056 Distribution lists: 60 (see addresseelineedit.cpp and SimpleCompletionItem here) 00057 KABC imap resources: 80 (see kresources/imap/kabc/resourceimap.cpp) 00058 Recent addresses (kmail) : 120 (see kmail/kmcomposewin.cpp) 00059 00060 This dialog allows to change those weights, by showing one item per: 00061 - LDAP server 00062 - KABC non-imap resource 00063 - KABC imap subresource 00064 plus one item for Distribution Lists. 00065 00066 Maybe 'recent addresses' should be configurable too, but first it might 00067 be better to add support for them in korganizer too. 00068 00069 */ 00070 00071 using namespace KPIM; 00072 00073 namespace KPIM { 00074 00075 // Base class for items in the list 00076 class CompletionItem 00077 { 00078 public: 00079 virtual ~CompletionItem() {} 00080 virtual QString label() const = 0; 00081 virtual int completionWeight() const = 0; 00082 virtual void setCompletionWeight( int weight ) = 0; 00083 virtual void save( CompletionOrderEditor* ) = 0; 00084 }; 00085 00086 int CompletionItemList::compareItems( QPtrCollection::Item s1, QPtrCollection::Item s2 ) 00087 { 00088 int w1 = ( (CompletionItem*)s1 )->completionWeight(); 00089 int w2 = ( (CompletionItem*)s2 )->completionWeight(); 00090 // s1 < s2 if it has a higher completion value, i.e. w1 > w2. 00091 return w2 - w1; 00092 } 00093 00094 class LDAPCompletionItem : public CompletionItem 00095 { 00096 public: 00097 LDAPCompletionItem( LdapClient* ldapClient ) : mLdapClient( ldapClient ) {} 00098 virtual QString label() const { return i18n( "LDAP server %1" ).arg( mLdapClient->host() ); } 00099 virtual int completionWeight() const { return mLdapClient->completionWeight(); } 00100 virtual void save( CompletionOrderEditor* ); 00101 protected: 00102 virtual void setCompletionWeight( int weight ) { mWeight = weight; } 00103 private: 00104 LdapClient* mLdapClient; 00105 int mWeight; 00106 }; 00107 00108 void LDAPCompletionItem::save( CompletionOrderEditor* ) 00109 { 00110 KConfig config( "kabldaprc" ); 00111 config.setGroup( "LDAP" ); 00112 config.writeEntry( QString( "SelectedCompletionWeight%1" ).arg( mLdapClient->clientNumber() ), 00113 mWeight ); 00114 config.sync(); 00115 } 00116 00117 // A simple item saved into kpimcompletionorder (no subresources, just name/identifier/weight) 00118 class SimpleCompletionItem : public CompletionItem 00119 { 00120 public: 00121 SimpleCompletionItem( CompletionOrderEditor* editor, const QString& label, const QString& identifier ) 00122 : mLabel( label ), mIdentifier( identifier ) { 00123 KConfigGroup group( editor->configFile(), "CompletionWeights" ); 00124 mWeight = group.readNumEntry( mIdentifier, 60 ); 00125 } 00126 virtual QString label() const { return mLabel; } 00127 virtual int completionWeight() const { return mWeight; } 00128 virtual void save( CompletionOrderEditor* ); 00129 protected: 00130 virtual void setCompletionWeight( int weight ) { mWeight = weight; } 00131 private: 00132 QString mLabel, mIdentifier; 00133 int mWeight; 00134 }; 00135 00136 void SimpleCompletionItem::save( CompletionOrderEditor* editor ) 00137 { 00138 // Maybe KABC::Resource could have a completionWeight setting (for readConfig/writeConfig) 00139 // But for kdelibs-3.2 compat purposes I can't do that. 00140 KConfigGroup group( editor->configFile(), "CompletionWeights" ); 00141 group.writeEntry( mIdentifier, mWeight ); 00142 } 00143 00144 // An imap subresource for kabc 00145 class KABCImapSubResCompletionItem : public CompletionItem 00146 { 00147 public: 00148 KABCImapSubResCompletionItem( ResourceABC* resource, const QString& subResource ) 00149 : mResource( resource ), mSubResource( subResource ), mWeight( completionWeight() ) {} 00150 virtual QString label() const { 00151 return QString( "%1 %2" ).arg( mResource->resourceName() ).arg( mSubResource ); 00152 } 00153 virtual int completionWeight() const { 00154 return mResource->subresourceCompletionWeight( mSubResource ); 00155 } 00156 virtual void setCompletionWeight( int weight ) { 00157 mWeight = weight; 00158 } 00159 virtual void save( CompletionOrderEditor* ) { 00160 mResource->setSubresourceCompletionWeight( mSubResource, mWeight ); 00161 } 00162 private: 00163 ResourceABC* mResource; 00164 QString mSubResource; 00165 int mWeight; 00166 }; 00167 00169 00170 class CompletionViewItem : public QListViewItem 00171 { 00172 public: 00173 CompletionViewItem( QListView* lv, CompletionItem* item ) 00174 : QListViewItem( lv, lv->lastItem(), item->label() ), mItem( item ) {} 00175 CompletionItem* item() const { return mItem; } 00176 void setItem( CompletionItem* i ) { mItem = i; setText( 0, mItem->label() ); } 00177 00178 private: 00179 CompletionItem* mItem; 00180 }; 00181 00182 CompletionOrderEditor::CompletionOrderEditor( KPIM::LdapSearch* ldapSearch, 00183 QWidget* parent, const char* name ) 00184 : KDialogBase( parent, name, true, i18n("Edit Completion Order"), Ok|Cancel, Ok, true ), 00185 mConfig( "kpimcompletionorder" ), mDirty( false ) 00186 { 00187 mItems.setAutoDelete( true ); 00188 // The first step is to gather all the data, creating CompletionItem objects 00189 QValueList< LdapClient* > ldapClients = ldapSearch->clients(); 00190 for( QValueList<LdapClient*>::const_iterator it = ldapClients.begin(); it != ldapClients.end(); ++it ) { 00191 //kdDebug(5300) << "LDAP: host " << (*it)->host() << " weight " << (*it)->completionWeight() << endl; 00192 mItems.append( new LDAPCompletionItem( *it ) ); 00193 } 00194 KABC::AddressBook *addressBook = KABC::StdAddressBook::self(); 00195 QPtrList<KABC::Resource> resources = addressBook->resources(); 00196 for( QPtrListIterator<KABC::Resource> resit( resources ); *resit; ++resit ) { 00197 //kdDebug(5300) << "KABC Resource: " << (*resit)->className() << endl; 00198 ResourceABC* res = dynamic_cast<ResourceABC *>( *resit ); 00199 if ( res ) { // IMAP KABC resource 00200 const QStringList subresources = res->subresources(); 00201 for( QStringList::const_iterator it = subresources.begin(); it != subresources.end(); ++it ) { 00202 mItems.append( new KABCImapSubResCompletionItem( res, *it ) ); 00203 } 00204 } else { // non-IMAP KABC resource 00205 mItems.append( new SimpleCompletionItem( this, (*resit)->resourceName(), 00206 (*resit)->identifier() ) ); 00207 } 00208 } 00209 // Add an item for distribution lists 00210 mItems.append( new SimpleCompletionItem( this, i18n( "Distribution Lists" ), "DistributionLists" ) ); 00211 00212 // Now sort the items, then create the GUI 00213 mItems.sort(); 00214 00215 QHBox* page = makeHBoxMainWidget(); 00216 mListView = new KListView( page ); 00217 mListView->setSorting( -1 ); 00218 mListView->addColumn( QString::null ); 00219 mListView->header()->hide(); 00220 00221 for( QPtrListIterator<CompletionItem> compit( mItems ); *compit; ++compit ) { 00222 new CompletionViewItem( mListView, *compit ); 00223 kdDebug(5300) << " " << (*compit)->label() << " " << (*compit)->completionWeight() << endl; 00224 } 00225 00226 QVBox* upDownBox = new QVBox( page ); 00227 mUpButton = new QToolButton( upDownBox, "mUpButton" ); 00228 mUpButton->setPixmap( BarIcon( "up", KIcon::SizeSmall ) ); 00229 mUpButton->setEnabled( false ); // b/c no item is selected yet 00230 mUpButton->setFocusPolicy( StrongFocus ); 00231 00232 mDownButton = new QToolButton( upDownBox, "mDownButton" ); 00233 mDownButton->setPixmap( BarIcon( "down", KIcon::SizeSmall ) ); 00234 mDownButton->setEnabled( false ); // b/c no item is selected yet 00235 mDownButton->setFocusPolicy( StrongFocus ); 00236 00237 QWidget* spacer = new QWidget( upDownBox ); 00238 upDownBox->setStretchFactor( spacer, 100 ); 00239 00240 connect( mListView, SIGNAL( selectionChanged( QListViewItem* ) ), 00241 SLOT( slotSelectionChanged( QListViewItem* ) ) ); 00242 connect( mUpButton, SIGNAL( clicked() ), this, SLOT( slotMoveUp() ) ); 00243 connect( mDownButton, SIGNAL( clicked() ), this, SLOT( slotMoveDown() ) ); 00244 } 00245 00246 CompletionOrderEditor::~CompletionOrderEditor() 00247 { 00248 } 00249 00250 void CompletionOrderEditor::slotSelectionChanged( QListViewItem *item ) 00251 { 00252 mDownButton->setEnabled( item && item->itemBelow() ); 00253 mUpButton->setEnabled( item && item->itemAbove() ); 00254 } 00255 00256 static void swapItems( CompletionViewItem *one, CompletionViewItem *other ) 00257 { 00258 CompletionItem* i = one->item(); 00259 one->setItem( other->item() ); 00260 other->setItem( i ); 00261 } 00262 00263 void CompletionOrderEditor::slotMoveUp() 00264 { 00265 CompletionViewItem *item = static_cast<CompletionViewItem *>( mListView->selectedItem() ); 00266 if ( !item ) return; 00267 CompletionViewItem *above = static_cast<CompletionViewItem *>( item->itemAbove() ); 00268 if ( !above ) return; 00269 swapItems( item, above ); 00270 mListView->setCurrentItem( above ); 00271 mListView->setSelected( above, true ); 00272 mDirty = true; 00273 } 00274 00275 void CompletionOrderEditor::slotMoveDown() 00276 { 00277 CompletionViewItem *item = static_cast<CompletionViewItem *>( mListView->selectedItem() ); 00278 if ( !item ) return; 00279 CompletionViewItem *below = static_cast<CompletionViewItem *>( item->itemBelow() ); 00280 if ( !below ) return; 00281 swapItems( item, below ); 00282 mListView->setCurrentItem( below ); 00283 mListView->setSelected( below, true ); 00284 mDirty = true; 00285 } 00286 00287 void CompletionOrderEditor::slotOk() 00288 { 00289 if ( mDirty ) { 00290 int w = 100; 00291 for ( QListViewItem* it = mListView->firstChild(); it; it = it->nextSibling() ) { 00292 CompletionViewItem *item = static_cast<CompletionViewItem *>( it ); 00293 item->item()->setCompletionWeight( w ); 00294 item->item()->save( this ); 00295 kdDebug(5300) << " " << item->item()->label() << " " << w << endl; 00296 --w; 00297 } 00298 } 00299 KDialogBase::slotOk(); 00300 } 00301 00302 } // namespace KPIM 00303 00304 #include "completionordereditor.moc"
KDE Logo
This file is part of the documentation for libkdepim Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Aug 27 12:50:23 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003