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(5800) <<
"FreeBusy::FreeBusy" << endl;
00040 mCalendar = calendar;
00041
00042
setDtStart(start);
00043 setDtEnd(end);
00044
00045
00046 Event::List eventList = mCalendar->
rawEvents( start.date(), end.date() );
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
Event *floatingEvent = 0;
00063
if ( event->
doesFloat() ) {
00064
00065 kdDebug(5800) <<
"Floating event\n";
00066 floatingEvent =
new Event( *event );
00067
00068
00069
QDateTime start( floatingEvent->
dtStart().date(),
QTime( 0, 0 ) );
00070
QDateTime end( floatingEvent->
dtEnd().date(),
QTime( 23, 59, 59, 999 ) );
00071 floatingEvent->
setFloats(
false );
00072 floatingEvent->
setDtStart( start );
00073 floatingEvent->
setDtEnd( end );
00074
00075 kdDebug(5800) <<
"Use: " << start.toString() <<
" to " << end.toString()
00076 << endl;
00077
00078 event = floatingEvent;
00079 }
00080
00081
00082
00083
00084
00085
00086
if ( event->
transparency() == Event::Transparent )
00087
00088
continue;
00089
00090
for(i=0; i<=duration; i++) {
00091 day=(start.addDays(i).date());
00092 tmpStart.setDate(day);
00093 tmpEnd.setDate(day);
00094
00095
if( event->
doesRecur() ) {
00096
if ( event->
isMultiDay() ) {
00097 extraDays = event->
dtStart().date().daysTo(event->
dtEnd().date());
00098
for (x=0; x<=extraDays; x++) {
00099
if ( event->
recursOn(day.addDays(-x))) {
00100 tmpStart.setDate(day.addDays(-x));
00101 tmpStart.setTime(event->
dtStart().time());
00102 tmpEnd=tmpStart.addSecs( (event->
duration()) );
00103
00104 addLocalPeriod( tmpStart, tmpEnd );
00105
break;
00106 }
00107 }
00108 }
else {
00109
if (event->
recursOn(day)) {
00110 tmpStart.setTime(event->
dtStart().time());
00111 tmpEnd.setTime(event->
dtEnd().time());
00112
00113 addLocalPeriod (tmpStart, tmpEnd);
00114 }
00115 }
00116 }
00117
00118 }
00119
00120 addLocalPeriod(event->
dtStart(), event->
dtEnd());
00121
00122
00123
delete floatingEvent;
00124 }
00125
00126 sortList();
00127 }
00128
00129 FreeBusy::~FreeBusy()
00130 {
00131 }
00132
00133
bool FreeBusy::setDtEnd(
const QDateTime &end )
00134 {
00135 mDtEnd = end;
00136
return true;
00137 }
00138
00139
QDateTime FreeBusy::dtEnd()
const
00140
{
00141
return mDtEnd;
00142 }
00143
00144
QValueList<Period> FreeBusy::busyPeriods()
const
00145
{
00146
return mBusyPeriods;
00147 }
00148
00149
bool FreeBusy::addLocalPeriod(
const QDateTime &eventStart,
const QDateTime &eventEnd ) {
00150
QDateTime tmpStart;
00151
QDateTime tmpEnd;
00152
00153
00154
00155
if (!((((this->
dtStart()).secsTo(eventStart)>=0)&&(eventStart.secsTo(this->dtEnd())>=0))
00156 ||(((this->
dtStart()).secsTo(eventEnd) >= 0)&&(eventEnd.secsTo(this->dtEnd()) >= 0))))
00157
return false;
00158
00159
if ( eventStart.secsTo(this->dtStart())>=0) {
00160 tmpStart = this->
dtStart();
00161 }
else {
00162 tmpStart = eventStart;
00163 }
00164
00165
if ( eventEnd.secsTo(this->dtEnd())<=0 ) {
00166 tmpEnd = this->dtEnd();
00167 }
else {
00168 tmpEnd = eventEnd;
00169 }
00170
00171
Period p(tmpStart, tmpEnd);
00172 mBusyPeriods.append( p );
00173
00174
return true;
00175 }
00176
00177 FreeBusy::FreeBusy(
QValueList<Period> busyPeriods)
00178 {
00179 mBusyPeriods = busyPeriods;
00180 }
00181
00182
void FreeBusy::sortList()
00183 {
00184
typedef QValueList<Period> PeriodList;
00185
00186 PeriodList::Iterator tmpPeriod, earlyPeriod;
00187 PeriodList sortedList;
00188
QDateTime earlyTime;
00189
00190
while( mBusyPeriods.count() > 0 ) {
00191 earlyTime=(*mBusyPeriods.begin()).start();
00192
for (tmpPeriod=mBusyPeriods.begin(); tmpPeriod!=mBusyPeriods.end(); tmpPeriod++) {
00193
if (earlyTime.secsTo((*tmpPeriod).start()) <= 0) {
00194 earlyTime=(*tmpPeriod).start();
00195 earlyPeriod=tmpPeriod;
00196 }
00197 }
00198
00199
Period tmpPeriod( (*earlyPeriod).start(), (*earlyPeriod).end() );
00200 sortedList.append( tmpPeriod );
00201 mBusyPeriods.remove( earlyPeriod );
00202 }
00203 mBusyPeriods=sortedList;
00204 }
00205
00206
void FreeBusy::addPeriod(
const QDateTime &start,
const QDateTime &end)
00207 {
00208
Period p(start, end);
00209 mBusyPeriods.append( p );
00210
00211 sortList();
00212 }