/* This file is part of KOrganizer. Copyright (c) 2003 Cornelius Schumacher 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 "navigatorbar.h" #include "koglobals.h" #include #include #include #include #include NavigatorBar::NavigatorBar( QWidget *parent ) : QWidget( parent ) { QFont tfont = font(); tfont.setPointSize( 10 ); tfont.setBold( false ); bool isRTL = KOGlobals::self()->reverseLayout(); mPrevYear = createNavigationButton( isRTL ? QLatin1String("arrow-right-double") : QLatin1String("arrow-left-double"), i18n( "Scroll backward to the previous year" ), i18n( "Click this button to scroll the display to the " "same approximate day of the previous year" ) ); mPrevMonth = createNavigationButton( isRTL ? QLatin1String("arrow-right") : QLatin1String("arrow-left"), i18n( "Scroll backward to the previous month" ), i18n( "Click this button to scroll the display to the " "same approximate date of the previous month" ) ); mNextMonth = createNavigationButton( isRTL ?QLatin1String( "arrow-left") : QLatin1String("arrow-right"), i18n( "Scroll forward to the next month" ), i18n( "Click this button to scroll the display to the " "same approximate date of the next month" ) ); mNextYear = createNavigationButton( isRTL ? QLatin1String("arrow-left-double") : QLatin1String("arrow-right-double"), i18n( "Scroll forward to the next year" ), i18n( "Click this button to scroll the display to the " "same approximate day of the next year" ) ); // Create month name button mMonth = new QToolButton( this ); mMonth->setPopupMode( QToolButton::InstantPopup ); mMonth->setAutoRaise( true ); mMonth->setFont( tfont ); mMonth->setToolTip( i18n( "Select a month" ) ); // Create year button mYear = new QToolButton( this ); mYear->setPopupMode( QToolButton::InstantPopup ); mYear->setAutoRaise( true ); mYear->setFont( tfont ); mYear->setToolTip( i18n( "Select a year" ) ); // set up control frame layout QHBoxLayout *ctrlLayout = new QHBoxLayout( this ); ctrlLayout->setMargin( 0 ); ctrlLayout->addWidget( mPrevYear ); ctrlLayout->addWidget( mPrevMonth ); ctrlLayout->addStretch(); ctrlLayout->addWidget( mMonth ); ctrlLayout->addWidget( mYear ); ctrlLayout->addStretch(); ctrlLayout->addWidget( mNextMonth ); ctrlLayout->addWidget( mNextYear ); connect( mPrevYear, SIGNAL(clicked()), SIGNAL(prevYearClicked()) ); connect( mPrevMonth, SIGNAL(clicked()), SIGNAL(prevMonthClicked()) ); connect( mNextMonth, SIGNAL(clicked()), SIGNAL(nextMonthClicked()) ); connect( mNextYear, SIGNAL(clicked()), SIGNAL(nextYearClicked()) ); connect( mMonth, SIGNAL(clicked()), SLOT(selectMonthFromMenu()) ); connect( mYear, SIGNAL(clicked()), SLOT(selectYearFromMenu()) ); } NavigatorBar::~NavigatorBar() { } void NavigatorBar::showButtons( bool left, bool right ) { if ( left ) { mPrevYear->show(); mPrevMonth->show(); } else { mPrevYear->hide(); mPrevMonth->hide(); } if ( right ) { mNextYear->show(); mNextMonth->show(); } else { mNextYear->hide(); mNextMonth->hide(); } } void NavigatorBar::selectDates( const KCalCore::DateList &dateList ) { if ( dateList.count() > 0 ) { mDate = dateList.first(); const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem(); // set the label text at the top of the navigator mMonth->setText( i18nc( "monthname", "%1", calSys->monthName( mDate ) ) ); mYear->setText( i18nc( "4 digit year", "%1", calSys->formatDate( mDate, KLocale::Year, KLocale::LongNumber ) ) ); } } void NavigatorBar::selectMonthFromMenu() { // every year can have different month names (in some calendar systems) const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem(); int month = calSys->month( mDate ); int year = calSys->year( mDate ); int months = calSys->monthsInYear( mDate ); QMenu *menu = new QMenu( mMonth ); QListact; QAction *activateAction = 0; for ( int i=1; i <= months; ++i ) { QAction *monthAction = menu->addAction( calSys->monthName( i, year ) ); act.append( monthAction ); if ( i == month ) { activateAction = monthAction; } } if ( activateAction ) { menu->setActiveAction( activateAction ); } month = 0; QAction *selectedAct = menu->exec( mMonth->mapToGlobal( QPoint( 0, 0 ) ) ); if ( selectedAct && ( selectedAct != activateAction ) ) { for ( int i=0; i < months; ++i ) { if ( act[i] == selectedAct ) { month = i + 1; } } } qDeleteAll( act ); act.clear(); delete menu; if ( month > 0 ) { emit monthSelected( month ); } } void NavigatorBar::selectYearFromMenu() { const KCalendarSystem *calSys = KOGlobals::self()->calendarSystem(); int year = calSys->year( mDate ); int years = 11; // odd number (show a few years ago -> a few years from now) int minYear = year - ( years / 3 ); QMenu *menu = new QMenu( mYear ); QListact; QString yearStr; QAction *activateAction = 0; int y = minYear; for ( int i=0; i < years; ++i ) { QAction *yearAction = menu->addAction( yearStr.setNum( y ) ); act.append( yearAction ); if ( y == year ) { activateAction = yearAction; } y++; } if ( activateAction ) { menu->setActiveAction( activateAction ); } year = 0; QAction *selectedAct = menu->exec( mYear->mapToGlobal( QPoint( 0, 0 ) ) ); if ( selectedAct && ( selectedAct != activateAction ) ) { int y = minYear; for ( int i=0; i < years; ++i ) { if ( act[i] == selectedAct ) { year = y; } y++; } } qDeleteAll( act ); act.clear(); delete menu; if ( year > 0 ) { emit yearSelected( year ); } } QToolButton *NavigatorBar::createNavigationButton( const QString &icon, const QString &toolTip, const QString &whatsThis ) { QToolButton *button = new QToolButton( this ); button->setIcon( KIconLoader::global()->loadIcon( icon, KIconLoader::Desktop, KIconLoader::SizeSmall ) ); button->setIconSize( QSize( KIconLoader::SizeSmall, KIconLoader::SizeSmall ) ); button->setToolButtonStyle( Qt::ToolButtonIconOnly ); button->setAutoRaise( true ); button->setToolTip( toolTip ); button->setWhatsThis( whatsThis ); return button; }