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
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
using namespace KPIM;
00072
00073
namespace KPIM {
00074
00075
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
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
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
00139
00140 KConfigGroup group( editor->configFile(),
"CompletionWeights" );
00141 group.writeEntry( mIdentifier, mWeight );
00142 }
00143
00144
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
00189
QValueList< LdapClient* > ldapClients = ldapSearch->
clients();
00190
for(
QValueList<LdapClient*>::const_iterator it = ldapClients.begin(); it != ldapClients.end(); ++it ) {
00191
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
00198
ResourceABC* res = dynamic_cast<ResourceABC *>( *resit );
00199
if ( res ) {
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 {
00205 mItems.append(
new SimpleCompletionItem(
this, (*resit)->resourceName(),
00206 (*resit)->identifier() ) );
00207 }
00208 }
00209
00210 mItems.append(
new SimpleCompletionItem(
this, i18n(
"Distribution Lists" ),
"DistributionLists" ) );
00211
00212
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 );
00230 mUpButton->setFocusPolicy( StrongFocus );
00231
00232 mDownButton =
new QToolButton( upDownBox,
"mDownButton" );
00233 mDownButton->setPixmap( BarIcon(
"down", KIcon::SizeSmall ) );
00234 mDownButton->setEnabled(
false );
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 }
00303
00304
#include "completionordereditor.moc"