diff options
Diffstat (limited to 'korganizer/archivedialog.cpp')
-rw-r--r-- | korganizer/archivedialog.cpp | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/korganizer/archivedialog.cpp b/korganizer/archivedialog.cpp new file mode 100644 index 000000000..89d7ecdd4 --- /dev/null +++ b/korganizer/archivedialog.cpp @@ -0,0 +1,237 @@ +/* + This file is part of KOrganizer. + Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> + Copyright (C) 2003-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. +*/ + +// ArchiveDialog -- archive/delete past events. + +#include <qlabel.h> +#include <qlayout.h> +#include <qdatetime.h> +#include <qcheckbox.h> +#include <qwhatsthis.h> +#include <qhgroupbox.h> + +#include <kdebug.h> +#include <klocale.h> +#include <kurlrequester.h> +#include <kmessagebox.h> +#include <kfiledialog.h> +#include <kurl.h> +#include <klineedit.h> +#include <kactivelabel.h> + +#include <libkdepim/kdateedit.h> + +#include "koprefs.h" + +#include "archivedialog.h" +#include "eventarchiver.h" +#include <knuminput.h> +#include <qbuttongroup.h> +#include <qradiobutton.h> +#include "archivedialog.moc" + +ArchiveDialog::ArchiveDialog(Calendar *cal,QWidget *parent, const char *name) + : KDialogBase (Plain,i18n("Archive/Delete Past Events and To-dos"), + User1|Cancel,User1,parent,name,false,true, + i18n("&Archive")) +{ + mCalendar = cal; + + QFrame *topFrame = plainPage(); + QVBoxLayout *topLayout = new QVBoxLayout(topFrame); + topLayout->setSpacing(spacingHint()); + + KActiveLabel *descLabel = new KActiveLabel( + i18n("Archiving saves old items into the given file and " + "then deletes them in the current calendar. If the archive file " + "already exists they will be added. " + "(<a href=\"whatsthis:In order to add an archive " + "to your calendar, use the "Merge Calendar" function. " + "You can view an archive by opening it in KOrganizer like any " + "other calendar. It is not saved in a special format, but as " + "vCalendar.\">How to restore</a>)"), + topFrame); + topLayout->addWidget(descLabel); + + QButtonGroup* radioBG = new QButtonGroup( this ); + radioBG->hide(); // just for the exclusive behavior + connect( radioBG, SIGNAL( clicked( int ) ), SLOT( slotActionChanged() ) ); + + QHBoxLayout *dateLayout = new QHBoxLayout(0); + mArchiveOnceRB = new QRadioButton(i18n("Archive now items older than:"),topFrame); + dateLayout->addWidget(mArchiveOnceRB); + radioBG->insert(mArchiveOnceRB); + mDateEdit = new KDateEdit(topFrame); + QWhatsThis::add(mDateEdit, + i18n("The date before which items should be archived. All older events and to-dos will " + "be saved and deleted, the newer (and events exactly on that date) will be kept.")); + dateLayout->addWidget(mDateEdit); + topLayout->addLayout(dateLayout); + + // Checkbox, numinput and combo for auto-archiving + // (similar to kmail's mExpireFolderCheckBox/mReadExpiryTimeNumInput in kmfolderdia.cpp) + QHBox* autoArchiveHBox = new QHBox(topFrame); + topLayout->addWidget(autoArchiveHBox); + mAutoArchiveRB = new QRadioButton(i18n("Automaticall&y archive items older than:"), autoArchiveHBox); + radioBG->insert(mAutoArchiveRB); + QWhatsThis::add(mAutoArchiveRB, + i18n("If this feature is enabled, KOrganizer will regularly check if events and to-dos have to be archived; " + "this means you will not need to use this dialog box again, except to change the settings.")); + + mExpiryTimeNumInput = new KIntNumInput(autoArchiveHBox); + mExpiryTimeNumInput->setRange(1, 500, 1, false); + mExpiryTimeNumInput->setEnabled(false); + mExpiryTimeNumInput->setValue(7); + QWhatsThis::add(mExpiryTimeNumInput, + i18n("The age of the events and to-dos to archive. All older items " + "will be saved and deleted, the newer will be kept.")); + + mExpiryUnitsComboBox = new QComboBox(autoArchiveHBox); + // Those items must match the "Expiry Unit" enum in the kcfg file! + mExpiryUnitsComboBox->insertItem(i18n("Day(s)")); + mExpiryUnitsComboBox->insertItem(i18n("Week(s)")); + mExpiryUnitsComboBox->insertItem(i18n("Month(s)")); + mExpiryUnitsComboBox->setEnabled(false); + + QHBoxLayout *fileLayout = new QHBoxLayout(0); + fileLayout->setSpacing(spacingHint()); + QLabel *l = new QLabel(i18n("Archive &file:"),topFrame); + fileLayout->addWidget(l); + mArchiveFile = new KURLRequester(KOPrefs::instance()->mArchiveFile,topFrame); + mArchiveFile->setMode(KFile::File); + mArchiveFile->setFilter(i18n("*.ics|iCalendar Files")); + QWhatsThis::add(mArchiveFile, + i18n("The path of the archive. The events and to-dos will be added to the " + "archive file, so any events that are already in the file " + "will not be modified or deleted. You can later load or merge the " + "file like any other calendar. It is not saved in a special " + "format, it uses the iCalendar format. ")); + l->setBuddy(mArchiveFile->lineEdit()); + fileLayout->addWidget(mArchiveFile); + topLayout->addLayout(fileLayout); + + QHGroupBox *typeBox = new QHGroupBox( i18n("Type of Items to Archive"), + topFrame); + mEvents = new QCheckBox( i18n("&Events"), typeBox ); + mTodos = new QCheckBox( i18n("&To-dos"), typeBox ); + topLayout->addWidget( typeBox ); + QWhatsThis::add( typeBox, i18n("Here you can select which items " + "should be archived. Events are archived if they " + "ended before the date given above; to-dos are archived if " + "they were finished before the date.") ); + + mDeleteCb = new QCheckBox(i18n("&Delete only, do not save"), + topFrame); + QWhatsThis::add(mDeleteCb, + i18n("Select this option to delete old events and to-dos without saving them. " + "It is not possible to recover the events later.")); + topLayout->addWidget(mDeleteCb); + connect(mDeleteCb, SIGNAL(toggled(bool)), mArchiveFile, SLOT(setDisabled(bool))); + connect(mDeleteCb, SIGNAL(toggled(bool)), this, SLOT(slotEnableUser1())); + connect(mArchiveFile->lineEdit(),SIGNAL(textChanged ( const QString & )), + this,SLOT(slotEnableUser1())); + + // Load settings from KOPrefs + mExpiryTimeNumInput->setValue( KOPrefs::instance()->mExpiryTime ); + mExpiryUnitsComboBox->setCurrentItem( KOPrefs::instance()->mExpiryUnit ); + mDeleteCb->setChecked( KOPrefs::instance()->mArchiveAction == KOPrefs::actionDelete ); + mEvents->setChecked( KOPrefs::instance()->mArchiveEvents ); + mTodos->setChecked( KOPrefs::instance()->mArchiveTodos ); + + slotEnableUser1(); + + // The focus should go to a useful field by default, not to the top richtext-label + if ( KOPrefs::instance()->mAutoArchive ) { + mAutoArchiveRB->setChecked( true ); + mAutoArchiveRB->setFocus(); + } else { + mArchiveOnceRB->setChecked( true ); + mArchiveOnceRB->setFocus(); + } + slotActionChanged(); +} + +ArchiveDialog::~ArchiveDialog() +{ +} + +void ArchiveDialog::slotEnableUser1() +{ + bool state = ( mDeleteCb->isChecked() || + !mArchiveFile->lineEdit()->text().isEmpty() ); + enableButton(KDialogBase::User1,state); +} + +void ArchiveDialog::slotActionChanged() +{ + mDateEdit->setEnabled( mArchiveOnceRB->isChecked() ); + mExpiryTimeNumInput->setEnabled( mAutoArchiveRB->isChecked() ); + mExpiryUnitsComboBox->setEnabled( mAutoArchiveRB->isChecked() ); +} + +// Archive old events +void ArchiveDialog::slotUser1() +{ + EventArchiver archiver; + connect( &archiver, SIGNAL( eventsDeleted() ), this, SLOT( slotEventsDeleted() ) ); + + KOPrefs::instance()->mAutoArchive = mAutoArchiveRB->isChecked(); + KOPrefs::instance()->mExpiryTime = mExpiryTimeNumInput->value(); + KOPrefs::instance()->mExpiryUnit = mExpiryUnitsComboBox->currentItem(); + + if (mDeleteCb->isChecked()) { + KOPrefs::instance()->mArchiveAction = KOPrefs::actionDelete; + } else { + KOPrefs::instance()->mArchiveAction = KOPrefs::actionArchive; + + // Get destination URL + KURL destUrl( mArchiveFile->url() ); + if ( !destUrl.isValid() ) { + KMessageBox::sorry(this,i18n("The archive file name is not valid.\n")); + return; + } + // Force filename to be ending with vCalendar extension + QString filename = destUrl.fileName(); + if (!filename.endsWith(".vcs") && !filename.endsWith(".ics")) { + filename.append(".ics"); + destUrl.setFileName(filename); + } + + KOPrefs::instance()->mArchiveFile = destUrl.url(); + } + if ( KOPrefs::instance()->mAutoArchive ) { + archiver.runAuto( mCalendar, this, true /*with gui*/ ); + emit autoArchivingSettingsModified(); + accept(); + } + else + archiver.runOnce( mCalendar, mDateEdit->date(), this ); +} + +void ArchiveDialog::slotEventsDeleted() +{ + emit eventsDeleted(); + if ( !KOPrefs::instance()->mAutoArchive ) + accept(); +} |