korganizer

datenavigator.cpp

00001 /*
00002     This file is part of KOrganizer.
00003     Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
00004     Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019 
00020     As a special exception, permission is given to link this program
00021     with any edition of Qt, and distribute the resulting executable,
00022     without including the source code for Qt in the source distribution.
00023 */
00024 
00025 #include "datenavigator.h"
00026 
00027 #include "koglobals.h"
00028 
00029 #include <kcalendarsystem.h>
00030 
00031 #include <kdebug.h>
00032 #include <kglobal.h>
00033 #include <klocale.h>
00034 
00035 using namespace KCal;
00036 
00037 DateNavigator::DateNavigator( QObject *parent, const char *name )
00038   : QObject( parent, name )
00039 {
00040   mSelectedDates.append( QDate::currentDate() );
00041 }
00042 
00043 DateNavigator::~DateNavigator()
00044 {
00045 }
00046 
00047 DateList DateNavigator::selectedDates()
00048 {
00049   return mSelectedDates;
00050 }
00051 
00052 int DateNavigator::datesCount() const
00053 {
00054   return mSelectedDates.count();
00055 }
00056 
00057 void DateNavigator::selectDates( const DateList &dateList )
00058 {
00059   if (dateList.count() > 0) {
00060     mSelectedDates = dateList;
00061 
00062     emitSelected();
00063   }
00064 }
00065 
00066 void DateNavigator::selectDate( const QDate &date )
00067 {
00068   QDate d = date;
00069 
00070   if ( !d.isValid() ) {
00071     kdDebug(5850) << "DateNavigator::selectDates(QDate): an invalid date was passed as a parameter!" << endl;
00072     d = QDate::currentDate();
00073   }
00074 
00075   mSelectedDates.clear();
00076   mSelectedDates.append( d );
00077 
00078   emitSelected();
00079 }
00080 
00081 void DateNavigator::selectDates( int count )
00082 {
00083   selectDates( mSelectedDates.first(), count );
00084 }
00085 
00086 void DateNavigator::selectDates( const QDate &d, int count )
00087 {
00088   DateList dates;
00089 
00090   int i;
00091   for( i = 0; i < count; ++i ) {
00092     dates.append( d.addDays( i ) );
00093   }
00094 
00095   mSelectedDates = dates;
00096 
00097   emitSelected();
00098 }
00099 
00100 void DateNavigator::selectWeekByDay( int weekDay, const QDate &d )
00101 {
00102   int dateCount = mSelectedDates.count();
00103   bool weekStart = ( weekDay == KGlobal::locale()->weekStartDay() );
00104   if ( weekStart && dateCount == 7 ) {
00105     selectWeek( d );
00106   } else {
00107     selectDates( d, dateCount );
00108   }
00109 }
00110 
00111 void DateNavigator::selectWeek()
00112 {
00113   selectWeek( mSelectedDates.first() );
00114 }
00115 
00116 void DateNavigator::selectWeek( const QDate &d )
00117 {
00118   int dayOfWeek = KOGlobals::self()->calendarSystem()->dayOfWeek( d );
00119 
00120   int weekStart = KGlobal::locale()->weekStartDay();
00121 
00122   QDate firstDate = d.addDays( weekStart - dayOfWeek );
00123 
00124   if ( weekStart != 1 && dayOfWeek < weekStart ) {
00125     firstDate = firstDate.addDays( -7 );
00126   }
00127 
00128   selectDates( firstDate, 7 );
00129 }
00130 
00131 void DateNavigator::selectWorkWeek()
00132 {
00133   selectWorkWeek( mSelectedDates.first() );
00134 }
00135 
00136 void DateNavigator::selectWorkWeek( const QDate &d )
00137 {
00138   int weekStart = KGlobal::locale()->weekStartDay();
00139 
00140   int dayOfWeek = KOGlobals::self()->calendarSystem()->dayOfWeek( d );
00141 
00142   QDate currentDate = d.addDays( weekStart - dayOfWeek );
00143 
00144   if ( weekStart != 1 && dayOfWeek < weekStart ) {
00145     currentDate = currentDate.addDays( -7 );
00146   }
00147 
00148   mSelectedDates.clear();
00149   int mask = KOGlobals::self()->getWorkWeekMask();
00150 
00151   for ( int i = 0; i < 7; ++i ) {
00152     if( (1<< ((i + weekStart + 6) % 7)) & (mask) ) {
00153     mSelectedDates.append( currentDate.addDays(i) );
00154     }
00155   }
00156 
00157   emitSelected();
00158 }
00159 
00160 void DateNavigator::selectToday()
00161 {
00162   QDate d = QDate::currentDate();
00163 
00164   int dateCount = mSelectedDates.count();
00165 
00166   if ( dateCount == 7 ) {
00167     selectWeek( d );
00168   } else if ( dateCount == 5 ) {
00169     selectWorkWeek( d );
00170   } else {
00171     selectDates( d, dateCount );
00172   }
00173 }
00174 
00175 void DateNavigator::selectPreviousYear()
00176 {
00177   QDate firstSelected = mSelectedDates.first();
00178   int weekDay = firstSelected.dayOfWeek();
00179   firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, -1 );
00180 
00181   selectWeekByDay( weekDay, firstSelected );
00182 }
00183 
00184 void DateNavigator::selectPreviousMonth()
00185 {
00186   QDate firstSelected = mSelectedDates.first();
00187   int weekDay = firstSelected.dayOfWeek();
00188   firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, -1 );
00189 
00190   selectWeekByDay( weekDay, firstSelected );
00191 }
00192 
00193 void DateNavigator::selectPreviousWeek()
00194 {
00195   QDate firstSelected = mSelectedDates.first();
00196   int weekDay = firstSelected.dayOfWeek();
00197   firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, -7 );
00198 
00199   selectWeekByDay( weekDay, firstSelected );
00200 }
00201 
00202 void DateNavigator::selectNextWeek()
00203 {
00204   QDate firstSelected = mSelectedDates.first();
00205   int weekDay = firstSelected.dayOfWeek();
00206 
00207   firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, 7 );
00208 
00209   selectWeekByDay( weekDay, firstSelected );
00210 }
00211 
00212 void DateNavigator::selectNextMonth()
00213 {
00214   QDate firstSelected = mSelectedDates.first();
00215   int weekDay = firstSelected.dayOfWeek();
00216 
00217   firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, 1 );
00218 
00219   selectWeekByDay( weekDay, firstSelected );
00220 }
00221 
00222 void DateNavigator::selectNextYear()
00223 {
00224   QDate firstSelected = mSelectedDates.first();
00225   int weekDay = firstSelected.dayOfWeek();
00226   firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, 1 );
00227 
00228   selectWeekByDay( weekDay, firstSelected );
00229 }
00230 
00231 void DateNavigator::selectPrevious()
00232 {
00233   int offset = -7;
00234   if ( datesCount() == 1 ) {
00235     offset = -1;
00236   }
00237 
00238   selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
00239 }
00240 
00241 void DateNavigator::selectNext()
00242 {
00243   int offset = 7;
00244   if ( datesCount() == 1 ) {
00245     offset = 1;
00246   }
00247 
00248   selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
00249 }
00250 
00251 void DateNavigator::selectMonth( int month )
00252 {
00253   QDate firstSelected = mSelectedDates.first();
00254   int weekDay = firstSelected.dayOfWeek();
00255 
00256   const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem();
00257   int day = calSys->day( firstSelected );
00258   calSys->setYMD( firstSelected, calSys->year( firstSelected ), month, 1 );
00259   int days = calSys->daysInMonth( firstSelected );
00260   // As day we use either the selected date, or if the month has less days
00261   // than that, we use the max day of that month
00262   if ( day > days ) {
00263     day = days;
00264   }
00265   calSys->setYMD( firstSelected, calSys->year( firstSelected ), month, day );
00266 
00267   selectWeekByDay( weekDay, firstSelected );
00268 }
00269 
00270 void DateNavigator::selectYear( int year )
00271 {
00272   QDate firstSelected = mSelectedDates.first();
00273   int deltaYear = year - KOGlobals::self()->calendarSystem()->year( firstSelected );
00274   firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, deltaYear );
00275 
00276   int weekDay = firstSelected.dayOfWeek();
00277   selectWeekByDay( weekDay, firstSelected );
00278 }
00279 
00280 void DateNavigator::emitSelected()
00281 {
00282   emit datesSelected( mSelectedDates );
00283 }
00284 
00285 #include "datenavigator.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys