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 ) selectWeek( d );
00105   else selectDates( d, dateCount );
00106 }
00107 
00108 void DateNavigator::selectWeek()
00109 {
00110   selectWeek( mSelectedDates.first() );
00111 }
00112 
00113 void DateNavigator::selectWeek( const QDate &d )
00114 {
00115   int dayOfWeek = KOGlobals::self()->calendarSystem()->dayOfWeek( d );
00116 
00117   int weekStart = KGlobal::locale()->weekStartDay();
00118 
00119   QDate firstDate = d.addDays( weekStart - dayOfWeek );
00120 
00121   if ( weekStart != 1 && dayOfWeek < weekStart ) {
00122     firstDate = firstDate.addDays( -7 );
00123   }
00124 
00125   selectDates( firstDate, 7 );
00126 }
00127 
00128 void DateNavigator::selectWorkWeek()
00129 {
00130   selectWorkWeek( mSelectedDates.first() );
00131 }
00132 
00133 void DateNavigator::selectWorkWeek( const QDate &d )
00134 {
00135   int weekStart = KGlobal::locale()->weekStartDay();
00136  
00137   int dayOfWeek = KOGlobals::self()->calendarSystem()->dayOfWeek( d );
00138 
00139   QDate currentDate = d.addDays( weekStart - dayOfWeek );
00140 
00141   if ( weekStart != 1 && dayOfWeek < weekStart ) {
00142     currentDate = currentDate.addDays( -7 );
00143   }
00144 
00145   mSelectedDates.clear();
00146   int mask = KOGlobals::self()->getWorkWeekMask();
00147 
00148   for ( int i = 0; i < 7; ++i ) {
00149     if( (1<< ((i + weekStart + 6) % 7)) & (mask) ) {
00150     mSelectedDates.append(currentDate.addDays(i));
00151     }
00152   }
00153   
00154   emitSelected();
00155 }
00156 
00157 void DateNavigator::selectToday()
00158 {
00159   QDate d = QDate::currentDate();
00160 
00161   int dateCount = mSelectedDates.count();
00162 
00163   if ( dateCount == 7 ) selectWeek( d );
00164   else selectDates( d, dateCount );
00165 }
00166 
00167 void DateNavigator::selectPreviousYear()
00168 {
00169   QDate firstSelected = mSelectedDates.first();
00170   int weekDay = firstSelected.dayOfWeek();
00171   firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, -1 );
00172 
00173   selectWeekByDay( weekDay, firstSelected );
00174 }
00175 
00176 void DateNavigator::selectPreviousMonth()
00177 {
00178   QDate firstSelected = mSelectedDates.first();
00179   int weekDay = firstSelected.dayOfWeek();
00180   firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, -1 );
00181 
00182   selectWeekByDay( weekDay, firstSelected );
00183 }
00184 
00185 void DateNavigator::selectPreviousWeek()
00186 {
00187   QDate firstSelected = mSelectedDates.first();
00188   int weekDay = firstSelected.dayOfWeek();
00189   firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, -7 );
00190 
00191   selectWeekByDay( weekDay, firstSelected );
00192 }
00193 
00194 void DateNavigator::selectNextWeek()
00195 {
00196   QDate firstSelected = mSelectedDates.first();
00197   int weekDay = firstSelected.dayOfWeek();
00198 
00199   firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, 7 );
00200 
00201   selectWeekByDay( weekDay, firstSelected );
00202 }
00203 
00204 void DateNavigator::selectNextMonth()
00205 {
00206   QDate firstSelected = mSelectedDates.first();
00207   int weekDay = firstSelected.dayOfWeek();
00208 
00209   firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, 1 );
00210 
00211   selectWeekByDay( weekDay, firstSelected );
00212 }
00213 
00214 void DateNavigator::selectNextYear()
00215 {
00216   QDate firstSelected = mSelectedDates.first();
00217   int weekDay = firstSelected.dayOfWeek();
00218   firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, 1 );
00219 
00220   selectWeekByDay( weekDay, firstSelected );
00221 }
00222 
00223 void DateNavigator::selectPrevious()
00224 {
00225   int offset = -7;
00226   if ( datesCount() == 1 ) {
00227     offset = -1;
00228   }
00229 
00230   selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
00231 }
00232 
00233 void DateNavigator::selectNext()
00234 {
00235   int offset = 7;
00236   if ( datesCount() == 1 ) {
00237     offset = 1;
00238   }
00239 
00240   selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
00241 }
00242 
00243 void DateNavigator::selectMonth(int month)
00244 {
00245   QDate firstSelected = mSelectedDates.first();
00246   int weekDay = firstSelected.dayOfWeek();
00247 
00248   const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem();
00249   int day = calSys->day( firstSelected );
00250   calSys->setYMD( firstSelected, calSys->year(firstSelected), month, 1 );
00251   int days = calSys->daysInMonth( firstSelected );
00252   // As day we use either the selected date, or if the month has less days
00253   // than that, we use the max day of that month
00254   if ( day > days ) day = days;
00255   calSys->setYMD( firstSelected, calSys->year( firstSelected ), month, day );
00256 
00257   selectWeekByDay( weekDay, firstSelected );
00258 }
00259 
00260 void DateNavigator::emitSelected()
00261 {
00262   emit datesSelected( mSelectedDates );
00263 }
00264 
00265 #include "datenavigator.moc"