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 ) {
00164     selectWeek( d );
00165   } else if ( dateCount == 5 ) {
00166     selectWorkWeek( d );
00167   } else {
00168     selectDates( d, dateCount );
00169   }
00170 }
00171 
00172 void DateNavigator::selectPreviousYear()
00173 {
00174   QDate firstSelected = mSelectedDates.first();
00175   int weekDay = firstSelected.dayOfWeek();
00176   firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, -1 );
00177 
00178   selectWeekByDay( weekDay, firstSelected );
00179 }
00180 
00181 void DateNavigator::selectPreviousMonth()
00182 {
00183   QDate firstSelected = mSelectedDates.first();
00184   int weekDay = firstSelected.dayOfWeek();
00185   firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, -1 );
00186 
00187   selectWeekByDay( weekDay, firstSelected );
00188 }
00189 
00190 void DateNavigator::selectPreviousWeek()
00191 {
00192   QDate firstSelected = mSelectedDates.first();
00193   int weekDay = firstSelected.dayOfWeek();
00194   firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, -7 );
00195 
00196   selectWeekByDay( weekDay, firstSelected );
00197 }
00198 
00199 void DateNavigator::selectNextWeek()
00200 {
00201   QDate firstSelected = mSelectedDates.first();
00202   int weekDay = firstSelected.dayOfWeek();
00203 
00204   firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, 7 );
00205 
00206   selectWeekByDay( weekDay, firstSelected );
00207 }
00208 
00209 void DateNavigator::selectNextMonth()
00210 {
00211   QDate firstSelected = mSelectedDates.first();
00212   int weekDay = firstSelected.dayOfWeek();
00213 
00214   firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, 1 );
00215 
00216   selectWeekByDay( weekDay, firstSelected );
00217 }
00218 
00219 void DateNavigator::selectNextYear()
00220 {
00221   QDate firstSelected = mSelectedDates.first();
00222   int weekDay = firstSelected.dayOfWeek();
00223   firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, 1 );
00224 
00225   selectWeekByDay( weekDay, firstSelected );
00226 }
00227 
00228 void DateNavigator::selectPrevious()
00229 {
00230   int offset = -7;
00231   if ( datesCount() == 1 ) {
00232     offset = -1;
00233   }
00234 
00235   selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
00236 }
00237 
00238 void DateNavigator::selectNext()
00239 {
00240   int offset = 7;
00241   if ( datesCount() == 1 ) {
00242     offset = 1;
00243   }
00244 
00245   selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
00246 }
00247 
00248 void DateNavigator::selectMonth(int month)
00249 {
00250   QDate firstSelected = mSelectedDates.first();
00251   int weekDay = firstSelected.dayOfWeek();
00252 
00253   const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem();
00254   int day = calSys->day( firstSelected );
00255   calSys->setYMD( firstSelected, calSys->year(firstSelected), month, 1 );
00256   int days = calSys->daysInMonth( firstSelected );
00257   // As day we use either the selected date, or if the month has less days
00258   // than that, we use the max day of that month
00259   if ( day > days ) day = days;
00260   calSys->setYMD( firstSelected, calSys->year( firstSelected ), month, day );
00261 
00262   selectWeekByDay( weekDay, firstSelected );
00263 }
00264 
00265 void DateNavigator::selectYear( int year )
00266 {
00267   QDate firstSelected = mSelectedDates.first();
00268   int deltaYear = year - KOGlobals::self()->calendarSystem()->year( firstSelected );
00269   firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, deltaYear );
00270 
00271   int weekDay = firstSelected.dayOfWeek();
00272   selectWeekByDay( weekDay, firstSelected );
00273 }
00274 
00275 void DateNavigator::emitSelected()
00276 {
00277   emit datesSelected( mSelectedDates );
00278 }
00279 
00280 #include "datenavigator.moc"
KDE Home | KDE Accessibility Home | Description of Access Keys