korganizer Library API Documentation

archivedialog.cpp

00001 /* 00002 This file is part of KOrganizer. 00003 Copyright (c) 2000,2001 Cornelius Schumacher <schumacher@kde.org> 00004 00005 This program is free software; you can redistribute it and/or modify 00006 it under the terms of the GNU General Public License as published by 00007 the Free Software Foundation; either version 2 of the License, or 00008 (at your option) any later version. 00009 00010 This program is distributed in the hope that it will be useful, 00011 but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 GNU General Public License for more details. 00014 00015 You should have received a copy of the GNU General Public License 00016 along with this program; if not, write to the Free Software 00017 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00018 00019 As a special exception, permission is given to link this program 00020 with any edition of Qt, and distribute the resulting executable, 00021 without including the source code for Qt in the source distribution. 00022 */ 00023 00024 // ArchiveDialog -- archive/delete past appointments. 00025 00026 #include <qlabel.h> 00027 #include <qlayout.h> 00028 #include <qdatetime.h> 00029 #include <qcheckbox.h> 00030 #include <qwhatsthis.h> 00031 00032 #include <kdebug.h> 00033 #include <klocale.h> 00034 #include <kurlrequester.h> 00035 #include <kmessagebox.h> 00036 #include <kglobal.h> 00037 #include <kfiledialog.h> 00038 #include <kurl.h> 00039 #include <ktempfile.h> 00040 #include <kio/netaccess.h> 00041 #include <klineedit.h> 00042 #include <kactivelabel.h> 00043 00044 #include <libkcal/event.h> 00045 #include <libkcal/calendar.h> 00046 #include <libkcal/calendarlocal.h> 00047 #include <libkcal/filestorage.h> 00048 00049 #include <libkdepim/kdateedit.h> 00050 00051 #include "koprefs.h" 00052 00053 #include "archivedialog.h" 00054 #include "archivedialog.moc" 00055 00056 ArchiveDialog::ArchiveDialog(Calendar *cal,QWidget *parent, const char *name) 00057 : KDialogBase (Plain,i18n("Archive/Delete Past Appointments"), 00058 User1|Cancel,User1,parent,name,false,true, 00059 i18n("&Archive")) 00060 { 00061 mCalendar = cal; 00062 00063 QFrame *topFrame = plainPage(); 00064 QVBoxLayout *topLayout = new QVBoxLayout(topFrame); 00065 topLayout->setSpacing(spacingHint()); 00066 00067 KActiveLabel *descLabel = new KActiveLabel( 00068 i18n("Archiving saves old appointments into the given file and " 00069 "then deletes them in the current calendar. If the archive file " 00070 "already exists they will be added. " 00071 "(<a href=\"whatsthis:In order to add an archive " 00072 "to your calendar, use the &quot;Merge Calendar&quot; function. " 00073 "You can view an archive by opening it in KOrganizer like any " 00074 "other calendar. It is not saved in a special format, but as " 00075 "vCalendar.\">How to restore</a>)"), 00076 topFrame); 00077 topLayout->addWidget(descLabel); 00078 00079 QHBoxLayout *dateLayout = new QHBoxLayout(0); 00080 QLabel *dateLabel = new QLabel(i18n("A&ppointments older than:"),topFrame); 00081 dateLayout->addWidget(dateLabel); 00082 mDateEdit = new KDateEdit(topFrame); 00083 QWhatsThis::add(mDateEdit, 00084 i18n("The age of the appointments to archive. All older appointments " 00085 "will be saved and deleted, the newer will be kept.")); 00086 dateLabel->setBuddy(mDateEdit); 00087 dateLayout->addWidget(mDateEdit); 00088 topLayout->addLayout(dateLayout); 00089 00090 QHBoxLayout *fileLayout = new QHBoxLayout(0); 00091 fileLayout->setSpacing(spacingHint()); 00092 QLabel *l = new QLabel(i18n("Archive &file:"),topFrame); 00093 fileLayout->addWidget(l); 00094 mArchiveFile = new KURLRequester(KOPrefs::instance()->mArchiveFile,topFrame); 00095 mArchiveFile->setMode(KFile::File); 00096 mArchiveFile->setFilter(i18n("*.vcs|vCalendar Files")); 00097 QWhatsThis::add(mArchiveFile, 00098 i18n("The path of the archive. The appointments will be added to the " 00099 "archive file, so any appointments that are already in the file " 00100 "will not be modified or deleted. You can later load or merge the " 00101 "file like any other calendar. It is not saved in a special " 00102 "format, it uses the vCalendar format. ")); 00103 l->setBuddy(mArchiveFile->lineEdit()); 00104 fileLayout->addWidget(mArchiveFile); 00105 topLayout->addLayout(fileLayout); 00106 00107 mDeleteCb = new QCheckBox(i18n("&Delete only, do not save"), 00108 topFrame); 00109 QWhatsThis::add(mDeleteCb, 00110 i18n("Select this option to delete old appointments without saving them." 00111 "It is not possible to recover the appointments later.")); 00112 topLayout->addWidget(mDeleteCb); 00113 connect(mDeleteCb, SIGNAL(toggled(bool)), mArchiveFile, SLOT(setDisabled(bool))); 00114 connect(mDeleteCb, SIGNAL(toggled(bool)), this, SLOT(slotEnableUser1())); 00115 connect(mArchiveFile->lineEdit(),SIGNAL(textChanged ( const QString & )), 00116 this,SLOT(slotEnableUser1())); 00117 enableButton(KDialogBase::User1,!mArchiveFile->lineEdit()->text().isEmpty()); 00118 } 00119 00120 ArchiveDialog::~ArchiveDialog() 00121 { 00122 } 00123 00124 void ArchiveDialog::slotEnableUser1() 00125 { 00126 bool state = ( mDeleteCb->isChecked() || 00127 !mArchiveFile->lineEdit()->text().isEmpty() ); 00128 enableButton(KDialogBase::User1,state); 00129 } 00130 00131 // Archive old events 00132 void ArchiveDialog::slotUser1() 00133 { 00134 if (mDeleteCb->isChecked()) { 00135 deleteOldEvents(); 00136 return; 00137 } 00138 00139 // Get destination URL 00140 KURL destUrl ( mArchiveFile->url() ); 00141 if ( !destUrl.isValid() ) { 00142 KMessageBox::sorry(this,i18n("The archive file name is not valid.\n")); 00143 return; 00144 } 00145 // Force filename to be ending with vCalendar extension 00146 QString filename = destUrl.fileName(); 00147 if (filename.right(4) != ".vcs" && filename.right(4) != ".ics") { 00148 filename.append(".ics"); 00149 destUrl.setFileName(filename); 00150 } 00151 00152 // Get events to be archived 00153 Event::List events = mCalendar->events( QDate( 1800, 1, 1 ), 00154 mDateEdit->date().addDays( -1 ), 00155 true ); 00156 if ( events.count() == 0 ) { 00157 KMessageBox::sorry(this,i18n("There are no events before %1") 00158 .arg(KGlobal::locale()->formatDate(mDateEdit->date()))); 00159 return; 00160 } 00161 00162 FileStorage storage( mCalendar ); 00163 00164 // Save current calendar to disk 00165 KTempFile tmpFile; 00166 tmpFile.setAutoDelete(true); 00167 storage.setFileName( tmpFile.name() ); 00168 if ( !storage.save() ) { 00169 kdDebug(5850) << "ArchiveDialog::slotUser1(): Can't save calendar to temp file" << endl; 00170 return; 00171 } 00172 00173 // Duplicate current calendar by loading in new calendar object 00174 CalendarLocal archiveCalendar( KOPrefs::instance()->mTimeZoneId ); 00175 00176 FileStorage archiveStore( &archiveCalendar ); 00177 archiveStore.setFileName( tmpFile.name() ); 00178 if (!archiveStore.load()) { 00179 kdDebug(5850) << "ArchiveDialog::slotUser1(): Can't load calendar from temp file" << endl; 00180 return; 00181 } 00182 00183 // Strip active events from calendar so that only events to be archived 00184 // remain. 00185 Event::List activeEvents = archiveCalendar.events( mDateEdit->date(), 00186 QDate( 3000, 1, 1 ), 00187 false ); 00188 Event::List::ConstIterator it; 00189 for( it = activeEvents.begin(); it != activeEvents.end(); ++it ) { 00190 archiveCalendar.deleteEvent( *it ); 00191 } 00192 00193 // Get or create the archive file 00194 QString archiveFile; 00195 00196 if ( KIO::NetAccess::exists( destUrl, true, this ) ) { 00197 if( !KIO::NetAccess::download( destUrl, archiveFile, this ) ) { 00198 kdDebug(5850) << "ArchiveDialog::slotUser1(): Can't download archive file" << endl; 00199 return; 00200 } 00201 // Merge with events to be archived. 00202 archiveStore.setFileName( archiveFile ); 00203 if ( !archiveStore.load() ) { 00204 kdDebug(5850) << "ArchiveDialog::slotUser1(): Can't merge with archive file" << endl; 00205 return; 00206 } 00207 /* 00208 QPtrList<Event> es = archiveCalendar.events(QDate(1800,1,1), 00209 QDate(3000,1,1), 00210 false); 00211 kdDebug(5850) << "--Following events in archive calendar:" << endl; 00212 Event *e; 00213 for(e=es.first();e;e=es.next()) { 00214 kdDebug(5850) << "-----Event: " << e->getSummary() << endl; 00215 } 00216 */ 00217 } else { 00218 archiveFile = tmpFile.name(); 00219 } 00220 00221 // Save archive calendar 00222 if ( !archiveStore.save() ) { 00223 KMessageBox::error(this,i18n("Cannot write archive file.")); 00224 return; 00225 } 00226 00227 // Upload if necessary 00228 KURL srcUrl; 00229 srcUrl.setPath(archiveFile); 00230 if (srcUrl != destUrl) { 00231 if ( !KIO::NetAccess::upload( archiveFile, destUrl, this ) ) { 00232 KMessageBox::error(this,i18n("Cannot write archive to final destination.")); 00233 return; 00234 } 00235 } 00236 00237 KOPrefs::instance()->mArchiveFile = destUrl.url(); 00238 00239 KIO::NetAccess::removeTempFile(archiveFile); 00240 00241 // Delete archived events from calendar 00242 for( it = events.begin(); it != events.end(); ++it ) { 00243 mCalendar->deleteEvent( *it ); 00244 } 00245 emit eventsDeleted(); 00246 00247 accept(); 00248 } 00249 00250 // Delete old events 00251 void ArchiveDialog::deleteOldEvents() 00252 { 00253 Event::List events = mCalendar->events( QDate( 1769, 12, 1 ), 00254 mDateEdit->date().addDays( -1 ), 00255 true ); 00256 00257 if ( events.count() == 0 ) { 00258 KMessageBox::sorry(this,i18n("There are no events before %1") 00259 .arg(KGlobal::locale()->formatDate(mDateEdit->date()))); 00260 return; 00261 } 00262 00263 QStringList eventStrs; 00264 Event::List::ConstIterator it; 00265 for( it = events.begin(); it != events.end(); ++it ) { 00266 eventStrs.append( (*it)->summary() ); 00267 } 00268 00269 int result = KMessageBox::warningContinueCancelList(this, 00270 i18n("Delete all events before %1 without saving?\n" 00271 "The following events will be deleted:") 00272 .arg(KGlobal::locale()->formatDate(mDateEdit->date())),eventStrs, 00273 i18n("Delete old events"),i18n("&Delete")); 00274 if (result == KMessageBox::Continue) { 00275 for( it = events.begin(); it != events.end(); ++it ) { 00276 mCalendar->deleteEvent( *it ); 00277 } 00278 emit eventsDeleted(); 00279 accept(); 00280 } 00281 }
KDE Logo
This file is part of the documentation for korganizer Library Version 3.2.2.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Wed Jul 28 23:58:12 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003