📄 datebookmonth.cpp
字号:
/************************************************************************ Copyright (C) 2000-2005 Trolltech AS. All rights reserved.**** This file is part of the Qtopia Environment.** ** 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.** ** A copy of the GNU GPL license version 2 is included in this package as ** LICENSE.GPL.**** 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.**** In addition, as a special exception Trolltech gives permission to link** the code of this program with Qtopia applications copyrighted, developed** and distributed by Trolltech under the terms of the Qtopia Personal Use** License Agreement. You must comply with the GNU General Public License** in all respects for all of the code used other than the applications** licensed under the Qtopia Personal Use License Agreement. If you modify** this file, you may extend this exception to your version of the file,** but you are not obligated to do so. If you do not wish to do so, delete** this exception statement from your version.** ** See http://www.trolltech.com/gpl/ for GPL licensing information.**** Contact info@trolltech.com if any conditions of this licensing are** not clear to you.************************************************************************/#include <qtoolbutton.h>#include <qspinbox.h>#include <qcombobox.h>#include <qdatetime.h>#include <qpainter.h>#include <qpopupmenu.h>#include <qvaluestack.h>#include <qwhatsthis.h>#include "config.h"#include "datebookmonth.h"#include "datebookdb.h"#include "resource.h"#include "qpeapplication.h"#include "timestring.h"QIconSet qtopia_internal_loadIconSet( const QString &pix );DateBookMonthHeader::DateBookMonthHeader( QWidget *parent, const char *name ) : QHBox( parent, name ){ setBackgroundMode( PaletteButton ); begin = new QToolButton( this ); begin->setFocusPolicy(NoFocus); begin->setIconSet( qtopia_internal_loadIconSet( "start" ) ); // No tr begin->setAutoRaise( TRUE ); begin->setFixedSize( begin->sizeHint() ); QWhatsThis::add( begin, tr("Show January in the selected year") ); back = new QToolButton( this ); back->setFocusPolicy(NoFocus); back->setIconSet( qtopia_internal_loadIconSet( "back" ) ); // No tr back->setAutoRaise( TRUE ); back->setFixedSize( back->sizeHint() ); QWhatsThis::add( back, tr("Show the previous month") ); month = new QComboBox( FALSE, this ); for ( int i = 0; i < 12; ++i ) month->insertItem( Calendar::nameOfMonth( i + 1 ) ); year = new QSpinBox( 1753, 8000, 1, this ); next = new QToolButton( this ); next->setFocusPolicy(NoFocus); next->setIconSet( qtopia_internal_loadIconSet( "forward" ) ); // No tr next->setAutoRaise( TRUE ); next->setFixedSize( next->sizeHint() ); QWhatsThis::add( next, tr("Show the next month") ); end = new QToolButton( this ); end->setFocusPolicy(NoFocus); end->setIconSet( qtopia_internal_loadIconSet( "finish" ) ); // No tr end->setAutoRaise( TRUE ); end->setFixedSize( end->sizeHint() ); QWhatsThis::add( end, tr("Show December in the selected year") ); connect( month, SIGNAL( activated(int) ), this, SLOT( updateDate() ) ); connect( year, SIGNAL( valueChanged(int) ), this, SLOT( updateDate() ) ); connect( begin, SIGNAL( clicked() ), this, SLOT( firstMonth() ) ); connect( end, SIGNAL( clicked() ), this, SLOT( lastMonth() ) ); connect( back, SIGNAL( clicked() ), this, SLOT( monthBack() ) ); connect( next, SIGNAL( clicked() ), this, SLOT( monthForward() ) ); back->setAutoRepeat( TRUE ); next->setAutoRepeat( TRUE );}DateBookMonthHeader::~DateBookMonthHeader(){}void DateBookMonthHeader::updateDate(){ emit dateChanged( year->value(), month->currentItem() + 1 );}void DateBookMonthHeader::firstMonth(){ emit dateChanged( year->value(), 1 ); month->setCurrentItem( 0 );}void DateBookMonthHeader::lastMonth(){ emit dateChanged( year->value(), 12 ); month->setCurrentItem( 11 );}void DateBookMonthHeader::monthBack(){ if ( month->currentItem() > 0 ) { emit dateChanged( year->value(), month->currentItem() ); month->setCurrentItem( month->currentItem() - 1 ); } else { emit dateChanged( year->value() - 1, 12 ); // we have a signal set to a changed value in year so we only need to change // year to get the result... month->setCurrentItem( 11 ); year->setValue( year->value() - 1 ); }}void DateBookMonthHeader::monthForward(){ if ( month->currentItem() < 11 ) { emit dateChanged( year->value(), month->currentItem() + 2 ); month->setCurrentItem( month->currentItem() + 1 ); } else { // we have a signal set to a changed value in year so we only need to change // year to get the result... month->setCurrentItem( 0 ); year->setValue( year->value() + 1 ); }}void DateBookMonthHeader::setDate( int y, int m ){ year->setValue( y ); month->setCurrentItem( m - 1 );}//---------------------------------------------------------------------------class DateBookMonthTablePrivate{public: DateBookMonthTablePrivate() {}; ~DateBookMonthTablePrivate() { mMonthEvents.clear(); }; QValueList<EffectiveEvent> mMonthEvents; bool onMonday;};DateBookMonthTable::DateBookMonthTable( QWidget *parent, const char *name, DateBookDB *newDb ) : QTable( 6, 7, parent, name ), db( newDb ){ d = new DateBookMonthTablePrivate(); selYear = -1; selMonth = -1; selDay = -1; year = -1; month = -1; Config cfg( "qpe" ); cfg.setGroup( "Time" ); d->onMonday = cfg.readBoolEntry( "MONDAY" ); horizontalHeader()->setResizeEnabled( FALSE ); int i; // we have to do this here... or suffer the consequences later... for ( i = 0; i < 7; i++ ){ horizontalHeader()->resizeSection( i, 30 ); setColumnStretchable( i, TRUE ); } setupLabels(); verticalHeader()->hide(); setLeftMargin( 0 ); for ( i = 0; i < 6; ++i ) setRowStretchable( i, TRUE ); setSelectionMode( NoSelection ); connect( this, SIGNAL( clicked(int,int,int,const QPoint&) ), this, SLOT( dayClicked(int,int) ) ); connect( this, SIGNAL( currentChanged(int,int) ), this, SLOT( dragDay(int,int) ) ); setVScrollBarMode( AlwaysOff ); setHScrollBarMode( AlwaysOff );}DateBookMonthTable::~DateBookMonthTable(){ monthsEvents.clear(); delete d;}void DateBookMonthTable::setDate(int y, int m, int d){ if (month == m && year == y) { if ( selYear == -1 ) year = selYear; if ( selMonth == -1 ) month = selMonth; int r1, c1, r2, c2; findDay(selDay, r1, c1); selDay = day = d; findDay(selDay, r2, c2); setCurrentCell( r2, c2 ); //updateCell(r1,c1); //updateCell(r2,c2); } else { selYear = year = y; selMonth = month = m; selDay = day = d; setupTable(); }}void DateBookMonthTable::redraw(){ setupLabels(); setupTable();}void DateBookMonthTable::setWeekStart( bool onMonday ){ d->onMonday = onMonday; setupLabels(); setupTable();}void DateBookMonthTable::setupTable(){ QValueList<Calendar::Day> days = Calendar::daysOfMonth( year, month, d->onMonday ); QValueList<Calendar::Day>::Iterator it = days.begin(); int row = 0, col = 0; int crow = 0; int ccol = 0; for ( ; it != days.end(); ++it ) { DayItemMonth *i = (DayItemMonth *)item( row, col ); if ( !i ) { i = new DayItemMonth( this, QTableItem::Never, "" ); setItem( row, col, i ); } Calendar::Day calDay = *it; i->clearEffEvents(); i->setDay( calDay.date ); i->setType( calDay.type ); if ( i->day() == day && calDay.type == Calendar::Day::ThisMonth ) { crow = row; ccol = col; } updateCell( row, col ); if ( col == 6 ) { ++row; col = 0; } else { ++col; } } setCurrentCell( crow, ccol ); getEvents();}void DateBookMonthTable::findDay( int day, int &row, int &col ){ QDate dtBegin( year, month, 1 ); int skips = dtBegin.dayOfWeek(); int effective_day = day + skips - 1; // row/columns begin at 0 // make an extra adjustment if we start on Mondays. if ( d->onMonday ) effective_day--; row = effective_day / 7; col = effective_day % 7;}void DateBookMonthTable::dayClicked( int row, int col ){ changeDaySelection( row, col ); emit dateClicked( selYear, selMonth, selDay );}void DateBookMonthTable::dragDay( int row, int col ){ changeDaySelection( row, col );}void DateBookMonthTable::changeDaySelection( int row, int col ){ DayItemMonth *i = (DayItemMonth*)item( row, col ); if ( !i ) return; switch ( i->type() ) { case Calendar::Day::ThisMonth: selMonth = month; break; case Calendar::Day::PrevMonth: selMonth = month-1; break; default: selMonth = month+1; } selYear = year; if ( selMonth <= 0 ) { selMonth = 12; selYear--; } else if ( selMonth > 12 ) { selMonth = 1; selYear++; } selDay = i->day();}void DateBookMonthTable::viewportMouseReleaseEvent( QMouseEvent * ){ dayClicked( currentRow(), currentColumn() );}void DateBookMonthTable::getEvents(){ if ( !db ) return; QDate dtStart( year, month, 1 ); d->mMonthEvents = db->getEffectiveEvents( dtStart, QDate( year, month, dtStart.daysInMonth() ) ); QValueListIterator<EffectiveEvent> it = d->mMonthEvents.begin(); // now that the events are sorted, basically go through the list, make // a small list for every day and set it for each item... // clear all the items... while ( it != d->mMonthEvents.end() ) { QValueList<EffectiveEvent> dayEvent; EffectiveEvent e = *it; ++it; dayEvent.append( e ); while ( it != d->mMonthEvents.end() && e.date() == (*it).date() ) { dayEvent.append( *it ); ++it; } int row, col; findDay( e.date().day(), row, col ); DayItemMonth* w = static_cast<DayItemMonth*>( item( row, col ) ); w->setEvents( dayEvent ); updateCell( row, col ); dayEvent.clear(); }}void DateBookMonthTable::setupLabels(){ for ( int i = 0; i < 7; ++i ) {// horizontalHeader()->resizeSection( i, 30 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -