00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <qtooltip.h>
00025 #include <qfiledialog.h>
00026 #include <qlayout.h>
00027 #include <qvbox.h>
00028 #include <qbuttongroup.h>
00029 #include <qvgroupbox.h>
00030 #include <qwidgetstack.h>
00031 #include <qdatetime.h>
00032 #include <qdragobject.h>
00033
00034 #include <kdebug.h>
00035 #include <klocale.h>
00036 #include <kiconloader.h>
00037 #include <kmessagebox.h>
00038 #ifndef KORG_NOKABC
00039 #include <kabc/addresseedialog.h>
00040 #include <kabc/vcardconverter.h>
00041 #endif
00042 #include <libkdepim/kvcarddrag.h>
00043
00044 #include <libkcal/incidence.h>
00045
00046 #include "koprefs.h"
00047 #include "koglobals.h"
00048
00049 #include "koeditorgantt.h"
00050 #include "koeditordetails.h"
00051 #include "koeditordetails.moc"
00052
00053 template <>
00054 CustomListViewItem<class Attendee *>::~CustomListViewItem()
00055 {
00056 delete mData;
00057 }
00058
00059 template <>
00060 void CustomListViewItem<class Attendee *>::updateItem()
00061 {
00062 setText(0,mData->name());
00063 setText(1,mData->email());
00064 setText(2,mData->roleStr());
00065 setText(3,mData->statusStr());
00066 if (mData->RSVP() && !mData->email().isEmpty())
00067 setPixmap(4,KOGlobals::self()->smallIcon("mailappt"));
00068 else
00069 setPixmap(4,KOGlobals::self()->smallIcon("nomailappt"));
00070 }
00071
00072 KOAttendeeListView::KOAttendeeListView (QWidget *parent, const char *name)
00073 : KListView(parent, name)
00074 {
00075 setAcceptDrops(true);
00076 }
00077
00083 KOAttendeeListView::~KOAttendeeListView()
00084 {
00085 }
00086
00087 void KOAttendeeListView::contentsDragEnterEvent( QDragEnterEvent *e )
00088 {
00089 dragEnterEvent(e);
00090 }
00091
00092 void KOAttendeeListView::contentsDragMoveEvent(QDragMoveEvent *e)
00093 {
00094 #ifndef KORG_NODND
00095 if ( KVCardDrag::canDecode( e ) || QTextDrag::canDecode( e ) ) {
00096 e->accept();
00097 } else {
00098 e->ignore();
00099 }
00100 #endif
00101 }
00102 void KOAttendeeListView::dragEnterEvent( QDragEnterEvent *e )
00103 {
00104 #ifndef KORG_NODND
00105 if ( KVCardDrag::canDecode( e ) || QTextDrag::canDecode( e ) ) {
00106 e->accept();
00107 } else {
00108 e->ignore();
00109 }
00110 #endif
00111 }
00112
00113 void KOAttendeeListView::addAttendee(QString newAttendee)
00114 {
00115 kdDebug(5850) << " Email: " << newAttendee << endl;
00116 int pos = newAttendee.find("<");
00117 QString name = newAttendee.left(pos);
00118 QString email = newAttendee.mid(pos);
00119 if (!email.isEmpty()) {
00120 emit dropped(new Attendee(name,email));
00121 } else if (name.contains("@")) {
00122 emit dropped(new Attendee(name, name));
00123 } else
00124 emit dropped(new Attendee(name, QString::null));
00125 }
00126
00127 void KOAttendeeListView::contentsDropEvent( QDropEvent *e )
00128 {
00129 dropEvent(e);
00130 }
00131
00132 void KOAttendeeListView::dropEvent( QDropEvent *e )
00133 {
00134 #ifndef KORG_NODND
00135 QString text;
00136 QString vcards;
00137
00138 #ifndef KORG_NOKABC
00139 if ( KVCardDrag::decode( e, vcards ) ) {
00140 KABC::VCardConverter converter;
00141
00142 KABC::Addressee::List list = converter.parseVCards( vcards );
00143 KABC::Addressee::List::Iterator it;
00144 for ( it = list.begin(); it != list.end(); ++it ) {
00145 QString em( (*it).fullEmail() );
00146 if (em.isEmpty()) {
00147 em=(*it).realName();
00148 }
00149 addAttendee( em );
00150 }
00151 } else
00152 #endif // KORG_NOKABC
00153 if (QTextDrag::decode(e,text)) {
00154 kdDebug(5850) << "Dropped : " << text << endl;
00155 QStringList emails = QStringList::split(",",text);
00156 for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) {
00157 addAttendee(*it);
00158 }
00159 }
00160 #endif //KORG_NODND
00161 }
00162
00163
00164 KOEditorDetails::KOEditorDetails (int spacing,QWidget* parent,const char* name)
00165 : QWidget( parent, name), mDisableItemUpdate( false ), mGantt( 0 )
00166 {
00167 QGridLayout *topLayout = new QGridLayout(this);
00168 topLayout->setSpacing(spacing);
00169
00170 QString organizer = KOPrefs::instance()->email();
00171 mOrganizerLabel = new QLabel(i18n("Organizer: %1").arg(organizer),this);
00172
00173 mListView = new KOAttendeeListView(this,"mListView");
00174 mListView->addColumn(i18n("Name"),180);
00175 mListView->addColumn(i18n("Email"),180);
00176 mListView->addColumn(i18n("Role"),60);
00177 mListView->addColumn(i18n("Status"),100);
00178 mListView->addColumn(i18n("RSVP"),35);
00179 if ( KOPrefs::instance()->mCompactDialogs ) {
00180 mListView->setFixedHeight(78);
00181 }
00182
00183 connect(mListView,SIGNAL(selectionChanged(QListViewItem *)),
00184 SLOT(updateAttendeeInput()));
00185 #ifndef KORG_NODND
00186 connect(mListView, SIGNAL(dropped( Attendee *)),
00187 SLOT(insertAttendee(Attendee *)));
00188 #endif
00189
00190 QLabel *attendeeLabel = new QLabel(this);
00191 attendeeLabel->setText(i18n("Na&me:"));
00192
00193 mNameEdit = new QLineEdit(this);
00194 attendeeLabel->setBuddy( mNameEdit );
00195 connect(mNameEdit,SIGNAL(textChanged(const QString &)),
00196 SLOT(updateAttendeeItem()));
00197
00198 mUidEdit = new QLineEdit(0);
00199 mUidEdit->setText("");
00200
00201 QLabel *emailLabel = new QLabel(this);
00202 emailLabel->setText(i18n("&Email:"));
00203
00204 mEmailEdit = new QLineEdit(this);
00205 emailLabel->setBuddy( mEmailEdit );
00206 connect(mEmailEdit,SIGNAL(textChanged(const QString &)),
00207 SLOT(updateAttendeeItem()));
00208
00209 QLabel *attendeeRoleLabel = new QLabel(this);
00210 attendeeRoleLabel->setText(i18n("Ro&le:"));
00211
00212 mRoleCombo = new QComboBox(false,this);
00213 mRoleCombo->insertStringList(Attendee::roleList());
00214 attendeeRoleLabel->setBuddy( mRoleCombo );
00215 connect(mRoleCombo,SIGNAL(activated(int)),SLOT(updateAttendeeItem()));
00216
00217 QLabel *statusLabel = new QLabel(this);
00218 statusLabel->setText( i18n("Stat&us:") );
00219
00220 mStatusCombo = new QComboBox(false,this);
00221 mStatusCombo->insertStringList(Attendee::statusList());
00222 statusLabel->setBuddy( mStatusCombo );
00223 connect(mStatusCombo,SIGNAL(activated(int)),SLOT(updateAttendeeItem()));
00224
00225 mRsvpButton = new QCheckBox(this);
00226 mRsvpButton->setText(i18n("Re&quest response"));
00227 connect(mRsvpButton,SIGNAL(clicked()),SLOT(updateAttendeeItem()));
00228
00229 QWidget *buttonBox = new QWidget(this);
00230 QVBoxLayout *buttonLayout = new QVBoxLayout(buttonBox);
00231
00232 QPushButton *newButton = new QPushButton(i18n("&New"),buttonBox);
00233 buttonLayout->addWidget(newButton);
00234 connect(newButton,SIGNAL(clicked()),SLOT(addNewAttendee()));
00235
00236 mRemoveButton = new QPushButton(i18n("&Remove"),buttonBox);
00237 buttonLayout->addWidget(mRemoveButton);
00238 connect(mRemoveButton, SIGNAL(clicked()),SLOT(removeAttendee()));
00239
00240 mAddressBookButton = new QPushButton(i18n("Select Addressee..."),buttonBox);
00241 buttonLayout->addWidget(mAddressBookButton);
00242 connect(mAddressBookButton,SIGNAL(clicked()),SLOT(openAddressBook()));
00243
00244 topLayout->addMultiCellWidget(mOrganizerLabel,0,0,0,5);
00245 topLayout->addMultiCellWidget(mListView,1,1,0,5);
00246 topLayout->addWidget(attendeeLabel,2,0);
00247 topLayout->addMultiCellWidget(mNameEdit,2,2,1,1);
00248 topLayout->addWidget(emailLabel,3,0);
00249 topLayout->addMultiCellWidget(mEmailEdit,3,3,1,1);
00250 topLayout->addWidget(attendeeRoleLabel,4,0);
00251 topLayout->addWidget(mRoleCombo,4,1);
00252 #if 0
00253 topLayout->setColStretch(2,1);
00254 topLayout->addWidget(statusLabel,3,3);
00255 topLayout->addWidget(mStatusCombo,3,4);
00256 #else
00257 topLayout->addWidget(statusLabel,5,0);
00258 topLayout->addWidget(mStatusCombo,5,1);
00259 #endif
00260 topLayout->addMultiCellWidget(mRsvpButton,6,6,0,1);
00261 topLayout->addMultiCellWidget(buttonBox,2,5,5,5);
00262
00263 #ifdef KORG_NOKABC
00264 mAddressBookButton->hide();
00265 #endif
00266
00267 updateAttendeeInput();
00268 }
00269
00270 KOEditorDetails::~KOEditorDetails()
00271 {
00272 }
00273
00274 void KOEditorDetails::removeAttendee()
00275 {
00276 AttendeeListItem *aItem = (AttendeeListItem *)mListView->selectedItem();
00277 if (!aItem) return;
00278
00279 Attendee *delA = new Attendee(aItem->data()->name(),aItem->data()->email(),
00280 aItem->data()->RSVP(),aItem->data()->status(),aItem->data()->role(),
00281 aItem->data()->uid());
00282 mdelAttendees.append(delA);
00283
00284 if( mGantt ) mGantt->removeAttendee( aItem->data() );
00285 delete aItem;
00286
00287 updateAttendeeInput();
00288 }
00289
00290
00291 void KOEditorDetails::openAddressBook()
00292 {
00293 #ifndef KORG_NOKABC
00294 KABC::Addressee a = KABC::AddresseeDialog::getAddressee(this);
00295 if (!a.isEmpty()) {
00296 insertAttendee( new Attendee( a.realName(), a.preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,a.uid()) );
00297 }
00298 #endif
00299 }
00300
00301
00302 void KOEditorDetails::addNewAttendee()
00303 {
00304 #if 0
00305
00306
00307 if (QString(mEmailEdit->text()).stripWhiteSpace().isEmpty()) {
00308 KabAPI addrBook;
00309 QString name;
00310 std::list<AddressBook::Entry> entries;
00311 name = mNameEdit->text();
00312 if (addrBook.init() == AddressBook::NoError) {
00313 if (addrBook.getEntryByName(name, entries, 1) == AddressBook::NoError) {
00314 kdDebug(5850) << "positive match" << endl;
00315
00316 if (!entries.front().emails.isEmpty() &&
00317 entries.front().emails.first().length()>0)
00318 mEmailEdit->setText(entries.front().emails.first());
00319 }
00320 }
00321 }
00322 #endif
00323
00324 Attendee *a = new Attendee(i18n("(EmptyName)"),i18n("(EmptyEmail)"));
00325 insertAttendee(a);
00326 }
00327
00328
00329 void KOEditorDetails::insertAttendee(Attendee *a)
00330 {
00331 AttendeeListItem *item = new AttendeeListItem(a,mListView);
00332 mListView->setSelected( item, true );
00333 if( mGantt ) mGantt->insertAttendee( a );
00334 }
00335
00336 void KOEditorDetails::setDefaults()
00337 {
00338 mRsvpButton->setChecked(true);
00339 }
00340
00341 void KOEditorDetails::readEvent(Incidence *event)
00342 {
00343
00344 bool block;
00345 if( mGantt ) {
00346 block = mGantt->updateEnabled();
00347 mGantt->setUpdateEnabled( false );
00348 mGantt->clearAttendees();
00349 }
00350
00351 mListView->clear();
00352 mdelAttendees.clear();
00353 Attendee::List al = event->attendees();
00354 Attendee::List::ConstIterator it;
00355 for( it = al.begin(); it != al.end(); ++it )
00356 insertAttendee( new Attendee( **it ) );
00357
00358 mListView->setSelected( mListView->firstChild(), true );
00359 mOrganizerLabel->setText(i18n("Organizer: %1").arg(event->organizer()));
00360
00361
00362 if( mGantt ) mGantt->setUpdateEnabled( block );
00363 }
00364
00365 void KOEditorDetails::writeEvent(Incidence *event)
00366 {
00367 event->clearAttendees();
00368 QListViewItem *item;
00369 AttendeeListItem *a;
00370 for (item = mListView->firstChild(); item;
00371 item = item->nextSibling()) {
00372 a = (AttendeeListItem *)item;
00373 event->addAttendee(new Attendee(*(a->data())));
00374 }
00375 }
00376
00377 void KOEditorDetails::cancelAttendeeEvent(Incidence *event)
00378 {
00379 event->clearAttendees();
00380 Attendee * att;
00381 for (att=mdelAttendees.first();att;att=mdelAttendees.next()) {
00382 event->addAttendee(new Attendee(*att));
00383 }
00384 mdelAttendees.clear();
00385 }
00386
00387 bool KOEditorDetails::validateInput()
00388 {
00389 return true;
00390 }
00391
00392 void KOEditorDetails::updateAttendeeInput()
00393 {
00394 QListViewItem *item = mListView->selectedItem();
00395 AttendeeListItem *aItem = static_cast<AttendeeListItem *>( item );
00396 if (aItem) {
00397 fillAttendeeInput( aItem );
00398 } else {
00399 clearAttendeeInput();
00400 }
00401 }
00402
00403 void KOEditorDetails::clearAttendeeInput()
00404 {
00405 mNameEdit->setText("");
00406 mUidEdit->setText("");
00407 mEmailEdit->setText("");
00408 mRoleCombo->setCurrentItem(0);
00409 mStatusCombo->setCurrentItem(0);
00410 mRsvpButton->setChecked(true);
00411 setEnabledAttendeeInput( false );
00412 }
00413
00414 void KOEditorDetails::fillAttendeeInput( AttendeeListItem *aItem )
00415 {
00416 Attendee *a = aItem->data();
00417 mDisableItemUpdate = true;
00418 mNameEdit->setText(a->name());
00419 mUidEdit->setText(a->uid());
00420 mEmailEdit->setText(a->email());
00421 mRoleCombo->setCurrentItem(a->role());
00422 mStatusCombo->setCurrentItem(a->status());
00423 mRsvpButton->setChecked(a->RSVP());
00424
00425 mDisableItemUpdate = false;
00426
00427 setEnabledAttendeeInput( true );
00428 }
00429
00430 void KOEditorDetails::setEnabledAttendeeInput( bool enabled )
00431 {
00432 mNameEdit->setEnabled( enabled );
00433 mEmailEdit->setEnabled( enabled );
00434 mRoleCombo->setEnabled( enabled );
00435 mStatusCombo->setEnabled( enabled );
00436 mRsvpButton->setEnabled( enabled );
00437
00438 mRemoveButton->setEnabled( enabled );
00439 }
00440
00441 void KOEditorDetails::updateAttendeeItem()
00442 {
00443 if (mDisableItemUpdate) return;
00444
00445 QListViewItem *item = mListView->selectedItem();
00446 AttendeeListItem *aItem = static_cast<AttendeeListItem *>( item );
00447 if ( !aItem ) return;
00448
00449 Attendee *a = aItem->data();
00450
00451 a->setName( mNameEdit->text() );
00452 a->setUid( mUidEdit->text() );
00453 a->setEmail( mEmailEdit->text() );
00454 a->setRole( Attendee::Role( mRoleCombo->currentItem() ) );
00455 a->setStatus( Attendee::PartStat( mStatusCombo->currentItem() ) );
00456 a->setRSVP( mRsvpButton->isChecked() );
00457 aItem->updateItem();
00458 if( mGantt ) mGantt->updateAttendee( a );
00459 }
00460
00461 void KOEditorDetails::setGanttWidget( KOEditorGantt* gantt )
00462 {
00463 mGantt = gantt;
00464 }