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