korganizer
datenavigator.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "datenavigator.h"
00026 #include "koglobals.h"
00027
00028 #include <kcalendarsystem.h>
00029 #include <kdebug.h>
00030 #include <kglobal.h>
00031 #include <klocale.h>
00032
00033 using namespace KCal;
00034
00035 DateNavigator::DateNavigator( QObject *parent ) : QObject( parent )
00036 {
00037 mSelectedDates.append( QDate::currentDate() );
00038 }
00039
00040 DateNavigator::~DateNavigator()
00041 {
00042 }
00043
00044 DateList DateNavigator::selectedDates()
00045 {
00046 return mSelectedDates;
00047 }
00048
00049 int DateNavigator::datesCount() const
00050 {
00051 return mSelectedDates.count();
00052 }
00053
00054 void DateNavigator::selectDates( const DateList &dateList )
00055 {
00056 if ( dateList.count() > 0 ) {
00057 mSelectedDates = dateList;
00058 emitSelected();
00059 }
00060 }
00061
00062 void DateNavigator::selectDate( const QDate &date )
00063 {
00064 QDate d = date;
00065
00066 if ( !d.isValid() ) {
00067 kDebug() << "an invalid date was passed as a parameter!";
00068 d = QDate::currentDate();
00069 }
00070
00071 mSelectedDates.clear();
00072 mSelectedDates.append( d );
00073
00074 emitSelected();
00075 }
00076
00077 void DateNavigator::selectDates( int count )
00078 {
00079 selectDates( mSelectedDates.first(), count );
00080 }
00081
00082 void DateNavigator::selectDates( const QDate &d, int count )
00083 {
00084 DateList dates;
00085
00086 int i;
00087 for ( i = 0; i < count; ++i ) {
00088 dates.append( d.addDays( i ) );
00089 }
00090
00091 mSelectedDates = dates;
00092 emitSelected();
00093 }
00094
00095 void DateNavigator::selectWeekByDay( int weekDay, const QDate &d )
00096 {
00097 int dateCount = mSelectedDates.count();
00098 bool weekStart = ( weekDay == KGlobal::locale()->weekStartDay() );
00099 if ( weekStart && dateCount == 7 ) {
00100 selectWeek( d );
00101 } else {
00102 selectDates( d, dateCount );
00103 }
00104 }
00105
00106 void DateNavigator::selectWeek()
00107 {
00108 selectWeek( mSelectedDates.first() );
00109 }
00110
00111 void DateNavigator::selectWeek( const QDate &d )
00112 {
00113 int dayOfWeek = KOGlobals::self()->calendarSystem()->dayOfWeek( d );
00114
00115 int weekStart = KGlobal::locale()->weekStartDay();
00116
00117 QDate firstDate = d.addDays( weekStart - dayOfWeek );
00118
00119 if ( weekStart != 1 && dayOfWeek < weekStart ) {
00120 firstDate = firstDate.addDays( -7 );
00121 }
00122
00123 selectDates( firstDate, 7 );
00124 }
00125
00126 void DateNavigator::selectWorkWeek()
00127 {
00128 selectWorkWeek( mSelectedDates.first() );
00129 }
00130
00131 void DateNavigator::selectWorkWeek( const QDate &d )
00132 {
00133 int weekStart = KGlobal::locale()->weekStartDay();
00134 int dayOfWeek = KOGlobals::self()->calendarSystem()->dayOfWeek( d );
00135 QDate currentDate = d.addDays( weekStart - dayOfWeek );
00136
00137 if ( weekStart != 1 && dayOfWeek < weekStart ) {
00138 currentDate = currentDate.addDays( -7 );
00139 }
00140
00141 mSelectedDates.clear();
00142 int mask = KOGlobals::self()->getWorkWeekMask();
00143
00144 for ( int i = 0; i < 7; ++i ) {
00145 if ( ( 1 << ( ( i + weekStart + 6 ) % 7 ) ) & (mask) ) {
00146 mSelectedDates.append( currentDate.addDays( i ) );
00147 }
00148 }
00149
00150 emitSelected();
00151 }
00152
00153 void DateNavigator::selectToday()
00154 {
00155 QDate d = QDate::currentDate();
00156
00157 int dateCount = mSelectedDates.count();
00158
00159 if ( dateCount == 7 ) {
00160 selectWeek( d );
00161 } else {
00162 selectDates( d, dateCount );
00163 }
00164 }
00165
00166 void DateNavigator::selectPreviousYear()
00167 {
00168 QDate firstSelected = mSelectedDates.first();
00169 int weekDay = firstSelected.dayOfWeek();
00170 firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, -1 );
00171
00172 selectWeekByDay( weekDay, firstSelected );
00173 }
00174
00175 void DateNavigator::selectPreviousMonth()
00176 {
00177 QDate firstSelected = mSelectedDates.first();
00178 int weekDay = firstSelected.dayOfWeek();
00179 firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, -1 );
00180
00181 selectWeekByDay( weekDay, firstSelected );
00182 }
00183
00184 void DateNavigator::selectPreviousWeek()
00185 {
00186 QDate firstSelected = mSelectedDates.first();
00187 int weekDay = firstSelected.dayOfWeek();
00188 firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, -7 );
00189
00190 selectWeekByDay( weekDay, firstSelected );
00191 }
00192
00193 void DateNavigator::selectNextWeek()
00194 {
00195 QDate firstSelected = mSelectedDates.first();
00196 int weekDay = firstSelected.dayOfWeek();
00197
00198 firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, 7 );
00199
00200 selectWeekByDay( weekDay, firstSelected );
00201 }
00202
00203 void DateNavigator::selectNextMonth()
00204 {
00205 QDate firstSelected = mSelectedDates.first();
00206 int weekDay = firstSelected.dayOfWeek();
00207
00208 firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, 1 );
00209
00210 selectWeekByDay( weekDay, firstSelected );
00211 }
00212
00213 void DateNavigator::selectNextYear()
00214 {
00215 QDate firstSelected = mSelectedDates.first();
00216 int weekDay = firstSelected.dayOfWeek();
00217 firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, 1 );
00218
00219 selectWeekByDay( weekDay, firstSelected );
00220 }
00221
00222 void DateNavigator::selectPrevious()
00223 {
00224 int offset = -7;
00225 if ( datesCount() == 1 ) {
00226 offset = -1;
00227 }
00228
00229 selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
00230 }
00231
00232 void DateNavigator::selectNext()
00233 {
00234 int offset = 7;
00235 if ( datesCount() == 1 ) {
00236 offset = 1;
00237 }
00238
00239 selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
00240 }
00241
00242 void DateNavigator::selectMonth( int month )
00243 {
00244 QDate firstSelected = mSelectedDates.first();
00245 int weekDay = firstSelected.dayOfWeek();
00246
00247 const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem();
00248 int day = calSys->day( firstSelected );
00249 calSys->setYMD( firstSelected, calSys->year( firstSelected ), month, 1 );
00250 int days = calSys->daysInMonth( firstSelected );
00251
00252
00253 if ( day > days ) {
00254 day = days;
00255 }
00256 calSys->setYMD( firstSelected, calSys->year( firstSelected ), month, day );
00257
00258 selectWeekByDay( weekDay, firstSelected );
00259 }
00260
00261 void DateNavigator::selectYear( int year )
00262 {
00263 QDate firstSelected = mSelectedDates.first();
00264 int deltaYear = year - KOGlobals::self()->calendarSystem()->year( firstSelected );
00265 firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, deltaYear );
00266
00267 int weekDay = firstSelected.dayOfWeek();
00268 selectWeekByDay( weekDay, firstSelected );
00269 }
00270
00271 void DateNavigator::emitSelected()
00272 {
00273 emit datesSelected( mSelectedDates );
00274 }
00275
00276 #include "datenavigator.moc"