freebusy.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <kdebug.h>
00022
00023 #include "freebusy.h"
00024
00025 using namespace KCal;
00026
00027 FreeBusy::FreeBusy()
00028 {
00029 }
00030
00031 FreeBusy::FreeBusy(const QDateTime &start, const QDateTime &end)
00032 {
00033 setDtStart(start);
00034 setDtEnd(end);
00035 }
00036
00037 FreeBusy::FreeBusy( Calendar *calendar, const QDateTime &start, const QDateTime &end )
00038 {
00039 kdDebug() << "FreeBusy::FreeBusy" << endl;
00040 mCalendar = calendar;
00041
00042 setDtStart(start);
00043 setDtEnd(end);
00044
00045
00046 Event::List eventList = mCalendar->events();
00047
00048 int extraDays, i, x, duration;
00049 duration = start.daysTo(end);
00050 QDate day;
00051 QDateTime tmpStart;
00052 QDateTime tmpEnd;
00053
00054 Event::List::ConstIterator it;
00055 for( it = eventList.begin(); it != eventList.end(); ++it ) {
00056 Event *event = *it;
00057
00058
00059
00060
00061
00062
00063 if ( event->transparency() == Event::Transparent )
00064
00065 continue;
00066
00067 for(i=0; i<=duration; i++) {
00068 day=(start.addDays(i).date());
00069 tmpStart.setDate(day);
00070 tmpEnd.setDate(day);
00071
00072 if( event->doesRecur() ) {
00073 if ( event->isMultiDay() ) {
00074 extraDays = event->dtStart().date().daysTo(event->dtEnd().date());
00075 for (x=0; x<=extraDays; x++) {
00076 if ( event->recursOn(day.addDays(-x))) {
00077 tmpStart.setDate(day.addDays(-x));
00078 tmpStart.setTime(event->dtStart().time());
00079 tmpEnd=tmpStart.addSecs( (event->duration()) );
00080
00081 addLocalPeriod( tmpStart, tmpEnd );
00082 break;
00083 }
00084 }
00085 } else {
00086 if (event->recursOn(day)) {
00087 tmpStart.setTime(event->dtStart().time());
00088 tmpEnd.setTime(event->dtEnd().time());
00089
00090 addLocalPeriod (tmpStart, tmpEnd);
00091 }
00092 }
00093 }
00094
00095 }
00096
00097 addLocalPeriod(event->dtStart(), event->dtEnd());
00098 }
00099
00100 sortList();
00101 }
00102
00103 FreeBusy::~FreeBusy()
00104 {
00105 }
00106
00107 bool FreeBusy::setDtEnd( const QDateTime &end )
00108 {
00109 mDtEnd = end;
00110 return true;
00111 }
00112
00113 QDateTime FreeBusy::dtEnd() const
00114 {
00115 return mDtEnd;
00116 }
00117
00118 QValueList<Period> FreeBusy::busyPeriods() const
00119 {
00120 return mBusyPeriods;
00121 }
00122
00123 bool FreeBusy::addLocalPeriod(const QDateTime &eventStart, const QDateTime &eventEnd ) {
00124 QDateTime tmpStart;
00125 QDateTime tmpEnd;
00126
00127
00128
00129 if (!((((this->dtStart()).secsTo(eventStart)>=0)&&(eventStart.secsTo(this->dtEnd())>=0))
00130 ||(((this->dtStart()).secsTo(eventEnd) >= 0)&&(eventEnd.secsTo(this->dtEnd()) >= 0))))
00131 return false;
00132
00133 if ( eventStart.secsTo(this->dtStart())>=0) {
00134 tmpStart = this->dtStart();
00135 } else {
00136 tmpStart = eventStart;
00137 }
00138
00139 if ( eventEnd.secsTo(this->dtEnd())<=0 ) {
00140 tmpEnd = this->dtEnd();
00141 } else {
00142 tmpEnd = eventEnd;
00143 }
00144
00145 Period p(tmpStart, tmpEnd);
00146 mBusyPeriods.append( p );
00147
00148 return true;
00149 }
00150
00151 FreeBusy::FreeBusy(QValueList<Period> busyPeriods)
00152 {
00153 mBusyPeriods = busyPeriods;
00154 }
00155
00156 void FreeBusy::sortList()
00157 {
00158 typedef QValueList<Period> PeriodList;
00159
00160 PeriodList::Iterator tmpPeriod, earlyPeriod;
00161 PeriodList sortedList;
00162 QDateTime earlyTime;
00163
00164 while( mBusyPeriods.count() > 0 ) {
00165 earlyTime=(*mBusyPeriods.begin()).start();
00166 for (tmpPeriod=mBusyPeriods.begin(); tmpPeriod!=mBusyPeriods.end(); tmpPeriod++) {
00167 if (earlyTime.secsTo((*tmpPeriod).start()) <= 0) {
00168 earlyTime=(*tmpPeriod).start();
00169 earlyPeriod=tmpPeriod;
00170 }
00171 }
00172
00173 Period tmpPeriod( (*earlyPeriod).start(), (*earlyPeriod).end() );
00174 sortedList.append( tmpPeriod );
00175 mBusyPeriods.remove( earlyPeriod );
00176 }
00177 mBusyPeriods=sortedList;
00178 }
00179
00180 void FreeBusy::addPeriod(const QDateTime &start, const QDateTime &end)
00181 {
00182 Period p(start, end);
00183 mBusyPeriods.append( p );
00184
00185 sortList();
00186 }
This file is part of the documentation for libkcal Library Version 3.2.2.