diff options
Diffstat (limited to 'korganizer/datenavigatorcontainer.cpp')
-rw-r--r-- | korganizer/datenavigatorcontainer.cpp | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/korganizer/datenavigatorcontainer.cpp b/korganizer/datenavigatorcontainer.cpp new file mode 100644 index 000000000..61be083b4 --- /dev/null +++ b/korganizer/datenavigatorcontainer.cpp @@ -0,0 +1,266 @@ +/* + This file is part of KOrganizer. + + Copyright (c) 2001,2002,2003 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 <kdebug.h> +#include <klocale.h> + +#include "koglobals.h" +#include "navigatorbar.h" +#include "kdatenavigator.h" + +#include <kcalendarsystem.h> +#include <kdialog.h> + +#include "datenavigatorcontainer.h" + +#include <qwhatsthis.h> +#include <qtimer.h> + +DateNavigatorContainer::DateNavigatorContainer( QWidget *parent, + const char *name ) + : QFrame( parent, name ), mCalendar( 0 ), + mHorizontalCount( 1 ), mVerticalCount( 1 ) +{ + mExtraViews.setAutoDelete( true ); + setFrameStyle( QFrame::Sunken | QFrame::StyledPanel ); + + mNavigatorView = new KDateNavigator( this, name ); + QWhatsThis::add( mNavigatorView, + i18n( "<qt><p>Select the dates you want to " + "display in KOrganizer's main view here. Hold down the " + "mouse button to select more than one day.</p>" + "<p>Press the top buttons to browse to the next " + "/ previous months or years.</p>" + "<p>Each line shows a week. The number in the left " + "column is the number of the week in the year. " + "Press it to select the whole week.</p>" + "</qt>" ) ); + + connectNavigatorView( mNavigatorView ); +} + +DateNavigatorContainer::~DateNavigatorContainer() +{ +} + +void DateNavigatorContainer::connectNavigatorView( KDateNavigator *v ) +{ + connect( v, SIGNAL( datesSelected( const KCal::DateList & ) ), + SIGNAL( datesSelected( const KCal::DateList & ) ) ); + connect( v, SIGNAL( incidenceDropped( Incidence *, const QDate & ) ), + SIGNAL( incidenceDropped( Incidence *, const QDate & ) ) ); + connect( v, SIGNAL( incidenceDroppedMove( Incidence *, const QDate & ) ), + SIGNAL( incidenceDroppedMove( Incidence *, const QDate & ) ) ); + connect( v, SIGNAL( weekClicked( const QDate & ) ), + SIGNAL( weekClicked( const QDate & ) ) ); + + connect( v, SIGNAL( goPrevious() ), SIGNAL( goPrevious() ) ); + connect( v, SIGNAL( goNext() ), SIGNAL( goNext() ) ); + + connect( v, SIGNAL( goNextMonth() ), SIGNAL( goNextMonth() ) ); + connect( v, SIGNAL( goPrevMonth() ), SIGNAL( goPrevMonth() ) ); + connect( v, SIGNAL( goNextYear() ), SIGNAL( goNextYear() ) ); + connect( v, SIGNAL( goPrevYear() ), SIGNAL( goPrevYear() ) ); + + connect( v, SIGNAL( goMonth( int ) ), SIGNAL( goMonth( int ) ) ); +} + +void DateNavigatorContainer::setCalendar( Calendar *cal ) +{ + mCalendar = cal; + mNavigatorView->setCalendar( cal ); + KDateNavigator *n; + for( n = mExtraViews.first(); n; n = mExtraViews.next() ) { + n->setCalendar( cal ); + } +} + +// TODO_Recurrence: let the navigators update just once, and tell them that +// if data has changed or just the selection (because then the list of dayss +// with events doesn't have to be updated if the month stayed the same +void DateNavigatorContainer::updateDayMatrix() +{ + mNavigatorView->updateDayMatrix(); + KDateNavigator *n; + for( n = mExtraViews.first(); n; n = mExtraViews.next() ) { + n->updateDayMatrix(); + } +} + +void DateNavigatorContainer::updateToday() +{ + mNavigatorView->updateToday(); + KDateNavigator *n; + for( n = mExtraViews.first(); n; n = mExtraViews.next() ) { + n->updateToday(); + } +} + +void DateNavigatorContainer::updateView() +{ + mNavigatorView->updateView(); + KDateNavigator *n; + for( n = mExtraViews.first(); n; n = mExtraViews.next() ) { + n->updateView(); + } +} + +void DateNavigatorContainer::updateConfig() +{ + mNavigatorView->updateConfig(); + KDateNavigator *n; + for( n = mExtraViews.first(); n; n = mExtraViews.next() ) { + n->updateConfig(); + } +} + +void DateNavigatorContainer::selectDates( const DateList &dateList ) +{ + if ( !dateList.isEmpty() ) { + QDate start( dateList.first() ); + QDate end( dateList.last() ); + QDate navfirst( mNavigatorView->startDate() ); + QDate navsecond; // start of the second shown month if existant + QDate navlast; + if ( !mExtraViews.isEmpty() ) { + navlast = mExtraViews.last()->endDate(); + navsecond = mExtraViews.first()->startDate(); + } else { + navlast = mNavigatorView->endDate(); + navsecond = navfirst; + } + if ( start < navfirst // <- start should always be visible + // end is not visible and we have a spare month at the beginning: + || ( end > navlast && start >= navsecond ) ) { + // Change the shown months so that the beginning of the date list is visible + setBaseDates( start ); + } + + mNavigatorView->selectDates( dateList ); + KDateNavigator *n = mExtraViews.first(); + while ( n ) { + n->selectDates( dateList ); + n = mExtraViews.next(); + } + } +} + +void DateNavigatorContainer::setBaseDates( const QDate &start ) +{ + QDate baseDate = start; + mNavigatorView->setBaseDate( baseDate ); + for( KDateNavigator *n = mExtraViews.first(); n; n = mExtraViews.next() ) { + baseDate = KOGlobals::self()->calendarSystem()->addMonths( baseDate, 1 ); + n->setBaseDate( baseDate ); + } +} + +void DateNavigatorContainer::resizeEvent( QResizeEvent * ) +{ +#if 0 + kdDebug(5850) << "DateNavigatorContainer::resizeEvent()" << endl; + kdDebug(5850) << " CURRENT SIZE: " << size() << endl; + kdDebug(5850) << " MINIMUM SIZEHINT: " << minimumSizeHint() << endl; + kdDebug(5850) << " SIZEHINT: " << sizeHint() << endl; + kdDebug(5850) << " MINIMUM SIZE: " << minimumSize() << endl; +#endif + QTimer::singleShot( 0, this, SLOT( resizeAllContents() ) ); +} + +void DateNavigatorContainer::resizeAllContents() +{ + QSize minSize = mNavigatorView->minimumSizeHint(); + +// kdDebug(5850) << " NAVIGATORVIEW minimumSizeHint: " << minSize << endl; + + int margin = KDialog::spacingHint(); + int verticalCount = ( size().height() - margin*2 ) / minSize.height(); + int horizontalCount = ( size().width() - margin*2 ) / minSize.width(); + + if ( horizontalCount != mHorizontalCount || + verticalCount != mVerticalCount ) { + uint count = horizontalCount * verticalCount; + if ( count == 0 ) return; + + while ( count > ( mExtraViews.count() + 1 ) ) { + KDateNavigator *n = new KDateNavigator( this ); + mExtraViews.append( n ); + n->setCalendar( mCalendar ); + connectNavigatorView( n ); + } + + while ( count < ( mExtraViews.count() + 1 ) ) { + mExtraViews.removeLast(); + } + + mHorizontalCount = horizontalCount; + mVerticalCount = verticalCount; + setBaseDates( mNavigatorView->selectedDates().first() ); + selectDates( mNavigatorView->selectedDates() ); + for( KDateNavigator *n = mExtraViews.first(); n; n = mExtraViews.next() ) { + n->show(); + } + } + + int height = (size().height() - margin*2) / verticalCount; + int width = (size().width() - margin*2) / horizontalCount; + + NavigatorBar *bar = mNavigatorView->navigatorBar(); + if ( horizontalCount > 1 ) bar->showButtons( true, false ); + else bar->showButtons( true, true ); + + mNavigatorView->setGeometry( + ( ( (KOGlobals::self()->reverseLayout())?(horizontalCount-1):0) * width ) + margin, + margin, width, height ); + for( uint i = 0; i < mExtraViews.count(); ++i ) { + int x = ( i + 1 ) % horizontalCount; + int y = ( i + 1 ) / horizontalCount; + + KDateNavigator *view = mExtraViews.at( i ); + bar = view->navigatorBar(); + if ( y > 0 ) bar->showButtons( false, false ); + else { + if ( x + 1 == horizontalCount ) bar->showButtons( false, true ); + else bar->showButtons( false, false ); + } + view->setGeometry( + ( ( (KOGlobals::self()->reverseLayout())?(horizontalCount-1-x):x) * width ) + margin, + ( y * height ) + margin, width, height ); + } +} + +QSize DateNavigatorContainer::minimumSizeHint() const +{ + int margin = KDialog::spacingHint() * 2; + return mNavigatorView->minimumSizeHint() + QSize( margin, margin ); +} + +QSize DateNavigatorContainer::sizeHint() const +{ + int margin = KDialog::spacingHint() * 2; + return mNavigatorView->sizeHint() + QSize( margin, margin ); +} + +#include "datenavigatorcontainer.moc" |