kaddressbook Library API Documentation

kabcore.cpp

00001 /* 00002 This file is part of KAddressbook. 00003 Copyright (c) 2003 - 2004 Tobias Koenig <tokoe@kde.org> 00004 00005 This program is free software; you can redistribute it and/or modify 00006 it under the terms of the GNU General Public License as published by 00007 the Free Software Foundation; either version 2 of the License, or 00008 (at your option) any later version. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00018 00019 As a special exception, permission is given to link this program 00020 with any edition of Qt, and distribute the resulting executable, 00021 without including the source code for Qt in the source distribution. 00022 */ 00023 00024 #include <qclipboard.h> 00025 #include <qdir.h> 00026 #include <qfile.h> 00027 #include <qlayout.h> 00028 #include <qregexp.h> 00029 #include <qvbox.h> 00030 00031 #include <kabc/addresseelist.h> 00032 #include <kabc/errorhandler.h> 00033 #include <kabc/resource.h> 00034 #include <kabc/stdaddressbook.h> 00035 #include <kabc/vcardconverter.h> 00036 #include <kabc/resourcefile.h> 00037 #include <kaboutdata.h> 00038 #include <kaccelmanager.h> 00039 #include <kapplication.h> 00040 #include <dcopclient.h> 00041 #include <kactionclasses.h> 00042 #include <kcmdlineargs.h> 00043 #include <kcmultidialog.h> 00044 #include <kdebug.h> 00045 #include <kdeversion.h> 00046 #include <kimproxy.h> 00047 #include <klocale.h> 00048 #include <kmessagebox.h> 00049 #include <kprinter.h> 00050 #include <kprotocolinfo.h> 00051 #include <kresources/selectdialog.h> 00052 #include <kstandarddirs.h> 00053 #include <kstatusbar.h> 00054 #include <kstdguiitem.h> 00055 #include <ktempfile.h> 00056 #include <kxmlguiclient.h> 00057 #include <ktoolbar.h> 00058 #include <libkdepim/addresseeview.h> 00059 #include <libkdepim/categoryeditdialog.h> 00060 #include <libkdepim/categoryselectdialog.h> 00061 00062 #include "addresseeutil.h" 00063 #include "addresseeeditordialog.h" 00064 #include "extensionmanager.h" 00065 #include "filterselectionwidget.h" 00066 #include "incsearchwidget.h" 00067 #include "jumpbuttonbar.h" 00068 #include "kablock.h" 00069 #include "kabprefs.h" 00070 #include "kaddressbookservice.h" 00071 #include "kaddressbookiface.h" 00072 #include "ldapsearchdialog.h" 00073 #include "locationmap.h" 00074 #include "printing/printingwizard.h" 00075 #include "searchmanager.h" 00076 #include "undocmds.h" 00077 #include "viewmanager.h" 00078 #include "xxportmanager.h" 00079 00080 #include "kabcore.h" 00081 00082 KABCore::KABCore( KXMLGUIClient *client, bool readWrite, QWidget *parent, 00083 const QString &file, const char *name ) 00084 : KAB::Core( client, parent, name ), mStatusBar( 0 ), mViewManager( 0 ), 00085 mExtensionManager( 0 ), mCategorySelectDialog( 0 ), mCategoryEditDialog( 0 ), 00086 mLdapSearchDialog( 0 ), mReadWrite( readWrite ), mModified( false ) 00087 { 00088 mWidget = new QWidget( parent, name ); 00089 00090 mIsPart = !parent->isA( "KAddressBookMain" ); 00091 00092 if ( file.isEmpty() ) { 00093 mAddressBook = KABC::StdAddressBook::self( true ); 00094 } else { 00095 kdDebug(5720) << "KABCore(): document '" << file << "'" << endl; 00096 mAddressBook = new KABC::AddressBook; 00097 mAddressBook->addResource( new KABC::ResourceFile( file ) ); 00098 if ( !mAddressBook->load() ) { 00099 KMessageBox::error( parent, i18n("Unable to load '%1'.").arg( file ) ); 00100 } 00101 } 00102 mAddressBook->setErrorHandler( new KABC::GuiErrorHandler( mWidget ) ); 00103 00104 mAddressBook->addCustomField( i18n( "Department" ), KABC::Field::Organization, 00105 "X-Department", "KADDRESSBOOK" ); 00106 mAddressBook->addCustomField( i18n( "Profession" ), KABC::Field::Organization, 00107 "X-Profession", "KADDRESSBOOK" ); 00108 mAddressBook->addCustomField( i18n( "Assistant's Name" ), KABC::Field::Organization, 00109 "X-AssistantsName", "KADDRESSBOOK" ); 00110 mAddressBook->addCustomField( i18n( "Manager's Name" ), KABC::Field::Organization, 00111 "X-ManagersName", "KADDRESSBOOK" ); 00112 mAddressBook->addCustomField( i18n( "Spouse's Name" ), KABC::Field::Personal, 00113 "X-SpousesName", "KADDRESSBOOK" ); 00114 mAddressBook->addCustomField( i18n( "Office" ), KABC::Field::Personal, 00115 "X-Office", "KADDRESSBOOK" ); 00116 mAddressBook->addCustomField( i18n( "IM Address" ), KABC::Field::Personal, 00117 "X-IMAddress", "KADDRESSBOOK" ); 00118 mAddressBook->addCustomField( i18n( "Anniversary" ), KABC::Field::Personal, 00119 "X-Anniversary", "KADDRESSBOOK" ); 00120 00121 mSearchManager = new KAB::SearchManager( mAddressBook, parent ); 00122 00123 initGUI(); 00124 00125 connect( mAddressBook, SIGNAL( addressBookChanged( AddressBook* ) ), 00126 SLOT( addressBookChanged() ) ); 00127 connect( mAddressBook, SIGNAL( loadingFinished( Resource* ) ), 00128 SLOT( addressBookChanged() ) ); 00129 00130 mIncSearchWidget->setFocus(); 00131 00132 connect( mViewManager, SIGNAL( selected( const QString& ) ), 00133 SLOT( setContactSelected( const QString& ) ) ); 00134 connect( mViewManager, SIGNAL( executed( const QString& ) ), 00135 SLOT( editContact( const QString& ) ) ); 00136 connect( mViewManager, SIGNAL( modified() ), 00137 SLOT( setModified() ) ); 00138 connect( mViewManager, SIGNAL( urlDropped( const KURL& ) ), 00139 mXXPortManager, SLOT( importVCard( const KURL& ) ) ); 00140 connect( mExtensionManager, SIGNAL( modified( const KABC::Addressee::List& ) ), 00141 this, SLOT( extensionModified( const KABC::Addressee::List& ) ) ); 00142 00143 connect( mXXPortManager, SIGNAL( modified() ), 00144 SLOT( setModified() ) ); 00145 00146 connect( mJumpButtonBar, SIGNAL( jumpToLetter( const QStringList& ) ), 00147 SLOT( incrementalJumpButtonSearch( const QStringList& ) ) ); 00148 connect( mViewManager, SIGNAL( sortFieldChanged() ), 00149 mJumpButtonBar, SLOT( updateButtons() ) ); 00150 connect( mIncSearchWidget, SIGNAL( doReset() ), 00151 mJumpButtonBar, SLOT( reset() ) ); 00152 00153 connect( mDetails, SIGNAL( highlightedMessage( const QString& ) ), 00154 SLOT( detailsHighlighted( const QString& ) ) ); 00155 00156 mAddressBookService = new KAddressBookService( this ); 00157 00158 mSearchManager->reload(); 00159 00160 setModified( false ); 00161 00162 KAcceleratorManager::manage( mWidget ); 00163 00164 mKIMProxy = ::KIMProxy::instance( kapp->dcopClient() ); 00165 } 00166 00167 KABCore::~KABCore() 00168 { 00169 saveSettings(); 00170 KABPrefs::instance()->writeConfig(); 00171 00172 mAddressBook->disconnect(); 00173 00174 mAddressBook = 0; 00175 KABC::StdAddressBook::close(); 00176 mKIMProxy = 0; 00177 } 00178 00179 void KABCore::restoreSettings() 00180 { 00181 bool state = KABPrefs::instance()->mJumpButtonBarVisible; 00182 mActionJumpBar->setChecked( state ); 00183 setJumpButtonBarVisible( state ); 00184 00185 state = KABPrefs::instance()->mDetailsPageVisible; 00186 mActionDetails->setChecked( state ); 00187 setDetailsVisible( state ); 00188 00189 mViewManager->restoreSettings(); 00190 mExtensionManager->restoreSettings(); 00191 00192 mIncSearchWidget->setCurrentItem( KABPrefs::instance()->mCurrentIncSearchField ); 00193 00194 QValueList<int> splitterSize = KABPrefs::instance()->mExtensionsSplitter; 00195 if ( splitterSize.count() == 0 ) { 00196 splitterSize.append( mDetailsSplitter->height() / 2 ); 00197 splitterSize.append( mDetailsSplitter->height() / 2 ); 00198 } 00199 mExtensionBarSplitter->setSizes( splitterSize ); 00200 00201 splitterSize = KABPrefs::instance()->mDetailsSplitter; 00202 if ( splitterSize.count() == 0 ) { 00203 splitterSize.append( 360 ); 00204 splitterSize.append( 260 ); 00205 } 00206 mDetailsSplitter->setSizes( splitterSize ); 00207 00208 } 00209 00210 void KABCore::saveSettings() 00211 { 00212 KABPrefs::instance()->mJumpButtonBarVisible = mActionJumpBar->isChecked(); 00213 KABPrefs::instance()->mDetailsPageVisible = mActionDetails->isChecked(); 00214 00215 KABPrefs::instance()->mExtensionsSplitter = mExtensionBarSplitter->sizes(); 00216 KABPrefs::instance()->mDetailsSplitter = mDetailsSplitter->sizes(); 00217 00218 mExtensionManager->saveSettings(); 00219 mViewManager->saveSettings(); 00220 00221 KABPrefs::instance()->mCurrentIncSearchField = mIncSearchWidget->currentItem(); 00222 } 00223 00224 KABC::AddressBook *KABCore::addressBook() const 00225 { 00226 return mAddressBook; 00227 } 00228 00229 KConfig *KABCore::config() const 00230 { 00231 return KABPrefs::instance()->config(); 00232 } 00233 00234 KActionCollection *KABCore::actionCollection() const 00235 { 00236 return guiClient()->actionCollection(); 00237 } 00238 00239 KABC::Field *KABCore::currentSortField() const 00240 { 00241 return mViewManager->currentSortField(); 00242 } 00243 00244 QStringList KABCore::selectedUIDs() const 00245 { 00246 return mViewManager->selectedUids(); 00247 } 00248 00249 KABC::Resource *KABCore::requestResource( QWidget *parent ) 00250 { 00251 QPtrList<KABC::Resource> kabcResources = addressBook()->resources(); 00252 00253 QPtrList<KRES::Resource> kresResources; 00254 QPtrListIterator<KABC::Resource> resIt( kabcResources ); 00255 KABC::Resource *resource; 00256 while ( ( resource = resIt.current() ) != 0 ) { 00257 ++resIt; 00258 if ( !resource->readOnly() ) { 00259 KRES::Resource *res = static_cast<KRES::Resource*>( resource ); 00260 if ( res ) 00261 kresResources.append( res ); 00262 } 00263 } 00264 00265 KRES::Resource *res = KRES::SelectDialog::getResource( kresResources, parent ); 00266 return static_cast<KABC::Resource*>( res ); 00267 } 00268 00269 QWidget *KABCore::widget() const 00270 { 00271 return mWidget; 00272 } 00273 00274 KAboutData *KABCore::createAboutData() 00275 { 00276 KAboutData *about = new KAboutData( "kaddressbook", I18N_NOOP( "KAddressBook" ), 00277 "3.3", I18N_NOOP( "The KDE Address Book" ), 00278 KAboutData::License_GPL_V2, 00279 I18N_NOOP( "(c) 1997-2004, The KDE PIM Team" ) ); 00280 about->addAuthor( "Tobias Koenig", I18N_NOOP( "Current maintainer" ), "tokoe@kde.org" ); 00281 about->addAuthor( "Don Sanders", I18N_NOOP( "Original author" ) ); 00282 about->addAuthor( "Cornelius Schumacher", 00283 I18N_NOOP( "Co-maintainer, libkabc port, CSV import/export" ), 00284 "schumacher@kde.org" ); 00285 about->addAuthor( "Mike Pilone", I18N_NOOP( "GUI and framework redesign" ), 00286 "mpilone@slac.com" ); 00287 about->addAuthor( "Greg Stern", I18N_NOOP( "DCOP interface" ) ); 00288 about->addAuthor( "Mark Westcott", I18N_NOOP( "Contact pinning" ) ); 00289 about->addAuthor( "Mischel Boyer de la Giroday", I18N_NOOP( "LDAP Lookup" ), 00290 "michel@klaralvdalens-datakonsult.se" ); 00291 about->addAuthor( "Steffen Hansen", I18N_NOOP( "LDAP Lookup" ), 00292 "hansen@kde.org" ); 00293 00294 return about; 00295 } 00296 00297 void KABCore::setStatusBar( KStatusBar *statusBar ) 00298 { 00299 mStatusBar = statusBar; 00300 } 00301 00302 KStatusBar *KABCore::statusBar() const 00303 { 00304 return mStatusBar; 00305 } 00306 00307 void KABCore::setContactSelected( const QString &uid ) 00308 { 00309 KABC::Addressee addr = mAddressBook->findByUid( uid ); 00310 if ( !mDetails->isHidden() ) 00311 mDetails->setAddressee( addr ); 00312 00313 mExtensionManager->setSelectionChanged(); 00314 00315 // update the actions 00316 bool selected = !uid.isEmpty(); 00317 00318 if ( mReadWrite ) { 00319 mActionCut->setEnabled( selected ); 00320 mActionPaste->setEnabled( selected ); 00321 } 00322 00323 mActionCopy->setEnabled( selected ); 00324 mActionDelete->setEnabled( selected ); 00325 mActionEditAddressee->setEnabled( selected ); 00326 mActionMail->setEnabled( selected ); 00327 mActionMailVCard->setEnabled( selected ); 00328 mActionChat->setEnabled( selected ); 00329 mActionWhoAmI->setEnabled( selected ); 00330 mActionCategories->setEnabled( selected ); 00331 mActionMerge->setEnabled( selected ); 00332 } 00333 00334 void KABCore::sendMail() 00335 { 00336 sendMail( mViewManager->selectedEmails().join( ", " ) ); 00337 } 00338 00339 void KABCore::sendMail( const QString& email ) 00340 { 00341 kapp->invokeMailer( email, "" ); 00342 } 00343 00344 void KABCore::mailVCard() 00345 { 00346 QStringList uids = mViewManager->selectedUids(); 00347 if ( !uids.isEmpty() ) 00348 mailVCard( uids ); 00349 } 00350 00351 void KABCore::mailVCard( const QStringList& uids ) 00352 { 00353 //QStringList urls; 00354 KURL::List urls; 00355 00356 // Create a temp dir, so that we can put the files in it with proper names 00357 KTempFile tempDir; 00358 if ( tempDir.status() != 0 ) { 00359 kdWarning() << strerror( tempDir.status() ) << endl; 00360 return; 00361 } 00362 00363 QString dirName = tempDir.name(); 00364 tempDir.unlink(); 00365 QDir().mkdir( dirName, true ); 00366 00367 for( QStringList::ConstIterator it = uids.begin(); it != uids.end(); ++it ) { 00368 KABC::Addressee a = mAddressBook->findByUid( *it ); 00369 00370 if ( a.isEmpty() ) 00371 continue; 00372 00373 QString name = a.givenName().utf8() + "_" + a.familyName().utf8() + ".vcf"; 00374 00375 QString fileName = dirName + "/" + name; 00376 00377 QFile outFile(fileName); 00378 if ( outFile.open( IO_WriteOnly ) ) { // file opened successfully 00379 KABC::VCardConverter converter; 00380 KABC::Addressee::List list; 00381 list.append( a ); 00382 QString vcard = converter.createVCards( list, KABC::VCardConverter::v3_0 ); 00383 00384 QTextStream t( &outFile ); // use a text stream 00385 t.setEncoding( QTextStream::UnicodeUTF8 ); 00386 t << vcard; 00387 00388 outFile.close(); 00389 00390 KURL url( fileName ); 00391 url.setFileEncoding( "UTF-8" ); 00392 urls.append( url ); 00393 } 00394 } 00395 kapp->invokeMailer( QString::null, QString::null, QString::null, 00396 QString::null, // subject 00397 QString::null, // body 00398 QString::null, 00399 urls.toStringList() ); // attachments 00400 } 00401 00402 void KABCore::startChat() 00403 { 00404 QStringList uids = mViewManager->selectedUids(); 00405 if ( !uids.isEmpty() ) 00406 mKIMProxy->chatWithContact( uids.first() ); 00407 } 00408 00409 void KABCore::browse( const QString& url ) 00410 { 00411 kapp->invokeBrowser( url ); 00412 } 00413 00414 void KABCore::selectAllContacts() 00415 { 00416 mViewManager->setSelected( QString::null, true ); 00417 } 00418 00419 void KABCore::deleteContacts() 00420 { 00421 QStringList uidList = mViewManager->selectedUids(); 00422 00423 deleteContacts( uidList ); 00424 } 00425 00426 void KABCore::deleteContacts( const QStringList &uids ) 00427 { 00428 if ( uids.count() > 0 ) { 00429 QStringList names; 00430 QStringList::ConstIterator it = uids.begin(); 00431 while ( it != uids.end() ) { 00432 KABC::Addressee addr = mAddressBook->findByUid( *it ); 00433 names.append( addr.realName().isEmpty() ? addr.preferredEmail() : addr.realName() ); 00434 ++it; 00435 } 00436 00437 if ( KMessageBox::warningContinueCancelList( mWidget, i18n( "Do you really want to delete these contacts?" ), 00438 names, "", KGuiItem( i18n("&Delete"), "editdelete") ) == KMessageBox::Cancel ) 00439 return; 00440 00441 PwDeleteCommand *command = new PwDeleteCommand( mAddressBook, uids ); 00442 UndoStack::instance()->push( command ); 00443 RedoStack::instance()->clear(); 00444 00445 // now if we deleted anything, refresh 00446 setContactSelected( QString::null ); 00447 setModified( true ); 00448 } 00449 } 00450 00451 void KABCore::copyContacts() 00452 { 00453 KABC::Addressee::List addrList = mViewManager->selectedAddressees(); 00454 00455 QString clipText = AddresseeUtil::addresseesToClipboard( addrList ); 00456 00457 kdDebug(5720) << "KABCore::copyContacts: " << clipText << endl; 00458 00459 QClipboard *cb = QApplication::clipboard(); 00460 cb->setText( clipText ); 00461 } 00462 00463 void KABCore::cutContacts() 00464 { 00465 QStringList uidList = mViewManager->selectedUids(); 00466 00467 if ( uidList.size() > 0 ) { 00468 PwCutCommand *command = new PwCutCommand( mAddressBook, uidList ); 00469 UndoStack::instance()->push( command ); 00470 RedoStack::instance()->clear(); 00471 00472 setModified( true ); 00473 } 00474 } 00475 00476 void KABCore::pasteContacts() 00477 { 00478 QClipboard *cb = QApplication::clipboard(); 00479 00480 KABC::Addressee::List list = AddresseeUtil::clipboardToAddressees( cb->text() ); 00481 00482 pasteContacts( list ); 00483 } 00484 00485 void KABCore::pasteContacts( KABC::Addressee::List &list ) 00486 { 00487 KABC::Resource *resource = requestResource( mWidget ); 00488 KABC::Addressee::List::Iterator it; 00489 for ( it = list.begin(); it != list.end(); ++it ) 00490 (*it).setResource( resource ); 00491 00492 PwPasteCommand *command = new PwPasteCommand( this, list ); 00493 UndoStack::instance()->push( command ); 00494 RedoStack::instance()->clear(); 00495 00496 setModified( true ); 00497 } 00498 00499 void KABCore::mergeContacts() 00500 { 00501 KABC::Addressee::List list = mViewManager->selectedAddressees(); 00502 if ( list.count() < 2 ) 00503 return; 00504 00505 KABC::Addressee addr = mergeContacts( list ); 00506 00507 KABC::Addressee::List::Iterator it = list.begin(); 00508 ++it; 00509 while ( it != list.end() ) { 00510 mAddressBook->removeAddressee( *it ); 00511 ++it; 00512 } 00513 00514 mAddressBook->insertAddressee( addr ); 00515 00516 mSearchManager->reload(); 00517 } 00518 00519 void KABCore::setWhoAmI() 00520 { 00521 KABC::Addressee::List addrList = mViewManager->selectedAddressees(); 00522 00523 if ( addrList.count() > 1 ) { 00524 KMessageBox::sorry( mWidget, i18n( "Please select only one contact." ) ); 00525 return; 00526 } 00527 00528 QString text( i18n( "<qt>Do you really want to use <b>%1</b> as your new personal contact?</qt>" ) ); 00529 if ( KMessageBox::questionYesNo( mWidget, text.arg( addrList[ 0 ].assembledName() ) ) == KMessageBox::Yes ) 00530 static_cast<KABC::StdAddressBook*>( KABC::StdAddressBook::self( true ) )->setWhoAmI( addrList[ 0 ] ); 00531 } 00532 00533 void KABCore::incrementalTextSearch( const QString& text ) 00534 { 00535 setContactSelected( QString::null ); 00536 mSearchManager->search( text, mIncSearchWidget->currentField() ); 00537 } 00538 00539 void KABCore::incrementalJumpButtonSearch( const QStringList& characters ) 00540 { 00541 setContactSelected( QString::null ); 00542 mSearchManager->setJumpButtonFilter( characters, mViewManager->currentSortField() ); 00543 } 00544 00545 void KABCore::setModified() 00546 { 00547 setModified( true ); 00548 } 00549 00550 void KABCore::setModified( bool modified ) 00551 { 00552 mModified = modified; 00553 mActionSave->setEnabled( mModified ); 00554 00555 mSearchManager->reload(); 00556 } 00557 00558 bool KABCore::modified() const 00559 { 00560 return mModified; 00561 } 00562 00563 void KABCore::contactModified( const KABC::Addressee &addr ) 00564 { 00565 Command *command = 0; 00566 QString uid; 00567 00568 // check if it exists already 00569 KABC::Addressee origAddr = mAddressBook->findByUid( addr.uid() ); 00570 if ( origAddr.isEmpty() ) 00571 command = new PwNewCommand( mAddressBook, addr ); 00572 else { 00573 command = new PwEditCommand( mAddressBook, origAddr, addr ); 00574 uid = addr.uid(); 00575 } 00576 00577 UndoStack::instance()->push( command ); 00578 RedoStack::instance()->clear(); 00579 00580 setContactSelected( addr.uid() ); 00581 setModified( true ); 00582 } 00583 00584 void KABCore::newContact() 00585 { 00586 AddresseeEditorDialog *dialog = 0; 00587 00588 QPtrList<KABC::Resource> kabcResources = mAddressBook->resources(); 00589 00590 QPtrList<KRES::Resource> kresResources; 00591 QPtrListIterator<KABC::Resource> it( kabcResources ); 00592 KABC::Resource *resource; 00593 while ( ( resource = it.current() ) != 0 ) { 00594 ++it; 00595 if ( !resource->readOnly() ) { 00596 KRES::Resource *res = static_cast<KRES::Resource*>( resource ); 00597 if ( res ) 00598 kresResources.append( res ); 00599 } 00600 } 00601 00602 KRES::Resource *res = KRES::SelectDialog::getResource( kresResources, mWidget ); 00603 resource = static_cast<KABC::Resource*>( res ); 00604 00605 if ( resource ) { 00606 KABC::Addressee addr; 00607 addr.setResource( resource ); 00608 00609 if ( !KABLock::self( mAddressBook )->lock( addr.resource() ) ) 00610 return; 00611 00612 dialog = createAddresseeEditorDialog( mWidget ); 00613 dialog->setAddressee( addr ); 00614 } else 00615 return; 00616 00617 mEditorDict.insert( dialog->addressee().uid(), dialog ); 00618 00619 dialog->show(); 00620 } 00621 00622 void KABCore::addEmail( const QString &aStr ) 00623 { 00624 QString fullName, email; 00625 00626 KABC::Addressee::parseEmailAddress( aStr, fullName, email ); 00627 00628 // Try to lookup the addressee matching the email address 00629 bool found = false; 00630 QStringList emailList; 00631 KABC::AddressBook::Iterator it; 00632 for ( it = mAddressBook->begin(); !found && (it != mAddressBook->end()); ++it ) { 00633 emailList = (*it).emails(); 00634 if ( emailList.contains( email ) > 0 ) { 00635 found = true; 00636 (*it).setNameFromString( fullName ); 00637 editContact( (*it).uid() ); 00638 } 00639 } 00640 00641 if ( !found ) { 00642 KABC::Addressee addr; 00643 addr.setNameFromString( fullName ); 00644 addr.insertEmail( email, true ); 00645 00646 mAddressBook->insertAddressee( addr ); 00647 mViewManager->refreshView( addr.uid() ); 00648 editContact( addr.uid() ); 00649 } 00650 } 00651 00652 void KABCore::importVCard( const KURL &url ) 00653 { 00654 mXXPortManager->importVCard( url ); 00655 } 00656 00657 void KABCore::importVCard( const QString &vCardURL ) 00658 { 00659 mXXPortManager->importVCard( vCardURL ); 00660 } 00661 00662 void KABCore::editContact( const QString &uid ) 00663 { 00664 if ( mExtensionManager->isQuickEditVisible() ) 00665 return; 00666 00667 // First, locate the contact entry 00668 QString localUID = uid; 00669 if ( localUID.isNull() ) { 00670 QStringList uidList = mViewManager->selectedUids(); 00671 if ( uidList.count() > 0 ) 00672 localUID = *( uidList.at( 0 ) ); 00673 } 00674 00675 KABC::Addressee addr = mAddressBook->findByUid( localUID ); 00676 if ( !addr.isEmpty() ) { 00677 AddresseeEditorDialog *dialog = mEditorDict.find( addr.uid() ); 00678 if ( !dialog ) { 00679 00680 if ( !addr.resource()->readOnly() ) 00681 if ( !KABLock::self( mAddressBook )->lock( addr.resource() ) ) 00682 return; 00683 00684 dialog = createAddresseeEditorDialog( mWidget ); 00685 00686 mEditorDict.insert( addr.uid(), dialog ); 00687 00688 dialog->setAddressee( addr ); 00689 } 00690 00691 dialog->raise(); 00692 dialog->show(); 00693 } 00694 } 00695 00696 void KABCore::save() 00697 { 00698 KABC::StdAddressBook *b = dynamic_cast<KABC::StdAddressBook*>( mAddressBook ); 00699 if ( b ) { 00700 if ( !b->save() ) { 00701 QString text = i18n( "There was an error while attempting to save the " 00702 "address book. Please check that no other application " 00703 "is using it." ); 00704 00705 KMessageBox::error( mWidget, text, i18n( "Unable to Save" ) ); 00706 } else { 00707 setModified( false ); 00708 } 00709 } else { 00710 // FIXME: Handle locking properly, i.e. get the ticket before doing the 00711 // first change to the addressbook and don't give up the ticket in case of a 00712 // save error without asking the user. 00713 KABC::Ticket *ticket = mAddressBook->requestSaveTicket(); 00714 if ( ticket ) { 00715 if ( !mAddressBook->save( ticket ) ) { 00716 KMessageBox::error( mWidget, i18n("Error saving address book.") ); 00717 mAddressBook->releaseSaveTicket( ticket ); 00718 } else { 00719 setModified( false ); 00720 } 00721 } else { 00722 KMessageBox::error( mWidget, 00723 i18n("Unable to get access for saving the address " 00724 "book.") ); 00725 } 00726 } 00727 } 00728 00729 void KABCore::undo() 00730 { 00731 UndoStack::instance()->undo(); 00732 00733 // Refresh the view 00734 mViewManager->refreshView(); 00735 } 00736 00737 void KABCore::redo() 00738 { 00739 RedoStack::instance()->redo(); 00740 00741 // Refresh the view 00742 mViewManager->refreshView(); 00743 } 00744 00745 void KABCore::setJumpButtonBarVisible( bool visible ) 00746 { 00747 if ( visible ) 00748 mJumpButtonBar->show(); 00749 else 00750 mJumpButtonBar->hide(); 00751 } 00752 00753 void KABCore::setDetailsVisible( bool visible ) 00754 { 00755 if ( visible ) 00756 mDetailsPage->show(); 00757 else 00758 mDetailsPage->hide(); 00759 } 00760 00761 void KABCore::extensionModified( const KABC::Addressee::List &list ) 00762 { 00763 if ( list.count() != 0 ) { 00764 KABC::Addressee::List::ConstIterator it; 00765 for ( it = list.begin(); it != list.end(); ++it ) { 00766 Command *command = 0; 00767 00768 // check if it exists already 00769 KABC::Addressee origAddr = mAddressBook->findByUid( (*it).uid() ); 00770 if ( origAddr.isEmpty() ) 00771 command = new PwNewCommand( mAddressBook, *it ); 00772 else 00773 command = new PwEditCommand( mAddressBook, origAddr, *it ); 00774 00775 UndoStack::instance()->push( command ); 00776 RedoStack::instance()->clear(); 00777 } 00778 00779 setModified( true ); 00780 } 00781 00782 if ( list.count() == 0 ) 00783 mViewManager->refreshView(); 00784 else 00785 mViewManager->refreshView( list[ 0 ].uid() ); 00786 } 00787 00788 QString KABCore::getNameByPhone( const QString &phone ) 00789 { 00790 QRegExp r( "[/*/-/ ]" ); 00791 QString localPhone( phone ); 00792 00793 bool found = false; 00794 QString ownerName = ""; 00795 KABC::AddressBook::Iterator iter; 00796 KABC::PhoneNumber::List::Iterator phoneIter; 00797 KABC::PhoneNumber::List phoneList; 00798 for ( iter = mAddressBook->begin(); !found && ( iter != mAddressBook->end() ); ++iter ) { 00799 phoneList = (*iter).phoneNumbers(); 00800 for ( phoneIter = phoneList.begin(); !found && ( phoneIter != phoneList.end() ); 00801 ++phoneIter) { 00802 // Get rid of separator chars so just the numbers are compared. 00803 if ( (*phoneIter).number().replace( r, "" ) == localPhone.replace( r, "" ) ) { 00804 ownerName = (*iter).realName(); 00805 found = true; 00806 } 00807 } 00808 } 00809 00810 return ownerName; 00811 } 00812 00813 void KABCore::openLDAPDialog() 00814 { 00815 if ( !KProtocolInfo::isKnownProtocol( KURL( "ldap://localhost" ) ) ) { 00816 KMessageBox::error( mWidget, i18n( "Your KDE installation is missing LDAP " 00817 "support, please ask your administrator or distributor for more information." ), 00818 i18n( "No LDAP IO slave available" ) ); 00819 return; 00820 } 00821 00822 if ( !mLdapSearchDialog ) { 00823 mLdapSearchDialog = new LDAPSearchDialog( mAddressBook, mWidget ); 00824 connect( mLdapSearchDialog, SIGNAL( addresseesAdded() ), mSearchManager, 00825 SLOT( addressBookChanged() ) ); 00826 connect( mLdapSearchDialog, SIGNAL( addresseesAdded() ), 00827 SLOT( setModified() ) ); 00828 } else 00829 mLdapSearchDialog->restoreSettings(); 00830 00831 if ( mLdapSearchDialog->isOK() ) 00832 mLdapSearchDialog->exec(); 00833 } 00834 00835 void KABCore::configure() 00836 { 00837 // Save the current config so we do not loose anything if the user accepts 00838 saveSettings(); 00839 00840 KCMultiDialog dlg( mWidget, "", true ); 00841 connect( &dlg, SIGNAL( configCommitted() ), 00842 this, SLOT( configurationChanged() ) ); 00843 00844 dlg.addModule( "kabconfig.desktop" ); 00845 dlg.addModule( "kabldapconfig.desktop" ); 00846 dlg.addModule( "kabcustomfields.desktop" ); 00847 00848 dlg.exec(); 00849 } 00850 00851 void KABCore::print() 00852 { 00853 KPrinter printer; 00854 if ( !printer.setup( mWidget, i18n("Print Addresses") ) ) 00855 return; 00856 00857 KABPrinting::PrintingWizard wizard( &printer, mAddressBook, 00858 mViewManager->selectedUids(), mWidget ); 00859 00860 wizard.exec(); 00861 } 00862 00863 void KABCore::detailsHighlighted( const QString &msg ) 00864 { 00865 if ( mStatusBar ) 00866 mStatusBar->changeItem( msg, 1 ); 00867 } 00868 00869 void KABCore::showContactsAddress( const QString &addrUid ) 00870 { 00871 QStringList uidList = mViewManager->selectedUids(); 00872 if ( uidList.isEmpty() ) 00873 return; 00874 00875 KABC::Addressee addr = mAddressBook->findByUid( uidList.first() ); 00876 if ( addr.isEmpty() ) 00877 return; 00878 00879 KABC::Address::List list = addr.addresses(); 00880 KABC::Address::List::Iterator it; 00881 for ( it = list.begin(); it != list.end(); ++it ) 00882 if ( (*it).id() == addrUid ) { 00883 LocationMap::instance()->showAddress( *it ); 00884 break; 00885 } 00886 } 00887 00888 void KABCore::configurationChanged() 00889 { 00890 mExtensionManager->reconfigure(); 00891 mSearchManager->reconfigure(); 00892 mViewManager->refreshView(); 00893 } 00894 00895 void KABCore::addressBookChanged() 00896 { 00897 mJumpButtonBar->updateButtons(); 00898 mSearchManager->reload(); 00899 } 00900 00901 AddresseeEditorDialog *KABCore::createAddresseeEditorDialog( QWidget *parent, 00902 const char *name ) 00903 { 00904 AddresseeEditorDialog *dialog = new AddresseeEditorDialog( this, parent, 00905 name ? name : "editorDialog" ); 00906 connect( dialog, SIGNAL( contactModified( const KABC::Addressee& ) ), 00907 SLOT( contactModified( const KABC::Addressee& ) ) ); 00908 connect( dialog, SIGNAL( editorDestroyed( const QString& ) ), 00909 SLOT( slotEditorDestroyed( const QString& ) ) ); 00910 00911 return dialog; 00912 } 00913 00914 void KABCore::slotEditorDestroyed( const QString &uid ) 00915 { 00916 mEditorDict.remove( uid ); 00917 00918 KABC::Addressee addr = mAddressBook->findByUid( uid ); 00919 00920 QApplication::setOverrideCursor( Qt::waitCursor ); 00921 00922 KABLock::self( mAddressBook )->unlock( addr.resource() ); 00923 00924 QApplication::restoreOverrideCursor(); 00925 } 00926 00927 void KABCore::initGUI() 00928 { 00929 QVBoxLayout *topLayout = new QVBoxLayout( mWidget, 0, 0 ); 00930 KToolBar* searchTB = new KToolBar( mWidget, "search toolbar"); 00931 searchTB->boxLayout()->setSpacing( KDialog::spacingHint() ); 00932 mIncSearchWidget = new IncSearchWidget( searchTB, "kde toolbar widget"); 00933 searchTB->setStretchableWidget( mIncSearchWidget ); 00934 connect( mIncSearchWidget, SIGNAL( doSearch( const QString& ) ), 00935 SLOT( incrementalTextSearch( const QString& ) ) ); 00936 00937 mFilterSelectionWidget = new FilterSelectionWidget( searchTB , "kde toolbar widget" ); 00938 00939 QHBoxLayout *hbox = new QHBoxLayout( mWidget, 0, 0 ); 00940 00941 mDetailsSplitter = new QSplitter( mWidget ); 00942 hbox->addWidget( mDetailsSplitter ); 00943 00944 topLayout->addWidget( searchTB ); 00945 topLayout->addWidget( mDetailsSplitter ); 00946 00947 mExtensionBarSplitter = new QSplitter( mDetailsSplitter ); 00948 mExtensionBarSplitter->setOrientation( Qt::Vertical ); 00949 00950 QWidget *detailsWidget = new QWidget( mDetailsSplitter ); 00951 QHBoxLayout *detailsLayout = new QHBoxLayout( detailsWidget ); 00952 00953 mDetailsPage = new QWidget( detailsWidget ); 00954 detailsLayout->addWidget( mDetailsPage ); 00955 00956 QHBoxLayout *detailsPageLayout = new QHBoxLayout( mDetailsPage, 0, 0 ); 00957 mDetails = new KPIM::AddresseeView( mDetailsPage ); 00958 detailsPageLayout->addWidget( mDetails ); 00959 00960 connect( mDetails, SIGNAL( addressClicked( const QString&) ), 00961 this, SLOT( showContactsAddress( const QString& ) ) ); 00962 00963 mViewManager = new ViewManager( this, mExtensionBarSplitter ); 00964 mViewManager->setFilterSelectionWidget( mFilterSelectionWidget ); 00965 00966 connect( mFilterSelectionWidget, SIGNAL( filterActivated( int ) ), 00967 mViewManager, SLOT( setActiveFilter( int ) ) ); 00968 00969 mExtensionManager = new ExtensionManager( this, mExtensionBarSplitter ); 00970 00971 mJumpButtonBar = new JumpButtonBar( this, detailsWidget ); 00972 detailsLayout->addWidget( mJumpButtonBar ); 00973 detailsLayout->setStretchFactor( mJumpButtonBar, 1 ); 00974 00975 topLayout->setStretchFactor( hbox, 1 ); 00976 00977 mXXPortManager = new XXPortManager( this, mWidget ); 00978 00979 initActions(); 00980 } 00981 00982 void KABCore::initActions() 00983 { 00984 connect( QApplication::clipboard(), SIGNAL( dataChanged() ), 00985 SLOT( clipboardDataChanged() ) ); 00986 00987 KAction *action; 00988 00989 // file menu 00990 mActionMail = new KAction( i18n( "&Send Email to Contact..." ), "mail_send", 0, 00991 this, SLOT( sendMail() ), actionCollection(), "file_mail" ); 00992 action = KStdAction::print( this, SLOT( print() ), actionCollection() ); 00993 mActionMail->setWhatsThis( i18n( "Send a mail to all selected contacts." ) ); 00994 action->setWhatsThis( i18n( "Print a special number of contacts." ) ); 00995 00996 mActionSave = KStdAction::save( this, 00997 SLOT( save() ), actionCollection(), "file_sync" ); 00998 mActionSave->setWhatsThis( i18n( "Save all changes of the address book to the storage backend." ) ); 00999 01000 action = new KAction( i18n( "&New Contact..." ), "identity", CTRL+Key_N, this, 01001 SLOT( newContact() ), actionCollection(), "file_new_contact" ); 01002 action->setWhatsThis( i18n( "Create a new contact<p>You will be presented with a dialog where you can add all data about a person, including addresses and phone numbers." ) ); 01003 01004 mActionMailVCard = new KAction( i18n("Send &Contact..."), "mail_post_to", 0, 01005 this, SLOT( mailVCard() ), 01006 actionCollection(), "file_mail_vcard" ); 01007 mActionMailVCard->setWhatsThis( i18n( "Send a mail with the selected contact as attachment." ) ); 01008 01009 mActionChat = new KAction( i18n("Chat &With..."), 0, 01010 this, SLOT( startChat() ), 01011 actionCollection(), "file_chat" ); 01012 mActionChat->setWhatsThis( i18n( "Start a chat with the selected contact." ) ); 01013 01014 mActionEditAddressee = new KAction( i18n( "&Edit Contact..." ), "edit", 0, 01015 this, SLOT( editContact() ), 01016 actionCollection(), "file_properties" ); 01017 mActionEditAddressee->setWhatsThis( i18n( "Edit a contact<p>You will be presented with a dialog where you can change all data about a person, including addresses and phone numbers." ) ); 01018 01019 mActionMerge = new KAction( i18n( "&Merge Contacts" ), "", 0, 01020 this, SLOT( mergeContacts() ), 01021 actionCollection(), "edit_merge" ); 01022 01023 // edit menu 01024 mActionCopy = KStdAction::copy( this, SLOT( copyContacts() ), actionCollection() ); 01025 mActionCut = KStdAction::cut( this, SLOT( cutContacts() ), actionCollection() ); 01026 mActionPaste = KStdAction::paste( this, SLOT( pasteContacts() ), actionCollection() ); 01027 action = KStdAction::selectAll( this, SLOT( selectAllContacts() ), actionCollection() ); 01028 mActionUndo = KStdAction::undo( this, SLOT( undo() ), actionCollection() ); 01029 mActionRedo = KStdAction::redo( this, SLOT( redo() ), actionCollection() ); 01030 mActionCopy->setWhatsThis( i18n( "Copy the currently selected contact(s) to system clipboard in vCard format." ) ); 01031 mActionCut->setWhatsThis( i18n( "Cuts the currently selected contact(s) to system clipboard in vCard format." ) ); 01032 mActionPaste->setWhatsThis( i18n( "Paste the previously cut or copied contacts from clipboard." ) ); 01033 action->setWhatsThis( i18n( "Selects all visible contacts from current view." ) ); 01034 mActionUndo->setWhatsThis( i18n( "Undoes the last <b>Cut</b>, <b>Copy</b> or <b>Paste</b>." ) ); 01035 mActionRedo->setWhatsThis( i18n( "Redoes the last <b>Cut</b>, <b>Copy</b> or <b>Paste</b>." ) ); 01036 01037 mActionDelete = new KAction( i18n( "&Delete Contact" ), "editdelete", 01038 Key_Delete, this, SLOT( deleteContacts() ), 01039 actionCollection(), "edit_delete" ); 01040 mActionDelete->setWhatsThis( i18n( "Delete all selected contacts." ) ); 01041 01042 mActionUndo->setEnabled( false ); 01043 mActionRedo->setEnabled( false ); 01044 01045 // settings menu 01046 mActionJumpBar = new KToggleAction( i18n( "Show Jump Bar" ), "next", 0, 01047 actionCollection(), "options_show_jump_bar" ); 01048 mActionJumpBar->setWhatsThis( i18n( "Toggle whether the jump button bar shall be visible." ) ); 01049 connect( mActionJumpBar, SIGNAL( toggled( bool ) ), SLOT( setJumpButtonBarVisible( bool ) ) ); 01050 01051 mActionDetails = new KToggleAction( i18n( "Show Details" ), 0, 0, 01052 actionCollection(), "options_show_details" ); 01053 mActionDetails->setWhatsThis( i18n( "Toggle whether the details page shall be visible." ) ); 01054 connect( mActionDetails, SIGNAL( toggled( bool ) ), SLOT( setDetailsVisible( bool ) ) ); 01055 01056 #if KDE_IS_VERSION(3,2,90) 01057 mActionJumpBar->setCheckedState( i18n( "Hide Jump Bar") ); 01058 mActionDetails->setCheckedState( i18n( "Hide Details") ); 01059 #endif 01060 01061 if ( mIsPart ) 01062 action = new KAction( i18n( "&Configure KAddressBook..." ), "configure", 0, 01063 this, SLOT( configure() ), actionCollection(), 01064 "kaddressbook_configure" ); 01065 else 01066 action = KStdAction::preferences( this, SLOT( configure() ), actionCollection() ); 01067 01068 action->setWhatsThis( i18n( "You will be presented with a dialog, that offers you all possibilities to configure KAddressBook." ) ); 01069 01070 // misc 01071 action = new KAction( i18n( "&Lookup Addresses in LDAP Directory..." ), "find", 0, 01072 this, SLOT( openLDAPDialog() ), actionCollection(), "ldap_lookup" ); 01073 action->setWhatsThis( i18n( "Search for contacts on a LDAP server<p>You will be presented with a dialog, where you can search for contacts and select the ones you want to add to your local address book." ) ); 01074 01075 mActionWhoAmI = new KAction( i18n( "Set as Personal Contact Data" ), "personal", 0, this, 01076 SLOT( setWhoAmI() ), actionCollection(), 01077 "edit_set_personal" ); 01078 mActionWhoAmI->setWhatsThis( i18n( "Set the personal contact<p>The data of this contact will be used in many other KDE applications, so you do not have to input your personal data several times." ) ); 01079 01080 mActionCategories = new KAction( i18n( "Select Categories..." ), 0, this, 01081 SLOT( setCategories() ), actionCollection(), 01082 "edit_set_categories" ); 01083 mActionCategories->setWhatsThis( i18n( "Set the categories for all selected contacts." ) ); 01084 01085 clipboardDataChanged(); 01086 01087 connect( UndoStack::instance(), SIGNAL( changed() ), SLOT( updateActionMenu() ) ); 01088 connect( RedoStack::instance(), SIGNAL( changed() ), SLOT( updateActionMenu() ) ); 01089 } 01090 01091 void KABCore::clipboardDataChanged() 01092 { 01093 if ( mReadWrite ) 01094 mActionPaste->setEnabled( !QApplication::clipboard()->text().isEmpty() ); 01095 } 01096 01097 void KABCore::updateActionMenu() 01098 { 01099 UndoStack *undo = UndoStack::instance(); 01100 RedoStack *redo = RedoStack::instance(); 01101 01102 if ( undo->isEmpty() ) 01103 mActionUndo->setText( i18n( "Undo" ) ); 01104 else 01105 mActionUndo->setText( i18n( "Undo %1" ).arg( undo->top()->name() ) ); 01106 01107 mActionUndo->setEnabled( !undo->isEmpty() ); 01108 01109 if ( !redo->top() ) 01110 mActionRedo->setText( i18n( "Redo" ) ); 01111 else 01112 mActionRedo->setText( i18n( "Redo %1" ).arg( redo->top()->name() ) ); 01113 01114 mActionRedo->setEnabled( !redo->isEmpty() ); 01115 } 01116 01117 KABC::Addressee KABCore::mergeContacts( const KABC::Addressee::List &list ) 01118 { 01119 if ( list.count() == 0 ) //emtpy 01120 return KABC::Addressee(); 01121 else if ( list.count() == 1 ) // nothing to merge 01122 return list.first(); 01123 01124 KABC::Addressee masterAddressee = list.first(); 01125 01126 KABC::Addressee::List::ConstIterator contactIt = list.begin(); 01127 for ( ++contactIt; contactIt != list.end(); ++contactIt ) { 01128 // ADR + LABEL 01129 KABC::Address::List addresses = (*contactIt).addresses(); 01130 KABC::Address::List masterAddresses = masterAddressee.addresses(); 01131 KABC::Address::List::Iterator addrIt ; 01132 for ( addrIt = addresses.begin(); addrIt != addresses.end(); ++addrIt ) { 01133 if ( !masterAddresses.contains( *addrIt ) ) 01134 masterAddressee.insertAddress( *addrIt ); 01135 } 01136 01137 if ( masterAddressee.birthday().isNull() && !(*contactIt).birthday().isNull() ) 01138 masterAddressee.setBirthday( (*contactIt).birthday() ); 01139 01140 01141 // CATEGORIES 01142 QStringList::Iterator it; 01143 QStringList categories = (*contactIt).categories(); 01144 QStringList masterCategories = masterAddressee.categories(); 01145 QStringList newCategories( masterCategories ); 01146 for ( it = categories.begin(); it != categories.end(); ++it ) 01147 if ( !masterCategories.contains( *it ) ) 01148 newCategories.append( *it ); 01149 masterAddressee.setCategories( newCategories ); 01150 01151 // CLASS 01152 if ( !masterAddressee.secrecy().isValid() && (*contactIt).secrecy().isValid() ) 01153 masterAddressee.setSecrecy( (*contactIt).secrecy() ); 01154 01155 // EMAIL 01156 QStringList emails = (*contactIt).emails(); 01157 QStringList masterEmails = masterAddressee.emails(); 01158 for ( it = emails.begin(); it != emails.end(); ++it ) 01159 if ( !masterEmails.contains( *it ) ) 01160 masterAddressee.insertEmail( *it, false ); 01161 01162 // FN 01163 if ( masterAddressee.formattedName().isEmpty() && !(*contactIt).formattedName().isEmpty() ) 01164 masterAddressee.setFormattedName( (*contactIt).formattedName() ); 01165 01166 // GEO 01167 if ( !masterAddressee.geo().isValid() && (*contactIt).geo().isValid() ) 01168 masterAddressee.setGeo( (*contactIt).geo() ); 01169 01170 /* 01171 // KEY 01172 // LOGO 01173 */ 01174 01175 // MAILER 01176 if ( masterAddressee.mailer().isEmpty() && !(*contactIt).mailer().isEmpty() ) 01177 masterAddressee.setMailer( (*contactIt).mailer() ); 01178 01179 // N 01180 if ( masterAddressee.assembledName().isEmpty() && !(*contactIt).assembledName().isEmpty() ) 01181 masterAddressee.setNameFromString( (*contactIt).assembledName() ); 01182 01183 // NICKNAME 01184 if ( masterAddressee.nickName().isEmpty() && !(*contactIt).nickName().isEmpty() ) 01185 masterAddressee.setNickName( (*contactIt).nickName() ); 01186 01187 // NOTE 01188 if ( masterAddressee.note().isEmpty() && !(*contactIt).note().isEmpty() ) 01189 masterAddressee.setNote( (*contactIt).note() ); 01190 01191 // ORG 01192 if ( masterAddressee.organization().isEmpty() && !(*contactIt).organization().isEmpty() ) 01193 masterAddressee.setOrganization( (*contactIt).organization() ); 01194 01195 /* 01196 // PHOTO 01197 */ 01198 01199 // PROID 01200 if ( masterAddressee.productId().isEmpty() && !(*contactIt).productId().isEmpty() ) 01201 masterAddressee.setProductId( (*contactIt).productId() ); 01202 01203 // REV 01204 if ( masterAddressee.revision().isNull() && !(*contactIt).revision().isNull() ) 01205 masterAddressee.setRevision( (*contactIt).revision() ); 01206 01207 // ROLE 01208 if ( masterAddressee.role().isEmpty() && !(*contactIt).role().isEmpty() ) 01209 masterAddressee.setRole( (*contactIt).role() ); 01210 01211 // SORT-STRING 01212 if ( masterAddressee.sortString().isEmpty() && !(*contactIt).sortString().isEmpty() ) 01213 masterAddressee.setSortString( (*contactIt).sortString() ); 01214 01215 /* 01216 // SOUND 01217 */ 01218 01219 // TEL 01220 KABC::PhoneNumber::List phones = (*contactIt).phoneNumbers(); 01221 KABC::PhoneNumber::List masterPhones = masterAddressee.phoneNumbers(); 01222 KABC::PhoneNumber::List::ConstIterator phoneIt; 01223 for ( phoneIt = phones.begin(); phoneIt != phones.end(); ++phoneIt ) 01224 if ( !masterPhones.contains( *it ) ) 01225 masterAddressee.insertPhoneNumber( *it ); 01226 01227 // TITLE 01228 if ( masterAddressee.title().isEmpty() && !(*contactIt).title().isEmpty() ) 01229 masterAddressee.setTitle( (*contactIt).title() ); 01230 01231 // TZ 01232 if ( !masterAddressee.timeZone().isValid() && (*contactIt).timeZone().isValid() ) 01233 masterAddressee.setTimeZone( (*contactIt).timeZone() ); 01234 01235 // UID // ignore UID 01236 01237 // URL 01238 if ( masterAddressee.url().isEmpty() && !(*contactIt).url().isEmpty() ) 01239 masterAddressee.setUrl( (*contactIt).url() ); 01240 01241 // X- 01242 QStringList customs = (*contactIt).customs(); 01243 QStringList masterCustoms = masterAddressee.customs(); 01244 QStringList newCustoms( masterCustoms ); 01245 for ( it = customs.begin(); it != customs.end(); ++it ) 01246 if ( !masterCustoms.contains( *it ) ) 01247 newCustoms.append( *it ); 01248 masterAddressee.setCustoms( newCustoms ); 01249 } 01250 01251 return masterAddressee; 01252 } 01253 01254 void KABCore::setCategories() 01255 { 01256 // Show the category dialog 01257 if ( mCategorySelectDialog == 0 ) { 01258 mCategorySelectDialog = new KPIM::CategorySelectDialog( KABPrefs::instance(), mWidget ); 01259 connect( mCategorySelectDialog, SIGNAL( categoriesSelected( const QStringList& ) ), 01260 SLOT( categoriesSelected( const QStringList& ) ) ); 01261 connect( mCategorySelectDialog, SIGNAL( editCategories() ), SLOT( editCategories() ) ); 01262 } 01263 01264 QStringList selected = mCategorySelectDialog->selectedCategories(); 01265 mCategorySelectDialog->setCategories(); 01266 mCategorySelectDialog->setSelected( selected ); 01267 mCategorySelectDialog->show(); 01268 mCategorySelectDialog->raise(); 01269 } 01270 01271 void KABCore::categoriesSelected( const QStringList &categories ) 01272 { 01273 bool merge = false; 01274 QString msg = i18n( "Merge with existing categories?" ); 01275 if ( KMessageBox::questionYesNo( mWidget, msg ) == KMessageBox::Yes ) 01276 merge = true; 01277 01278 QStringList uids = mViewManager->selectedUids(); 01279 QStringList::ConstIterator it; 01280 for ( it = uids.begin(); it != uids.end(); ++it ) { 01281 KABC::Addressee addr = mAddressBook->findByUid( *it ); 01282 if ( !addr.isEmpty() ) { 01283 if ( !merge ) 01284 addr.setCategories( categories ); 01285 else { 01286 QStringList addrCategories = addr.categories(); 01287 QStringList::ConstIterator catIt; 01288 for ( catIt = categories.begin(); catIt != categories.end(); ++catIt ) { 01289 if ( !addrCategories.contains( *catIt ) ) 01290 addrCategories.append( *catIt ); 01291 } 01292 addr.setCategories( addrCategories ); 01293 } 01294 01295 mAddressBook->insertAddressee( addr ); 01296 } 01297 } 01298 01299 if ( uids.count() > 0 ) 01300 setModified( true ); 01301 } 01302 01303 void KABCore::editCategories() 01304 { 01305 if ( mCategoryEditDialog == 0 ) { 01306 mCategoryEditDialog = new KPIM::CategoryEditDialog( KABPrefs::instance(), mWidget ); 01307 connect( mCategoryEditDialog, SIGNAL( categoryConfigChanged() ), 01308 SLOT( setCategories() ) ); 01309 } 01310 01311 mCategoryEditDialog->show(); 01312 mCategoryEditDialog->raise(); 01313 } 01314 01315 bool KABCore::handleCommandLine( KAddressBookIface* iface ) 01316 { 01317 KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); 01318 QCString addrStr = args->getOption( "addr" ); 01319 QCString uidStr = args->getOption( "uid" ); 01320 01321 QString addr, uid, vcard; 01322 if ( !addrStr.isEmpty() ) 01323 addr = QString::fromLocal8Bit( addrStr ); 01324 if ( !uidStr.isEmpty() ) 01325 uid = QString::fromLocal8Bit( uidStr ); 01326 01327 bool doneSomething = false; 01328 01329 // Can not see why anyone would pass both a uid and an email address, so I'll leave it that two contact editors will show if they do 01330 if ( !addr.isEmpty() ) { 01331 iface->addEmail( addr ); 01332 doneSomething = true; 01333 } 01334 01335 if ( !uid.isEmpty() ) { 01336 iface->showContactEditor( uid ); 01337 doneSomething = true; 01338 } 01339 01340 if ( args->isSet( "new-contact" ) ) { 01341 iface->newContact(); 01342 doneSomething = true; 01343 } 01344 01345 if ( args->count() >= 1 ) { 01346 for ( int i = 0; i < args->count(); ++i ) 01347 iface->importVCard( args->url( i ).url() ); 01348 doneSomething = true; 01349 } 01350 return doneSomething; 01351 } 01352 01353 #include "kabcore.moc"
KDE Logo
This file is part of the documentation for kaddressbook Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Thu Oct 21 19:46:36 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003