00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <qlayout.h>
00022 #include <qpushbutton.h>
00023 #include <qgroupbox.h>
00024 #include <qregexp.h>
00025
00026 #include <klocale.h>
00027 #include <kdebug.h>
00028
00029 #include "stdaddressbook.h"
00030
00031 #include "addresseedialog.h"
00032 #include "addresseedialog.moc"
00033
00034 using namespace KABC;
00035
00036 AddresseeItem::AddresseeItem( QListView *parent, const Addressee &addressee ) :
00037 QListViewItem( parent ),
00038 mAddressee( addressee )
00039 {
00040 setText( Name, addressee.realName() );
00041 setText( Email, addressee.preferredEmail() );
00042 }
00043
00044 QString AddresseeItem::key( int column, bool ) const
00045 {
00046 if (column == Email) {
00047 QString value = text(Email);
00048 QRegExp emailRe("<\\S*>");
00049 int match = emailRe.search(value);
00050 if (match > -1)
00051 value = value.mid(match + 1, emailRe.matchedLength() - 2);
00052
00053 return value.lower();
00054 }
00055
00056 return text(column).lower();
00057 }
00058
00059 AddresseeDialog::AddresseeDialog( QWidget *parent, bool multiple ) :
00060 KDialogBase( KDialogBase::Plain, i18n("Select Addressee"),
00061 Ok|Cancel, Ok, parent ), mMultiple( multiple )
00062 {
00063 QWidget *topWidget = plainPage();
00064
00065 QBoxLayout *topLayout = new QHBoxLayout( topWidget );
00066 QBoxLayout *listLayout = new QVBoxLayout;
00067 topLayout->addLayout( listLayout );
00068
00069 mAddresseeList = new KListView( topWidget );
00070 mAddresseeList->addColumn( i18n("Name") );
00071 mAddresseeList->addColumn( i18n("Email") );
00072 mAddresseeList->setAllColumnsShowFocus( true );
00073 mAddresseeList->setFullWidth( true );
00074 listLayout->addWidget( mAddresseeList );
00075 connect( mAddresseeList, SIGNAL( doubleClicked( QListViewItem * ) ),
00076 SLOT( slotOk() ) );
00077 connect( mAddresseeList, SIGNAL( selectionChanged( QListViewItem * ) ),
00078 SLOT( updateEdit( QListViewItem * ) ) );
00079
00080 mAddresseeEdit = new KLineEdit( topWidget );
00081 mAddresseeEdit->setCompletionMode( KGlobalSettings::CompletionAuto );
00082 connect( mAddresseeEdit->completionObject(), SIGNAL( match( const QString & ) ),
00083 SLOT( selectItem( const QString & ) ) );
00084 mAddresseeEdit->setFocus();
00085 mAddresseeEdit->completionObject()->setIgnoreCase( true );
00086 listLayout->addWidget( mAddresseeEdit );
00087
00088 setInitialSize( QSize( 450, 300 ) );
00089
00090 if ( mMultiple ) {
00091 QBoxLayout *selectedLayout = new QVBoxLayout;
00092 topLayout->addLayout( selectedLayout );
00093 topLayout->setSpacing( spacingHint() );
00094
00095 QGroupBox *selectedGroup = new QGroupBox( 1, Horizontal, i18n("Selected"),
00096 topWidget );
00097 selectedLayout->addWidget( selectedGroup );
00098
00099 mSelectedList = new KListView( selectedGroup );
00100 mSelectedList->addColumn( i18n("Name") );
00101 mSelectedList->addColumn( i18n("Email") );
00102 mSelectedList->setAllColumnsShowFocus( true );
00103 mSelectedList->setFullWidth( true );
00104 connect( mSelectedList, SIGNAL( doubleClicked( QListViewItem * ) ),
00105 SLOT( removeSelected() ) );
00106
00107 QPushButton *unselectButton = new QPushButton( i18n("Unselect"), selectedGroup );
00108 connect ( unselectButton, SIGNAL( clicked() ), SLOT( removeSelected() ) );
00109
00110 connect( mAddresseeList, SIGNAL( clicked( QListViewItem * ) ),
00111 SLOT( addSelected( QListViewItem * ) ) );
00112
00113 setInitialSize( QSize( 650, 350 ) );
00114 }
00115
00116 mAddressBook = StdAddressBook::self( true );
00117 connect( mAddressBook, SIGNAL( addressBookChanged( AddressBook* ) ),
00118 SLOT( addressBookChanged() ) );
00119 connect( mAddressBook, SIGNAL( loadingFinished( Resource* ) ),
00120 SLOT( addressBookChanged() ) );
00121
00122 loadAddressBook();
00123 }
00124
00125 AddresseeDialog::~AddresseeDialog()
00126 {
00127 }
00128
00129 void AddresseeDialog::loadAddressBook()
00130 {
00131 mAddresseeList->clear();
00132 mItemDict.clear();
00133 mAddresseeEdit->completionObject()->clear();
00134
00135 AddressBook::Iterator it;
00136 for( it = mAddressBook->begin(); it != mAddressBook->end(); ++it ) {
00137 AddresseeItem *item = new AddresseeItem( mAddresseeList, (*it) );
00138 addCompletionItem( (*it).realName(), item );
00139 addCompletionItem( (*it).preferredEmail(), item );
00140 }
00141 }
00142
00143 void AddresseeDialog::addCompletionItem( const QString &str, QListViewItem *item )
00144 {
00145 if ( str.isEmpty() ) return;
00146
00147 mItemDict.insert( str, item );
00148 mAddresseeEdit->completionObject()->addItem( str );
00149 }
00150
00151 void AddresseeDialog::selectItem( const QString &str )
00152 {
00153 if ( str.isEmpty() ) return;
00154
00155 QListViewItem *item = mItemDict.find( str );
00156 if ( item ) {
00157 mAddresseeList->blockSignals( true );
00158 mAddresseeList->setSelected( item, true );
00159 mAddresseeList->ensureItemVisible( item );
00160 mAddresseeList->blockSignals( false );
00161 }
00162 }
00163
00164 void AddresseeDialog::updateEdit( QListViewItem *item )
00165 {
00166 mAddresseeEdit->setText( item->text( 0 ) );
00167 mAddresseeEdit->setSelection( 0, item->text( 0 ).length() );
00168 }
00169
00170 void AddresseeDialog::addSelected( QListViewItem *item )
00171 {
00172 AddresseeItem *addrItem = dynamic_cast<AddresseeItem *>( item );
00173 if ( !addrItem ) return;
00174
00175 Addressee a = addrItem->addressee();
00176
00177 QListViewItem *selectedItem = mSelectedDict.find( a.uid() );
00178 if ( !selectedItem ) {
00179 selectedItem = new AddresseeItem( mSelectedList, a );
00180 mSelectedDict.insert( a.uid(), selectedItem );
00181 }
00182 }
00183
00184 void AddresseeDialog::removeSelected()
00185 {
00186 QListViewItem *item = mSelectedList->selectedItem();
00187 AddresseeItem *addrItem = dynamic_cast<AddresseeItem *>( item );
00188 if ( !addrItem ) return;
00189
00190 mSelectedDict.remove( addrItem->addressee().uid() );
00191 delete addrItem;
00192 }
00193
00194 Addressee AddresseeDialog::addressee()
00195 {
00196 AddresseeItem *aItem = 0;
00197
00198 if ( mMultiple )
00199 aItem = dynamic_cast<AddresseeItem *>( mSelectedList->firstChild() );
00200 else
00201 aItem = dynamic_cast<AddresseeItem *>( mAddresseeList->selectedItem() );
00202
00203 if (aItem) return aItem->addressee();
00204 return Addressee();
00205 }
00206
00207 Addressee::List AddresseeDialog::addressees()
00208 {
00209 Addressee::List al;
00210 AddresseeItem *aItem = 0;
00211
00212 if ( mMultiple ) {
00213 QListViewItem *item = mSelectedList->firstChild();
00214 while( item ) {
00215 aItem = dynamic_cast<AddresseeItem *>( item );
00216 if ( aItem ) al.append( aItem->addressee() );
00217 item = item->nextSibling();
00218 }
00219 }
00220 else
00221 {
00222 aItem = dynamic_cast<AddresseeItem *>( mAddresseeList->selectedItem() );
00223 if (aItem) al.append( aItem->addressee() );
00224 }
00225
00226 return al;
00227 }
00228
00229 Addressee AddresseeDialog::getAddressee( QWidget *parent )
00230 {
00231 AddresseeDialog *dlg = new AddresseeDialog( parent );
00232 Addressee addressee;
00233 int result = dlg->exec();
00234
00235 if ( result == QDialog::Accepted ) {
00236 addressee = dlg->addressee();
00237 }
00238
00239 delete dlg;
00240 return addressee;
00241 }
00242
00243 Addressee::List AddresseeDialog::getAddressees( QWidget *parent )
00244 {
00245 AddresseeDialog *dlg = new AddresseeDialog( parent, true );
00246 Addressee::List addressees;
00247 int result = dlg->exec();
00248 if ( result == QDialog::Accepted ) {
00249 addressees = dlg->addressees();
00250 }
00251
00252 delete dlg;
00253 return addressees;
00254 }
00255
00256 void AddresseeDialog::addressBookChanged()
00257 {
00258 loadAddressBook();
00259 }