korganizer

koattendeeeditor.cpp
00001 /*
00002     Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org>
00003     Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
00004     Copyright (c) 2007 Volker Krause <vkrause@kde.org>
00005 
00006         This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019 */
00020 
00021 #include <config.h> // for TDEPIM_NEW_DISTRLISTS
00022 
00023 #include "koattendeeeditor.h"
00024 #include "koprefs.h"
00025 #include "koglobals.h"
00026 
00027 #ifndef KORG_NOKABC
00028 #include <tdeabc/addresseedialog.h>
00029 #include <libtdepim/addressesdialog.h>
00030 #include <libtdepim/addresseelineedit.h>
00031 #endif
00032 
00033 #include <libkcal/incidence.h>
00034 
00035 #include <libemailfunctions/email.h>
00036 
00037 #ifdef TDEPIM_NEW_DISTRLISTS
00038 #include "distributionlist.h"
00039 #else
00040 #include <tdeabc/distributionlist.h>
00041 #endif
00042 #include <tdeabc/stdaddressbook.h>
00043 
00044 #include <kiconloader.h>
00045 #include <tdelocale.h>
00046 #include <tdemessagebox.h>
00047 
00048 #include <tqcheckbox.h>
00049 #include <tqcombobox.h>
00050 #include <tqhbox.h>
00051 #include <tqlabel.h>
00052 #include <tqlayout.h>
00053 #include <tqpushbutton.h>
00054 #include <tqwhatsthis.h>
00055 
00056 using namespace KCal;
00057 
00058 KOAttendeeEditor::KOAttendeeEditor( TQWidget * parent, const char *name ) :
00059     TQWidget( parent, name ),
00060     mDisableItemUpdate( true )
00061 {
00062 }
00063 
00064 void KOAttendeeEditor::initOrganizerWidgets(TQWidget * parent, TQBoxLayout * layout)
00065 {
00066   mOrganizerHBox = new TQHBox( parent );
00067   layout->addWidget( mOrganizerHBox );
00068   // If creating a new event, then the user is the organizer -> show the
00069   // identity combo
00070   // readEvent will delete it and set another label text instead, if the user
00071   // isn't the organizer.
00072   // Note that the i18n text below is duplicated in readEvent
00073   TQString whatsThis = i18n("Sets the identity corresponding to "
00074                            "the organizer of this to-do or event. "
00075                            "Identities can be set in the 'Personal' "
00076                            "section of the KOrganizer configuration, or in the "
00077                            "'Security & Privacy'->'Password & User Account' "
00078                            "section of the Trinity Control Center. In addition, "
00079                            "identities are gathered from your KMail settings "
00080                            "and from your address book. If you choose "
00081                            "to set it globally for TDE in the Control Center, "
00082                            "be sure to check 'Use email settings from "
00083                            "Control Center' in the 'Personal' section of the "
00084                            "KOrganizer configuration.");
00085   mOrganizerLabel = new TQLabel( i18n( "Identity as organizer:" ),
00086                                 mOrganizerHBox );
00087   mOrganizerCombo = new TQComboBox( mOrganizerHBox );
00088   TQWhatsThis::add( mOrganizerLabel, whatsThis );
00089   TQWhatsThis::add( mOrganizerCombo, whatsThis );
00090   fillOrganizerCombo();
00091   mOrganizerHBox->setStretchFactor( mOrganizerCombo, 100 );
00092 }
00093 
00094 void KOAttendeeEditor::initEditWidgets(TQWidget * parent, TQBoxLayout * layout)
00095 {
00096   TQGridLayout *topLayout = new TQGridLayout();
00097   layout->addLayout( topLayout );
00098 
00099   TQString whatsThis = i18n("Edits the name of the attendee selected in the list "
00100                            "above, or adds a new attendee if there are no attendees"
00101                            "in the list.");
00102   TQLabel *attendeeLabel = new TQLabel( parent );
00103   TQWhatsThis::add( attendeeLabel, whatsThis );
00104   attendeeLabel->setText( i18n("Na&me:") );
00105   topLayout->addWidget( attendeeLabel, 0, 0 );
00106 
00107   mNameEdit = new KPIM::AddresseeLineEdit( parent );
00108   TQWhatsThis::add( mNameEdit, whatsThis );
00109   mNameEdit->setClickMessage( i18n("Click to add a new attendee") );
00110   attendeeLabel->setBuddy( mNameEdit );
00111   mNameEdit->installEventFilter( this );
00112   connect( mNameEdit, TQT_SIGNAL( textChanged( const TQString & ) ),
00113            TQT_SLOT( updateAttendee() ) );
00114   connect( mNameEdit, TQT_SIGNAL(returnPressed()), TQT_SLOT(expandAttendee()) );
00115   topLayout->addMultiCellWidget( mNameEdit, 0, 0, 1, 2 );
00116 
00117   whatsThis = i18n("Edits the role of the attendee selected "
00118                    "in the list above.");
00119   TQLabel *attendeeRoleLabel = new TQLabel( parent );
00120   TQWhatsThis::add( attendeeRoleLabel, whatsThis );
00121   attendeeRoleLabel->setText( i18n("Ro&le:") );
00122   topLayout->addWidget( attendeeRoleLabel, 1, 0 );
00123 
00124   mRoleCombo = new TQComboBox( false, parent );
00125   TQWhatsThis::add( mRoleCombo, whatsThis );
00126   mRoleCombo->insertStringList( Attendee::roleList() );
00127   attendeeRoleLabel->setBuddy( mRoleCombo );
00128   connect( mRoleCombo, TQT_SIGNAL( activated( int ) ),
00129            TQT_SLOT( updateAttendee() ) );
00130   topLayout->addWidget( mRoleCombo, 1, 1 );
00131 
00132   mDelegateLabel = new TQLabel( parent );
00133   topLayout->addWidget( mDelegateLabel, 1, 2 );
00134 
00135   whatsThis = i18n("Edits the current attendance status of the attendee "
00136                    "selected in the list above.");
00137   TQLabel *statusLabel = new TQLabel( parent );
00138   TQWhatsThis::add( statusLabel, whatsThis );
00139   statusLabel->setText( i18n("Stat&us:") );
00140   topLayout->addWidget( statusLabel, 2, 0 );
00141 
00142   mStatusCombo = new TQComboBox( false, parent );
00143   TQWhatsThis::add( mStatusCombo, whatsThis );
00144 //   mStatusCombo->insertStringList( Attendee::statusList() );
00145   mStatusCombo->insertItem( SmallIcon( "help" ), Attendee::statusName( Attendee::NeedsAction ) );
00146   mStatusCombo->insertItem( KOGlobals::self()->smallIcon( "ok" ), Attendee::statusName( Attendee::Accepted ) );
00147   mStatusCombo->insertItem( KOGlobals::self()->smallIcon( "no" ), Attendee::statusName( Attendee::Declined ) );
00148   mStatusCombo->insertItem( KOGlobals::self()->smallIcon( "apply" ), Attendee::statusName( Attendee::Tentative ) );
00149   mStatusCombo->insertItem( KOGlobals::self()->smallIcon( "mail-forward" ), Attendee::statusName( Attendee::Delegated ) );
00150   mStatusCombo->insertItem( Attendee::statusName( Attendee::Completed ) );
00151   mStatusCombo->insertItem( KOGlobals::self()->smallIcon( "help" ), Attendee::statusName( Attendee::InProcess ) );
00152 
00153   statusLabel->setBuddy( mStatusCombo );
00154   connect( mStatusCombo, TQT_SIGNAL( activated( int ) ),
00155            TQT_SLOT( updateAttendee() ) );
00156   topLayout->addWidget( mStatusCombo, 2, 1 );
00157 
00158   topLayout->setColStretch( 2, 1 );
00159 
00160   mRsvpButton = new TQCheckBox( parent );
00161   TQWhatsThis::add( mRsvpButton,
00162            i18n("Edits whether to send an email to the attendee "
00163             "selected in the list above to request "
00164             "a response concerning attendance.") );
00165   mRsvpButton->setText( i18n("Re&quest response") );
00166   connect( mRsvpButton, TQT_SIGNAL( clicked() ), TQT_SLOT( updateAttendee() ) );
00167   topLayout->addWidget( mRsvpButton, 2, 2 );
00168 
00169   TQWidget *buttonBox = new TQWidget( parent );
00170   TQVBoxLayout *buttonLayout = new TQVBoxLayout( buttonBox );
00171 
00172   mAddButton = new TQPushButton( i18n("&New"), buttonBox );
00173   TQWhatsThis::add( mAddButton,
00174            i18n("Adds a new attendee to the list. Once the "
00175             "attendee is added, you will be able to "
00176             "edit the attendee's name, role, attendance "
00177             "status, and whether or not the attendee is required "
00178             "to respond to the invitation. To select an attendee "
00179             "from your addressbook, click the 'Select Addressee' "
00180             "button instead.") );
00181   buttonLayout->addWidget( mAddButton );
00182   connect( mAddButton, TQT_SIGNAL( clicked() ), TQT_SLOT( addNewAttendee() ) );
00183 
00184   mRemoveButton = new TQPushButton( i18n("&Remove"), buttonBox );
00185   TQWhatsThis::add( mRemoveButton,
00186            i18n("Removes the attendee selected in "
00187             "the list above.") );
00188   buttonLayout->addWidget( mRemoveButton );
00189 
00190   mAddressBookButton = new TQPushButton( i18n("Select Addressee..."),
00191                                         buttonBox );
00192   TQWhatsThis::add( mAddressBookButton,
00193            i18n("Opens your address book, allowing you to select "
00194             "new attendees from it.") );
00195   buttonLayout->addWidget( mAddressBookButton );
00196   connect( mAddressBookButton, TQT_SIGNAL( clicked() ), TQT_SLOT( openAddressBook() ) );
00197 
00198   topLayout->addMultiCellWidget( buttonBox, 0, 3, 3, 3 );
00199 
00200 #ifdef KORG_NOKABC
00201   mAddressBookButton->hide();
00202 #endif
00203 }
00204 
00205 void KOAttendeeEditor::openAddressBook()
00206 {
00207 #ifndef KORG_NOKABC
00208   KPIM::AddressesDialog *dia = new KPIM::AddressesDialog( this, "adddialog" );
00209   dia->setShowCC( false );
00210   dia->setShowBCC( false );
00211   if ( dia->exec() ) {
00212     TDEABC::Addressee::List aList = dia->allToAddressesNoDuplicates();
00213     for ( TDEABC::Addressee::List::iterator itr = aList.begin();
00214           itr != aList.end(); ++itr ) {
00215       insertAttendeeFromAddressee( (*itr) );
00216     }
00217   }
00218   delete dia;
00219   return;
00220 #endif
00221 }
00222 
00223 void KOAttendeeEditor::insertAttendeeFromAddressee(const TDEABC::Addressee &a, const Attendee * at)
00224 {
00225   bool myself = KOPrefs::instance()->thatIsMe( a.preferredEmail() );
00226   bool sameAsOrganizer = mOrganizerCombo &&
00227   KPIM::compareEmail( a.preferredEmail(), mOrganizerCombo->currentText(), false );
00228   KCal::Attendee::PartStat partStat = at? at->status() : KCal::Attendee::NeedsAction;
00229   bool rsvp = at? at->RSVP() : true;
00230 
00231   if ( myself && sameAsOrganizer ) {
00232     partStat = KCal::Attendee::Accepted;
00233     rsvp = false;
00234   }
00235   Attendee *newAt = new Attendee( a.realName(),
00236                                   a.preferredEmail(),
00237                                   !myself, partStat,
00238                                   at ? at->role() : Attendee::ReqParticipant,
00239                                   a.uid() );
00240   newAt->setRSVP( rsvp );
00241   insertAttendee( newAt, true );
00242   mnewAttendees.append( newAt );
00243 }
00244 
00245 void KOAttendeeEditor::fillOrganizerCombo()
00246 {
00247   Q_ASSERT( mOrganizerCombo );
00248   // Get all emails from KOPrefs (coming from various places),
00249   // and insert them - removing duplicates
00250   const TQStringList lst = KOPrefs::instance()->fullEmails();
00251   TQStringList uniqueList;
00252   for( TQStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it ) {
00253     if ( uniqueList.find( *it ) == uniqueList.end() )
00254       uniqueList << *it;
00255   }
00256   mOrganizerCombo->insertStringList( uniqueList );
00257 }
00258 
00259 void KOAttendeeEditor::addNewAttendee()
00260 {
00261   // check if there's still an unchanged example entry, and if so
00262   // suggest to edit that first
00263   if ( TQListViewItem* item = hasExampleAttendee() ) {
00264       KMessageBox::information( this,
00265           i18n( "Please edit the example attendee, before adding more." ), TQString(),
00266           "EditExistingExampleAttendeeFirst" );
00267       // make sure the example attendee is selected
00268       item->setSelected( true );
00269       item->listView()->setCurrentItem( item );
00270       return;
00271   }
00272   Attendee *a = new Attendee( i18n("Firstname Lastname"),
00273                               i18n("name") + "@example.net", true );
00274   insertAttendee( a, false );
00275   mnewAttendees.append( a );
00276   updateAttendeeInput();
00277   // We don't want the hint again
00278   mNameEdit->setClickMessage( "" );
00279   mNameEdit->setFocus();
00280   TQTimer::singleShot( 0, mNameEdit, TQT_SLOT( selectAll() ) );
00281 }
00282 
00283 void KOAttendeeEditor::readEvent(KCal::Incidence * incidence)
00284 {
00285   mdelAttendees.clear();
00286   mnewAttendees.clear();
00287   if ( KOPrefs::instance()->thatIsMe( incidence->organizer().email() ) || incidence->organizer().isEmpty() ) {
00288     if ( !mOrganizerCombo ) {
00289       mOrganizerCombo = new TQComboBox( mOrganizerHBox );
00290       fillOrganizerCombo();
00291     }
00292     mOrganizerLabel->setText( i18n( "Identity as organizer:" ) );
00293 
00294     int found = -1;
00295     TQString fullOrganizer = incidence->organizer().fullName();
00296     for ( int i = 0 ; i < mOrganizerCombo->count(); ++i ) {
00297       if ( mOrganizerCombo->text( i ) == fullOrganizer ) {
00298         found = i;
00299         mOrganizerCombo->setCurrentItem( i );
00300         break;
00301       }
00302     }
00303     if ( found < 0 ) {
00304       mOrganizerCombo->insertItem( fullOrganizer, 0 );
00305       mOrganizerCombo->setCurrentItem( 0 );
00306     }
00307   } else { // someone else is the organizer
00308     if ( mOrganizerCombo ) {
00309       delete mOrganizerCombo;
00310       mOrganizerCombo = 0;
00311     }
00312     mOrganizerLabel->setText( i18n( "Organizer: %1" ).arg( incidence->organizer().fullName() ) );
00313   }
00314 
00315   Attendee::List al = incidence->attendees();
00316   Attendee::List::ConstIterator it;
00317   Attendee *first = 0;
00318   for( it = al.begin(); it != al.end(); ++it ) {
00319     Attendee *a = new Attendee( **it );
00320     if ( !first ) {
00321       first = a;
00322     }
00323     insertAttendee( a, true );
00324   }
00325 
00326   // Set the initial editing values to the first attendee in the list.
00327   if ( first ) {
00328     // Don't update the item here, the user didn't edit it, so it's not needed.
00329     // Also, AttendeeEditor's subclasses didn't set the current Item at this point
00330     // so if updateAttendee is called now what will happen is that a random item
00331     // will get the text of "first".
00332     mDisableItemUpdate = true;
00333 
00334     setSelected( 0 );
00335     mNameEdit->setText( first->fullName() );
00336     mUid = first->uid();
00337     mRoleCombo->setCurrentItem( first->role() );
00338     if ( first->status() != KCal::Attendee::None ) {
00339       mStatusCombo->setCurrentItem( first->status() );
00340     } else {
00341       mStatusCombo->setCurrentItem( KCal::Attendee::NeedsAction );
00342     }
00343     mRsvpButton->setChecked( first->RSVP() );
00344     mRsvpButton->setEnabled( true );
00345     mDisableItemUpdate = false;
00346   }
00347 }
00348 
00349 void KOAttendeeEditor::writeEvent(KCal::Incidence * incidence)
00350 {
00351   if ( mOrganizerCombo ) {
00352     // TODO: Don't take a string and split it up... Is there a better way?
00353     incidence->setOrganizer( mOrganizerCombo->currentText() );
00354   }
00355 }
00356 
00357 void KOAttendeeEditor::setEnableAttendeeInput(bool enabled)
00358 {
00359   //mNameEdit->setEnabled( enabled );
00360   mRoleCombo->setEnabled( enabled );
00361   mStatusCombo->setEnabled( enabled );
00362   mRsvpButton->setEnabled( enabled );
00363 
00364   mRemoveButton->setEnabled( enabled );
00365 }
00366 
00367 void KOAttendeeEditor::clearAttendeeInput()
00368 {
00369   mNameEdit->setText("");
00370   mUid = TQString();
00371   mRoleCombo->setCurrentItem(0);
00372   mStatusCombo->setCurrentItem(0);
00373   mRsvpButton->setChecked(true);
00374   setEnableAttendeeInput( false );
00375   mDelegateLabel->setText( TQString() );
00376 }
00377 
00378 void KOAttendeeEditor::expandAttendee()
00379 {
00380   TDEABC::Addressee::List aList = expandDistList( mNameEdit->text() );
00381   if ( !aList.isEmpty() ) {
00382     int index = selectedIndex();
00383     for ( TDEABC::Addressee::List::iterator itr = aList.begin(); itr != aList.end(); ++itr ) {
00384       insertAttendeeFromAddressee( (*itr) );
00385     }
00386     setSelected( index );
00387     removeAttendee( currentAttendee() );
00388   }
00389 }
00390 
00391 void KOAttendeeEditor::updateAttendee()
00392 {
00393   Attendee *a = currentAttendee();
00394   if ( !a || mDisableItemUpdate )
00395     return;
00396 
00397   TQString text = mNameEdit->text();
00398   if ( !mNameEdit->text().startsWith( "\"" ) ) {
00399     // Quote the text as it might contain commas and other quotable chars.
00400     text = KPIM::quoteNameIfNecessary( text );
00401   }
00402 
00403   TQString name, email;
00404   if ( KPIM::getNameAndMail( text, name, email ) ) {
00405     name.remove( '"' );
00406     email.remove( '"' ).remove( '>' );
00407   } else {
00408     name = TQString();
00409     email = mNameEdit->text();
00410   }
00411 
00412   bool iAmTheOrganizer = mOrganizerCombo &&
00413     KOPrefs::instance()->thatIsMe( mOrganizerCombo->currentText() );
00414   if ( iAmTheOrganizer ) {
00415     bool myself =
00416       KPIM::compareEmail( email, mOrganizerCombo->currentText(), false );
00417     bool wasMyself =
00418       KPIM::compareEmail( a->email(), mOrganizerCombo->currentText(), false );
00419     if ( myself ) {
00420       mRsvpButton->setChecked( false );
00421       mRsvpButton->setEnabled( false );
00422     } else if ( wasMyself ) {
00423       // this was me, but is no longer, reset
00424       mStatusCombo->setCurrentItem( KCal::Attendee::NeedsAction );
00425       mRsvpButton->setChecked( true );
00426       mRsvpButton->setEnabled( true );
00427     }
00428   }
00429   a->setName( name );
00430   a->setUid( mUid );
00431   a->setEmail( email );
00432   a->setRole( Attendee::Role( mRoleCombo->currentItem() ) );
00433   a->setStatus( Attendee::PartStat( mStatusCombo->currentItem() ) );
00434   a->setRSVP( mRsvpButton->isChecked() );
00435 
00436   updateCurrentItem();
00437 }
00438 
00439 void KOAttendeeEditor::fillAttendeeInput( KCal::Attendee *a )
00440 {
00441   mDisableItemUpdate = true;
00442 
00443   TQString tname, temail;
00444   TQString username = a->name();
00445   if ( !a->email().isEmpty() ) {
00446     username = KPIM::quoteNameIfNecessary( username );
00447 
00448     KPIM::getNameAndMail( username, tname, temail ); // ignore return value
00449                                                      // which is always false
00450     tname += " <" + a->email() + '>';
00451   }
00452 
00453   bool myself = KOPrefs::instance()->thatIsMe( a->email() );
00454   bool sameAsOrganizer = mOrganizerCombo &&
00455           KPIM::compareEmail( a->email(),
00456                                    mOrganizerCombo->currentText(), false );
00457   KCal::Attendee::PartStat partStat = a->status();
00458   bool rsvp = a->RSVP();
00459 
00460   if ( myself && sameAsOrganizer && a->status() == KCal::Attendee::None ) {
00461       partStat = KCal::Attendee::Accepted;
00462       rsvp = false;
00463   }
00464 
00465   mNameEdit->setText(tname);
00466   mUid = a->uid();
00467   mRoleCombo->setCurrentItem(a->role());
00468   if ( partStat != KCal::Attendee::None ) {
00469     mStatusCombo->setCurrentItem( partStat );
00470   } else {
00471     mStatusCombo->setCurrentItem( KCal::Attendee::NeedsAction );
00472   }
00473   mRsvpButton->setChecked( rsvp );
00474 
00475   mDisableItemUpdate = false;
00476   setEnableAttendeeInput( true );
00477 
00478   if ( a->status() == Attendee::Delegated ) {
00479     if ( !a->delegate().isEmpty() )
00480       mDelegateLabel->setText( i18n( "Delegated to %1" ).arg( a->delegate() ) );
00481     else if ( !a->delegator().isEmpty() )
00482       mDelegateLabel->setText( i18n( "Delegated from %1" ).arg( a->delegator() ) );
00483     else
00484       mDelegateLabel->setText( i18n( "Not delegated" ) );
00485   }
00486   if( myself )
00487     mRsvpButton->setEnabled( false );
00488 
00489 }
00490 
00491 void KOAttendeeEditor::updateAttendeeInput()
00492 {
00493   setEnableAttendeeInput(!mNameEdit->text().isEmpty());
00494   Attendee* a = currentAttendee();
00495   if ( a ) {
00496     fillAttendeeInput( a );
00497   } else {
00498     clearAttendeeInput();
00499   }
00500 }
00501 
00502 void KOAttendeeEditor::cancelAttendeeEvent( KCal::Incidence *incidence )
00503 {
00504   incidence->clearAttendees();
00505 
00506   if ( mdelAttendees.isEmpty() ) {
00507     return;
00508   }
00509 
00510   Attendee *att;
00511   for ( att = mdelAttendees.first(); att; att = mdelAttendees.next() ) {
00512     bool isNewAttendee = false;
00513     if ( !mnewAttendees.isEmpty() ) {
00514       for ( Attendee *newAtt = mnewAttendees.first(); newAtt; newAtt = mnewAttendees.next() ) {
00515         if ( *att == *newAtt ) {
00516           isNewAttendee = true;
00517           break;
00518         }
00519       }
00520     }
00521     if ( !isNewAttendee ) {
00522       incidence->addAttendee( new Attendee( *att ) );
00523     }
00524   }
00525   mdelAttendees.clear();
00526 }
00527 
00528 void KOAttendeeEditor::acceptForMe()
00529 {
00530   changeStatusForMe( Attendee::Accepted );
00531 }
00532 
00533 void KOAttendeeEditor::declineForMe()
00534 {
00535   changeStatusForMe( Attendee::Declined );
00536 }
00537 
00538 bool KOAttendeeEditor::eventFilter(TQObject *watched, TQEvent *ev)
00539 {
00540   if ( watched && TQT_BASE_OBJECT(watched) == TQT_BASE_OBJECT(mNameEdit) && ev->type() == TQEvent::FocusIn &&
00541        currentAttendee() == 0 ) {
00542     addNewAttendee();
00543   }
00544 
00545   return TQWidget::eventFilter( watched, ev );
00546 }
00547 
00548 bool KOAttendeeEditor::isExampleAttendee( const KCal::Attendee* attendee ) const
00549 {
00550     if ( !attendee ) return false;
00551     if ( attendee->name() == i18n( "Firstname Lastname" )
00552         && attendee->email().endsWith( "example.net" ) ) {
00553         return true;
00554     }
00555     return false;
00556 }
00557 
00558 TDEABC::Addressee::List KOAttendeeEditor::expandDistList( const TQString &text )  const
00559 {
00560   TDEABC::Addressee::List aList;
00561   TDEABC::AddressBook *abook = TDEABC::StdAddressBook::self( true );
00562 
00563 #ifdef TDEPIM_NEW_DISTRLISTS
00564   const TQValueList<KPIM::DistributionList::Entry> eList =
00565     KPIM::DistributionList::findByName( abook, text ).entries( abook );
00566   TQValueList<KPIM::DistributionList::Entry>::ConstIterator eit;
00567   for ( eit = eList.begin(); eit != eList.end(); ++eit ) {
00568     TDEABC::Addressee a = (*eit).addressee;
00569     if ( !a.preferredEmail().isEmpty() && aList.find( a ) == aList.end() ) {
00570       aList.append( a ) ;
00571     }
00572   }
00573 
00574 #else
00575   TDEABC::DistributionListManager manager( abook );
00576   manager.load();
00577   const TQStringList dList = manager.listNames();
00578   for ( TQStringList::ConstIterator it = dList.begin(); it != dList.end(); ++it ) {
00579     if ( (*it) == text ) {
00580       const TQValueList<TDEABC::DistributionList::Entry> eList = manager.list( *it )->entries();
00581       TQValueList<TDEABC::DistributionList::Entry>::ConstIterator eit;
00582       for ( eit = eList.begin(); eit != eList.end(); ++eit ) {
00583         TDEABC::Addressee a = (*eit).addressee;
00584         if ( !a.preferredEmail().isEmpty() && aList.find( a ) == aList.end() ) {
00585           aList.append( a ) ;
00586         }
00587       }
00588     }
00589   }
00590 #endif
00591   return aList;
00592 }
00593 
00594 
00595 #include "koattendeeeditor.moc"