libkcal

incidence.cpp

Go to the documentation of this file.
00001 /*
00002     This file is part of libkcal.
00003 
00004     Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org>
00005     Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
00006 
00007     This library is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU Library General Public
00009     License as published by the Free Software Foundation; either
00010     version 2 of the License, or (at your option) any later version.
00011 
00012     This library is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     Library General Public License for more details.
00016 
00017     You should have received a copy of the GNU Library General Public License
00018     along with this library; see the file COPYING.LIB.  If not, write to
00019     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00020     Boston, MA 02110-1301, USA.
00021 */
00022 
00023 #include <kglobal.h>
00024 #include <klocale.h>
00025 #include <kdebug.h>
00026 
00027 #include "calformat.h"
00028 
00029 #include "incidence.h"
00030 
00031 using namespace KCal;
00032 
00033 Incidence::Incidence() :
00034   IncidenceBase(),
00035   mRelatedTo(0), mStatus(StatusNone), mSecrecy(SecrecyPublic),
00036   mPriority(0), mRecurrence(0)
00037 {
00038   recreate();
00039 
00040   mAlarms.setAutoDelete(true);
00041   mAttachments.setAutoDelete(true);
00042 }
00043 
00044 Incidence::Incidence( const Incidence &i ) : IncidenceBase( i ),Recurrence::Observer()
00045 {
00046 // TODO: reenable attributes currently commented out.
00047   mRevision = i.mRevision;
00048   mCreated = i.mCreated;
00049   mDescription = i.mDescription;
00050   mSummary = i.mSummary;
00051   mCategories = i.mCategories;
00052 //  Incidence *mRelatedTo;          Incidence *mRelatedTo;
00053   mRelatedTo = 0;
00054   mRelatedToUid = i.mRelatedToUid;
00055 //  Incidence::List mRelations;    Incidence::List mRelations;
00056   mResources = i.mResources;
00057   mStatusString = i.mStatusString;
00058   mStatus = i.mStatus;
00059   mSecrecy = i.mSecrecy;
00060   mPriority = i.mPriority;
00061   mLocation = i.mLocation;
00062 
00063   // Alarms and Attachments are stored in ListBase<...>, which is a QValueList<...*>.
00064   // We need to really duplicate the objects stored therein, otherwise deleting
00065   // i will also delete all attachments from this object (setAutoDelete...)
00066   Alarm::List::ConstIterator it;
00067   for( it = i.mAlarms.begin(); it != i.mAlarms.end(); ++it ) {
00068     Alarm *b = new Alarm( **it );
00069     b->setParent( this );
00070     mAlarms.append( b );
00071   }
00072   mAlarms.setAutoDelete(true);
00073 
00074   Attachment::List::ConstIterator it1;
00075   for ( it1 = i.mAttachments.begin(); it1 != i.mAttachments.end(); ++it1 ) {
00076     Attachment *a = new Attachment( **it1 );
00077     mAttachments.append( a );
00078   }
00079   mAttachments.setAutoDelete( true );
00080 
00081   if (i.mRecurrence) {
00082     mRecurrence = new Recurrence( *(i.mRecurrence) );
00083     mRecurrence->addObserver( this );
00084   } else
00085     mRecurrence = 0;
00086 
00087   mSchedulingID = i.mSchedulingID;
00088 }
00089 
00090 Incidence::~Incidence()
00091 {
00092     Incidence::List Relations = mRelations;
00093     List::ConstIterator it;
00094     for ( it = Relations.begin(); it != Relations.end(); ++it ) {
00095         if ( (*it)->relatedTo() == this ) (*it)->mRelatedTo = 0;
00096     }
00097     if ( relatedTo() ) relatedTo()->removeRelation( this );
00098 
00099     delete mRecurrence;
00100 }
00101 
00102 // A string comparison that considers that null and empty are the same
00103 static bool stringCompare( const QString& s1, const QString& s2 )
00104 {
00105   return ( s1.isEmpty() && s2.isEmpty() ) || (s1 == s2);
00106 }
00107 
00108 Incidence& Incidence::operator=( const Incidence &i )
00109 {
00110   if ( &i == this )
00111     return *this;
00112   IncidenceBase::operator=( i );
00113   mRevision = i.mRevision;
00114   mCreated = i.mCreated;
00115   mDescription = i.mDescription;
00116   mSummary = i.mSummary;
00117   mCategories = i.mCategories;
00118   mRelatedTo = 0;
00119   mRelatedToUid = i.mRelatedToUid;
00120   mRelations.clear();
00121   mResources = i.mResources;
00122   mStatusString = i.mStatusString;
00123   mStatus = i.mStatus;
00124   mSecrecy = i.mSecrecy;
00125   mPriority = i.mPriority;
00126   mLocation = i.mLocation;
00127 
00128   mAlarms.clearAll();
00129   Alarm::List::ConstIterator it;
00130   for( it = i.mAlarms.begin(); it != i.mAlarms.end(); ++it ) {
00131     Alarm *b = new Alarm( **it );
00132     b->setParent( this );
00133     mAlarms.append( b );
00134   }
00135 
00136   mAttachments.clearAll();
00137   Attachment::List::ConstIterator it1;
00138   for ( it1 = i.mAttachments.begin(); it1 != i.mAttachments.end(); ++it1 ) {
00139     Attachment *a = new Attachment( **it1 );
00140     mAttachments.append( a );
00141   }
00142 
00143   delete mRecurrence;
00144   if (i.mRecurrence) {
00145     mRecurrence = new Recurrence( *(i.mRecurrence) );
00146     mRecurrence->addObserver( this );
00147   } else
00148     mRecurrence = 0;
00149 
00150   mSchedulingID = i.mSchedulingID;
00151   return *this;
00152 }
00153 
00154 bool Incidence::operator==( const Incidence& i2 ) const
00155 {
00156     if( alarms().count() != i2.alarms().count() ) {
00157         return false; // no need to check further
00158     }
00159 
00160     Alarm::List::ConstIterator a1 = alarms().begin();
00161     Alarm::List::ConstIterator a2 = i2.alarms().begin();
00162     for( ; a1 != alarms().end() && a2 != i2.alarms().end(); ++a1, ++a2 )
00163         if( **a1 == **a2 )
00164             continue;
00165         else {
00166             return false;
00167         }
00168 
00169     if ( !IncidenceBase::operator==(i2) )
00170         return false;
00171 
00172     bool recurrenceEqual = ( mRecurrence == 0 && i2.mRecurrence == 0 );
00173     if ( !recurrenceEqual )
00174     {
00175         recurrenceEqual = mRecurrence != 0 &&
00176                           i2.mRecurrence != 0 &&
00177                           *mRecurrence == *i2.mRecurrence;
00178     }
00179 
00180     return
00181         recurrenceEqual &&
00182         created() == i2.created() &&
00183         stringCompare( description(), i2.description() ) &&
00184         stringCompare( summary(), i2.summary() ) &&
00185         categories() == i2.categories() &&
00186         // no need to compare mRelatedTo
00187         stringCompare( relatedToUid(), i2.relatedToUid() ) &&
00188         relations() == i2.relations() &&
00189         attachments() == i2.attachments() &&
00190         resources() == i2.resources() &&
00191         mStatus == i2.mStatus &&
00192         ( mStatus == StatusNone || stringCompare( mStatusString, i2.mStatusString ) ) &&
00193         secrecy() == i2.secrecy() &&
00194         priority() == i2.priority() &&
00195         stringCompare( location(), i2.location() ) &&
00196         stringCompare( schedulingID(), i2.schedulingID() );
00197 }
00198 
00199 
00200 void Incidence::recreate()
00201 {
00202   setCreated(QDateTime::currentDateTime());
00203 
00204   setUid(CalFormat::createUniqueId());
00205   setSchedulingID( QString::null );
00206 
00207   setRevision(0);
00208 
00209   setLastModified(QDateTime::currentDateTime());
00210   setPilotId( 0 );
00211   setSyncStatus( SYNCNONE );
00212 }
00213 
00214 void Incidence::setReadOnly( bool readOnly )
00215 {
00216   IncidenceBase::setReadOnly( readOnly );
00217   if ( mRecurrence )
00218     mRecurrence->setRecurReadOnly( readOnly );
00219 }
00220 
00221 void Incidence::setFloats(bool f)
00222 {
00223   if (mReadOnly) return;
00224   if ( recurrence() )
00225     recurrence()->setFloats( f );
00226   IncidenceBase::setFloats( f );
00227 }
00228 
00229 void Incidence::setCreated( const QDateTime &created )
00230 {
00231   if (mReadOnly) return;
00232   mCreated = created;
00233 
00234 // FIXME: Shouldn't we call updated for the creation date, too?
00235 //  updated();
00236 }
00237 
00238 QDateTime Incidence::created() const
00239 {
00240   return mCreated;
00241 }
00242 
00243 void Incidence::setRevision( int rev )
00244 {
00245   if (mReadOnly) return;
00246   mRevision = rev;
00247 
00248   updated();
00249 }
00250 
00251 int Incidence::revision() const
00252 {
00253   return mRevision;
00254 }
00255 
00256 void Incidence::setDtStart(const QDateTime &dtStart)
00257 {
00258   if ( mRecurrence ) {
00259     mRecurrence->setStartDateTime( dtStart );
00260     mRecurrence->setFloats( doesFloat() );
00261   }
00262   IncidenceBase::setDtStart( dtStart );
00263 }
00264 
00265 void Incidence::setDescription(const QString &description)
00266 {
00267   if (mReadOnly) return;
00268   mDescription = description;
00269   updated();
00270 }
00271 
00272 QString Incidence::description() const
00273 {
00274   return mDescription;
00275 }
00276 
00277 
00278 void Incidence::setSummary(const QString &summary)
00279 {
00280   if (mReadOnly) return;
00281   mSummary = summary;
00282   updated();
00283 }
00284 
00285 QString Incidence::summary() const
00286 {
00287   return mSummary;
00288 }
00289 
00290 void Incidence::setCategories(const QStringList &categories)
00291 {
00292   if (mReadOnly) return;
00293   mCategories = categories;
00294   updated();
00295 }
00296 
00297 // TODO: remove setCategories(QString) function
00298 void Incidence::setCategories(const QString &catStr)
00299 {
00300   if (mReadOnly) return;
00301   mCategories.clear();
00302 
00303   if (catStr.isEmpty()) return;
00304 
00305   mCategories = QStringList::split(",",catStr);
00306 
00307   QStringList::Iterator it;
00308   for(it = mCategories.begin();it != mCategories.end(); ++it) {
00309     *it = (*it).stripWhiteSpace();
00310   }
00311 
00312   updated();
00313 }
00314 
00315 QStringList Incidence::categories() const
00316 {
00317   return mCategories;
00318 }
00319 
00320 QString Incidence::categoriesStr() const
00321 {
00322   return mCategories.join(",");
00323 }
00324 
00325 void Incidence::setRelatedToUid(const QString &relatedToUid)
00326 {
00327   if ( mReadOnly || mRelatedToUid == relatedToUid ) return;
00328   mRelatedToUid = relatedToUid;
00329   updated();
00330 }
00331 
00332 QString Incidence::relatedToUid() const
00333 {
00334   return mRelatedToUid;
00335 }
00336 
00337 void Incidence::setRelatedTo(Incidence *relatedTo)
00338 {
00339   if (mReadOnly || mRelatedTo == relatedTo) return;
00340   if(mRelatedTo)
00341     mRelatedTo->removeRelation(this);
00342   mRelatedTo = relatedTo;
00343   if (mRelatedTo) {
00344     mRelatedTo->addRelation(this);
00345     if ( mRelatedTo->uid() != mRelatedToUid )
00346       setRelatedToUid( mRelatedTo->uid() );
00347   } else {
00348     setRelatedToUid( QString::null );
00349   }
00350 }
00351 
00352 Incidence *Incidence::relatedTo() const
00353 {
00354   return mRelatedTo;
00355 }
00356 
00357 Incidence::List Incidence::relations() const
00358 {
00359   return mRelations;
00360 }
00361 
00362 void Incidence::addRelation( Incidence *event )
00363 {
00364   if ( mRelations.find( event ) == mRelations.end() ) {
00365     mRelations.append( event );
00366   }
00367 }
00368 
00369 void Incidence::removeRelation(Incidence *event)
00370 // Remove the relation of our incident. E.g. if you have a task t and a
00371 // subtask, the subtask will have its relation to the task t.
00372 {
00373   mRelations.removeRef(event);
00374 //  if (event->getRelatedTo() == this) event->setRelatedTo(0);
00375   mRelatedToUid=QString();
00376 }
00377 
00378 
00379 // %%%%%%%%%%%%  Recurrence-related methods %%%%%%%%%%%%%%%%%%%%
00380 
00381 
00382 Recurrence *Incidence::recurrence() const
00383 {
00384   if (!mRecurrence)
00385   {
00386     const_cast<KCal::Incidence*>(this)->mRecurrence = new Recurrence();
00387     mRecurrence->setStartDateTime( IncidenceBase::dtStart() );
00388     mRecurrence->setFloats( doesFloat() );
00389     mRecurrence->setRecurReadOnly( mReadOnly );
00390     mRecurrence->addObserver( const_cast<KCal::Incidence*>(this) );
00391   }
00392 
00393   return mRecurrence;
00394 }
00395 
00396 void Incidence::clearRecurrence()
00397 {
00398   delete mRecurrence;
00399   mRecurrence = 0;
00400 }
00401 
00402 uint Incidence::recurrenceType() const
00403 {
00404   if ( mRecurrence ) return mRecurrence->recurrenceType();
00405   else return Recurrence::rNone;
00406 }
00407 
00408 bool Incidence::doesRecur() const
00409 {
00410   if ( mRecurrence ) return mRecurrence->doesRecur();
00411   else return false;
00412 }
00413 
00414 bool Incidence::recursOn(const QDate &qd) const
00415 {
00416   return ( mRecurrence && mRecurrence->recursOn(qd) );
00417 }
00418 
00419 bool Incidence::recursAt(const QDateTime &qdt) const
00420 {
00421   return ( mRecurrence && mRecurrence->recursAt(qdt) );
00422 }
00423 
00432 QValueList<QDateTime> Incidence::startDateTimesForDate( const QDate &date ) const
00433 {
00434 //kdDebug(5800) << "Incidence::startDateTimesForDate " << date << ", incidence=" << summary() << endl;
00435   QDateTime start = dtStart();
00436   QDateTime end = endDateRecurrenceBase();
00437 
00438   QValueList<QDateTime> result;
00439 
00440   // TODO_Recurrence: Also work if only due date is given...
00441   if ( !start.isValid() && ! end.isValid() ) {
00442     return result;
00443   }
00444 
00445   // if the incidence doesn't recur,
00446   if ( !doesRecur() ) {
00447     if ( !(start.date() > date || end.date() < date ) ) {
00448       result << start;
00449     }
00450     return result;
00451   }
00452 
00453   int days = start.daysTo( end );
00454   // Account for possible recurrences going over midnight, while the original event doesn't
00455   QDate tmpday( date.addDays( -days - 1 ) );
00456   QDateTime tmp;
00457   while ( tmpday <= date ) {
00458     if ( recurrence()->recursOn( tmpday ) ) {
00459       QValueList<QTime> times = recurrence()->recurTimesOn( tmpday );
00460       for ( QValueList<QTime>::ConstIterator it = times.begin(); it != times.end(); ++it ) {
00461         tmp = QDateTime( tmpday, *it );
00462         if ( endDateForStart( tmp ).date() >= date )
00463           result << tmp;
00464       }
00465     }
00466     tmpday = tmpday.addDays( 1 );
00467   }
00468   return result;
00469 }
00470 
00479 QValueList<QDateTime> Incidence::startDateTimesForDateTime( const QDateTime &datetime ) const
00480 {
00481 // kdDebug(5800) << "Incidence::startDateTimesForDateTime " << datetime << ", incidence=" << summary() << endl;
00482   QDateTime start = dtStart();
00483   QDateTime end = endDateRecurrenceBase();
00484 
00485   QValueList<QDateTime> result;
00486 
00487   // TODO_Recurrence: Also work if only due date is given...
00488   if ( !start.isValid() && ! end.isValid() ) {
00489     return result;
00490   }
00491 
00492   // if the incidence doesn't recur,
00493   if ( !doesRecur() ) {
00494     if ( !(start > datetime || end < datetime ) ) {
00495       result << start;
00496     }
00497     return result;
00498   }
00499 
00500   int days = start.daysTo( end );
00501   // Account for possible recurrences going over midnight, while the original event doesn't
00502   QDate tmpday( datetime.date().addDays( -days - 1 ) );
00503   QDateTime tmp;
00504   while ( tmpday <= datetime.date() ) {
00505     if ( recurrence()->recursOn( tmpday ) ) {
00506       QValueList<QTime> times = recurrence()->recurTimesOn( tmpday );
00507       for ( QValueList<QTime>::ConstIterator it = times.begin(); it != times.end(); ++it ) {
00508         tmp = QDateTime( tmpday, *it );
00509         if ( !(tmp > datetime || endDateForStart( tmp ) < datetime ) )
00510           result << tmp;
00511       }
00512     }
00513     tmpday = tmpday.addDays( 1 );
00514   }
00515   return result;
00516 }
00517 
00519 QDateTime Incidence::endDateForStart( const QDateTime &startDt ) const
00520 {
00521   QDateTime start = dtStart();
00522   QDateTime end = endDateRecurrenceBase();
00523   if ( !end.isValid() ) return start;
00524   if ( !start.isValid() ) return end;
00525 
00526   return startDt.addSecs( start.secsTo( end ) );
00527 }
00528 
00529 // %%%%%%%%%%%%%%%%% begin:RecurrenceRule %%%%%%%%%%%%%%%%%
00530 
00531 // Exception Dates
00532 /*void Incidence::setExDates(const DateList &exDates)
00533 {
00534   if ( mReadOnly ) return;
00535   recurrence()->setExDates( exDates );
00536   updated();
00537 }
00538 
00539 void Incidence::addExDate( const QDate &date )
00540 {
00541   if ( mReadOnly ) return;
00542   recurrence()->addExDate( date );
00543   updated();
00544 }
00545 
00546 DateList Incidence::exDates() const
00547 {
00548   if ( mRecurrence ) return mRecurrence->exDates();
00549   else return DateList();
00550 }
00551 
00552 
00553 // Exception DateTimes
00554 void Incidence::setExDateTimes( const DateTimeList &exDates )
00555 {
00556   if ( mReadOnly ) return;
00557   recurrence()->setExDateTimes( exDates );
00558   updated();
00559 }
00560 
00561 void Incidence::addExDateTime( const QDateTime &date )
00562 {
00563   if ( mReadOnly ) return;
00564   recurrence()->addExDateTime( date );
00565   updated();
00566 }
00567 
00568 DateTimeList Incidence::exDateTimes() const
00569 {
00570   if ( mRecurrence ) return mRecurrence->exDateTimes();
00571   else return DateTimeList();
00572 }
00573 
00574 
00575 // Recurrence Dates
00576 void Incidence::setRDates(const DateList &exDates)
00577 {
00578   if ( mReadOnly ) return;
00579   recurrence()->setRDates( exDates );
00580   updated();
00581 }
00582 
00583 void Incidence::addRDate( const QDate &date )
00584 {
00585   if ( mReadOnly ) return;
00586   recurrence()->addRDate( date );
00587   updated();
00588 }
00589 
00590 DateList Incidence::rDates() const
00591 {
00592   if ( mRecurrence ) return mRecurrence->rDates();
00593   else return DateList();
00594 }
00595 
00596 
00597 // Recurrence DateTimes
00598 void Incidence::setRDateTimes( const DateTimeList &exDates )
00599 {
00600   if ( mReadOnly ) return;
00601   recurrence()->setRDateTimes( exDates );
00602   updated();
00603 }
00604 
00605 void Incidence::addRDateTime( const QDateTime &date )
00606 {
00607   if ( mReadOnly ) return;
00608   recurrence()->addRDateTime( date );
00609   updated();
00610 }
00611 
00612 DateTimeList Incidence::rDateTimes() const
00613 {
00614   if ( mRecurrence ) return mRecurrence->rDateTimes();
00615   else return DateTimeList();
00616 }*/
00617 
00618 // %%%%%%%%%%%%%%%%% end:RecurrenceRule %%%%%%%%%%%%%%%%%
00619 
00620 void Incidence::addAttachment(Attachment *attachment)
00621 {
00622   if (mReadOnly || !attachment) return;
00623   mAttachments.append(attachment);
00624   updated();
00625 }
00626 
00627 void Incidence::deleteAttachment(Attachment *attachment)
00628 {
00629   mAttachments.removeRef(attachment);
00630 }
00631 
00632 void Incidence::deleteAttachments( const QString &mime )
00633 {
00634   Attachment::List::Iterator it = mAttachments.begin();
00635   while( it != mAttachments.end() ) {
00636     if ( (*it)->mimeType() == mime ) mAttachments.remove( it );
00637     else ++it;
00638   }
00639 }
00640 
00641 Attachment::List Incidence::attachments() const
00642 {
00643   return mAttachments;
00644 }
00645 
00646 Attachment::List Incidence::attachments(const QString& mime) const
00647 {
00648   Attachment::List attachments;
00649   Attachment::List::ConstIterator it;
00650   for( it = mAttachments.begin(); it != mAttachments.end(); ++it ) {
00651     if ( (*it)->mimeType() == mime ) attachments.append( *it );
00652   }
00653 
00654   return attachments;
00655 }
00656 
00657 void Incidence::clearAttachments()
00658 {
00659   mAttachments.clearAll();
00660 }
00661 
00662 void Incidence::setResources(const QStringList &resources)
00663 {
00664   if (mReadOnly) return;
00665   mResources = resources;
00666   updated();
00667 }
00668 
00669 QStringList Incidence::resources() const
00670 {
00671   return mResources;
00672 }
00673 
00674 
00675 void Incidence::setPriority(int priority)
00676 {
00677   if (mReadOnly) return;
00678   mPriority = priority;
00679   updated();
00680 }
00681 
00682 int Incidence::priority() const
00683 {
00684   return mPriority;
00685 }
00686 
00687 void Incidence::setStatus(Incidence::Status status)
00688 {
00689   if (mReadOnly || status == StatusX) return;
00690   mStatus = status;
00691   mStatusString = QString::null;
00692   updated();
00693 }
00694 
00695 void Incidence::setCustomStatus(const QString &status)
00696 {
00697   if (mReadOnly) return;
00698   mStatus = status.isEmpty() ? StatusNone : StatusX;
00699   mStatusString = status;
00700   updated();
00701 }
00702 
00703 Incidence::Status Incidence::status() const
00704 {
00705   return mStatus;
00706 }
00707 
00708 QString Incidence::statusStr() const
00709 {
00710   if (mStatus == StatusX)
00711     return mStatusString;
00712   return statusName(mStatus);
00713 }
00714 
00715 QString Incidence::statusName(Incidence::Status status)
00716 {
00717   switch (status) {
00718     case StatusTentative:    return i18n("incidence status", "Tentative");
00719     case StatusConfirmed:    return i18n("Confirmed");
00720     case StatusCompleted:    return i18n("Completed");
00721     case StatusNeedsAction:  return i18n("Needs-Action");
00722     case StatusCanceled:     return i18n("Canceled");
00723     case StatusInProcess:    return i18n("In-Process");
00724     case StatusDraft:        return i18n("Draft");
00725     case StatusFinal:        return i18n("Final");
00726     case StatusX:
00727     case StatusNone:
00728     default:                 return QString::null;
00729   }
00730 }
00731 
00732 void Incidence::setSecrecy(int sec)
00733 {
00734   if (mReadOnly) return;
00735   mSecrecy = sec;
00736   updated();
00737 }
00738 
00739 int Incidence::secrecy() const
00740 {
00741   return mSecrecy;
00742 }
00743 
00744 QString Incidence::secrecyStr() const
00745 {
00746   return secrecyName(mSecrecy);
00747 }
00748 
00749 QString Incidence::secrecyName(int secrecy)
00750 {
00751   switch (secrecy) {
00752     case SecrecyPublic:
00753       return i18n("Public");
00754     case SecrecyPrivate:
00755       return i18n("Private");
00756     case SecrecyConfidential:
00757       return i18n("Confidential");
00758     default:
00759       return i18n("Undefined");
00760   }
00761 }
00762 
00763 QStringList Incidence::secrecyList()
00764 {
00765   QStringList list;
00766   list << secrecyName(SecrecyPublic);
00767   list << secrecyName(SecrecyPrivate);
00768   list << secrecyName(SecrecyConfidential);
00769 
00770   return list;
00771 }
00772 
00773 
00774 const Alarm::List &Incidence::alarms() const
00775 {
00776   return mAlarms;
00777 }
00778 
00779 Alarm* Incidence::newAlarm()
00780 {
00781   Alarm* alarm = new Alarm(this);
00782   mAlarms.append(alarm);
00783 //  updated();
00784   return alarm;
00785 }
00786 
00787 void Incidence::addAlarm(Alarm *alarm)
00788 {
00789   mAlarms.append(alarm);
00790   updated();
00791 }
00792 
00793 void Incidence::removeAlarm(Alarm *alarm)
00794 {
00795   mAlarms.removeRef(alarm);
00796   updated();
00797 }
00798 
00799 void Incidence::clearAlarms()
00800 {
00801   mAlarms.clearAll();
00802   updated();
00803 }
00804 
00805 bool Incidence::isAlarmEnabled() const
00806 {
00807   Alarm::List::ConstIterator it;
00808   for( it = mAlarms.begin(); it != mAlarms.end(); ++it ) {
00809     if ( (*it)->enabled() ) return true;
00810   }
00811   return false;
00812 }
00813 
00814 void Incidence::setLocation(const QString &location)
00815 {
00816   if (mReadOnly) return;
00817   mLocation = location;
00818   updated();
00819 }
00820 
00821 QString Incidence::location() const
00822 {
00823   return mLocation;
00824 }
00825 
00826 void Incidence::setSchedulingID( const QString& sid )
00827 {
00828   mSchedulingID = sid;
00829 }
00830 
00831 QString Incidence::schedulingID() const
00832 {
00833   if ( mSchedulingID.isNull() )
00834     // Nothing set, so use the normal uid
00835     return uid();
00836   return mSchedulingID;
00837 }
00838 
00842 void Incidence::recurrenceUpdated( Recurrence *recurrence )
00843 {
00844   if ( recurrence == mRecurrence )
00845     updated();
00846 }
00847