00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#include "koeditordetails.h"
00026
00027
#include <qtooltip.h>
00028
#include <qfiledialog.h>
00029
#include <qlayout.h>
00030
#include <qvbox.h>
00031
#include <qbuttongroup.h>
00032
#include <qvgroupbox.h>
00033
#include <qwidgetstack.h>
00034
#include <qdatetime.h>
00035
#include <qdragobject.h>
00036
#include <qcombobox.h>
00037
#include <qlineedit.h>
00038
#include <qlabel.h>
00039
#include <qcheckbox.h>
00040
#include <qpushbutton.h>
00041
#include <qgroupbox.h>
00042
#include <qradiobutton.h>
00043
00044
#include <kdebug.h>
00045
#include <klocale.h>
00046
#include <kiconloader.h>
00047
#include <kmessagebox.h>
00048
#ifndef KORG_NOKABC
00049
#include <kabc/addresseedialog.h>
00050
#include <kabc/vcardconverter.h>
00051
#include <libkdepim/addressesdialog.h>
00052
#include <libkdepim/addresseelineedit.h>
00053
#include <kabc/distributionlist.h>
00054
#include <kabc/stdaddressbook.h>
00055
#endif
00056
#include <libkdepim/kvcarddrag.h>
00057
#include <libkdepim/email.h>
00058
00059
#include <libkcal/incidence.h>
00060
00061
#include "koprefs.h"
00062
#include "koglobals.h"
00063
00064
#include "koeditorfreebusy.h"
00065
00066
#include "kocore.h"
00067
00068
template <>
00069 CustomListViewItem<class Attendee *>::~CustomListViewItem()
00070 {
00071
delete mData;
00072 }
00073
00074
template <>
00075
void CustomListViewItem<class Attendee *>::updateItem()
00076 {
00077 setText(0,mData->name());
00078 setText(1,mData->email());
00079 setText(2,mData->roleStr());
00080 setText(3,mData->statusStr());
00081
if (mData->RSVP() && !mData->email().isEmpty())
00082 setPixmap(4,KOGlobals::self()->smallIcon(
"mailappt"));
00083
else
00084 setPixmap(4,KOGlobals::self()->smallIcon(
"nomailappt"));
00085 }
00086
00087 KOAttendeeListView::KOAttendeeListView (
QWidget *parent,
const char *name )
00088 : KListView(parent, name)
00089 {
00090 setAcceptDrops(
true );
00091 setAllColumnsShowFocus(
true );
00092 }
00093
00099 KOAttendeeListView::~KOAttendeeListView()
00100 {
00101 }
00102
00103
void KOAttendeeListView::contentsDragEnterEvent(
QDragEnterEvent *e )
00104 {
00105 dragEnterEvent(e);
00106 }
00107
00108
void KOAttendeeListView::contentsDragMoveEvent(
QDragMoveEvent *e )
00109 {
00110
#ifndef KORG_NODND
00111
if ( KVCardDrag::canDecode( e ) || QTextDrag::canDecode( e ) ) {
00112 e->accept();
00113 }
else {
00114 e->ignore();
00115 }
00116
#endif
00117
}
00118
00119
void KOAttendeeListView::dragEnterEvent(
QDragEnterEvent *e )
00120 {
00121
#ifndef KORG_NODND
00122
if ( KVCardDrag::canDecode( e ) || QTextDrag::canDecode( e ) ) {
00123 e->accept();
00124 }
else {
00125 e->ignore();
00126 }
00127
#endif
00128
}
00129
00130
void KOAttendeeListView::addAttendee(
const QString &newAttendee )
00131 {
00132 kdDebug(5850) <<
" Email: " << newAttendee << endl;
00133
QString name;
00134
QString email;
00135 KPIM::getNameAndMail( newAttendee, name, email );
00136 emit dropped(
new Attendee( name, email ) );
00137 }
00138
00139
void KOAttendeeListView::contentsDropEvent(
QDropEvent *e )
00140 {
00141 dropEvent(e);
00142 }
00143
00144
void KOAttendeeListView::dropEvent(
QDropEvent *e )
00145 {
00146
#ifndef KORG_NODND
00147
QString text;
00148
QString vcards;
00149
00150
#ifndef KORG_NOKABC
00151
if ( KVCardDrag::decode( e, vcards ) ) {
00152 KABC::VCardConverter converter;
00153
00154 KABC::Addressee::List list = converter.parseVCards( vcards );
00155 KABC::Addressee::List::Iterator it;
00156
for ( it = list.begin(); it != list.end(); ++it ) {
00157
QString em( (*it).fullEmail() );
00158
if (em.isEmpty()) {
00159 em=(*it).realName();
00160 }
00161 addAttendee( em );
00162 }
00163 }
else
00164
#endif // KORG_NOKABC
00165
if (QTextDrag::decode(e,text)) {
00166 kdDebug(5850) <<
"Dropped : " << text << endl;
00167
QStringList emails = QStringList::split(
",",text);
00168
for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) {
00169 addAttendee(*it);
00170 }
00171 }
00172
#endif //KORG_NODND
00173
}
00174
00175
00176 KOEditorDetails::KOEditorDetails(
int spacing,
QWidget *parent,
00177
const char *name )
00178 :
QWidget( parent, name), mDisableItemUpdate( false ), mFreeBusy( 0 )
00179 {
00180
QGridLayout *topLayout =
new QGridLayout(
this );
00181 topLayout->setSpacing( spacing );
00182
00183 mOrganizerHBox =
new QHBox(
this );
00184
00185
00186
00187
00188
00189 mOrganizerLabel =
new QLabel( i18n(
"Identity as organizer:" ),
00190 mOrganizerHBox );
00191 mOrganizerCombo =
new QComboBox( mOrganizerHBox );
00192 fillOrganizerCombo();
00193 mOrganizerHBox->setStretchFactor( mOrganizerCombo, 100 );
00194
00195 mListView =
new KOAttendeeListView(
this,
"mListView" );
00196 mListView->addColumn( i18n(
"Name"), 200 );
00197 mListView->addColumn( i18n(
"Email"), 200 );
00198 mListView->addColumn( i18n(
"Role"), 60 );
00199 mListView->addColumn( i18n(
"Status"), 100 );
00200 mListView->addColumn( i18n(
"RSVP"), 35 );
00201 mListView->setResizeMode( QListView::LastColumn );
00202
if ( KOPrefs::instance()->mCompactDialogs ) {
00203 mListView->setFixedHeight( 78 );
00204 }
00205
00206 connect( mListView, SIGNAL( selectionChanged(
QListViewItem * ) ),
00207 SLOT( updateAttendeeInput() ) );
00208
#ifndef KORG_NODND
00209
connect( mListView, SIGNAL( dropped( Attendee * ) ),
00210 SLOT( insertAttendee( Attendee * ) ) );
00211
#endif
00212
00213 QLabel *attendeeLabel =
new QLabel(
this );
00214 attendeeLabel->setText( i18n(
"Na&me:") );
00215
00216 mNameEdit =
new KPIM::AddresseeLineEdit(
this );
00217 mNameEdit->setClickMessage( i18n(
"Click to add a new attendee") );
00218 attendeeLabel->setBuddy( mNameEdit );
00219 mNameEdit->installEventFilter(
this );
00220 connect( mNameEdit, SIGNAL( textChanged(
const QString & ) ),
00221 SLOT( updateAttendeeItem() ) );
00222
00223 mUidEdit =
new QLineEdit( 0 );
00224 mUidEdit->setText(
"" );
00225
00226 QLabel *attendeeRoleLabel =
new QLabel(
this );
00227 attendeeRoleLabel->setText( i18n(
"Ro&le:") );
00228
00229 mRoleCombo =
new QComboBox(
false,
this );
00230 mRoleCombo->insertStringList( Attendee::roleList() );
00231 attendeeRoleLabel->setBuddy( mRoleCombo );
00232 connect( mRoleCombo, SIGNAL( activated(
int ) ),
00233 SLOT( updateAttendeeItem() ) );
00234
00235 QLabel *statusLabel =
new QLabel(
this );
00236 statusLabel->setText( i18n(
"Stat&us:") );
00237
00238 mStatusCombo =
new QComboBox(
false,
this );
00239 mStatusCombo->insertStringList( Attendee::statusList() );
00240 statusLabel->setBuddy( mStatusCombo );
00241 connect( mStatusCombo, SIGNAL( activated(
int ) ),
00242 SLOT( updateAttendeeItem() ) );
00243
00244 mRsvpButton =
new QCheckBox(
this );
00245 mRsvpButton->setText( i18n(
"Re&quest response") );
00246 connect( mRsvpButton, SIGNAL( clicked() ), SLOT( updateAttendeeItem() ) );
00247
00248
QWidget *buttonBox =
new QWidget(
this );
00249
QVBoxLayout *buttonLayout =
new QVBoxLayout( buttonBox );
00250
00251
QPushButton *newButton =
new QPushButton( i18n(
"&New"), buttonBox );
00252 buttonLayout->addWidget( newButton );
00253 connect( newButton, SIGNAL( clicked() ), SLOT( addNewAttendee() ) );
00254
00255 mRemoveButton =
new QPushButton( i18n(
"&Remove"), buttonBox );
00256 buttonLayout->addWidget( mRemoveButton );
00257 connect( mRemoveButton, SIGNAL( clicked() ), SLOT( removeAttendee() ) );
00258
00259 mAddressBookButton =
new QPushButton( i18n(
"Select Addressee..."),
00260 buttonBox );
00261 buttonLayout->addWidget( mAddressBookButton );
00262 connect( mAddressBookButton, SIGNAL( clicked() ), SLOT( openAddressBook() ) );
00263
00264 topLayout->addMultiCellWidget( mOrganizerHBox, 0, 0, 0, 5 );
00265 topLayout->addMultiCellWidget( mListView, 1, 1, 0, 5 );
00266 topLayout->addWidget( attendeeLabel, 2, 0 );
00267 topLayout->addMultiCellWidget( mNameEdit, 2, 2, 1, 1 );
00268
00269 topLayout->addWidget( attendeeRoleLabel, 3, 0 );
00270 topLayout->addWidget( mRoleCombo, 3, 1 );
00271
#if 0
00272
topLayout->setColStretch( 2, 1 );
00273 topLayout->addWidget( statusLabel, 3, 3 );
00274 topLayout->addWidget( mStatusCombo, 3, 4 );
00275
#else
00276
topLayout->addWidget( statusLabel, 4, 0 );
00277 topLayout->addWidget( mStatusCombo, 4, 1 );
00278
#endif
00279
topLayout->addMultiCellWidget( mRsvpButton, 5, 5, 0, 1 );
00280 topLayout->addMultiCellWidget( buttonBox, 2, 4, 5, 5 );
00281
00282
#ifdef KORG_NOKABC
00283
mAddressBookButton->hide();
00284
#endif
00285
00286 updateAttendeeInput();
00287 }
00288
00289 KOEditorDetails::~KOEditorDetails()
00290 {
00291 }
00292
00293
bool KOEditorDetails::eventFilter(
QObject *watched,
QEvent *ev)
00294 {
00295
if ( watched && watched == mNameEdit && ev->type() == QEvent::FocusIn &&
00296 mListView->childCount() == 0 ) {
00297 addNewAttendee();
00298 }
00299
00300
return QWidget::eventFilter( watched, ev );
00301 }
00302
00303
void KOEditorDetails::removeAttendee()
00304 {
00305 AttendeeListItem *aItem =
00306 static_cast<AttendeeListItem *>( mListView->selectedItem() );
00307
if ( !aItem )
return;
00308
00309 Attendee *delA =
new Attendee( aItem->data()->name(), aItem->data()->email(),
00310 aItem->data()->RSVP(), aItem->data()->status(),
00311 aItem->data()->role(), aItem->data()->uid() );
00312 mdelAttendees.append( delA );
00313
00314
if ( mFreeBusy ) mFreeBusy->removeAttendee( aItem->data() );
00315
delete aItem;
00316
00317 updateAttendeeInput();
00318 }
00319
00320
00321
void KOEditorDetails::openAddressBook()
00322 {
00323
#ifndef KORG_NOKABC
00324
KPIM::AddressesDialog *dia =
new KPIM::AddressesDialog(
this,
"adddialog" );
00325 dia->setShowCC(
false );
00326 dia->setShowBCC(
false );
00327
if ( dia->exec() ) {
00328 KABC::Addressee::List aList = dia->allToAddressesNoDuplicates();
00329
for ( KABC::Addressee::List::iterator itr = aList.begin();
00330 itr != aList.end(); ++itr ) {
00331 KABC::Addressee a = (*itr);
00332
bool myself = KOPrefs::instance()->thatIsMe( a.preferredEmail() );
00333 KCal::Attendee::PartStat partStat;
00334
if ( myself ) partStat = KCal::Attendee::Accepted;
00335
else partStat = KCal::Attendee::NeedsAction;
00336 insertAttendee(
new Attendee( a.realName(), a.preferredEmail(),
00337 !myself, partStat,
00338 KCal::Attendee::ReqParticipant, a.uid() ) );
00339 }
00340 }
00341
delete dia;
00342
return;
00343
#if 0
00344
00345 KABC::Addressee a = KABC::AddresseeDialog::getAddressee(
this);
00346
if (!a.isEmpty()) {
00347
00348
00349
bool myself = KOPrefs::instance()->thatIsMe( a.preferredEmail() );
00350 KCal::Attendee::PartStat partStat =
00351 myself ? KCal::Attendee::Accepted : KCal::Attendee::NeedsAction;
00352 insertAttendee(
new Attendee( a.realName(), a.preferredEmail(),
00353 !myself, partStat,
00354 KCal::Attendee::ReqParticipant, a.uid() ) );
00355 }
00356
#endif
00357
#endif
00358
}
00359
00360
00361
void KOEditorDetails::addNewAttendee()
00362 {
00363 Attendee *a =
new Attendee( i18n(
"Firstname Lastname"),
00364 i18n(
"name@domain.com") );
00365 insertAttendee( a );
00366
00367 mNameEdit->setClickMessage(
"" );
00368 mNameEdit->setFocus();
00369 QTimer::singleShot( 0, mNameEdit, SLOT( selectAll() ) );
00370 }
00371
00372
00373
void KOEditorDetails::insertAttendee( Attendee *a )
00374 {
00375 AttendeeListItem *item =
new AttendeeListItem( a, mListView );
00376 mListView->setSelected( item,
true );
00377
if( mFreeBusy ) mFreeBusy->insertAttendee( a );
00378 }
00379
00380
void KOEditorDetails::setDefaults()
00381 {
00382 mRsvpButton->setChecked(
true );
00383 }
00384
00385
void KOEditorDetails::readEvent( Incidence *event )
00386 {
00387
00388
bool block =
false;
00389
if( mFreeBusy ) {
00390 block = mFreeBusy->updateEnabled();
00391 mFreeBusy->setUpdateEnabled(
false );
00392 mFreeBusy->clearAttendees();
00393 }
00394
00395 mListView->clear();
00396 mdelAttendees.clear();
00397 Attendee::List al = event->attendees();
00398 Attendee::List::ConstIterator it;
00399
for( it = al.begin(); it != al.end(); ++it )
00400 insertAttendee(
new Attendee( **it ) );
00401
00402 mListView->setSelected( mListView->firstChild(),
true );
00403
00404
if ( KOPrefs::instance()->thatIsMe( event->organizer() ) ) {
00405
if ( !mOrganizerCombo ) {
00406 mOrganizerCombo =
new QComboBox( mOrganizerHBox );
00407 fillOrganizerCombo();
00408 }
00409 mOrganizerLabel->setText( i18n(
"Identity as organizer:" ) );
00410
00411
00412
00413
for (
int i = 0 ; i < mOrganizerCombo->count(); ++i ) {
00414
QString itemTxt = KPIM::getEmailAddr( mOrganizerCombo->text( i ) );
00415
if ( KPIM::compareEmail( event->organizer(), itemTxt,
false ) ) {
00416
00417 mOrganizerCombo->changeItem( event->organizer(), i );
00418 mOrganizerCombo->setCurrentItem( i );
00419
break;
00420 }
00421 }
00422 }
else {
00423
if ( mOrganizerCombo ) {
00424
delete mOrganizerCombo;
00425 mOrganizerCombo = 0;
00426 }
00427 mOrganizerLabel->setText( i18n(
"Organizer: %1" ).arg( event->organizer() ) );
00428 }
00429
00430
00431
if( mFreeBusy ) mFreeBusy->setUpdateEnabled( block );
00432 }
00433
00434
void KOEditorDetails::writeEvent(Incidence *event)
00435 {
00436 event->clearAttendees();
00437
QListViewItem *item;
00438 AttendeeListItem *a;
00439
for (item = mListView->firstChild(); item;
00440 item = item->nextSibling()) {
00441 a = (AttendeeListItem *)item;
00442 event->addAttendee(
new Attendee(*(a->data())));
00443 }
00444
if ( mOrganizerCombo ) {
00445 event->setOrganizer( mOrganizerCombo->currentText() );
00446 }
00447 }
00448
00449
void KOEditorDetails::cancelAttendeeEvent(Incidence *event)
00450 {
00451 event->clearAttendees();
00452 Attendee * att;
00453
for (att=mdelAttendees.first();att;att=mdelAttendees.next()) {
00454 event->addAttendee(
new Attendee(*att));
00455 }
00456 mdelAttendees.clear();
00457 }
00458
00459
bool KOEditorDetails::validateInput()
00460 {
00461
return true;
00462 }
00463
00464
void KOEditorDetails::updateAttendeeInput()
00465 {
00466
00467 setEnableAttendeeInput(!mNameEdit->text().isEmpty());
00468
QListViewItem *item = mListView->selectedItem();
00469 AttendeeListItem *aItem = static_cast<AttendeeListItem *>( item );
00470
if (aItem) {
00471 fillAttendeeInput( aItem );
00472 }
else {
00473 clearAttendeeInput();
00474 }
00475 }
00476
00477
void KOEditorDetails::clearAttendeeInput()
00478 {
00479 mNameEdit->setText(
"");
00480 mUidEdit->setText(
"");
00481 mRoleCombo->setCurrentItem(0);
00482 mStatusCombo->setCurrentItem(0);
00483 mRsvpButton->setChecked(
true);
00484 setEnableAttendeeInput(
false );
00485 }
00486
00487
void KOEditorDetails::fillAttendeeInput( AttendeeListItem *aItem )
00488 {
00489 Attendee *a = aItem->data();
00490 mDisableItemUpdate =
true;
00491
QString name = a->name();
00492
if (!a->email().isEmpty())
00493 name +=
" <" + a->email() +
">";
00494 mNameEdit->setText(name);
00495 mUidEdit->setText(a->uid());
00496 mRoleCombo->setCurrentItem(a->role());
00497 mStatusCombo->setCurrentItem(a->status());
00498 mRsvpButton->setChecked(a->RSVP());
00499
00500 mDisableItemUpdate =
false;
00501
00502 setEnableAttendeeInput(
true );
00503 }
00504
00505
void KOEditorDetails::setEnableAttendeeInput(
bool enabled )
00506 {
00507
00508 mRoleCombo->setEnabled( enabled );
00509 mStatusCombo->setEnabled( enabled );
00510 mRsvpButton->setEnabled( enabled );
00511
00512 mRemoveButton->setEnabled( enabled );
00513 }
00514
00515
void KOEditorDetails::updateAttendeeItem()
00516 {
00517
if (mDisableItemUpdate)
return;
00518
00519
QListViewItem *item = mListView->selectedItem();
00520 AttendeeListItem *aItem = static_cast<AttendeeListItem *>( item );
00521
if ( !aItem )
return;
00522
00523 Attendee *a = aItem->data();
00524
00525
QString name;
00526
QString email;
00527 KPIM::getNameAndMail(mNameEdit->text(), name, email);
00528 a->setName( name );
00529 a->setUid( mUidEdit->text() );
00530 a->setEmail( email );
00531 a->setRole( Attendee::Role( mRoleCombo->currentItem() ) );
00532 a->setStatus( Attendee::PartStat( mStatusCombo->currentItem() ) );
00533 a->setRSVP( mRsvpButton->isChecked() );
00534 aItem->updateItem();
00535
if ( mFreeBusy ) mFreeBusy->updateAttendee( a );
00536 }
00537
00538
void KOEditorDetails::setFreeBusyWidget( KOEditorFreeBusy *v )
00539 {
00540 mFreeBusy = v;
00541 }
00542
00543
void KOEditorDetails::fillOrganizerCombo()
00544 {
00545 Q_ASSERT( mOrganizerCombo );
00546
00547
00548
const QStringList lst = KOPrefs::instance()->allEmails();
00549
QStringList uniqueList;
00550
for( QStringList::ConstIterator it = lst.begin(); it != lst.end(); ++it ) {
00551
if ( uniqueList.find( *it ) == uniqueList.end() )
00552 uniqueList << *it;
00553 }
00554 mOrganizerCombo->insertStringList( uniqueList );
00555 }
00556
00557
#include "koeditordetails.moc"