diff options
Diffstat (limited to 'korganizer/koeditoralarms.cpp')
-rw-r--r-- | korganizer/koeditoralarms.cpp | 388 |
1 files changed, 388 insertions, 0 deletions
diff --git a/korganizer/koeditoralarms.cpp b/korganizer/koeditoralarms.cpp new file mode 100644 index 000000000..e14581e4d --- /dev/null +++ b/korganizer/koeditoralarms.cpp @@ -0,0 +1,388 @@ +/* + This file is part of KOrganizer. + + Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org> + Copyright (C) 2004 Reinhold Kainhofer <reinhold@kainhofer.com> + + 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 the 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 "koeditoralarms_base.h" +#include "koeditoralarms.h" + +#include <qlayout.h> +#include <qlistview.h> +#include <qpushbutton.h> +#include <qspinbox.h> +#include <qcombobox.h> +#include <qcheckbox.h> +#include <qbuttongroup.h> +#include <qtextedit.h> +#include <qwidgetstack.h> + +#include <kurlrequester.h> +#include <klocale.h> +#include <kdebug.h> + +#include <libkcal/alarm.h> +#include <libkcal/incidence.h> + +#include <libemailfunctions/email.h> + +class AlarmListViewItem : public QListViewItem +{ + public: + AlarmListViewItem( QListView *parent, KCal::Alarm *alarm ); + virtual ~AlarmListViewItem(); + KCal::Alarm *alarm() const { return mAlarm; } + void construct(); + enum AlarmViewColumns { ColAlarmType=0, ColAlarmOffset, ColAlarmRepeat }; + protected: + KCal::Alarm *mAlarm; +}; + +AlarmListViewItem::AlarmListViewItem( QListView *parent, KCal::Alarm *alarm ) + : QListViewItem( parent ) +{ + if ( alarm ) { + mAlarm = new KCal::Alarm( *alarm ); + } else { + mAlarm = new KCal::Alarm( 0 ); + } + construct(); +} + +AlarmListViewItem::~AlarmListViewItem() +{ + delete mAlarm; +} + +void AlarmListViewItem::construct() +{ + if ( mAlarm ) { + // Alarm type: + QString type; + switch ( mAlarm->type() ) { + case KCal::Alarm::Display: + type = i18n("Reminder Dialog"); + break; + case KCal::Alarm::Procedure: + type = i18n("Program"); + break; + case KCal::Alarm::Email: + type = i18n("Email"); + break; + case KCal::Alarm::Audio: + type = i18n("Audio"); + break; + default: + type = i18n("Unknown"); + break; + } + setText( ColAlarmType, type ); + + // Alarm offset: + QString offsetstr; + int offset = 0; + if ( mAlarm->hasStartOffset() ) { + offset = mAlarm->startOffset().asSeconds(); + if ( offset < 0 ) { + offsetstr = i18n("N days/hours/minutes before/after the start/end", "%1 before the start"); + offset = -offset; + } else { + offsetstr = i18n("N days/hours/minutes before/after the start/end", "%1 after the start"); + } + } else if ( mAlarm->hasEndOffset() ) { + offset = mAlarm->endOffset().asSeconds(); + if ( offset < 0 ) { + offsetstr = i18n("N days/hours/minutes before/after the start/end", "%1 before the end"); + offset = -offset; + } else { + offsetstr = i18n("N days/hours/minutes before/after the start/end", "%1 after the end"); + } + } + + offset = offset / 60; // make minutes + int useoffset = offset; + + if ( offset % (24*60) == 0 && offset>0 ) { // divides evenly into days? + useoffset = offset / (24*60); + offsetstr = offsetstr.arg( i18n("1 day", "%n days", useoffset ) ); + } else if (offset % 60 == 0 && offset>0 ) { // divides evenly into hours? + useoffset = offset / 60; + offsetstr = offsetstr.arg( i18n("1 hour", "%n hours", useoffset ) ); + } else { + useoffset = offset; + offsetstr = offsetstr.arg( i18n("1 minute", "%n minutes", useoffset ) ); + } + setText( ColAlarmOffset, offsetstr ); + + // Alarm repeat + if ( mAlarm->repeatCount()>0 ) { + setText( ColAlarmRepeat, i18n("Yes") ); + } else { + setText( ColAlarmRepeat, i18n("No") ); + } + } +} + + +KOEditorAlarms::KOEditorAlarms( KCal::Alarm::List *alarms, QWidget *parent, + const char *name ) + : KDialogBase( parent, name, true, i18n("Edit Reminders"), Ok | Cancel ), mAlarms( alarms ),mCurrentItem(0L) +{ + setMainWidget( mWidget = new KOEditorAlarms_base( this ) ); + mWidget->mAlarmList->setColumnWidthMode( 0, QListView::Maximum ); + mWidget->mAlarmList->setColumnWidthMode( 1, QListView::Maximum ); + connect( mWidget->mAlarmList, SIGNAL( selectionChanged( QListViewItem * ) ), + SLOT( selectionChanged( QListViewItem * ) ) ); + connect( mWidget->mAddButton, SIGNAL( clicked() ), SLOT( slotAdd() ) ); + connect( mWidget->mRemoveButton, SIGNAL( clicked() ), SLOT( slotRemove() ) ); + connect( mWidget->mDuplicateButton, SIGNAL( clicked() ), SLOT( slotDuplicate() ) ); + + connect( mWidget->mAlarmOffset, SIGNAL( valueChanged( int ) ), SLOT( changed() ) ); + connect( mWidget->mOffsetUnit, SIGNAL( activated( int ) ), SLOT( changed() ) ); + connect( mWidget->mBeforeAfter, SIGNAL( activated( int ) ), SLOT( changed() ) ); + connect( mWidget->mRepeats, SIGNAL( toggled( bool ) ), SLOT( changed() ) ); + connect( mWidget->mRepeatCount, SIGNAL( valueChanged( int ) ), SLOT( changed() ) ); + connect( mWidget->mRepeatInterval, SIGNAL( valueChanged( int ) ), SLOT( changed() ) ); + connect( mWidget->mAlarmType, SIGNAL(clicked(int)), SLOT( changed() ) ); + connect( mWidget->mDisplayText, SIGNAL( textChanged() ), SLOT( changed() ) ); + connect( mWidget->mSoundFile, SIGNAL( textChanged( const QString & ) ), SLOT( changed() ) ); + connect( mWidget->mApplication, SIGNAL( textChanged( const QString & ) ), SLOT( changed() ) ); + connect( mWidget->mAppArguments, SIGNAL( textChanged( const QString & ) ), SLOT( changed() ) ); + connect( mWidget->mEmailAddress, SIGNAL( textChanged( const QString & ) ), SLOT( changed() ) ); + connect( mWidget->mEmailText, SIGNAL( textChanged() ), SLOT( changed() ) ); + + init(); +} + +KOEditorAlarms::~KOEditorAlarms() +{ +} + +void KOEditorAlarms::changed() +{ + if ( !mInitializing && mCurrentItem ) { + writeAlarm( mCurrentItem->alarm() ); + mCurrentItem->construct(); + } +} + +void KOEditorAlarms::readAlarm( KCal::Alarm *alarm ) +{ + if ( !alarm ) return; + + mInitializing = true; + + // Offsets + int offset; + int beforeafterpos = 0; + if ( alarm->hasEndOffset() ) { + beforeafterpos = 2; + offset = alarm->endOffset().asSeconds(); + } else { + // TODO: Also allow alarms at fixed times, not relative to start/end + offset = alarm->startOffset().asSeconds(); + } + // Negative offset means before the start/end... + if ( offset < 0 ) { + offset = -offset; + } else { + ++beforeafterpos; + } + mWidget->mBeforeAfter->setCurrentItem( beforeafterpos ); + + offset = offset / 60; // make minutes + int useoffset = offset; + + if ( offset % (24*60) == 0 && offset>0 ) { // divides evenly into days? + useoffset = offset / (24*60); + mWidget->mOffsetUnit->setCurrentItem( 2 ); + } else if (offset % 60 == 0 && offset>0 ) { // divides evenly into hours? + useoffset = offset / 60; + mWidget->mOffsetUnit->setCurrentItem( 1 ); + } else { + useoffset = offset; + mWidget->mOffsetUnit->setCurrentItem( 0 ); + } + mWidget->mAlarmOffset->setValue( useoffset ); + + + // Repeating + mWidget->mRepeats->setChecked( alarm->repeatCount()>0 ); + if ( alarm->repeatCount()>0 ) { + mWidget->mRepeatCount->setValue( alarm->repeatCount() ); + mWidget->mRepeatInterval->setValue( alarm->snoozeTime() ); + } + + switch ( alarm->type() ) { + case KCal::Alarm::Audio: + mWidget->mAlarmType->setButton( 1 ); + mWidget->mSoundFile->setURL( alarm->audioFile() ); + break; + case KCal::Alarm::Procedure: + mWidget->mAlarmType->setButton( 2 ); + mWidget->mApplication->setURL( alarm->programFile() ); + mWidget->mAppArguments->setText( alarm->programArguments() ); + break; + case KCal::Alarm::Email: { + mWidget->mAlarmType->setButton( 3 ); + QValueList<KCal::Person> addresses = alarm->mailAddresses(); + QStringList add; + for ( QValueList<KCal::Person>::ConstIterator it = addresses.begin(); + it != addresses.end(); ++it ) { + add << (*it).fullName(); + } + mWidget->mEmailAddress->setText( add.join(", ") ); + mWidget->mEmailText->setText( alarm->mailText() ); + break;} + case KCal::Alarm::Display: + case KCal::Alarm::Invalid: + default: + mWidget->mAlarmType->setButton( 0 ); + mWidget->mDisplayText->setText( alarm->text() ); + break; + } + + mWidget->mTypeStack->raiseWidget( mWidget->mAlarmType->selectedId() ); + + mInitializing = false; +} + +void KOEditorAlarms::writeAlarm( KCal::Alarm *alarm ) +{ + // Offsets + int offset = mWidget->mAlarmOffset->value()*60; // minutes + int offsetunit = mWidget->mOffsetUnit->currentItem(); + if ( offsetunit >= 1 ) offset *= 60; // hours + if ( offsetunit >= 2 ) offset *= 24; // days + if ( offsetunit >= 3 ) offset *= 7; // weeks + + int beforeafterpos = mWidget->mBeforeAfter->currentItem(); + if ( beforeafterpos % 2 == 0 ) { // before -> negative + offset = -offset; + } + + // TODO: Add possibility to specify a given time for the reminder + if ( beforeafterpos / 2 == 0 ) { // start offset + alarm->setStartOffset( KCal::Duration( offset ) ); + } else { + alarm->setEndOffset( KCal::Duration( offset ) ); + } + + // Repeating + if ( mWidget->mRepeats->isChecked() ) { + alarm->setRepeatCount( mWidget->mRepeatCount->value() ); + alarm->setSnoozeTime( mWidget->mRepeatInterval->value() ); + } else { + alarm->setRepeatCount( 0 ); + } + + switch ( mWidget->mAlarmType->selectedId() ) { + case 1: // Audio + alarm->setAudioAlarm( mWidget->mSoundFile->url() ); + break; + case 2: // Procedure + alarm->setProcedureAlarm( mWidget->mApplication->url(), mWidget->mAppArguments->text() ); + break; + case 3: { // Email + QStringList addresses = KPIM::splitEmailAddrList( mWidget->mEmailAddress->text() ); + QValueList<KCal::Person> add; + for ( QStringList::Iterator it = addresses.begin(); it != addresses.end(); + ++it ) { + add << KCal::Person( *it ); + } + // TODO: Add a subject line and possibilities for attachments + alarm->setEmailAlarm( QString::null, mWidget->mEmailText->text(), + add ); + break; } + case 0: // Display + default: + alarm->setDisplayAlarm( mWidget->mDisplayText->text() ); + break; + } +} + +void KOEditorAlarms::selectionChanged( QListViewItem *listviewitem ) +{ + AlarmListViewItem *item = dynamic_cast<AlarmListViewItem*>(listviewitem); + mCurrentItem = item; + mWidget->mTimeGroup->setEnabled( item ); + mWidget->mTypeGroup->setEnabled( item ); + if ( item ) { + readAlarm( item->alarm() ); + } +} + +void KOEditorAlarms::slotOk() +{ + // copy the mAlarms list + if ( mAlarms ) { + mAlarms->clear(); + QListViewItemIterator it( mWidget->mAlarmList ); + while ( it.current() ) { + AlarmListViewItem *item = dynamic_cast<AlarmListViewItem*>(*it); + if ( item ) { + mAlarms->append( new KCal::Alarm( *(item->alarm()) ) ); + } + ++it; + } + } + accept(); +} + +void KOEditorAlarms::slotAdd() +{ + mCurrentItem = new AlarmListViewItem( mWidget->mAlarmList, 0 ); + mWidget->mAlarmList->setCurrentItem( mCurrentItem ); +// selectionChanged( mCurrentItem ); +} + +void KOEditorAlarms::slotDuplicate() +{ + if ( mCurrentItem ) { + mCurrentItem = new AlarmListViewItem( mWidget->mAlarmList, mCurrentItem->alarm() ); + mWidget->mAlarmList->setCurrentItem( mCurrentItem ); +// selectionChanged( mCurrentItem ); + } +} + +void KOEditorAlarms::slotRemove() +{ + if ( mCurrentItem ) { + delete mCurrentItem; + mCurrentItem = dynamic_cast<AlarmListViewItem*>( mWidget->mAlarmList->currentItem() ); + mWidget->mAlarmList->setSelected( mCurrentItem, true ); + + } +} + +void KOEditorAlarms::init() +{ + mInitializing = true; + KCal::Alarm::List::ConstIterator it; + for ( it = mAlarms->begin(); it != mAlarms->end(); ++it ) { + new AlarmListViewItem( mWidget->mAlarmList, *it ); + } + mWidget->mAlarmList->setSelected( mWidget->mAlarmList->firstChild(), true ); + mInitializing = false; +} + +#include "koeditoralarms.moc" |