26#include <tqeventloop.h>
28#include <tqclipboard.h>
34#include <tqwidgetstack.h>
38#include <tqwhatsthis.h>
40#include <tdeabc/addresseelist.h>
41#include <tdeabc/errorhandler.h>
42#include <tdeabc/resource.h>
43#include <tdeabc/stdaddressbook.h>
44#include <tdeabc/vcardconverter.h>
45#include <tdeabc/resourcefile.h>
46#include <tdeaboutdata.h>
47#include <tdeaccelmanager.h>
48#include <tdeapplication.h>
49#include <dcopclient.h>
50#include <tdeactionclasses.h>
51#include <tdecmdlineargs.h>
52#include <kcmultidialog.h>
54#include <tdeimproxy.h>
56#include <tdemessagebox.h>
58#include <kprotocolinfo.h>
59#include <kpushbutton.h>
60#include <tderesources/selectdialog.h>
61#include <kstandarddirs.h>
62#include <kstatusbar.h>
63#include <kstdguiitem.h>
64#include <kxmlguiclient.h>
65#include <tdetoolbar.h>
66#include <libtdepim/addresseeview.h>
67#include <libtdepim/categoryeditdialog.h>
68#include <libtdepim/categoryselectdialog.h>
69#include <libtdepim/resourceabc.h>
70#include "distributionlisteditor.h"
72#include "addresseeutil.h"
73#include "addresseeeditordialog.h"
74#include "distributionlistentryview.h"
75#include "extensionmanager.h"
76#include "filterselectionwidget.h"
77#include "incsearchwidget.h"
78#include "jumpbuttonbar.h"
82#include "kaddressbookservice.h"
83#include "kaddressbookiface.h"
84#include "ldapsearchdialog.h"
85#include "locationmap.h"
86#include "printing/printingwizard.h"
87#include "searchmanager.h"
89#include "viewmanager.h"
90#include "xxportmanager.h"
94KABCore::KABCore( KXMLGUIClient *client,
bool readWrite, TQWidget *parent,
95 const TQString &file,
const char *name )
96 : KAB::Core( client, parent, name ), mStatusBar( 0 ), mViewManager( 0 ),
97 mExtensionManager( 0 ), mJumpButtonBar( 0 ), mCategorySelectDialog( 0 ),
98 mCategoryEditDialog( 0 ), mLdapSearchDialog( 0 ), mReadWrite( readWrite ),
101 mWidget =
new TQWidget( parent, name );
103 mIsPart = !parent->isA(
"KAddressBookMain" );
105 mAddressBookChangedTimer =
new TQTimer(
this );
106 connect( mAddressBookChangedTimer, TQ_SIGNAL( timeout() ),
107 this, TQ_SLOT( addressBookChanged() ) );
109 if ( file.isEmpty() ) {
110 mAddressBook = TDEABC::StdAddressBook::self(
true );
112 kdDebug(5720) <<
"KABCore(): document '" << file <<
"'" << endl;
113 mAddressBook =
new TDEABC::AddressBook;
114 mAddressBook->addResource(
new TDEABC::ResourceFile( file ) );
115 if ( !mAddressBook->load() ) {
116 KMessageBox::error( parent, i18n(
"Unable to load '%1'.").arg( file ) );
119 mAddressBook->setErrorHandler(
new TDEABC::GuiErrorHandler( mWidget ) );
121 mAddressBook->addCustomField( i18n(
"Profession" ), TDEABC::Field::Organization,
122 "X-Profession",
"KADDRESSBOOK" );
123 mAddressBook->addCustomField( i18n(
"Assistant's Name" ), TDEABC::Field::Organization,
124 "X-AssistantsName",
"KADDRESSBOOK" );
125 mAddressBook->addCustomField( i18n(
"Manager's Name" ), TDEABC::Field::Organization,
126 "X-ManagersName",
"KADDRESSBOOK" );
127 mAddressBook->addCustomField( i18n(
"Partner's Name" ), TDEABC::Field::Personal,
128 "X-SpousesName",
"KADDRESSBOOK" );
129 mAddressBook->addCustomField( i18n(
"Office" ), TDEABC::Field::Personal,
130 "X-Office",
"KADDRESSBOOK" );
131 mAddressBook->addCustomField( i18n(
"IM Address" ), TDEABC::Field::Personal,
132 "X-IMAddress",
"KADDRESSBOOK" );
133 mAddressBook->addCustomField( i18n(
"Anniversary" ), TDEABC::Field::Personal,
134 "X-Anniversary",
"KADDRESSBOOK" );
135 mAddressBook->addCustomField( i18n(
"Blog" ), TDEABC::Field::Personal,
136 "BlogFeed",
"KADDRESSBOOK" );
138 mSearchManager =
new KAB::SearchManager( mAddressBook, parent );
140 connect( mSearchManager, TQ_SIGNAL( contactsUpdated() ),
141 this, TQ_SLOT( slotContactsUpdated() ) );
145 connect( mAddressBook, TQ_SIGNAL( addressBookChanged( AddressBook* ) ),
146 TQ_SLOT( delayedAddressBookChanged() ) );
147 connect( mAddressBook, TQ_SIGNAL( loadingFinished( Resource* ) ),
148 TQ_SLOT( delayedAddressBookChanged() ) );
150 mIncSearchWidget->setFocus();
152 connect( mViewManager, TQ_SIGNAL( selected(
const TQString& ) ),
153 TQ_SLOT( setContactSelected(
const TQString& ) ) );
154 connect( mViewManager, TQ_SIGNAL( executed(
const TQString& ) ),
155 TQ_SLOT( editContact(
const TQString& ) ) );
156 connect( mViewManager, TQ_SIGNAL( modified() ),
157 TQ_SLOT( setModified() ) );
158 connect( mViewManager, TQ_SIGNAL( urlDropped(
const KURL& ) ),
159 mXXPortManager, TQ_SLOT( importVCard(
const KURL& ) ) );
160 connect( mViewManager, TQ_SIGNAL( viewFieldsChanged() ),
161 TQ_SLOT( updateIncSearchWidget() ) );
162 connect( mExtensionManager, TQ_SIGNAL( modified(
const TDEABC::Addressee::List& ) ),
163 this, TQ_SLOT( extensionModified(
const TDEABC::Addressee::List& ) ) );
164 connect( mExtensionManager, TQ_SIGNAL( deleted(
const TQStringList& ) ),
165 this, TQ_SLOT( extensionDeleted(
const TQStringList& ) ) );
167 connect( mXXPortManager, TQ_SIGNAL( modified() ),
168 TQ_SLOT( setModified() ) );
170 connect( mDetailsViewer, TQ_SIGNAL( highlightedMessage(
const TQString& ) ),
171 TQ_SLOT( detailsHighlighted(
const TQString& ) ) );
173 connect( mIncSearchWidget, TQ_SIGNAL( scrollUp() ),
174 mViewManager, TQ_SLOT( scrollUp() ) );
175 connect( mIncSearchWidget, TQ_SIGNAL( scrollDown() ),
176 mViewManager, TQ_SLOT( scrollDown() ) );
178 mAddressBookService =
new KAddressBookService(
this );
180 mCommandHistory =
new KCommandHistory( actionCollection(),
true );
181 connect( mCommandHistory, TQ_SIGNAL( commandExecuted() ),
182 mSearchManager, TQ_SLOT( reload() ) );
184 mSearchManager->reload();
186 setModified(
false );
188 TDEAcceleratorManager::manage( mWidget );
190 mKIMProxy = ::KIMProxy::instance( kapp->dcopClient() );
195 mAddressBook->disconnect();
198 TDEABC::StdAddressBook::close();
202void KABCore::restoreSettings()
204 bool state = KABPrefs::instance()->jumpButtonBarVisible();
205 mActionJumpBar->setChecked( state );
206 setJumpButtonBarVisible( state );
208 state = KABPrefs::instance()->detailsPageVisible();
209 mActionDetails->setChecked( state );
210 setDetailsVisible( state );
212 mViewManager->restoreSettings();
213 mExtensionManager->restoreSettings();
215 updateIncSearchWidget();
216 mIncSearchWidget->setCurrentItem( KABPrefs::instance()->currentIncSearchField() );
218 TQValueList<int> splitterSize = KABPrefs::instance()->detailsSplitter();
219 if ( splitterSize.count() == 0 ) {
220 splitterSize.append( 360 );
221 splitterSize.append( 260 );
223 mDetailsSplitter->setSizes( splitterSize );
225 const TQValueList<int> leftSplitterSizes = KABPrefs::instance()->leftSplitter();
226 if ( !leftSplitterSizes.isEmpty() )
227 mLeftSplitter->setSizes( leftSplitterSizes );
230void KABCore::saveSettings()
232 KABPrefs::instance()->setJumpButtonBarVisible( mActionJumpBar->isChecked() );
233 KABPrefs::instance()->setDetailsPageVisible( mActionDetails->isChecked() );
234 KABPrefs::instance()->setDetailsSplitter( mDetailsSplitter->sizes() );
235 KABPrefs::instance()->setLeftSplitter( mLeftSplitter->sizes() );
237 mExtensionManager->saveSettings();
238 mViewManager->saveSettings();
240 KABPrefs::instance()->setCurrentIncSearchField( mIncSearchWidget->currentItem() );
243TDEABC::AddressBook *KABCore::addressBook()
const
248TDEConfig *KABCore::config()
const
250 return KABPrefs::instance()->config();
253TDEActionCollection *KABCore::actionCollection()
const
255 return guiClient()->actionCollection();
258TDEABC::Field *KABCore::currentSortField()
const
260 return mViewManager->currentSortField();
263TQStringList KABCore::selectedUIDs()
const
265 return mViewManager->selectedUids();
268TDEABC::Resource *KABCore::requestResource( TQWidget *parent )
270 TQPtrList<TDEABC::Resource> tdeabcResources = addressBook()->resources();
272 TQPtrList<KRES::Resource> kresResources;
273 TQPtrListIterator<TDEABC::Resource> resIt( tdeabcResources );
274 TDEABC::Resource *resource;
275 while ( ( resource = resIt.current() ) != 0 ) {
277 bool writable =
false;
278 if ( resource->inherits(
"KPIM::ResourceABC" ) ) {
279 KPIM::ResourceABC *resAbc =
static_cast<KPIM::ResourceABC *
>( resource );
280 const TQStringList subresources = resAbc->subresources();
281 for ( TQStringList::ConstIterator it = subresources.begin(); it != subresources.end(); ++it ) {
282 if ( resAbc->subresourceActive(*it) && resAbc->subresourceWritable(*it) ) {
288 if ( !resource->readOnly() ) {
294 KRES::Resource *res = resource;
295 kresResources.append( res );
299 KRES::Resource *res = KRES::SelectDialog::getResource( kresResources, parent );
300 return static_cast<TDEABC::Resource*
>( res );
303TQWidget *KABCore::widget()
const
308TDEAboutData *KABCore::createAboutData()
310 TDEAboutData *about =
new TDEAboutData(
"kaddressbook", I18N_NOOP(
"KAddressBook" ),
311 "3.5.13", I18N_NOOP(
"The TDE Address Book" ),
312 TDEAboutData::License_GPL_V2,
313 I18N_NOOP(
"(c) 2008-2010, The Trinity Team\n(c) 1997-2005, The KDE PIM Team" ) );
314 about->addAuthor(
"Timothy Pearson", I18N_NOOP(
"Current maintainer" ),
"kb9vqf@pearsoncomputing.net" );
315 about->addAuthor(
"Tobias Koenig", I18N_NOOP(
"Previous maintainer" ),
"tokoe@kde.org" );
316 about->addAuthor(
"Don Sanders", I18N_NOOP(
"Original author" ) );
317 about->addAuthor(
"Cornelius Schumacher",
318 I18N_NOOP(
"Co-maintainer, libtdeabc port, CSV import/export" ),
319 "schumacher@kde.org" );
320 about->addAuthor(
"Mike Pilone", I18N_NOOP(
"GUI and framework redesign" ),
321 "mpilone@slac.com" );
322 about->addAuthor(
"Greg Stern", I18N_NOOP(
"DCOP interface" ) );
323 about->addAuthor(
"Mark Westcott", I18N_NOOP(
"Contact pinning" ) );
324 about->addAuthor(
"Mischel Boyer de la Giroday", I18N_NOOP(
"LDAP Lookup" ),
325 "michel@klaralvdalens-datakonsult.se" );
326 about->addAuthor(
"Steffen Hansen", I18N_NOOP(
"LDAP Lookup" ),
332void KABCore::setStatusBar( KStatusBar *statusBar )
334 mStatusBar = statusBar;
337KStatusBar *KABCore::statusBar()
const
342void KABCore::setContactSelected(
const TQString &uid )
345 if ( !mAddressBook ) {
349 TDEABC::Addressee addr = mAddressBook->findByUid( uid );
350 if ( !mDetailsViewer->isHidden() )
351 mDetailsViewer->setAddressee( addr );
352#ifdef TDEPIM_NEW_DISTRLISTS
353 if ( !mSelectedDistributionList.isNull() && mDistListEntryView->isShown() ) {
354 showDistributionListEntry( uid );
357 mExtensionManager->setSelectionChanged();
359 TDEABC::Addressee::List list = mViewManager->selectedAddressees();
360 const bool someSelected = list.size() > 0;
361 const bool singleSelected = list.size() == 1;
362 bool writable = mReadWrite;
369 TDEABC::Addressee::List::ConstIterator addrIt = list.constBegin();
370 for ( ; addrIt != list.constEnd(); ++addrIt ) {
371 TDEABC::Resource *res = ( *addrIt ).resource();
373 kdDebug() <<
"KABCore::setContactSelected: this addressee has no resource!" << endl;
377 if ( res->readOnly() ) {
382 if ( res->inherits(
"KPIM::ResourceABC" ) ) {
383 KPIM::ResourceABC *resAbc =
static_cast<KPIM::ResourceABC *
>( res );
385 TQString subresource = resAbc->uidToResourceMap()[ ( *addrIt ).uid() ];
386 if ( !subresource.isEmpty() && !resAbc->subresourceWritable( subresource ) ) {
394 bool moreThanOneResource = mAddressBook->resources().count() > 1;
395 if ( !moreThanOneResource && !mAddressBook->resources().isEmpty() ) {
396 TDEABC::Resource *res = mAddressBook->resources().first();
397 if ( res->inherits(
"KPIM::ResourceABC" ) ) {
398 KPIM::ResourceABC *resAbc =
static_cast<KPIM::ResourceABC *
>( res );
399 const TQStringList subresources = resAbc->subresources();
401 for ( TQStringList::ConstIterator it = subresources.begin(); it != subresources.end(); ++it ) {
402 if ( resAbc->subresourceActive(*it) && resAbc->subresourceWritable(*it) ) {
406 moreThanOneResource = ( writeables >= 2 );
412 mActionCopy->setEnabled( someSelected );
413 mActionCut->setEnabled( someSelected && writable );
414 mActionDelete->setEnabled( someSelected && writable );
417 mActionEditAddressee->setEnabled( singleSelected && !mExtensionManager->isQuickEditVisible());
418 mActionCopyAddresseeTo->setEnabled( someSelected && moreThanOneResource );
419 mActionMoveAddresseeTo->setEnabled( someSelected && moreThanOneResource && writable );
420 mActionMail->setEnabled( someSelected );
421 mActionMailVCard->setEnabled( someSelected );
422 mActionChat->setEnabled( singleSelected && mKIMProxy && mKIMProxy->initialize() );
423 mActionWhoAmI->setEnabled( singleSelected );
424 mActionCategories->setEnabled( someSelected && writable );
425 mActionMerge->setEnabled( ( list.size() == 2 ) && writable );
428 TQClipboard *cb = TQApplication::clipboard();
429#if defined(KABC_VCARD_ENCODING_FIX)
430 const TQMimeSource *data = cb->data( TQClipboard::Clipboard );
435 mActionPaste->setEnabled( !list.isEmpty() );
437#ifdef TDEPIM_NEW_DISTRLISTS
438 mAddDistListButton->setEnabled( writable );
439 mRemoveDistListButton->setEnabled( someSelected && writable );
443void KABCore::sendMail()
446 sendMail( mViewManager->selectedEmails().join(
", " ) );
449void KABCore::sendMail(
const TQString& email )
451 kapp->invokeMailer( email,
"" );
454void KABCore::mailVCard()
456 TQStringList uids = mViewManager->selectedUids();
457 if ( !uids.isEmpty() )
461void KABCore::mailVCard(
const TQStringList &uids )
463 KABTools::mailVCards( uids, mAddressBook );
466void KABCore::startChat()
468 TQStringList uids = mViewManager->selectedUids();
469 if ( !uids.isEmpty() )
470 mKIMProxy->chatWithContact( uids.first() );
473void KABCore::browse(
const TQString& url )
475 kapp->invokeBrowser( url );
478void KABCore::selectAllContacts()
480 mViewManager->setSelected( TQString(),
true );
483void KABCore::deleteContacts()
485 TQStringList uidList = mViewManager->selectedUids();
487 deleteContacts( uidList );
490void KABCore::deleteDistributionLists(
const TQStringList & names )
492 if ( names.isEmpty() )
494 if ( KMessageBox::warningContinueCancelList( mWidget, i18n(
"Do you really want to delete this distribution list?",
495 "Do you really want to delete these %n distribution lists?", names.count() ),
496 names, TQString(), KStdGuiItem::del() ) == KMessageBox::Cancel )
500 for ( TQStringList::ConstIterator it = names.begin(); it != names.end(); ++it ) {
501 uids.append( KPIM::DistributionList::findByName( mAddressBook, *it ).uid() );
503 DeleteCommand *command =
new DeleteCommand( mAddressBook, uids );
504 mCommandHistory->addCommand( command );
508void KABCore::deleteContacts(
const TQStringList &uids )
510 if ( uids.count() > 0 ) {
512 TQStringList::ConstIterator it = uids.begin();
513 const TQStringList::ConstIterator endIt( uids.end() );
514 while ( it != endIt ) {
515 TDEABC::Addressee addr = mAddressBook->findByUid( *it );
516 names.append( addr.realName().isEmpty() ? addr.preferredEmail() : addr.realName() );
520 if ( KMessageBox::warningContinueCancelList(
523 "Do you really want to delete this contact from your addressbook?<br>"
524 "<b>Note:</b>The contact will be also removed from all distribution lists."
527 "Do you really want to delete these %n contacts from your addressbook?<br>"
528 "<b>Note:</b>The contacts will be also removed from all distribution lists."
531 names, TQString(), KStdGuiItem::del() ) == KMessageBox::Cancel ) {
535 DeleteCommand *command =
new DeleteCommand( mAddressBook, uids );
536 mCommandHistory->addCommand( command );
539 setContactSelected( TQString() );
544void KABCore::copyContacts()
546 TDEABC::Addressee::List addrList = mViewManager->selectedAddressees();
548#if defined(KABC_VCARD_ENCODING_FIX)
550 TQClipboard *cb = TQApplication::clipboard();
551 cb->setText( TQString::fromUtf8( clipText.data() ) );
554 TQClipboard *cb = TQApplication::clipboard();
555 cb->setText( clipText );
559void KABCore::cutContacts()
561 TQStringList uidList = mViewManager->selectedUids();
563 if ( uidList.size() > 0 ) {
564 CutCommand *command =
new CutCommand( mAddressBook, uidList );
565 mCommandHistory->addCommand( command );
571void KABCore::pasteContacts()
573 TQClipboard *cb = TQApplication::clipboard();
574#if defined(KABC_VCARD_ENCODING_FIX)
575 const TQMimeSource *data = cb->data( TQClipboard::Clipboard );
580 pasteContacts( list );
583void KABCore::pasteContacts( TDEABC::Addressee::List &list )
585 TDEABC::Resource *resource = requestResource( mWidget );
589 TDEABC::Addressee::List::Iterator it;
590 const TDEABC::Addressee::List::Iterator endIt( list.end() );
591 for ( it = list.begin(); it != endIt; ++it )
592 (*it).setResource( resource );
594 PasteCommand *command =
new PasteCommand(
this, list );
595 mCommandHistory->addCommand( command );
600void KABCore::mergeContacts()
602 TDEABC::Addressee::List list = mViewManager->selectedAddressees();
603 if ( list.count() < 2 )
606 TDEABC::Addressee addr = KABTools::mergeContacts( list );
608 TDEABC::Addressee::List::Iterator it = list.begin();
609 const TDEABC::Addressee::List::Iterator endIt( list.end() );
610 TDEABC::Addressee origAddr = *it;
613 while ( it != endIt ) {
614 uids.append( (*it).uid() );
618 DeleteCommand *command =
new DeleteCommand( mAddressBook, uids );
619 mCommandHistory->addCommand( command );
621 EditCommand *editCommand =
new EditCommand( mAddressBook, origAddr, addr );
622 mCommandHistory->addCommand( editCommand );
624 mSearchManager->reload();
627void KABCore::setWhoAmI()
629 TDEABC::Addressee::List addrList = mViewManager->selectedAddressees();
631 if ( addrList.count() > 1 ) {
633 KMessageBox::sorry( mWidget, i18n(
"Please select only one contact." ) );
637 TQString text( i18n(
"<qt>Do you really want to use <b>%1</b> as your new personal contact?</qt>" ) );
638 if ( KMessageBox::questionYesNo( mWidget, text.arg( addrList[ 0 ].assembledName() ), TQString(), i18n(
"Use"), i18n(
"Do Not Use") ) == KMessageBox::Yes )
639 static_cast<TDEABC::StdAddressBook*
>( TDEABC::StdAddressBook::self(
true ) )->setWhoAmI( addrList[ 0 ] );
642void KABCore::incrementalTextSearch(
const TQString& text )
644 setContactSelected( TQString() );
645 mSearchManager->search( text, mIncSearchWidget->currentFields() );
648void KABCore::incrementalJumpButtonSearch(
const TQString& character )
650 mViewManager->setSelected( TQString(),
false );
652 TDEABC::AddresseeList list = mSearchManager->contacts();
653 TDEABC::Field *field = mViewManager->currentSortField();
655 list.sortByField( field );
656 TDEABC::AddresseeList::ConstIterator it;
657 const TDEABC::AddresseeList::ConstIterator endIt( list.end() );
658 for ( it = list.begin(); it != endIt; ++it ) {
659 if ( field->value( *it ).startsWith( character,
false ) ) {
660 mViewManager->setSelected( (*it).uid(),
true );
667void KABCore::setModified()
672void KABCore::setModified(
bool modified )
674 mModified = modified;
675 mActionSave->setEnabled( mModified );
677 mSearchManager->reload();
680bool KABCore::modified()
const
685void KABCore::contactModified(
const TDEABC::Addressee &addr )
687 Command *command = 0;
690 TDEABC::Addressee origAddr = mAddressBook->findByUid( addr.uid() );
691 if ( origAddr.isEmpty() ) {
692 TDEABC::Addressee::List addressees;
693 addressees.append( addr );
694 command =
new NewCommand( mAddressBook, addressees );
696 command =
new EditCommand( mAddressBook, origAddr, addr );
699 mCommandHistory->addCommand( command );
701 setContactSelected( addr.uid() );
705void KABCore::newDistributionList()
707#ifdef TDEPIM_NEW_DISTRLISTS
708 TDEABC::Resource *resource = requestResource( mWidget );
712 TQString name = i18n(
"New Distribution List" );
713 const KPIM::DistributionList distList = KPIM::DistributionList::findByName( addressBook(), name );
714 if ( !distList.isEmpty() ) {
715 bool foundUnused =
false;
717 while ( !foundUnused ) {
718 name = i18n(
"New Distribution List (%1)" ).arg( i++ );
719 foundUnused = KPIM::DistributionList::findByName( addressBook(), name ).isEmpty();
722 KPIM::DistributionList list;
723 list.setUid( TDEApplication::randomString( 10 ) );
724 list.setName( name );
725 list.setResource( resource );
726 editDistributionList( list );
730void KABCore::newContact()
732 AddresseeEditorDialog *dialog = 0;
734 TDEABC::Resource* resource = requestResource( mWidget );
737 TDEABC::Addressee addr;
738 addr.setResource( resource );
740 if ( !KABLock::self( mAddressBook )->lock( addr.resource() ) )
743 dialog = createAddresseeEditorDialog( mWidget );
744 dialog->setAddressee( addr );
748 mEditorDict.insert( dialog->addressee().uid(), dialog );
753void KABCore::addEmail(
const TQString &aStr )
755 TQString fullName, email;
757 TDEABC::Addressee::parseEmailAddress( aStr, fullName, email );
761 while ( !mAddressBook->loadingHasFinished() ) {
762 TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput );
770 TQStringList emailList;
771 TDEABC::AddressBook::Iterator it;
772 const TDEABC::AddressBook::Iterator endIt( mAddressBook->end() );
773 for ( it = mAddressBook->begin(); !found && (it != endIt); ++it ) {
774 emailList = (*it).emails();
775 if ( emailList.contains( email ) > 0 ) {
777 (*it).setNameFromString( fullName );
778 editContact( (*it).uid() );
783 TDEABC::Addressee addr;
784 addr.setNameFromString( fullName );
785 addr.insertEmail( email,
true );
787 mAddressBook->insertAddressee( addr );
788 mViewManager->refreshView( addr.uid() );
789 editContact( addr.uid() );
793void KABCore::importVCard(
const KURL &url )
795 mXXPortManager->importVCard( url );
798void KABCore::importVCardFromData(
const TQString &vCard )
800 mXXPortManager->importVCardFromData( vCard );
803void KABCore::editContact(
const TQString &uid )
805 if ( mExtensionManager->isQuickEditVisible() )
809 TQString localUID = uid;
810 if ( localUID.isNull() ) {
811 TQStringList uidList = mViewManager->selectedUids();
812 if ( uidList.count() > 0 )
813 localUID = *( uidList.at( 0 ) );
818 else while ( !mAddressBook->loadingHasFinished() ) {
819 TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput );
825 TDEABC::Addressee addr = mAddressBook->findByUid( localUID );
826 if ( !addr.isEmpty() ) {
827 AddresseeEditorDialog *dialog = mEditorDict.find( addr.uid() );
830 if ( !addr.resource()->readOnly() )
831 if ( !KABLock::self( mAddressBook )->lock( addr.resource() ) ) {
835 dialog = createAddresseeEditorDialog( mWidget );
837 mEditorDict.insert( addr.uid(), dialog );
839 dialog->setAddressee( addr );
848void KABCore::copySelectedContactToResource()
850 storeContactIn( TQString(),
true );
853void KABCore::moveSelectedContactToResource()
855 storeContactIn( TQString(),
false );
858void KABCore::storeContactIn(
const TQString &uid,
bool copy )
861 TQStringList uidList;
862 if ( uid.isNull() ) {
863 uidList = mViewManager->selectedUids();
867 TDEABC::Resource *resource = requestResource( mWidget );
872 CopyToCommand *command =
new CopyToCommand( mAddressBook, uidList, resource );
873 mCommandHistory->addCommand( command );
876 MoveToCommand *command =
new MoveToCommand(
this, uidList, resource );
877 mCommandHistory->addCommand( command );
880 addressBookChanged();
886 TQPtrList<TDEABC::Resource> resources = mAddressBook->resources();
887 TQPtrListIterator<TDEABC::Resource> it( resources );
888 while ( it.current() && !it.current()->readOnly() ) {
889 TDEABC::Ticket *ticket = mAddressBook->requestSaveTicket( it.current() );
891 if ( !mAddressBook->save( ticket ) ) {
892 KMessageBox::error( mWidget,
893 i18n(
"<qt>Unable to save address book <b>%1</b>.</qt>" ).arg( it.current()->resourceName() ) );
894 mAddressBook->releaseSaveTicket( ticket );
896 setModified(
false );
899 KMessageBox::error( mWidget,
900 i18n(
"<qt>Unable to get access for saving the address book <b>%1</b>.</qt>" )
901 .arg( it.current()->resourceName() ) );
910 TQPtrList<TDEABC::Resource> resources = mAddressBook->resources();
911 TQPtrListIterator<TDEABC::Resource> it( resources );
912 while ( it.current() ) {
913 mAddressBook->load();
918void KABCore::setJumpButtonBarVisible(
bool visible )
921 if ( !mJumpButtonBar )
922 createJumpButtonBar();
923 mJumpButtonBar->show();
925 if ( mJumpButtonBar )
926 mJumpButtonBar->hide();
929void KABCore::setDetailsVisible(
bool visible )
932 mDetailsPage->show();
934 mDetailsPage->hide();
937void KABCore::extensionModified(
const TDEABC::Addressee::List &list )
939 if ( list.count() != 0 ) {
940 TDEABC::Addressee::List::ConstIterator it;
941 const TDEABC::Addressee::List::ConstIterator endIt( list.end() );
942 for ( it = list.begin(); it != endIt; ++it ) {
943 Command *command = 0;
946 TDEABC::Addressee origAddr = mAddressBook->findByUid( (*it).uid() );
947 if ( origAddr.isEmpty() ) {
948 TDEABC::Addressee::List addressees;
949 addressees.append( *it );
950 command =
new NewCommand( mAddressBook, addressees );
952 command =
new EditCommand( mAddressBook, origAddr, *it );
954 mCommandHistory->blockSignals(
true );
955 mCommandHistory->addCommand( command );
956 mCommandHistory->blockSignals(
false );
963void KABCore::extensionDeleted(
const TQStringList &uidList )
965 DeleteCommand *command =
new DeleteCommand( mAddressBook, uidList );
966 mCommandHistory->addCommand( command );
969 setContactSelected( TQString() );
973TQString KABCore::getNameByPhone(
const TQString &phone )
977 while ( !mAddressBook->loadingHasFinished() ) {
978 TQApplication::eventLoop()->processEvents( TQEventLoop::ExcludeUserInput );
984 TQRegExp r(
"[/*/-/ ]" );
985 TQString localPhone( phone );
988 TQString ownerName =
"";
989 TDEABC::PhoneNumber::List phoneList;
991 TDEABC::AddressBook::ConstIterator iter;
992 const TDEABC::AddressBook::ConstIterator endIter( mAddressBook->end() );
994 for ( iter = mAddressBook->begin(); !found && ( iter != endIter ); ++iter ) {
995 phoneList = (*iter).phoneNumbers();
996 TDEABC::PhoneNumber::List::Iterator phoneIter( phoneList.begin() );
997 const TDEABC::PhoneNumber::List::Iterator phoneEndIter( phoneList.end() );
998 for ( ; !found && ( phoneIter != phoneEndIter ); ++phoneIter) {
1000 if ( (*phoneIter).number().replace( r,
"" ) == localPhone.replace( r,
"" ) ) {
1001 ownerName = (*iter).realName();
1010void KABCore::openLDAPDialog()
1012 if ( !KProtocolInfo::isKnownProtocol( KURL(
"ldap://localhost" ) ) ) {
1013 KMessageBox::error( mWidget, i18n(
"Your TDE installation is missing LDAP "
1014 "support, please ask your administrator or distributor for more information." ),
1015 i18n(
"No LDAP IO Slave Available" ) );
1019 if ( !mLdapSearchDialog ) {
1020 mLdapSearchDialog =
new LDAPSearchDialog( mAddressBook,
this, mWidget );
1021 connect( mLdapSearchDialog, TQ_SIGNAL( addresseesAdded() ),
1022 TQ_SLOT( addressBookChanged() ) );
1023 connect( mLdapSearchDialog, TQ_SIGNAL( addresseesAdded() ),
1024 TQ_SLOT( setModified() ) );
1026 mLdapSearchDialog->restoreSettings();
1028 if ( mLdapSearchDialog->isOK() )
1029 mLdapSearchDialog->exec();
1032void KABCore::configure()
1037 KCMultiDialog dlg( mWidget,
"",
true );
1038 connect( &dlg, TQ_SIGNAL( configCommitted() ),
1039 this, TQ_SLOT( configurationChanged() ) );
1041 dlg.addModule(
"kabconfig.desktop" );
1042 dlg.addModule(
"kabldapconfig.desktop" );
1043 dlg.addModule(
"kabcustomfields.desktop" );
1048void KABCore::print()
1051 printer.setDocName( i18n(
"Address Book" ) );
1052 printer.setDocFileName(
"addressbook" );
1054 if ( !printer.setup( mWidget, i18n(
"Print Addresses") ) )
1057 KABPrinting::PrintingWizard wizard( &printer, mAddressBook,
1058 mViewManager->selectedUids(), mWidget );
1063void KABCore::detailsHighlighted(
const TQString &msg )
1066 if ( !mStatusBar->hasItem( 2 ) )
1067 mStatusBar->insertItem( msg, 2 );
1069 mStatusBar->changeItem( msg, 2 );
1073void KABCore::showContactsAddress(
const TQString &addrUid )
1075 TQStringList uidList = mViewManager->selectedUids();
1076 if ( uidList.isEmpty() )
1079 TDEABC::Addressee addr = mAddressBook->findByUid( uidList.first() );
1080 if ( addr.isEmpty() )
1083 const TDEABC::Address::List list = addr.addresses();
1084 TDEABC::Address::List::ConstIterator it;
1085 const TDEABC::Address::List::ConstIterator endIt( list.end() );
1086 for ( it = list.begin(); it != endIt; ++it )
1087 if ( (*it).id() == addrUid ) {
1088 LocationMap::instance()->showAddress( *it );
1093void KABCore::configurationChanged()
1095 mExtensionManager->reconfigure();
1096 mViewManager->refreshView();
1099bool KABCore::queryClose()
1102 KABPrefs::instance()->writeConfig();
1104 TQPtrList<TDEABC::Resource> resources = mAddressBook->resources();
1105 TQPtrListIterator<TDEABC::Resource> it( resources );
1106 while ( it.current() ) {
1107 it.current()->close();
1114void KABCore::reinitXMLGUI()
1116 mExtensionManager->createActions();
1118void KABCore::delayedAddressBookChanged()
1120 mAddressBookChangedTimer->start( 1000 );
1123void KABCore::addressBookChanged()
1125 const TQStringList selectedUids = mViewManager->selectedUids();
1127 mAddressBookChangedTimer->stop();
1129 if ( mJumpButtonBar )
1130 mJumpButtonBar->updateButtons();
1132 mSearchManager->reload();
1134 mViewManager->setSelected( TQString(),
false );
1136 TQString uid = TQString();
1137 if ( !selectedUids.isEmpty() ) {
1138 uid = selectedUids.first();
1139 mViewManager->setSelected( uid,
true );
1142 setContactSelected( uid );
1147AddresseeEditorDialog *KABCore::createAddresseeEditorDialog( TQWidget *parent,
1150 AddresseeEditorDialog *dialog =
new AddresseeEditorDialog(
this, parent,
1151 name ? name :
"editorDialog" );
1152 connect( dialog, TQ_SIGNAL( contactModified(
const TDEABC::Addressee& ) ),
1153 TQ_SLOT( contactModified(
const TDEABC::Addressee& ) ) );
1154 connect( dialog, TQ_SIGNAL( editorDestroyed(
const TQString& ) ),
1155 TQ_SLOT( slotEditorDestroyed(
const TQString& ) ) );
1160void KABCore::activateDetailsWidget( TQWidget *widget )
1162 if ( mDetailsStack->visibleWidget() == widget )
1164 mDetailsStack->raiseWidget( widget );
1167void KABCore::deactivateDetailsWidget( TQWidget *widget )
1169 if ( mDetailsStack->visibleWidget() != widget )
1171 mDetailsStack->raiseWidget( mDetailsWidget );
1174void KABCore::slotEditorDestroyed(
const TQString &uid )
1176 AddresseeEditorDialog *dialog = mEditorDict.take( uid );
1178 TDEABC::Addressee addr = dialog->addressee();
1180 if ( !addr.resource()->readOnly() ) {
1181 TQApplication::setOverrideCursor( TQt::waitCursor );
1182 KABLock::self( mAddressBook )->unlock( addr.resource() );
1183 TQApplication::restoreOverrideCursor();
1187void KABCore::initGUI()
1189 TQVBoxLayout *topLayout =
new TQVBoxLayout( mWidget, 0, 0 );
1190 TDEToolBar* searchTB =
new TDEToolBar( mWidget,
"search toolbar");
1191 searchTB->boxLayout()->setSpacing( KDialog::spacingHint() );
1192 mIncSearchWidget =
new IncSearchWidget( searchTB,
"tde toolbar widget");
1193 searchTB->setStretchableWidget( mIncSearchWidget );
1194 connect( mIncSearchWidget, TQ_SIGNAL( doSearch(
const TQString& ) ),
1195 TQ_SLOT( incrementalTextSearch(
const TQString& ) ) );
1197 mDetailsSplitter =
new TQSplitter( mWidget );
1199 mLeftSplitter =
new TQSplitter( mDetailsSplitter );
1200 mLeftSplitter->setOrientation( KABPrefs::instance()->contactListAboveExtensions() ? TQt::Vertical : TQt::Horizontal );
1202 topLayout->addWidget( searchTB );
1203 topLayout->addWidget( mDetailsSplitter );
1205 mDetailsStack =
new TQWidgetStack( mDetailsSplitter );
1206 mExtensionManager =
new ExtensionManager(
new TQWidget( mLeftSplitter ), mDetailsStack,
this,
this );
1207 connect( mExtensionManager, TQ_SIGNAL( detailsWidgetDeactivated( TQWidget* ) ),
1208 this, TQ_SLOT( deactivateDetailsWidget( TQWidget* ) ) );
1209 connect( mExtensionManager, TQ_SIGNAL( detailsWidgetActivated( TQWidget* ) ),
1210 this, TQ_SLOT( activateDetailsWidget( TQWidget* ) ) );
1212 TQWidget *viewWidget =
new TQWidget( mLeftSplitter );
1213 if ( KABPrefs::instance()->contactListAboveExtensions() )
1214 mLeftSplitter->moveToFirst( viewWidget );
1215 TQVBoxLayout *viewLayout =
new TQVBoxLayout( viewWidget );
1216 viewLayout->setSpacing( KDialog::spacingHint() );
1218 mViewHeaderLabel =
new TQLabel( viewWidget );
1220 mViewHeaderLabel->setText( i18n(
"Contacts" ) );
1221 viewLayout->addWidget( mViewHeaderLabel );
1222 mViewManager =
new ViewManager(
this, viewWidget );
1223 viewLayout->addWidget( mViewManager, 1 );
1225#ifdef TDEPIM_NEW_DISTRLISTS
1226 mDistListButtonWidget =
new TQWidget( viewWidget );
1227 TQHBoxLayout *buttonLayout =
new TQHBoxLayout( mDistListButtonWidget );
1228 buttonLayout->setSpacing( KDialog::spacingHint() );
1229 buttonLayout->addStretch( 1 );
1231 mAddDistListButton =
new KPushButton( mDistListButtonWidget );
1232 mAddDistListButton->setEnabled(
false );
1233 mAddDistListButton->setText( i18n(
"Add" ) );
1234 TQToolTip::add( mAddDistListButton, i18n(
"Add contacts to the distribution list" ) );
1235 TQWhatsThis::add( mAddDistListButton,
1236 i18n(
"Click this button if you want to add more contacts to "
1237 "the current distribution list. You will be shown a dialog that allows "
1238 "to enter a list of existing contacts to this distribution list." ) );
1239 connect( mAddDistListButton, TQ_SIGNAL( clicked() ),
1240 this, TQ_SLOT( editSelectedDistributionList() ) );
1241 buttonLayout->addWidget( mAddDistListButton );
1242 mDistListButtonWidget->setShown(
false );
1243 viewLayout->addWidget( mDistListButtonWidget );
1245 mRemoveDistListButton =
new KPushButton( mDistListButtonWidget );
1246 mRemoveDistListButton->setEnabled(
false );
1247 mRemoveDistListButton->setText( i18n(
"Remove" ) );
1248 TQToolTip::add( mRemoveDistListButton, i18n(
"Remove contacts from the distribution list" ) );
1249 TQWhatsThis::add( mRemoveDistListButton,
1250 i18n(
"Click this button if you want to remove the selected contacts from "
1251 "the current distribution list." ) );
1252 connect( mRemoveDistListButton, TQ_SIGNAL( clicked() ),
1253 this, TQ_SLOT( removeSelectedContactsFromDistList() ) );
1254 buttonLayout->addWidget( mRemoveDistListButton );
1257 mFilterSelectionWidget =
new FilterSelectionWidget( searchTB ,
"tde toolbar widget" );
1258 mViewManager->setFilterSelectionWidget( mFilterSelectionWidget );
1260 connect( mFilterSelectionWidget, TQ_SIGNAL( filterActivated(
int ) ),
1261 mViewManager, TQ_SLOT( setActiveFilter(
int ) ) );
1263 mDetailsWidget =
new TQWidget( mDetailsSplitter );
1264 mDetailsLayout =
new TQHBoxLayout( mDetailsWidget );
1266 mDetailsPage =
new TQWidget( mDetailsWidget );
1267 mDetailsLayout->addWidget( mDetailsPage );
1269 TQHBoxLayout *detailsPageLayout =
new TQHBoxLayout( mDetailsPage, 0, 0 );
1270 mDetailsViewer =
new KPIM::AddresseeView( mDetailsPage );
1271 mDetailsViewer->setVScrollBarMode( TQScrollView::Auto );
1272 detailsPageLayout->addWidget( mDetailsViewer );
1274 mDistListEntryView =
new KAB::DistributionListEntryView(
this, mWidget );
1275 connect( mDistListEntryView, TQ_SIGNAL( distributionListClicked(
const TQString& ) ),
1276 this, TQ_SLOT( sendMailToDistributionList(
const TQString& ) ) );
1277 mDetailsStack->addWidget( mDistListEntryView );
1278 mDetailsStack->addWidget( mDetailsWidget );
1279 mDetailsStack->raiseWidget( mDetailsWidget );
1280 mDetailsSplitter->moveToLast( mDetailsStack );
1282 connect( mDetailsViewer, TQ_SIGNAL( addressClicked(
const TQString&) ),
1283 this, TQ_SLOT( showContactsAddress(
const TQString& ) ) );
1285 topLayout->setStretchFactor( mDetailsSplitter, 1 );
1287 mXXPortManager =
new XXPortManager(
this, mWidget );
1292void KABCore::createJumpButtonBar()
1294 mJumpButtonBar =
new JumpButtonBar(
this, mDetailsWidget );
1295 mDetailsLayout->addWidget( mJumpButtonBar );
1296 mDetailsLayout->setStretchFactor( mJumpButtonBar, 1 );
1298 connect( mJumpButtonBar, TQ_SIGNAL( jumpToLetter(
const TQString& ) ),
1299 TQ_SLOT( incrementalJumpButtonSearch(
const TQString& ) ) );
1300 connect( mViewManager, TQ_SIGNAL( sortFieldChanged() ),
1301 mJumpButtonBar, TQ_SLOT( updateButtons() ) );
1304void KABCore::initActions()
1306 connect( TQApplication::clipboard(), TQ_SIGNAL( dataChanged() ),
1307 TQ_SLOT( clipboardDataChanged() ) );
1312 mActionMail =
new TDEAction( i18n(
"&Send Email to Contact..." ),
"mail-send", 0,
1313 this, TQ_SLOT( sendMail() ), actionCollection(),
"file_mail" );
1314 action = KStdAction::print(
this, TQ_SLOT( print() ), actionCollection() );
1315 mActionMail->setWhatsThis( i18n(
"Send a mail to all selected contacts." ) );
1316 action->setWhatsThis( i18n(
"Print a special number of contacts." ) );
1318 mActionSave = KStdAction::save(
this,
1319 TQ_SLOT( save() ), actionCollection(),
"file_sync" );
1320 mActionSave->setWhatsThis( i18n(
"Save all changes of the address book to the storage backend." ) );
1322 action =
new TDEAction( i18n(
"&New Contact..." ),
"identity", CTRL+Key_N,
this,
1323 TQ_SLOT( newContact() ), actionCollection(),
"file_new_contact" );
1324 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." ) );
1326 action =
new TDEAction( i18n(
"&New Distribution List..." ),
"kontact_contacts", 0,
this,
1327 TQ_SLOT( newDistributionList() ), actionCollection(),
"file_new_distributionlist" );
1328 action->setWhatsThis( i18n(
"Create a new distribution list<p>You will be presented with a dialog where you can create a new distribution list." ) );
1330 mActionMailVCard =
new TDEAction( i18n(
"Send &Contact..."),
"mail_post_to", 0,
1331 this, TQ_SLOT( mailVCard() ),
1332 actionCollection(),
"file_mail_vcard" );
1333 mActionMailVCard->setWhatsThis( i18n(
"Send a mail with the selected contact as attachment." ) );
1335 mActionChat =
new TDEAction( i18n(
"Chat &With..."), 0,
1336 this, TQ_SLOT( startChat() ),
1337 actionCollection(),
"file_chat" );
1338 mActionChat->setWhatsThis( i18n(
"Start a chat with the selected contact." ) );
1340 mActionEditAddressee =
new TDEAction( i18n(
"&Edit Contact..." ),
"edit", 0,
1341 this, TQ_SLOT( editContact() ),
1342 actionCollection(),
"file_properties" );
1343 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." ) );
1345 mActionMerge =
new TDEAction( i18n(
"&Merge Contacts" ),
"", 0,
1346 this, TQ_SLOT( mergeContacts() ),
1347 actionCollection(),
"edit_merge" );
1350 mActionCopy = KStdAction::copy(
this, TQ_SLOT( copyContacts() ), actionCollection() );
1351 mActionCut = KStdAction::cut(
this, TQ_SLOT( cutContacts() ), actionCollection() );
1352 mActionPaste = KStdAction::paste(
this, TQ_SLOT( pasteContacts() ), actionCollection() );
1353 action = KStdAction::selectAll(
this, TQ_SLOT( selectAllContacts() ), actionCollection() );
1354 mActionCopy->setWhatsThis( i18n(
"Copy the currently selected contact(s) to system clipboard in vCard format." ) );
1355 mActionCut->setWhatsThis( i18n(
"Cuts the currently selected contact(s) to system clipboard in vCard format." ) );
1356 mActionPaste->setWhatsThis( i18n(
"Paste the previously cut or copied contacts from clipboard." ) );
1357 action->setWhatsThis( i18n(
"Selects all visible contacts from current view." ) );
1361 mActionDelete =
new TDEAction( i18n(
"&Delete Contact" ),
"edit-delete",
1362 Key_Delete,
this, TQ_SLOT( deleteContacts() ),
1363 actionCollection(),
"edit_delete" );
1364 mActionDelete->setWhatsThis( i18n(
"Delete all selected contacts." ) );
1367 mActionCopyAddresseeTo =
new TDEAction( i18n(
"&Copy Contact To..." ),
"", 0,
1368 this, TQ_SLOT( copySelectedContactToResource() ),
1369 actionCollection(),
"copy_contact_to" );
1370 const TQString copyMoveWhatsThis = i18n(
"Store a contact in a different Addressbook<p>You will be presented with a dialog where you can select a new storage place for this contact." );
1371 mActionCopyAddresseeTo->setWhatsThis( copyMoveWhatsThis );
1373 mActionMoveAddresseeTo =
new TDEAction( i18n(
"M&ove Contact To..." ),
"", 0,
1374 this, TQ_SLOT( moveSelectedContactToResource() ),
1375 actionCollection(),
"move_contact_to" );
1376 mActionMoveAddresseeTo->setWhatsThis( copyMoveWhatsThis );
1379 mActionJumpBar =
new TDEToggleAction( i18n(
"Show Jump Bar" ),
"next", 0,
1380 actionCollection(),
"options_show_jump_bar" );
1381 mActionJumpBar->setWhatsThis( i18n(
"Toggle whether the jump button bar shall be visible." ) );
1382 mActionJumpBar->setCheckedState( i18n(
"Hide Jump Bar") );
1383 connect( mActionJumpBar, TQ_SIGNAL( toggled(
bool ) ), TQ_SLOT( setJumpButtonBarVisible(
bool ) ) );
1385 mActionDetails =
new TDEToggleAction( i18n(
"Show Details" ), 0, 0,
1386 actionCollection(),
"options_show_details" );
1387 mActionDetails->setWhatsThis( i18n(
"Toggle whether the details page shall be visible." ) );
1388 mActionDetails->setCheckedState( i18n(
"Hide Details") );
1389 connect( mActionDetails, TQ_SIGNAL( toggled(
bool ) ), TQ_SLOT( setDetailsVisible(
bool ) ) );
1392 action =
new TDEAction( i18n(
"&Configure Address Book..." ),
"configure", 0,
1393 this, TQ_SLOT( configure() ), actionCollection(),
1394 "kaddressbook_configure" );
1396 action = KStdAction::preferences(
this, TQ_SLOT( configure() ), actionCollection() );
1398 action->setWhatsThis( i18n(
"You will be presented with a dialog, that offers you all possibilities to configure KAddressBook." ) );
1401 action =
new TDEAction( i18n(
"&Lookup Addresses in LDAP Directory..." ),
"edit-find", 0,
1402 this, TQ_SLOT( openLDAPDialog() ), actionCollection(),
"ldap_lookup" );
1403 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." ) );
1405 mActionWhoAmI =
new TDEAction( i18n(
"Set as Personal Contact Data" ),
"preferences-desktop-personal", 0,
this,
1406 TQ_SLOT( setWhoAmI() ), actionCollection(),
1407 "edit_set_personal" );
1408 mActionWhoAmI->setWhatsThis( i18n(
"Set the personal contact<p>The data of this contact will be used in many other TDE applications, so you do not have to input your personal data several times." ) );
1410 mActionCategories =
new TDEAction( i18n(
"Select Categories..." ), 0,
this,
1411 TQ_SLOT( setCategories() ), actionCollection(),
1412 "edit_set_categories" );
1413 mActionCategories->setWhatsThis( i18n(
"Set the categories for all selected contacts." ) );
1415 TDEAction *clearLocation =
new TDEAction( i18n(
"Clear Search Bar" ),
1416 TQApplication::reverseLayout() ?
"clear_left" :
"locationbar_erase",
1417 CTRL+Key_L,
this, TQ_SLOT( slotClearSearchBar() ), actionCollection(),
"clear_search" );
1418 clearLocation->setWhatsThis( i18n(
"Clear Search Bar<p>"
1419 "Clears the content of the quick search bar." ) );
1421 clipboardDataChanged();
1424void KABCore::clipboardDataChanged()
1427 mActionPaste->setEnabled( !TQApplication::clipboard()->text().isEmpty() );
1430void KABCore::updateIncSearchWidget()
1432 mIncSearchWidget->setViewFields( mViewManager->viewFields() );
1435void KABCore::updateCategories()
1437 TQStringList categories( allCategories() );
1440 const TQStringList customCategories( KABPrefs::instance()->customCategories() );
1441 TQStringList::ConstIterator it;
1442 const TQStringList::ConstIterator endIt( customCategories.end() );
1443 for ( it = customCategories.begin(); it != endIt; ++it ) {
1444 if ( categories.find( *it ) == categories.end() ) {
1445 categories.append( *it );
1449 KABPrefs::instance()->mCustomCategories = categories;
1450 KABPrefs::instance()->writeConfig();
1452 if ( mCategoryEditDialog )
1453 mCategoryEditDialog->reload();
1456TQStringList KABCore::allCategories()
const
1458 TQStringList categories, allCategories;
1459 TQStringList::ConstIterator catIt;
1462 if ( !mAddressBook ) {
1463 return allCategories;
1466 TDEABC::AddressBook::ConstIterator it;
1467 const TDEABC::AddressBook::ConstIterator endIt( mAddressBook->end() );
1468 for ( it = mAddressBook->begin(); it != endIt; ++it ) {
1469 categories = (*it).categories();
1470 const TQStringList::ConstIterator catEndIt( categories.end() );
1471 for ( catIt = categories.begin(); catIt != catEndIt; ++catIt ) {
1472 if ( !allCategories.contains( *catIt ) )
1473 allCategories.append( *catIt );
1477 return allCategories;
1480void KABCore::setCategories()
1483 if ( mCategorySelectDialog == 0 ) {
1484 mCategorySelectDialog =
new KPIM::CategorySelectDialog( KABPrefs::instance(), mWidget );
1485 connect( mCategorySelectDialog, TQ_SIGNAL( categoriesSelected(
const TQStringList& ) ),
1486 TQ_SLOT( categoriesSelected(
const TQStringList& ) ) );
1487 connect( mCategorySelectDialog, TQ_SIGNAL( editCategories() ), TQ_SLOT( editCategories() ) );
1490 mCategorySelectDialog->show();
1491 mCategorySelectDialog->raise();
1494void KABCore::categoriesSelected(
const TQStringList &categories )
1497 TQString msg = i18n(
"Merge with existing categories?" );
1498 if ( KMessageBox::questionYesNo( mWidget, msg, TQString(), i18n(
"Merge" ), i18n(
"Do Not Merge" ) ) == KMessageBox::Yes )
1501 TQStringList uids = mViewManager->selectedUids();
1502 TQStringList::ConstIterator it;
1503 const TQStringList::ConstIterator endIt( uids.end() );
1504 for ( it = uids.begin(); it != endIt; ++it ) {
1505 TDEABC::Addressee addr = mAddressBook->findByUid( *it );
1506 if ( !addr.isEmpty() ) {
1508 addr.setCategories( categories );
1510 TQStringList addrCategories = addr.categories();
1511 TQStringList::ConstIterator catIt;
1512 const TQStringList::ConstIterator catEndIt( categories.end() );
1513 for ( catIt = categories.begin(); catIt != catEndIt; ++catIt ) {
1514 if ( !addrCategories.contains( *catIt ) )
1515 addrCategories.append( *catIt );
1517 addr.setCategories( addrCategories );
1520 mAddressBook->insertAddressee( addr );
1524 if ( uids.count() > 0 )
1525 setModified(
true );
1528void KABCore::editCategories()
1530 if ( mCategoryEditDialog == 0 ) {
1531 mCategoryEditDialog =
new KPIM::CategoryEditDialog( KABPrefs::instance(), mWidget );
1532 connect( mCategoryEditDialog, TQ_SIGNAL( categoryConfigChanged() ),
1533 mCategorySelectDialog, TQ_SLOT( updateCategoryConfig() ) );
1536 mCategoryEditDialog->show();
1537 mCategoryEditDialog->raise();
1540void KABCore::slotClearSearchBar()
1542 mIncSearchWidget->clear();
1543 mIncSearchWidget->setFocus();
1546void KABCore::slotContactsUpdated()
1549 TQString msg( i18n(
"%n contact matches",
"%n contacts matching", mSearchManager->contacts().count() ) );
1550 if ( !mStatusBar->hasItem( 1 ) )
1551 mStatusBar->insertItem( msg, 1 );
1553 mStatusBar->changeItem( msg, 1 );
1556 emit contactsUpdated();
1559bool KABCore::handleCommandLine( KAddressBookIface* iface )
1561 TDECmdLineArgs *args = TDECmdLineArgs::parsedArgs();
1562 TQCString addrStr = args->getOption(
"addr" );
1563 TQCString uidStr = args->getOption(
"uid" );
1565 TQString addr, uid, vcard;
1566 if ( !addrStr.isEmpty() )
1567 addr = TQString::fromLocal8Bit( addrStr );
1568 if ( !uidStr.isEmpty() )
1569 uid = TQString::fromLocal8Bit( uidStr );
1571 bool doneSomething =
false;
1574 if ( !addr.isEmpty() ) {
1575 iface->addEmail( addr );
1576 doneSomething =
true;
1579 if ( !uid.isEmpty() ) {
1580 iface->showContactEditor( uid );
1581 doneSomething =
true;
1584 if ( args->isSet(
"new-contact" ) ) {
1585 iface->newContact();
1586 doneSomething =
true;
1589 if ( args->count() >= 1 ) {
1590 for (
int i = 0; i < args->count(); ++i )
1591 iface->importVCard( args->url( i ).url() );
1592 doneSomething =
true;
1594 return doneSomething;
1597void KABCore::removeSelectedContactsFromDistList()
1599#ifdef TDEPIM_NEW_DISTRLISTS
1601 KPIM::DistributionList dist = KPIM::DistributionList::findByName( addressBook(), mSelectedDistributionList );
1602 if ( dist.isEmpty() )
1604 const TQStringList uids = selectedUIDs();
1605 if ( uids.isEmpty() )
1609 TQStringList::ConstIterator it = uids.begin();
1610 const TQStringList::ConstIterator endIt( uids.end() );
1611 while ( it != endIt ) {
1612 TDEABC::Addressee addr = mAddressBook->findByUid( *it );
1613 names.append( addr.realName().isEmpty() ? addr.preferredEmail() : addr.realName() );
1617 if ( KMessageBox::warningContinueCancelList(
1620 "Do you really want to remove this contact from the %1 distribution list?<br>"
1621 "<b>Note:</b>The contact will be not be removed from your addressbook nor from "
1622 "any other distribution list."
1625 "Do you really want to remove these %n contacts from the %1 distribution list?<br>"
1626 "<b>Note:</b>The contacts will be not be removed from your addressbook nor from "
1627 "any other distribution list."
1629 uids.count() ).arg( mSelectedDistributionList ),
1630 names, TQString(), KStdGuiItem::del() ) == KMessageBox::Cancel ) {
1634 for ( TQStringList::ConstIterator uidIt = uids.begin(); uidIt != uids.end(); ++uidIt ) {
1635 typedef KPIM::DistributionList::Entry::List EntryList;
1636 const EntryList entries = dist.entries( addressBook() );
1637 for ( EntryList::ConstIterator it = entries.begin(); it != entries.end(); ++it ) {
1638 if ( (*it).addressee.uid() == (*uidIt) ) {
1639 dist.removeEntry( (*it).addressee, (*it).email );
1644 addressBook()->insertAddressee( dist );
1649void KABCore::sendMailToDistributionList(
const TQString &name )
1651#ifdef TDEPIM_NEW_DISTRLISTS
1652 KPIM::DistributionList dist = KPIM::DistributionList::findByName( addressBook(), name );
1653 if ( dist.isEmpty() )
1655 typedef KPIM::DistributionList::Entry::List EntryList;
1657 const EntryList entries = dist.entries( addressBook() );
1658 for ( EntryList::ConstIterator it = entries.begin(); it != entries.end(); ++it )
1659 mails += (*it).addressee.fullEmail( (*it).email );
1660 sendMail( mails.join(
", " ) );
1664void KABCore::editSelectedDistributionList()
1666#ifdef TDEPIM_NEW_DISTRLISTS
1667 editDistributionList( KPIM::DistributionList::findByName( addressBook(), mSelectedDistributionList ) );
1672void KABCore::editDistributionList(
const TQString &name )
1674#ifdef TDEPIM_NEW_DISTRLISTS
1675 editDistributionList( KPIM::DistributionList::findByName( addressBook(), name ) );
1679#ifdef TDEPIM_NEW_DISTRLISTS
1681void KABCore::showDistributionListEntry(
const TQString& uid )
1683 KPIM::DistributionList dist = KPIM::DistributionList::findByName( addressBook(), mSelectedDistributionList );
1684 if ( !dist.isEmpty() ) {
1685 mDistListEntryView->clear();
1686 typedef KPIM::DistributionList::Entry::List EntryList;
1687 const EntryList entries = dist.entries( addressBook() );
1688 for (EntryList::ConstIterator it = entries.begin(); it != entries.end(); ++it ) {
1689 if ( (*it).addressee.uid() == uid ) {
1690 mDistListEntryView->setEntry( dist, *it );
1697void KABCore::editDistributionList(
const KPIM::DistributionList &dist )
1699 if ( dist.isEmpty() )
1701 TQGuardedPtr<KPIM::DistributionListEditor::EditorWidget> dlg =
new KPIM::DistributionListEditor::EditorWidget( addressBook(), widget() );
1702 dlg->setDistributionList( dist );
1703 if ( dlg->exec() == TQDialog::Accepted && dlg ) {
1704 const KPIM::DistributionList newDist = dlg->distributionList();
1705 if ( newDist != dist ) {
1713KPIM::DistributionList::List KABCore::distributionLists()
const
1715 return mSearchManager->distributionLists();
1718void KABCore::setSelectedDistributionList(
const TQString &name )
1720 mSelectedDistributionList = name;
1721 mSearchManager->setSelectedDistributionList( name );
1722 mViewHeaderLabel->setText( name.isNull() ?
1723 i18n(
"Contacts" ) :
1724 i18n(
"Distribution List: %1" ).arg( name ) );
1725 mDistListButtonWidget->setShown( !mSelectedDistributionList.isNull() );
1726 if ( !name.isNull() ) {
1727 mDetailsStack->raiseWidget( mDistListEntryView );
1728 if ( selectedUIDs().isEmpty() ) {
1729 mViewManager->setFirstSelected(
true );
1731 const TQStringList selectedUids = selectedUIDs();
1732 showDistributionListEntry( selectedUids.isEmpty() ? TQString() : selectedUids.first() );
1734 mDetailsStack->raiseWidget( mExtensionManager->activeDetailsWidget() ?
1735 mExtensionManager->activeDetailsWidget() : mDetailsWidget );
1739TQStringList KABCore::distributionListNames()
const
1741 return mSearchManager->distributionListNames();
1745#include "kabcore.moc"
static TDEABC::Addressee::List clipboardToAddressees(const TQString &clipboard)
Convert a string from the clipboard into a list of addressee objects.
static TQString addresseesToClipboard(const TDEABC::Addressee::List &addrList)
Same as above function, except that an entire list of TDEABC::Addressee objects will be converted to ...