00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
#include <qlistview.h>
00022
#include <qlayout.h>
00023
#include <qlabel.h>
00024
#include <qpushbutton.h>
00025
#include <qcombobox.h>
00026
#include <kinputdialog.h>
00027
#include <qbuttongroup.h>
00028
#include <qradiobutton.h>
00029
00030
#include <klocale.h>
00031
#include <kdebug.h>
00032
#include <kmessagebox.h>
00033
00034
#include "addressbook.h"
00035
#include "addresseedialog.h"
00036
#include "distributionlist.h"
00037
00038
#include "distributionlistdialog.h"
00039
#include "distributionlistdialog.moc"
00040
00041
using namespace KABC;
00042
00043 DistributionListDialog::DistributionListDialog(
AddressBook *addressBook,
QWidget *parent)
00044 :
KDialogBase( parent,
"", true, i18n(
"Configure Distribution Lists"), Ok, Ok, true)
00045 {
00046 mEditor =
new DistributionListEditorWidget( addressBook,
this );
00047
setMainWidget( mEditor );
00048
00049 connect(
this, SIGNAL(
okClicked() ), mEditor, SLOT( save() ) );
00050 }
00051
00052 DistributionListDialog::~DistributionListDialog()
00053 {
00054 }
00055
00056
00057 EmailSelector::EmailSelector(
const QStringList &emails,
const QString ¤t,
00058
QWidget *parent ) :
00059
KDialogBase(
KDialogBase::Plain, i18n(
"Select Email Address"), Ok, Ok,
00060 parent )
00061 {
00062
QFrame *topFrame =
plainPage();
00063
QBoxLayout *topLayout =
new QVBoxLayout( topFrame );
00064
00065 mButtonGroup =
new QButtonGroup( 1, Horizontal, i18n(
"Email Addresses"),
00066 topFrame );
00067 topLayout->
addWidget( mButtonGroup );
00068
00069 QStringList::ConstIterator it;
00070
for( it = emails.begin(); it != emails.end(); ++it ) {
00071
QRadioButton *button =
new QRadioButton( *it, mButtonGroup );
00072
if ( (*it) == current ) {
00073 button->setDown(
true );
00074 }
00075 }
00076 }
00077
00078
QString EmailSelector::selected()
00079 {
00080
QButton *button = mButtonGroup->selected();
00081
if ( button )
return button->text();
00082
return QString::null;
00083 }
00084
00085
QString EmailSelector::getEmail(
const QStringList &emails,
const QString ¤t,
00086
QWidget *parent )
00087 {
00088
EmailSelector *dlg =
new EmailSelector( emails, current, parent );
00089 dlg->exec();
00090
00091
QString result = dlg->
selected();
00092
00093
delete dlg;
00094
00095
return result;
00096 }
00097
00098
class EntryItem :
public QListViewItem
00099 {
00100
public:
00101 EntryItem(
QListView *parent,
const Addressee &addressee,
00102
const QString &email=QString::null ) :
00103
QListViewItem( parent ),
00104 mAddressee( addressee ),
00105 mEmail( email )
00106 {
00107 setText( 0, addressee.
realName() );
00108
if( email.isEmpty() ) {
00109 setText( 1, addressee.
preferredEmail() );
00110 setText( 2, i18n(
"Yes") );
00111 }
else {
00112 setText( 1, email );
00113 setText( 2, i18n(
"No") );
00114 }
00115 }
00116
00117
Addressee addressee()
const
00118
{
00119
return mAddressee;
00120 }
00121
00122
QString email()
const
00123
{
00124
return mEmail;
00125 }
00126
00127
private:
00128
Addressee mAddressee;
00129
QString mEmail;
00130 };
00131
00132 DistributionListEditorWidget::DistributionListEditorWidget( AddressBook *addressBook,
QWidget *parent) :
00133
QWidget( parent ),
00134 mAddressBook( addressBook )
00135 {
00136
kdDebug(5700) <<
"DistributionListEditor()" <<
endl;
00137
00138
QBoxLayout *topLayout =
new QVBoxLayout(
this );
00139 topLayout->
setSpacing( KDialog::spacingHint() );
00140
00141
QBoxLayout *nameLayout =
new QHBoxLayout( topLayout) ;
00142
00143 mNameCombo =
new QComboBox(
this );
00144 nameLayout->
addWidget( mNameCombo );
00145 connect( mNameCombo, SIGNAL( activated(
int ) ), SLOT( updateEntryView() ) );
00146
00147 mNewButton =
new QPushButton( i18n(
"New List..."),
this );
00148 nameLayout->
addWidget( mNewButton );
00149 connect( mNewButton, SIGNAL( clicked() ), SLOT( newList() ) );
00150
00151 mEditButton =
new QPushButton( i18n(
"Rename List..."),
this );
00152 nameLayout->
addWidget( mEditButton );
00153 connect( mEditButton, SIGNAL( clicked() ), SLOT( editList() ) );
00154
00155 mRemoveButton =
new QPushButton( i18n(
"Remove List"),
this );
00156 nameLayout->
addWidget( mRemoveButton );
00157 connect( mRemoveButton, SIGNAL( clicked() ), SLOT( removeList() ) );
00158
00159
QGridLayout *gridLayout =
new QGridLayout( topLayout, 3, 3 );
00160 gridLayout->setColStretch(1, 1);
00161
00162
QLabel *listLabel =
new QLabel( i18n(
"Available addresses:"),
this );
00163 gridLayout->addWidget( listLabel, 0, 0 );
00164
00165 mListLabel =
new QLabel(
this );
00166 gridLayout->addMultiCellWidget( mListLabel, 0, 0, 1, 2 );
00167
00168 mAddresseeView =
new QListView(
this );
00169 mAddresseeView->addColumn( i18n(
"Name") );
00170 mAddresseeView->addColumn( i18n(
"Preferred Email") );
00171 mAddresseeView->setAllColumnsShowFocus(
true );
00172 gridLayout->addWidget( mAddresseeView, 1, 0 );
00173 connect( mAddresseeView, SIGNAL( selectionChanged() ),
00174 SLOT( slotSelectionAddresseeViewChanged() ) );
00175 connect( mAddresseeView, SIGNAL( doubleClicked(
QListViewItem * ) ),
00176 SLOT( addEntry() ) );
00177
00178 mAddEntryButton =
new QPushButton( i18n(
"Add Entry"),
this );
00179 mAddEntryButton->setEnabled(
false);
00180 gridLayout->addWidget( mAddEntryButton, 2, 0 );
00181 connect( mAddEntryButton, SIGNAL( clicked() ), SLOT( addEntry() ) );
00182
00183 mEntryView =
new QListView(
this );
00184 mEntryView->addColumn( i18n(
"Name") );
00185 mEntryView->addColumn( i18n(
"Email") );
00186 mEntryView->addColumn( i18n(
"Use Preferred") );
00187 mEntryView->setEnabled(
false);
00188 mEntryView->setAllColumnsShowFocus(
true );
00189 gridLayout->addMultiCellWidget( mEntryView, 1, 1, 1, 2 );
00190 connect( mEntryView, SIGNAL( selectionChanged() ),
00191 SLOT( slotSelectionEntryViewChanged() ) );
00192
00193 mChangeEmailButton =
new QPushButton( i18n(
"Change Email..."),
this );
00194 gridLayout->addWidget( mChangeEmailButton, 2, 1 );
00195 connect( mChangeEmailButton, SIGNAL( clicked() ), SLOT( changeEmail() ) );
00196
00197 mRemoveEntryButton =
new QPushButton( i18n(
"Remove Entry"),
this );
00198 gridLayout->addWidget( mRemoveEntryButton, 2, 2 );
00199 connect( mRemoveEntryButton, SIGNAL( clicked() ), SLOT( removeEntry() ) );
00200
00201 mManager =
new DistributionListManager( mAddressBook );
00202 mManager->load();
00203
00204 updateAddresseeView();
00205 updateNameCombo();
00206 }
00207
00208 DistributionListEditorWidget::~DistributionListEditorWidget()
00209 {
00210
kdDebug(5700) <<
"~DistributionListEditor()" <<
endl;
00211
00212
delete mManager;
00213 }
00214
00215
void DistributionListEditorWidget::save()
00216 {
00217 mManager->save();
00218 }
00219
00220
void DistributionListEditorWidget::slotSelectionEntryViewChanged()
00221 {
00222 EntryItem *entryItem = static_cast<EntryItem *>( mEntryView->selectedItem() );
00223
bool state=entryItem;
00224
00225 mChangeEmailButton->setEnabled(state);
00226 mRemoveEntryButton->setEnabled(state);
00227 }
00228
00229
void DistributionListEditorWidget::newList()
00230 {
00231
bool ok;
00232
QString name =
KInputDialog::getText( i18n(
"New Distribution List" ),
00233 i18n(
"Please enter &name:" ), QString::null, &ok );
00234
if (!ok)
return;
00235
00236
new DistributionList( mManager, name );
00237
00238 mNameCombo->clear();
00239 mNameCombo->insertStringList( mManager->listNames() );
00240 mNameCombo->setCurrentItem( mNameCombo->count() - 1 );
00241
00242 updateEntryView();
00243 slotSelectionAddresseeViewChanged();
00244 }
00245
00246
void DistributionListEditorWidget::editList()
00247 {
00248
QString oldName = mNameCombo->currentText();
00249
bool ok;
00250
QString name =
KInputDialog::getText( i18n(
"Distribution List" ),
00251 i18n(
"Please change &name:" ), oldName, &ok );
00252
if (!ok)
return;
00253
00254
DistributionList *list = mManager->list( oldName );
00255 list->
setName( name );
00256
00257 mNameCombo->clear();
00258 mNameCombo->insertStringList( mManager->listNames() );
00259 mNameCombo->setCurrentItem( mNameCombo->count() - 1 );
00260
00261 updateEntryView();
00262 slotSelectionAddresseeViewChanged();
00263 }
00264
00265
void DistributionListEditorWidget::removeList()
00266 {
00267
int result =
KMessageBox::warningContinueCancel(
this,
00268 i18n(
"Delete distribution list '%1'?") .arg( mNameCombo->currentText() ),
00269 QString::null,
KStdGuiItem::del() );
00270
00271
if ( result != KMessageBox::Continue )
return;
00272
00273 mManager->remove( mManager->list( mNameCombo->currentText() ) );
00274 mNameCombo->removeItem( mNameCombo->currentItem() );
00275
00276 updateEntryView();
00277 slotSelectionAddresseeViewChanged();
00278 }
00279
00280
void DistributionListEditorWidget::addEntry()
00281 {
00282
AddresseeItem *addresseeItem =
00283 static_cast<AddresseeItem *>( mAddresseeView->selectedItem() );
00284
00285
if( !addresseeItem ) {
00286
kdDebug(5700) <<
"DLE::addEntry(): No addressee selected." <<
endl;
00287
return;
00288 }
00289
00290
DistributionList *list = mManager->list( mNameCombo->currentText() );
00291
if ( !list ) {
00292
kdDebug(5700) <<
"DLE::addEntry(): No dist list '" << mNameCombo->currentText() <<
"'" <<
endl;
00293
return;
00294 }
00295
00296 list->
insertEntry( addresseeItem->
addressee() );
00297 updateEntryView();
00298 slotSelectionAddresseeViewChanged();
00299 }
00300
00301
void DistributionListEditorWidget::removeEntry()
00302 {
00303
DistributionList *list = mManager->list( mNameCombo->currentText() );
00304
if ( !list )
return;
00305
00306 EntryItem *entryItem =
00307 static_cast<EntryItem *>( mEntryView->selectedItem() );
00308
if ( !entryItem )
return;
00309
00310 list->
removeEntry( entryItem->addressee(), entryItem->email() );
00311
delete entryItem;
00312 }
00313
00314
void DistributionListEditorWidget::changeEmail()
00315 {
00316
DistributionList *list = mManager->list( mNameCombo->currentText() );
00317
if ( !list )
return;
00318
00319 EntryItem *entryItem =
00320 static_cast<EntryItem *>( mEntryView->selectedItem() );
00321
if ( !entryItem )
return;
00322
00323
QString email = EmailSelector::getEmail( entryItem->addressee().emails(),
00324 entryItem->email(),
this );
00325 list->
removeEntry( entryItem->addressee(), entryItem->email() );
00326 list->
insertEntry( entryItem->addressee(), email );
00327
00328 updateEntryView();
00329 }
00330
00331
void DistributionListEditorWidget::updateEntryView()
00332 {
00333
if ( mNameCombo->currentText().isEmpty() ) {
00334 mListLabel->setText( i18n(
"Selected addressees:") );
00335 }
else {
00336 mListLabel->setText( i18n(
"Selected addresses in '%1':")
00337 .arg( mNameCombo->currentText() ) );
00338 }
00339
00340 mEntryView->clear();
00341
00342
DistributionList *list = mManager->list( mNameCombo->currentText() );
00343
if ( !list ) {
00344 mEditButton->setEnabled(
false);
00345 mRemoveButton->setEnabled(
false);
00346 mChangeEmailButton->setEnabled(
false);
00347 mRemoveEntryButton->setEnabled(
false);
00348 mAddresseeView->setEnabled(
false);
00349 mEntryView->setEnabled(
false);
00350
return;
00351 }
else {
00352 mEditButton->setEnabled(
true);
00353 mRemoveButton->setEnabled(
true);
00354 mAddresseeView->setEnabled(
true);
00355 mEntryView->setEnabled(
true);
00356 }
00357
00358 DistributionList::Entry::List entries = list->
entries();
00359 DistributionList::Entry::List::ConstIterator it;
00360
for( it = entries.begin(); it != entries.end(); ++it ) {
00361
new EntryItem( mEntryView, (*it).addressee, (*it).email );
00362 }
00363
00364 EntryItem *entryItem = static_cast<EntryItem *>( mEntryView->selectedItem() );
00365
bool state=entryItem;
00366
00367 mChangeEmailButton->setEnabled(state);
00368 mRemoveEntryButton->setEnabled(state);
00369 }
00370
00371
void DistributionListEditorWidget::updateAddresseeView()
00372 {
00373 mAddresseeView->clear();
00374
00375 AddressBook::Iterator it;
00376
for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) {
00377
new AddresseeItem( mAddresseeView, *it );
00378 }
00379 }
00380
00381
void DistributionListEditorWidget::updateNameCombo()
00382 {
00383 mNameCombo->insertStringList( mManager->listNames() );
00384
00385 updateEntryView();
00386 }
00387
00388
void DistributionListEditorWidget::slotSelectionAddresseeViewChanged()
00389 {
00390
AddresseeItem *addresseeItem =
00391 static_cast<AddresseeItem *>( mAddresseeView->selectedItem() );
00392
bool state=addresseeItem;
00393 mAddEntryButton->setEnabled( state && !mNameCombo->currentText().isEmpty());
00394 }