summaryrefslogtreecommitdiffstats
path: root/korganizer/datenavigator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'korganizer/datenavigator.cpp')
-rw-r--r--korganizer/datenavigator.cpp265
1 files changed, 265 insertions, 0 deletions
diff --git a/korganizer/datenavigator.cpp b/korganizer/datenavigator.cpp
new file mode 100644
index 000000000..56360ca2e
--- /dev/null
+++ b/korganizer/datenavigator.cpp
@@ -0,0 +1,265 @@
+/*
+ This file is part of KOrganizer.
+ Copyright (c) 2002 Cornelius Schumacher <schumacher@kde.org>
+ Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include "datenavigator.h"
+
+#include "koglobals.h"
+
+#include <kcalendarsystem.h>
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <klocale.h>
+
+using namespace KCal;
+
+DateNavigator::DateNavigator( QObject *parent, const char *name )
+ : QObject( parent, name )
+{
+ mSelectedDates.append( QDate::currentDate() );
+}
+
+DateNavigator::~DateNavigator()
+{
+}
+
+DateList DateNavigator::selectedDates()
+{
+ return mSelectedDates;
+}
+
+int DateNavigator::datesCount() const
+{
+ return mSelectedDates.count();
+}
+
+void DateNavigator::selectDates( const DateList& dateList )
+{
+ if (dateList.count() > 0) {
+ mSelectedDates = dateList;
+
+ emitSelected();
+ }
+}
+
+void DateNavigator::selectDate( const QDate &date )
+{
+ QDate d = date;
+
+ if ( !d.isValid() ) {
+ kdDebug(5850) << "DateNavigator::selectDates(QDate): an invalid date was passed as a parameter!" << endl;
+ d = QDate::currentDate();
+ }
+
+ mSelectedDates.clear();
+ mSelectedDates.append( d );
+
+ emitSelected();
+}
+
+void DateNavigator::selectDates( int count )
+{
+ selectDates( mSelectedDates.first(), count );
+}
+
+void DateNavigator::selectDates( const QDate &d, int count )
+{
+ DateList dates;
+
+ int i;
+ for( i = 0; i < count; ++i ) {
+ dates.append( d.addDays( i ) );
+ }
+
+ mSelectedDates = dates;
+
+ emitSelected();
+}
+
+void DateNavigator::selectWeekByDay( int weekDay, const QDate &d )
+{
+ int dateCount = mSelectedDates.count();
+ bool weekStart = ( weekDay == KGlobal::locale()->weekStartDay() );
+ if ( weekStart && dateCount == 7 ) selectWeek( d );
+ else selectDates( d, dateCount );
+}
+
+void DateNavigator::selectWeek()
+{
+ selectWeek( mSelectedDates.first() );
+}
+
+void DateNavigator::selectWeek( const QDate &d )
+{
+ int dayOfWeek = KOGlobals::self()->calendarSystem()->dayOfWeek( d );
+
+ int weekStart = KGlobal::locale()->weekStartDay();
+
+ QDate firstDate = d.addDays( weekStart - dayOfWeek );
+
+ if ( weekStart != 1 && dayOfWeek < weekStart ) {
+ firstDate = firstDate.addDays( -7 );
+ }
+
+ selectDates( firstDate, 7 );
+}
+
+void DateNavigator::selectWorkWeek()
+{
+ selectWorkWeek( mSelectedDates.first() );
+}
+
+void DateNavigator::selectWorkWeek( const QDate &d )
+{
+ int weekStart = KGlobal::locale()->weekStartDay();
+
+ int dayOfWeek = KOGlobals::self()->calendarSystem()->dayOfWeek( d );
+
+ QDate currentDate = d.addDays( weekStart - dayOfWeek );
+
+ if ( weekStart != 1 && dayOfWeek < weekStart ) {
+ currentDate = currentDate.addDays( -7 );
+ }
+
+ mSelectedDates.clear();
+ int mask = KOGlobals::self()->getWorkWeekMask();
+
+ for ( int i = 0; i < 7; ++i ) {
+ if( (1<< ((i + weekStart + 6) % 7)) & (mask) ) {
+ mSelectedDates.append(currentDate.addDays(i));
+ }
+ }
+
+ emitSelected();
+}
+
+void DateNavigator::selectToday()
+{
+ QDate d = QDate::currentDate();
+
+ int dateCount = mSelectedDates.count();
+
+ if ( dateCount == 7 ) selectWeek( d );
+ else selectDates( d, dateCount );
+}
+
+void DateNavigator::selectPreviousYear()
+{
+ QDate firstSelected = mSelectedDates.first();
+ int weekDay = firstSelected.dayOfWeek();
+ firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, -1 );
+
+ selectWeekByDay( weekDay, firstSelected );
+}
+
+void DateNavigator::selectPreviousMonth()
+{
+ QDate firstSelected = mSelectedDates.first();
+ int weekDay = firstSelected.dayOfWeek();
+ firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, -1 );
+
+ selectWeekByDay( weekDay, firstSelected );
+}
+
+void DateNavigator::selectPreviousWeek()
+{
+ QDate firstSelected = mSelectedDates.first();
+ int weekDay = firstSelected.dayOfWeek();
+ firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, -7 );
+
+ selectWeekByDay( weekDay, firstSelected );
+}
+
+void DateNavigator::selectNextWeek()
+{
+ QDate firstSelected = mSelectedDates.first();
+ int weekDay = firstSelected.dayOfWeek();
+
+ firstSelected = KOGlobals::self()->calendarSystem()->addDays( firstSelected, 7 );
+
+ selectWeekByDay( weekDay, firstSelected );
+}
+
+void DateNavigator::selectNextMonth()
+{
+ QDate firstSelected = mSelectedDates.first();
+ int weekDay = firstSelected.dayOfWeek();
+
+ firstSelected = KOGlobals::self()->calendarSystem()->addMonths( firstSelected, 1 );
+
+ selectWeekByDay( weekDay, firstSelected );
+}
+
+void DateNavigator::selectNextYear()
+{
+ QDate firstSelected = mSelectedDates.first();
+ int weekDay = firstSelected.dayOfWeek();
+ firstSelected = KOGlobals::self()->calendarSystem()->addYears( firstSelected, 1 );
+
+ selectWeekByDay( weekDay, firstSelected );
+}
+
+void DateNavigator::selectPrevious()
+{
+ int offset = -7;
+ if ( datesCount() == 1 ) {
+ offset = -1;
+ }
+
+ selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
+}
+
+void DateNavigator::selectNext()
+{
+ int offset = 7;
+ if ( datesCount() == 1 ) {
+ offset = 1;
+ }
+
+ selectDates( mSelectedDates.first().addDays( offset ), datesCount() );
+}
+
+void DateNavigator::selectMonth(int month)
+{
+ QDate firstSelected = mSelectedDates.first();
+ int weekDay = firstSelected.dayOfWeek();
+
+ const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem();
+ int day = calSys->day( firstSelected );
+ calSys->setYMD( firstSelected, calSys->year(firstSelected), month, 1 );
+ int days = calSys->daysInMonth( firstSelected );
+ // As day we use either the selected date, or if the month has less days
+ // than that, we use the max day of that month
+ if ( day > days ) day = days;
+ calSys->setYMD( firstSelected, calSys->year( firstSelected ), month, day );
+
+ selectWeekByDay( weekDay, firstSelected );
+}
+
+void DateNavigator::emitSelected()
+{
+ emit datesSelected( mSelectedDates );
+}
+
+#include "datenavigator.moc"