Diffstat (limited to 'korganizer/koeditordetails.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | korganizer/koeditordetails.cpp | 398 |
1 files changed, 398 insertions, 0 deletions
diff --git a/korganizer/koeditordetails.cpp b/korganizer/koeditordetails.cpp new file mode 100644 index 0000000..7c4c382 --- a/dev/null +++ b/korganizer/koeditordetails.cpp @@ -0,0 +1,398 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in thse hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <qtooltip.h> +#include <qfiledialog.h> +#include <qlayout.h> +#include <qvbox.h> +#include <qbuttongroup.h> +#include <qvgroupbox.h> +#include <qwidgetstack.h> +#include <qdatetime.h> +#include <qapp.h> + +#include <klocale.h> +#include <kglobal.h> +#include <kiconloader.h> +#include <kstandarddirs.h> +#include <kmessagebox.h> +#ifndef KORG_NOKABC +#include <kabc/addresseedialog.h> +#endif + +#include <libkcal/incidence.h> + +#include "koprefs.h" + +#include "koeditordetails.h" +#include "koeditordetails.moc" + +template <> +CustomListViewItem<class Attendee *>::~CustomListViewItem() +{ + delete mData; +} + +template <> +void CustomListViewItem<class Attendee *>::updateItem() +{ + setText(0,mData->name()); + setText(1,mData->email()); + setText(2,mData->roleStr()); + setText(3,mData->statusStr()); + if (mData->RSVP() && !mData->email().isEmpty()) + setPixmap(4,SmallIcon("mailappt")); + else + setPixmap(4,SmallIcon("nomailappt")); +} + + +KOEditorDetails::KOEditorDetails (int spacing,QWidget* parent,const char* name) + : QWidget( parent, name), mDisableItemUpdate( false ) +{ + QGridLayout *topLayout = new QGridLayout(this); + topLayout->setSpacing(spacing); + + QString organizer = KOPrefs::instance()->email(); + mOrganizerLabel = new QLabel(i18n("Organizer: %1").arg(organizer),this); + + mListView = new KListView(this,"mListView"); + mListView->addColumn(i18n("Name"),180); + mListView->addColumn(i18n("Email"),180); + mListView->addColumn(i18n("Role"),60); + mListView->addColumn(i18n("Status"),100); + mListView->addColumn(i18n("RSVP"),35); + if ( KOPrefs::instance()->mCompactDialogs ) { + //mListView->setFixedHeight(78); + } + + connect(mListView,SIGNAL(selectionChanged(QListViewItem *)), + SLOT(updateAttendeeInput())); + + QLabel *attendeeLabel = new QLabel(this); + attendeeLabel->setText(i18n("Name:")); + attendeeLabel->setFixedSize( attendeeLabel->sizeHint() ); + mNameEdit = new QLineEdit(this); + connect(mNameEdit,SIGNAL(textChanged(const QString &)), + SLOT(updateAttendeeItem())); + + mUidEdit = new QLineEdit(0); + mUidEdit->setText(""); + + QLabel *emailLabel = new QLabel(this); + emailLabel->setText(i18n("Email:")); + mEmailEdit = new QLineEdit(this); + connect(mEmailEdit,SIGNAL(textChanged(const QString &)), + SLOT(updateAttendeeItem())); + + QLabel *attendeeRoleLabel = new QLabel(this); + attendeeRoleLabel->setText(i18n("Role:")); + mRoleCombo = new QComboBox(false,this); + mRoleCombo->insertStringList(Attendee::roleList()); + connect(mRoleCombo,SIGNAL(activated(int)),SLOT(updateAttendeeItem())); + + QLabel *statusLabel = new QLabel(this); + statusLabel->setText( i18n("Status:") ); + + mStatusCombo = new QComboBox(false,this); + mStatusCombo->insertStringList(Attendee::statusList()); + connect(mStatusCombo,SIGNAL(activated(int)),SLOT(updateAttendeeItem())); + + mRsvpButton = new QCheckBox(this); + mRsvpButton->setText(i18n("Request response")); + connect(mRsvpButton,SIGNAL(clicked()),SLOT(updateAttendeeItem())); + QWidget *buttonBox = new QWidget(this); + QVBoxLayout *buttonLayout = new QVBoxLayout(buttonBox); + + QPushButton *newButton = new QPushButton(i18n("&New"),buttonBox); + buttonLayout->addWidget(newButton); + connect(newButton,SIGNAL(clicked()),SLOT(addNewAttendee())); + + mRemoveButton = new QPushButton(i18n("&Remove"),buttonBox); + buttonLayout->addWidget(mRemoveButton); + connect(mRemoveButton, SIGNAL(clicked()),SLOT(removeAttendee())); + + mAddressBookButton = new QPushButton(i18n("Address &Book..."),this); + // buttonLayout->addWidget(mAddressBookButton); + connect(mAddressBookButton,SIGNAL(clicked()),SLOT(openAddressBook())); + //mRoleCombo->setFixedSize( mRoleCombo->sizeHint () ); + + if (qApp->desktop()->width() < 300 ) { + mListView->setFixedHeight(80); + topLayout->addMultiCellWidget(mOrganizerLabel,0,0,0,3); + topLayout->addMultiCellWidget(mListView,1,1,0,3); + topLayout->addWidget(attendeeLabel,3,0); + topLayout->addMultiCellWidget(mNameEdit,3,3,1,2); + topLayout->addWidget(emailLabel,4,0); + topLayout->addMultiCellWidget(mEmailEdit,4,4,1,2); + topLayout->addWidget(attendeeRoleLabel,5,0); + topLayout->addMultiCellWidget(mRoleCombo,5,5,1,2); + topLayout->addWidget(statusLabel,6,0); + topLayout->addMultiCellWidget(mStatusCombo,6,6,1,2); + topLayout->addMultiCellWidget(mAddressBookButton,2,2,2,3); + topLayout->addMultiCellWidget(mRsvpButton,2,2,0,1); + topLayout->addMultiCellWidget(buttonBox,3,4,3,3); + topLayout->setRowStretch(1,2); + topLayout->setColStretch(0,0); + topLayout->setColStretch(1,2); + topLayout->setColStretch(2,1); + topLayout->setColStretch(3,1); + + } else { + topLayout->addMultiCellWidget(mOrganizerLabel,0,0,0,5); + topLayout->addMultiCellWidget(mListView,1,1,0,5); + topLayout->addWidget(attendeeLabel,3,0); + topLayout->addMultiCellWidget(mNameEdit,3,3,1,4); + topLayout->addWidget(emailLabel,4,0); + topLayout->addMultiCellWidget(mEmailEdit,4,4,1,4); + topLayout->addWidget(attendeeRoleLabel,5,0); + topLayout->addMultiCellWidget(mRoleCombo,5,5,1,2); + topLayout->addWidget(statusLabel,5,3); + topLayout->addMultiCellWidget(mStatusCombo,5,5,4,5); + topLayout->addMultiCellWidget(mAddressBookButton,2,2,4,5); + topLayout->addMultiCellWidget(mRsvpButton,2,2,0,1); + topLayout->addMultiCellWidget(buttonBox,3,4,5,5); + topLayout->setRowStretch(1,5); + topLayout->setColStretch(0,0); + } +// #if 0 +// topLayout->setColStretch(2,1); +// topLayout->addWidget(statusLabel,3,3); +// topLayout->addWidget(mStatusCombo,3,4); +// #else +// topLayout->addWidget(statusLabel,4,3); +// // topLayout->addWidget(mStatusCombo,4,3); +// topLayout->addMultiCellWidget(mStatusCombo,4,4,4,5); + +// #endif +// // topLayout->setRowStretch(5,1); +// topLayout->addMultiCellWidget(mRsvpButton,5,5,0,1); +// topLayout->addMultiCellWidget(buttonBox,2,3,5,5); +// topLayout->setRowStretch(1,5); +// topLayout->setColStretch(0,0); + +#ifdef KORG_NOKABC + mAddressBookButton->hide(); +#endif + + updateAttendeeInput(); +} + +KOEditorDetails::~KOEditorDetails() +{ +} + +void KOEditorDetails::removeAttendee() +{ + AttendeeListItem *aItem = (AttendeeListItem *)mListView->selectedItem(); + if (!aItem) return; + + Attendee *delA = new Attendee(aItem->data()->name(),aItem->data()->email(), + aItem->data()->RSVP(),aItem->data()->status(),aItem->data()->role(), + aItem->data()->uid()); + mdelAttendees.append(delA); + + delete aItem; + + updateAttendeeInput(); +} + + +void KOEditorDetails::openAddressBook() +{ +#ifndef KORG_NOKABC + + KABC::Addressee::List list = KABC::AddresseeDialog::getAddressees(this); + uint i=0; + for (i=0; i < list.count(); i++) { + insertAttendee( new Attendee( list[i].realName(), list[i].preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,list[i].uid()) ); + } + +#if 0 + KABC::Addressee a = KABC::AddresseeDialog::getAddressee(this); + if (!a.isEmpty()) { + insertAttendee( new Attendee( a.realName(), a.preferredEmail(),false,KCal::Attendee::NeedsAction,KCal::Attendee::ReqParticipant,a.uid()) ); + } +#endif +#endif +} + + +void KOEditorDetails::addNewAttendee() +{ +#if 0 + // this is cool. If they didn't enter an email address, + // try to look it up in the address book and fill it in for them. + if (QString(mEmailEdit->text()).stripWhiteSpace().isEmpty()) { + KabAPI addrBook; + QString name; + std::list<AddressBook::Entry> entries; + name = mNameEdit->text(); + if (addrBook.init() == AddressBook::NoError) { + if (addrBook.getEntryByName(name, entries, 1) == AddressBook::NoError) { + kdDebug() << "positive match" << endl; + // take first email address + if (!entries.front().emails.isEmpty() && + entries.front().emails.first().length()>0) + mEmailEdit->setText(entries.front().emails.first()); + } + } + } +#endif + + Attendee *a = new Attendee(i18n("(EmptyName)"),i18n("(EmptyEmail)")); + insertAttendee(a); +} + + +void KOEditorDetails::insertAttendee(Attendee *a) +{ + AttendeeListItem *item = new AttendeeListItem(a,mListView); + mListView->setSelected( item, true ); +} + +void KOEditorDetails::setDefaults() +{ + mRsvpButton->setChecked(true); + mListView->clear(); + mdelAttendees.clear(); + clearAttendeeInput(); + mOrganizerLabel->setText(i18n("Organizer: %1").arg(KOPrefs::instance()->email())); + + mNameEdit->setText(""); + mUidEdit->setText(""); + mEmailEdit->setText(""); + mRoleCombo->setCurrentItem( 0 ); + mStatusCombo->setCurrentItem( 0 ); + +} + +void KOEditorDetails::readEvent(Incidence *event) +{ + setDefaults(); + //mListView->clear(); + //mdelAttendees.clear(); + QPtrList<Attendee> tmpAList = event->attendees(); + Attendee *a; + for (a = tmpAList.first(); a; a = tmpAList.next()) + insertAttendee(new Attendee(*a)); + + mListView->setSelected( mListView->firstChild(), true ); + mOrganizerLabel->setText(i18n("Organizer: %1").arg(event->organizer())); +} + +void KOEditorDetails::writeEvent(Incidence *event) +{ + event->clearAttendees(); + QListViewItem *item; + AttendeeListItem *a; + for (item = mListView->firstChild(); item; + item = item->nextSibling()) { + a = (AttendeeListItem *)item; + event->addAttendee(new Attendee(*(a->data()))); + } + event->setOrganizer(KOPrefs::instance()->email()); +} + +void KOEditorDetails::cancelAttendeeEvent(Incidence *event) +{ + event->clearAttendees(); + Attendee * att; + for (att=mdelAttendees.first();att;att=mdelAttendees.next()) { + event->addAttendee(new Attendee(*att)); + } + mdelAttendees.clear(); +} + +bool KOEditorDetails::validateInput() +{ + return true; +} + +void KOEditorDetails::updateAttendeeInput() +{ + QListViewItem *item = mListView->selectedItem(); + AttendeeListItem *aItem = static_cast<AttendeeListItem *>( item ); + if (aItem) { + fillAttendeeInput( aItem ); + } else { + clearAttendeeInput(); + } +} + +void KOEditorDetails::clearAttendeeInput() +{ + mNameEdit->setText(""); + mUidEdit->setText(""); + mEmailEdit->setText(""); + mRoleCombo->setCurrentItem(0); + mStatusCombo->setCurrentItem(0); + mRsvpButton->setChecked(true); + setEnabledAttendeeInput( false ); +} + +void KOEditorDetails::fillAttendeeInput( AttendeeListItem *aItem ) +{ + Attendee *a = aItem->data(); + mDisableItemUpdate = true; + mNameEdit->setText(a->name()); + mUidEdit->setText(a->uid()); + mEmailEdit->setText(a->email()); + mRoleCombo->setCurrentItem(a->role()); + mStatusCombo->setCurrentItem(a->status()); + mRsvpButton->setChecked(a->RSVP()); + + mDisableItemUpdate = false; + + setEnabledAttendeeInput( true ); +} + +void KOEditorDetails::setEnabledAttendeeInput( bool enabled ) +{ + mNameEdit->setEnabled( enabled ); + mEmailEdit->setEnabled( enabled ); + mRoleCombo->setEnabled( enabled ); + mStatusCombo->setEnabled( enabled ); + mRsvpButton->setEnabled( enabled ); + + mRemoveButton->setEnabled( enabled ); +} + +void KOEditorDetails::updateAttendeeItem() +{ + if (mDisableItemUpdate) return; + + QListViewItem *item = mListView->selectedItem(); + AttendeeListItem *aItem = static_cast<AttendeeListItem *>( item ); + if ( !aItem ) return; + + Attendee *a = aItem->data(); + + a->setName( mNameEdit->text() ); + a->setUid( mUidEdit->text() ); + a->setEmail( mEmailEdit->text() ); + a->setRole( Attendee::Role( mRoleCombo->currentItem() ) ); + a->setStatus( Attendee::PartStat( mStatusCombo->currentItem() ) ); + a->setRSVP( mRsvpButton->isChecked() ); + aItem->updateItem(); +} |