author | umopapisdn <umopapisdn> | 2003-05-13 22:58:18 (UTC) |
---|---|---|
committer | umopapisdn <umopapisdn> | 2003-05-13 22:58:18 (UTC) |
commit | 1e0e2f57472538bd880967ebe061c8f39a7e270b (patch) (side-by-side diff) | |
tree | fcc070d53148385f93c0dc6ab5443d5100be0d26 | |
parent | 45c0386de12b107e54e4d020d54eb05517a9efac (diff) | |
download | opie-1e0e2f57472538bd880967ebe061c8f39a7e270b.zip opie-1e0e2f57472538bd880967ebe061c8f39a7e270b.tar.gz opie-1e0e2f57472538bd880967ebe061c8f39a7e270b.tar.bz2 |
Bugfix: (Bug #0000902) Adding events in weekview shouldn't create them as events on the first day of the week but rather the last visited day.
-rw-r--r-- | core/pim/datebook/datebookweek.cpp | 47 | ||||
-rw-r--r-- | core/pim/datebook/datebookweek.h | 6 | ||||
-rw-r--r-- | core/pim/datebook/datebookweekheaderimpl.cpp | 26 | ||||
-rw-r--r-- | core/pim/datebook/datebookweekheaderimpl.h | 4 | ||||
-rw-r--r-- | core/pim/datebook/datebookweeklst.cpp | 42 | ||||
-rw-r--r-- | core/pim/datebook/datebookweeklst.h | 9 |
6 files changed, 48 insertions, 86 deletions
diff --git a/core/pim/datebook/datebookweek.cpp b/core/pim/datebook/datebookweek.cpp index 3ae4610..12f57a0 100644 --- a/core/pim/datebook/datebookweek.cpp +++ b/core/pim/datebook/datebookweek.cpp @@ -181,499 +181,498 @@ void DateBookWeekView::alterDay( int day ) if ( !bOnMonday ) { day--; } emit showDay( day ); } void DateBookWeekView::positionItem( DateBookWeekItem *i ) { const int Width = 8; const EffectiveEvent ev = i->event(); // 30 minute intervals int y = ev.start().hour() * 2; y += db_round30min( ev.start().minute() ); int y2 = ev.end().hour() * 2; y2 += db_round30min( ev.end().minute() ); if ( y > 47 ) y = 47; if ( y2 > 48 ) y2 = 48; y = (y * rowHeight) / 2; y2 = (y2 * rowHeight) / 2; int h; if ( ev.event().type() == Event::AllDay ) { h = (48 * rowHeight) / 2; y = 0; } else { h=y2-y; if ( h < (1*rowHeight)/2 ) h = (1*rowHeight)/2; } int dow = ev.date().dayOfWeek(); if ( !bOnMonday ) { if ( dow == 7 ) dow = 1; else dow++; } int x = header->sectionPos( dow ) - 1; int xlim = header->sectionPos( dow ) + header->sectionSize( dow ); DateBookWeekItem *isect = 0; do { i->setGeometry( x, y, Width, h ); isect = intersects( i ); x += Width - 1; } while ( isect && x < xlim ); } DateBookWeekItem *DateBookWeekView::intersects( const DateBookWeekItem *item ) { QRect geom = item->geometry(); // We allow the edges to overlap geom.moveBy( 1, 1 ); geom.setSize( geom.size()-QSize(2,2) ); QListIterator<DateBookWeekItem> it(items); for ( ; it.current(); ++it ) { DateBookWeekItem *i = it.current(); if ( i != item ) { if ( i->geometry().intersects( geom ) ) { return i; } } } return 0; } void DateBookWeekView::contentsMousePressEvent( QMouseEvent *e ) { QListIterator<DateBookWeekItem> it(items); for ( ; it.current(); ++it ) { DateBookWeekItem *i = it.current(); if ( i->geometry().contains( e->pos() ) ) { showingEvent = true; emit signalShowEvent( i->event() ); break; } } } void DateBookWeekView::contentsMouseReleaseEvent( QMouseEvent *e ) { if ( showingEvent ) { showingEvent = false; emit signalHideEvent(); } else { int d = header->sectionAt( e->pos().x() ); if ( d > 0 ) { // if ( !bOnMonday ) // d--; emit showDay( d ); } } } void DateBookWeekView::drawContents( QPainter *p, int cx, int cy, int cw, int ch ) { QRect ur( cx, cy, cw, ch ); p->setPen( lightGray ); for ( int i = 1; i <= 7; i++ ) p->drawLine( header->sectionPos(i)-2, cy, header->sectionPos(i)-2, cy+ch ); p->setPen( black ); for ( int t = 0; t < 24; t++ ) { int y = t*rowHeight; if ( QRect( 1, y, 20, rowHeight ).intersects( ur ) ) { QString s; if ( ampm ) { if ( t == 0 ) s = QString::number( 12 ); else if ( t == 12 ) s = QString::number(12) + tr( "p" ); else if ( t > 12 ) { if ( t - 12 < 10 ) s = " "; else s = ""; s += QString::number( t - 12 ) + tr("p"); } else { if ( 12 - t < 3 ) s = ""; else s = " "; s += QString::number( t ); } } else { s = QString::number( t ); if ( s.length() == 1 ) s.prepend( "0" ); } p->drawText( 1, y+p->fontMetrics().ascent()+1, s ); } } QListIterator<DateBookWeekItem> it(items); for ( ; it.current(); ++it ) { DateBookWeekItem *i = it.current(); if ( i->geometry().intersects( ur ) ) { p->setBrush( i->color() ); p->drawRect( i->geometry() ); } } } void DateBookWeekView::resizeEvent( QResizeEvent *e ) { const int hourWidth = 20; QScrollView::resizeEvent( e ); int avail = width()-qApp->style().scrollBarExtent().width()-1; header->setGeometry( 0, 0, avail, header->sizeHint().height() ); setMargins( 0, header->height(), 0, 0 ); header->resizeSection( 0, hourWidth ); int sw = (avail - hourWidth) / 7; for ( int i = 1; i < 7; i++ ) header->resizeSection( i, sw ); header->resizeSection( 7, avail - hourWidth - sw*6 ); } void DateBookWeekView::setStartOfWeek( bool bStartOnMonday ) { bOnMonday = bStartOnMonday; initNames(); } //------------------------------------------------------------------- DateBookWeek::DateBookWeek( bool ap, bool startOnMonday, DateBookDB *newDB, QWidget *parent, const char *name ) : QWidget( parent, name ), db( newDB ), startTime( 0 ), ampm( ap ), bStartOnMonday( startOnMonday ) { setFocusPolicy(StrongFocus); QVBoxLayout *vb = new QVBoxLayout( this ); header = new DateBookWeekHeader( bStartOnMonday, this ); view = new DateBookWeekView( ampm, startOnMonday, this ); vb->addWidget( header ); vb->addWidget( view ); lblDesc = new QLabel( this, "event label" ); lblDesc->setFrameStyle( QFrame::Plain | QFrame::Box ); lblDesc->setBackgroundColor( yellow ); lblDesc->hide(); tHide = new QTimer( this ); connect( view, SIGNAL( showDay( int ) ), this, SLOT( showDay( int ) ) ); connect( view, SIGNAL(signalShowEvent(const EffectiveEvent&)), this, SLOT(slotShowEvent(const EffectiveEvent&)) ); connect( view, SIGNAL(signalHideEvent()), this, SLOT(slotHideEvent()) ); - connect( header, SIGNAL( dateChanged( int, int ) ), this, SLOT( dateChanged( int, int ) ) ); + connect( header, SIGNAL( dateChanged( QDate &) ), this, SLOT( dateChanged( QDate &) ) ); connect( tHide, SIGNAL( timeout() ), lblDesc, SLOT( hide() ) ); connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(slotWeekChanged(bool)) ); connect( qApp, SIGNAL(clockChanged(bool)), this, SLOT(slotClockChanged(bool))); setDate(QDate::currentDate()); } void DateBookWeek::keyPressEvent(QKeyEvent *e) { switch(e->key()) { case Key_Up: view->scrollBy(0, -20); break; case Key_Down: view->scrollBy(0, 20); break; case Key_Left: setDate(date().addDays(-7)); break; case Key_Right: setDate(date().addDays(7)); break; default: e->ignore(); } } void DateBookWeek::showDay( int day ) { - QDate d; - d = dateFromWeek( _week, year, bStartOnMonday ); + QDate d=bdate; + + // Calculate offset to first day of week. + int dayoffset=d.dayOfWeek(); + if(bStartOnMonday) dayoffset--; + day--; - d = d.addDays( day ); + d=d.addDays(day-dayoffset); emit showDate( d.year(), d.month(), d.day() ); + qDebug("%4d-%02d-%02d / Day %d\n",d.year(),d.month(),d.day(),day); } void DateBookWeek::setDate( int y, int m, int d ) { setDate(QDate(y, m, d)); } -void DateBookWeek::setDate(QDate date) +void DateBookWeek::setDate(QDate newdate) { - dow = date.dayOfWeek(); - int w, y; - calcWeek( date, w, y, bStartOnMonday ); - header->setDate( date ); + bdate=newdate; + dow = newdate.dayOfWeek(); + header->setDate( newdate ); } -void DateBookWeek::dateChanged( int y, int w ) +void DateBookWeek::dateChanged( QDate &newdate ) { - year = y; - _week = w; + bdate=newdate; getEvents(); } QDate DateBookWeek::date() const { - QDate d; - d = dateFromWeek( _week - 1, year, bStartOnMonday ); - if ( bStartOnMonday ) - d = d.addDays( 7 + dow - 1 ); - else { - if ( dow == 7 ) - d = d.addDays( dow ); - else - d = d.addDays( 7 + dow ); - } - return d; + return bdate; } void DateBookWeek::getEvents() { QDate startWeek = weekDate(); QDate endWeek = startWeek.addDays( 6 ); QValueList<EffectiveEvent> eventList = db->getEffectiveEvents(startWeek, endWeek); view->showEvents( eventList ); view->moveToHour( startTime ); } void DateBookWeek::generateAllDayTooltext( QString& text ) { text += "<b>" + tr("This is an all day event.") + "</b><br>"; } void DateBookWeek::generateNormalTooltext( QString& str, const EffectiveEvent &ev ) { str += "<b>" + QObject::tr("Start") + "</b>: "; str += TimeString::timeString( ev.event().start().time(), ampm, FALSE ); if( ev.startDate()!=ev.endDate() ) { str += " <i>" + TimeString::longDateString( ev.startDate() )+"</i>"; } str += "<br>"; str += "<b>" + QObject::tr("End") + "</b>: "; str += TimeString::timeString( ev.event().end().time(), ampm, FALSE ); if( ev.startDate()!=ev.endDate() ) { str += " <i>" + TimeString::longDateString( ev.endDate() ) + "</i>"; } } void DateBookWeek::slotShowEvent( const EffectiveEvent &ev ) { if ( tHide->isActive() ) tHide->stop(); // why would someone use "<"? Oh well, fix it up... // I wonder what other things may be messed up... QString strDesc = ev.description(); int where = strDesc.find( "<" ); while ( where != -1 ) { strDesc.remove( where, 1 ); strDesc.insert( where, "<" ); where = strDesc.find( "<", where ); } QString strCat; // ### FIX later... // QString strCat = ev.category(); // where = strCat.find( "<" ); // while ( where != -1 ) { // strCat.remove( where, 1 ); // strCat.insert( where, "<" ); // where = strCat.find( "<", where ); // } QString strLocation = ev.location(); while ( where != -1 ) { strLocation.remove( where, 1 ); strLocation.insert( where, "<" ); where = strLocation.find( "<", where ); } QString strNote = ev.notes(); where = strNote.find( "<" ); while ( where != -1 ) { strNote.remove( where, 1 ); strNote.insert( where, "<" ); where = strNote.find( "<", where ); } QString str = "<b>" + strDesc + "</b><br>" + strLocation + "<br>" + "<i>" + strCat + "</i>" + "<br>" + TimeString::longDateString( ev.date() ) + "<br>"; if (ev.event().type() == Event::Normal ) generateNormalTooltext( str, ev ); else generateAllDayTooltext( str ); str += "<br><br>" + strNote; lblDesc->setText( str ); lblDesc->resize( lblDesc->sizeHint() ); // move the label so it is "centerd" horizontally... lblDesc->move( QMAX(0,(width() - lblDesc->width()) / 2), 0 ); lblDesc->show(); } void DateBookWeek::slotHideEvent() { tHide->start( 2000, true ); } void DateBookWeek::setStartViewTime( int startHere ) { startTime = startHere; view->moveToHour( startTime ); } int DateBookWeek::startViewTime() const { return startTime; } void DateBookWeek::redraw() { getEvents(); } void DateBookWeek::slotYearChanged( int y ) { int totWeek; QDate d( y, 12, 31 ); int throwAway; calcWeek( d, totWeek, throwAway, bStartOnMonday ); while ( totWeek == 1 ) { d = d.addDays( -1 ); calcWeek( d, totWeek, throwAway, bStartOnMonday ); } } void DateBookWeek::slotWeekChanged( bool onMonday ) { bStartOnMonday = onMonday; view->setStartOfWeek( bStartOnMonday ); header->setStartOfWeek( bStartOnMonday ); redraw(); } void DateBookWeek::slotClockChanged( bool ap ) { ampm = ap; } // return the date at the beginning of the week... QDate DateBookWeek::weekDate() const { - return dateFromWeek( _week, year, bStartOnMonday ); + QDate d=bdate; + + // Calculate offset to first day of week. + int dayoffset=d.dayOfWeek(); + if(bStartOnMonday) dayoffset--; + + return d.addDays(-dayoffset); } // this used to only be needed by datebook.cpp, but now we need it inside // week view since // we need to be able to figure out our total number of weeks on the fly... // this is probably the best place to put it.. // For Weeks that start on Monday... (EASY!) // At the moment we will use ISO 8601 method for computing // the week. Granted, other countries use other methods, // bet we aren't doing any Locale stuff at the moment. So, // this should pass. This Algorithim is public domain and // available at: // http://personal.ecu.edu/mccartyr/ISOwdALG.txt // the week number is return, and the year number is returned in year // for Instance 2001/12/31 is actually the first week in 2002. // There is a more mathematical definition, but I will implement it when // we are pass our deadline. // For Weeks that start on Sunday... (ahh... home rolled) // okay, if Jan 1 is on Friday or Saturday, // it will go to the pervious // week... bool calcWeek( const QDate &d, int &week, int &year, bool startOnMonday ) { int weekNumber; int yearNumber; // remove a pesky warning, (Optimizations on g++) weekNumber = -1; int jan1WeekDay = QDate(d.year(), 1, 1).dayOfWeek(); int dayOfWeek = d.dayOfWeek(); if ( !d.isValid() ) return false; if ( startOnMonday ) { // find the Jan1Weekday; if ( d.dayOfYear() <= ( 8 - jan1WeekDay) && jan1WeekDay > 4 ) { yearNumber = d.year() - 1; if ( jan1WeekDay == 5 || ( jan1WeekDay == 6 && QDate::leapYear(yearNumber) ) ) weekNumber = 53; else weekNumber = 52; } else yearNumber = d.year(); if ( yearNumber == d.year() ) { int totalDays = 365; if ( QDate::leapYear(yearNumber) ) totalDays++; if ( ((totalDays - d.dayOfYear()) < (4 - dayOfWeek) ) || (jan1WeekDay == 7) && (totalDays - d.dayOfYear()) < 3) { yearNumber++; weekNumber = 1; } } if ( yearNumber == d.year() ) { int j = d.dayOfYear() + (7 - dayOfWeek) + ( jan1WeekDay - 1 ); weekNumber = j / 7; if ( jan1WeekDay > 4 ) weekNumber--; } } else { // it's better to keep these cases separate... if ( d.dayOfYear() <= (7 - jan1WeekDay) && jan1WeekDay > 4 && jan1WeekDay != 7 ) { yearNumber = d.year() - 1; if ( jan1WeekDay == 6 || (jan1WeekDay == 7 && QDate::leapYear(yearNumber) ) ) { weekNumber = 53; }else weekNumber = 52; } else yearNumber = d.year(); if ( yearNumber == d.year() ) { int totalDays = 365; if ( QDate::leapYear( yearNumber ) ) totalDays++; if ( ((totalDays - d.dayOfYear()) < (4 - dayOfWeek % 7)) ) { yearNumber++; weekNumber = 1; } } if ( yearNumber == d.year() ) { int j = d.dayOfYear() + (7 - dayOfWeek % 7) + ( jan1WeekDay - 1 ); weekNumber = j / 7; if ( jan1WeekDay > 4 ) { weekNumber--; } } } year = yearNumber; week = weekNumber; return true; } diff --git a/core/pim/datebook/datebookweek.h b/core/pim/datebook/datebookweek.h index 8c5e06d..c273e30 100644 --- a/core/pim/datebook/datebookweek.h +++ b/core/pim/datebook/datebookweek.h @@ -1,166 +1,166 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** 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. ** **********************************************************************/ #ifndef DATEBOOKWEEK #define DATEBOOKWEEK #include <qpe/event.h> #include <qlist.h> #include <qscrollview.h> #include <qstring.h> #include <qvaluelist.h> class DateBookDB; class DateBookWeekHeader; class QDate; class QLabel; class QResizeEvent; class QSpinBox; class QTimer; class QHeader; class DateBookWeekItem { public: DateBookWeekItem( const EffectiveEvent e ); void setGeometry( int x, int y, int w, int h ); QRect geometry() const { return r; } const QColor &color() const { return c; } const EffectiveEvent event() const { return ev; } private: const EffectiveEvent ev; QRect r; QColor c; }; class DateBookWeekView : public QScrollView { Q_OBJECT public: DateBookWeekView( bool ampm, bool weekOnMonday, QWidget *parent = 0, const char *name = 0 ); bool whichClock() const; void showEvents( QValueList<EffectiveEvent> &ev ); void moveToHour( int h ); void setStartOfWeek( bool bOnMonday ); signals: void showDay( int d ); void signalShowEvent( const EffectiveEvent & ); void signalHideEvent(); protected slots: void keyPressEvent(QKeyEvent *); private slots: void slotChangeClock( bool ); void alterDay( int ); private: void positionItem( DateBookWeekItem *i ); DateBookWeekItem *intersects( const DateBookWeekItem * ); void drawContents( QPainter *p, int cx, int cy, int cw, int ch ); void contentsMousePressEvent( QMouseEvent * ); void contentsMouseReleaseEvent( QMouseEvent * ); void resizeEvent( QResizeEvent * ); void initNames(); private: bool ampm; bool bOnMonday; QHeader *header; QList<DateBookWeekItem> items; int rowHeight; bool showingEvent; }; class DateBookWeek : public QWidget { Q_OBJECT public: DateBookWeek( bool ampm, bool weekOnMonday, DateBookDB *newDB, QWidget *parent = 0, const char *name = 0 ); void setDate( int y, int m, int d ); void setDate( QDate d ); QDate date() const; DateBookWeekView *weekView() const { return view; } void setStartViewTime( int startHere ); int startViewTime() const; int week() const { return _week; }; QDate weekDate() const; public slots: void redraw(); void slotWeekChanged( bool bStartOnMonday ); void slotClockChanged( bool a ); signals: void showDate( int y, int m, int d ); protected slots: void keyPressEvent(QKeyEvent *); private slots: void showDay( int day ); - void dateChanged( int y, int w ); + void dateChanged( QDate &newdate ); void slotShowEvent( const EffectiveEvent & ); void slotHideEvent(); void slotYearChanged( int ); private: void getEvents(); /** * Wow that's a hell lot of code duplication * in datebook. I vote for a common base class * but never the less. This add a note * that the Event is an all day event * */ void generateAllDayTooltext( QString& text ); /** * This will add the times to the text * It will be shown in the Tooltip bubble */ void generateNormalTooltext( QString& text, const EffectiveEvent &ev); int year; int _week; int dow; + QDate bdate; DateBookWeekHeader *header; DateBookWeekView *view; DateBookDB *db; QLabel *lblDesc; QTimer *tHide; int startTime; bool ampm; bool bStartOnMonday; }; -bool calcWeek( const QDate &d, int &week, int &year, - bool startOnMonday = false ); +bool calcWeek( const QDate &d, int &week, int &year, bool startOnMonday = false ); #endif diff --git a/core/pim/datebook/datebookweekheaderimpl.cpp b/core/pim/datebook/datebookweekheaderimpl.cpp index fd792e2..ff7626f 100644 --- a/core/pim/datebook/datebookweekheaderimpl.cpp +++ b/core/pim/datebook/datebookweekheaderimpl.cpp @@ -1,139 +1,115 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** 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 "datebookweekheaderimpl.h" #include "datebookweekheader.h" #include "datebookweek.h" #include <qlabel.h> #include <qspinbox.h> #include <qdatetime.h> #include <qpe/resource.h> #include <qpe/datebookmonth.h> #include <qtoolbutton.h> /* * Constructs a DateBookWeekHeader which is a child of 'parent', with the * name 'name' and widget flags set to 'f' */ DateBookWeekHeader::DateBookWeekHeader( bool startOnMonday, QWidget* parent, const char* name, WFlags fl ) : DateBookWeekHeaderBase( parent, name, fl ), bStartOnMonday( startOnMonday ) { setBackgroundMode( PaletteButton ); labelDate->setBackgroundMode( PaletteButton ); backmonth->setPixmap( Resource::loadPixmap("fastback") ); backweek->setPixmap( Resource::loadPixmap("back") ); forwardweek->setPixmap( Resource::loadPixmap("forward") ); forwardmonth->setPixmap( Resource::loadPixmap("fastforward") ); } /* * Destroys the object and frees any allocated resources */ DateBookWeekHeader::~DateBookWeekHeader() { // no need to delete child widgets, Qt does it all for us } void DateBookWeekHeader::pickDate() { static QPopupMenu *m1 = 0; static DateBookMonth *picker = 0; if ( !m1 ) { m1 = new QPopupMenu( this ); picker = new DateBookMonth( m1, 0, TRUE ); m1->insertItem( picker ); connect( picker, SIGNAL( dateClicked( int, int, int ) ), this, SLOT( setDate( int, int, int ) ) ); // connect( m1, SIGNAL( aboutToHide() ), this, SLOT( gotHide() ) ); } picker->setDate( date.year(), date.month(), date.day() ); m1->popup(mapToGlobal(labelDate->pos()+QPoint(0,labelDate->height()))); picker->setFocus(); } void DateBookWeekHeader::nextMonth() { setDate(date.addDays(28)); } void DateBookWeekHeader::prevMonth() { setDate(date.addDays(-28)); } void DateBookWeekHeader::nextWeek() { setDate(date.addDays(7)); } void DateBookWeekHeader::prevWeek() { setDate(date.addDays(-7)); } void DateBookWeekHeader::setDate( int y, int m, int d ) { setDate(QDate(y,m,d)); } void DateBookWeekHeader::setDate(const QDate &d) { int year,week,dayofweek; date=d; dayofweek=d.dayOfWeek(); if(bStartOnMonday) dayofweek--; date=date.addDays(-dayofweek); calcWeek(date,week,year,bStartOnMonday); QDate start=date; QDate stop=start.addDays(6); labelDate->setText( QString::number(start.day()) + "." + start.monthName(start.month()) + "-" + QString::number(stop.day()) + "." + start.monthName(stop.month()) +" ("+ tr("w")+":"+QString::number( week ) +")"); - emit dateChanged(year,week); + emit dateChanged(date); } void DateBookWeekHeader::setStartOfWeek( bool onMonday ) { bStartOnMonday = onMonday; setDate( date ); } - -// dateFromWeek -// compute the date from the week in the year -QDate dateFromWeek( int week, int year, bool startOnMonday ) -{ - QDate d; - d.setYMD( year, 1, 1 ); - int dayOfWeek = d.dayOfWeek(); - if ( startOnMonday ) { - if ( dayOfWeek <= 4 ) { - d = d.addDays( ( week - 1 ) * 7 - dayOfWeek + 1 ); - } else { - d = d.addDays( (week) * 7 - dayOfWeek + 1 ); - } - } else { - if ( dayOfWeek <= 4 || dayOfWeek == 7) { - d = d.addDays( ( week - 1 ) * 7 - dayOfWeek % 7 ); - } else { - d = d.addDays( ( week ) * 7 - dayOfWeek % 7 ); - } - } - return d; -} - diff --git a/core/pim/datebook/datebookweekheaderimpl.h b/core/pim/datebook/datebookweekheaderimpl.h index 1ab1d52..d8dce90 100644 --- a/core/pim/datebook/datebookweekheaderimpl.h +++ b/core/pim/datebook/datebookweekheaderimpl.h @@ -1,59 +1,57 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** 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. ** **********************************************************************/ #ifndef DATEBOOKDAYHEADER_H #define DATEBOOKDAYHEADER_H #include <qdatetime.h> #include "datebookweekheader.h" class DateBookWeekHeader : public DateBookWeekHeaderBase { Q_OBJECT public: DateBookWeekHeader( bool startOnMonday, QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~DateBookWeekHeader(); void setDate(const QDate &d); void setStartOfWeek( bool onMonday ); signals: - void dateChanged( int y, int w ); + void dateChanged( QDate &date ); public slots: void pickDate(); void nextMonth(); void prevMonth(); void nextWeek(); void prevWeek(); void setDate( int y, int m, int d); protected slots: void keyPressEvent(QKeyEvent *e) { e->ignore(); } private: QDate date; bool bStartOnMonday; }; -QDate dateFromWeek( int week, int year, bool startOnMonday ); - #endif // DATEBOOKDAYHEADER_H diff --git a/core/pim/datebook/datebookweeklst.cpp b/core/pim/datebook/datebookweeklst.cpp index a39ff40..7817042 100644 --- a/core/pim/datebook/datebookweeklst.cpp +++ b/core/pim/datebook/datebookweeklst.cpp @@ -1,398 +1,386 @@ #include "datebookweeklst.h" #include "datebookweekheaderimpl.h" #include "datebook.h" #include <qpe/calendar.h> #include <qpe/datebookdb.h> #include <qpe/event.h> #include <qpe/qpeapplication.h> #include <qpe/timestring.h> #include <qpe/datebookmonth.h> #include <qpe/config.h> #include <qpe/resource.h> #include <qdatetime.h> #include <qheader.h> #include <qlabel.h> #include <qlayout.h> #include <qpainter.h> #include <qpopupmenu.h> #include <qtimer.h> #include <qstyle.h> #include <qtoolbutton.h> #include <qvbox.h> #include <qsizepolicy.h> #include <qabstractlayout.h> #include <qtl.h> bool calcWeek(const QDate &d, int &week, int &year,bool startOnMonday = false); DateBookWeekLstHeader::DateBookWeekLstHeader(bool onM, QWidget* parent, const char* name, WFlags fl) : DateBookWeekLstHeaderBase(parent, name, fl) { setBackgroundMode( PaletteButton ); labelDate->setBackgroundMode( PaletteButton ); forwardweek->setBackgroundMode( PaletteButton ); forwardweek->setPixmap( Resource::loadPixmap("forward") ); forwardmonth->setBackgroundMode( PaletteButton ); forwardmonth->setPixmap( Resource::loadPixmap("fastforward") ); backweek->setBackgroundMode( PaletteButton ); backweek->setPixmap( Resource::loadPixmap("back") ); backmonth->setBackgroundMode( PaletteButton ); backmonth->setPixmap( Resource::loadPixmap("fastback") ); DateBookWeekLstHeaderBaseLayout->setSpacing(0); DateBookWeekLstHeaderBaseLayout->setMargin(0); //setSizePolicy(QSizePolicy(QSizePolicy::Fixed,QSizePolicy::Expanding)); setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed)); connect(backmonth, SIGNAL(clicked()), this, SLOT(prevMonth())); connect(backweek, SIGNAL(clicked()), this, SLOT(prevWeek())); connect(forwardweek, SIGNAL(clicked()), this, SLOT(nextWeek())); connect(forwardmonth, SIGNAL(clicked()), this, SLOT(nextMonth())); connect(labelDate, SIGNAL(clicked()), this, SLOT(pickDate())); connect(dbl, SIGNAL(toggled(bool)), this, SIGNAL(setDbl(bool))); bStartOnMonday=onM; } DateBookWeekLstHeader::~DateBookWeekLstHeader(){} void DateBookWeekLstHeader::setDate(const QDate &d) { int year,week,dayofweek; date=d; dayofweek=d.dayOfWeek(); if(bStartOnMonday) dayofweek--; date=date.addDays(-dayofweek); calcWeek(date,week,year,bStartOnMonday); QDate start=date; QDate stop=start.addDays(6); labelDate->setText( QString::number(start.day()) + "." + start.monthName(start.month()) + "-" + QString::number(stop.day()) + "." + start.monthName(stop.month()) +" ("+ tr("w")+":"+QString::number( week ) +")"); - emit dateChanged(year,week); + emit dateChanged(date); } void DateBookWeekLstHeader::pickDate() { static QPopupMenu *m1 = 0; static DateBookMonth *picker = 0; if ( !m1 ) { m1 = new QPopupMenu( this ); picker = new DateBookMonth( m1, 0, TRUE ); m1->insertItem( picker ); connect( picker, SIGNAL( dateClicked( int, int, int ) ),this, SLOT( setDate( int, int, int ) ) ); //connect( m1, SIGNAL( aboutToHide() ), //this, SLOT( gotHide() ) ); } picker->setDate( date.year(), date.month(), date.day() ); m1->popup(mapToGlobal(labelDate->pos()+QPoint(0,labelDate->height()))); picker->setFocus(); } void DateBookWeekLstHeader::setDate(int y, int m, int d) { setDate(QDate(y,m,d)); } void DateBookWeekLstHeader::nextWeek() { setDate(date.addDays(7)); } void DateBookWeekLstHeader::prevWeek() { setDate(date.addDays(-7)); } void DateBookWeekLstHeader::nextMonth() { setDate(date.addDays(28)); } void DateBookWeekLstHeader::prevMonth() { setDate(date.addDays(-28)); } DateBookWeekLstDayHdr::DateBookWeekLstDayHdr(const QDate &d, bool /*onM*/, QWidget* parent, const char* name, WFlags fl ) : DateBookWeekLstDayHdrBase(parent, name, fl) { date=d; - static const char *wdays={"MTWTFSS"}; + static const char *wdays={"MTWTFSSM"}; char day=wdays[d.dayOfWeek()-1]; label->setText( QString(QObject::tr(QString(QChar(day)))) + " " +QString::number(d.day()) ); add->setText("+"); if (d == QDate::currentDate()) { QPalette pal=label->palette(); pal.setColor(QColorGroup::Foreground, QColor(0,0,255)); label->setPalette(pal); /* QFont f=label->font(); f.setItalic(true); label->setFont(f); label->setPalette(QPalette(QColor(0,0,255),label->backgroundColor())); */ } else if (d.dayOfWeek() == 7) { // FIXME: Match any holiday QPalette pal=label->palette(); pal.setColor(QColorGroup::Foreground, QColor(255,0,0)); label->setPalette(pal); } connect (label, SIGNAL(clicked()), this, SLOT(showDay())); connect (add, SIGNAL(clicked()), this, SLOT(newEvent())); } void DateBookWeekLstDayHdr::showDay() { emit showDate(date.year(), date.month(), date.day()); } void DateBookWeekLstDayHdr::newEvent() { QDateTime start, stop; start=stop=date; start.setTime(QTime(10,0)); stop.setTime(QTime(12,0)); emit addEvent(start,stop,"",0); } DateBookWeekLstEvent::DateBookWeekLstEvent(const EffectiveEvent &ev, int weeklistviewconfig, QWidget* parent, const char* name, WFlags fl ) : OClickableLabel(parent,name,fl), event(ev) { // old values... lastday = "__|__", middle=" |---", Firstday="00:00", QString s,start,middle,end,day; qDebug("weeklistviewconfig=%d",weeklistviewconfig); if(weeklistviewconfig==NONE) { // No times displayed. // start.sprintf("%.2d:%.2d-",ev.start().hour(),ev.start().minute()); // middle.sprintf("<--->"); // end.sprintf("-%.2d:%.2d",ev.end().hour(),ev.end().minute()); // day.sprintf("%.2d:%.2d-%.2d:%.2d",ev.start().hour(),ev.start().minute(),ev.end().hour(),ev.end().minute()); } else if(weeklistviewconfig==NORMAL) { // "Normal", only display start time. start.sprintf("%.2d:%.2d",ev.start().hour(),ev.start().minute()); middle.sprintf(" |---"); end.sprintf("__|__"); day.sprintf("%.2d:%.2d",ev.start().hour(),ev.start().minute()); } else if(weeklistviewconfig==EXTENDED) { // Extended mode, display start and end times. start.sprintf("%.2d:%.2d-",ev.start().hour(),ev.start().minute()); middle.sprintf("<--->"); end.sprintf("-%.2d:%.2d",ev.end().hour(),ev.end().minute()); day.sprintf("%.2d:%.2d-%.2d:%.2d",ev.start().hour(),ev.start().minute(),ev.end().hour(),ev.end().minute()); } if(ev.event().type() == Event::Normal) { if(ev.startDate()==ev.date() && ev.endDate()==ev.date()) { // day event. s=day; } else if(ev.startDate()==ev.date()) { // start event. s=start; } else if(ev.endDate()==ev.date()) { // end event. s=end; } else { // middle day. s=middle; } } else { s=""; } setText(QString(s) + " " + ev.description()); connect(this, SIGNAL(clicked()), this, SLOT(editMe())); setAlignment( int( QLabel::WordBreak | QLabel::AlignLeft ) ); } void DateBookWeekLstEvent::editMe() { emit editEvent(event.event()); } DateBookWeekLstView::DateBookWeekLstView(QValueList<EffectiveEvent> &ev, const QDate &d, bool onM, QWidget* parent, const char* name, WFlags fl) : QWidget( parent, name, fl ) { Config config("DateBook"); config.setGroup("Main"); int weeklistviewconfig=config.readNumEntry("weeklistviewconfig", NORMAL); qDebug("Read weeklistviewconfig: %d",weeklistviewconfig); bStartOnMonday=onM; setPalette(white); setSizePolicy(QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding)); QVBoxLayout *layout = new QVBoxLayout( this ); qBubbleSort(ev); QValueListIterator<EffectiveEvent> it; it=ev.begin(); int dayOrder[7]; if (bStartOnMonday) { for (int d=0; d<7; d++) dayOrder[d]=d+1; } else { for (int d=0; d<7; d++) dayOrder[d]=d; dayOrder[0]=7; } + // Calculate offset to first day of week. + int dayoffset=d.dayOfWeek(); + if(bStartOnMonday) dayoffset--; + for (int i=0; i<7; i++) { // Header - DateBookWeekLstDayHdr *hdr=new DateBookWeekLstDayHdr(d.addDays(i), bStartOnMonday,this); + DateBookWeekLstDayHdr *hdr=new DateBookWeekLstDayHdr(d.addDays(i-dayoffset), bStartOnMonday,this); connect(hdr, SIGNAL(showDate(int,int,int)), this, SIGNAL(showDate(int,int,int))); connect(hdr, SIGNAL(addEvent(const QDateTime &, const QDateTime &, const QString &, const QString &)), this, SIGNAL(addEvent(const QDateTime &, const QDateTime &, const QString &, const QString &))); layout->addWidget(hdr); // Events while ( (*it).date().dayOfWeek() == dayOrder[i] && it!=ev.end() ) { if(!(((*it).end().hour()==0) && ((*it).end().minute()==0) && ((*it).startDate()!=(*it).date()))) { // Skip events ending at 00:00 starting at another day. DateBookWeekLstEvent *l=new DateBookWeekLstEvent(*it,weeklistviewconfig,this); layout->addWidget(l); connect (l, SIGNAL(editEvent(const Event &)), this, SIGNAL(editEvent(const Event &))); } it++; } - layout->addItem(new QSpacerItem(1,1, QSizePolicy::Minimum, QSizePolicy::Expanding)); } } DateBookWeekLstView::~DateBookWeekLstView(){} void DateBookWeekLstView::keyPressEvent(QKeyEvent *e) {e->ignore();} DateBookWeekLstDblView::DateBookWeekLstDblView(QValueList<EffectiveEvent> &ev1, QValueList<EffectiveEvent> &ev2, QDate &d, bool onM, QWidget* parent, const char* name, WFlags fl) : QWidget( parent, name, fl ) { QHBoxLayout *layout = new QHBoxLayout( this ); DateBookWeekLstView *w=new DateBookWeekLstView(ev1,d,onM,this); layout->addWidget(w); connect (w, SIGNAL(editEvent(const Event &)), this, SIGNAL(editEvent(const Event &))); connect (w, SIGNAL(showDate(int,int,int)), this, SIGNAL(showDate(int,int,int))); connect (w, SIGNAL(addEvent(const QDateTime &, const QDateTime &, const QString &,const QString &)), this, SIGNAL(addEvent(const QDateTime &, const QDateTime &, const QString &, const QString &))); w=new DateBookWeekLstView(ev2,d.addDays(7),onM,this); layout->addWidget(w); connect (w, SIGNAL(editEvent(const Event &)), this, SIGNAL(editEvent(const Event &))); connect (w, SIGNAL(showDate(int,int,int)), this, SIGNAL(showDate(int,int,int))); connect (w, SIGNAL(addEvent(const QDateTime &, const QDateTime &, const QString &, const QString &)), this, SIGNAL(addEvent(const QDateTime &, const QDateTime &, const QString &, const QString &))); } DateBookWeekLst::DateBookWeekLst( bool ap, bool onM, DateBookDB *newDB, QWidget *parent, const char *name ) : QWidget( parent, name ), db( newDB ), startTime( 0 ), ampm( ap ), bStartOnMonday(onM) { setFocusPolicy(StrongFocus); layout = new QVBoxLayout( this ); layout->setMargin(0); header=new DateBookWeekLstHeader(onM, this); layout->addWidget( header ); - connect(header, SIGNAL(dateChanged(int,int)), this, SLOT(dateChanged(int,int))); + connect(header, SIGNAL(dateChanged(QDate &)), this, SLOT(dateChanged(QDate &))); connect(header, SIGNAL(setDbl(bool)), this, SLOT(setDbl(bool))); scroll=new QScrollView(this); scroll->setResizePolicy(QScrollView::AutoOneFit); layout->addWidget(scroll); view=NULL; Config config("DateBook"); config.setGroup("Main"); dbl=config.readBoolEntry("weeklst_dbl", false); header->dbl->setOn(dbl); } DateBookWeekLst::~DateBookWeekLst(){ Config config("DateBook"); config.setGroup("Main"); config.writeEntry("weeklst_dbl", dbl); } void DateBookWeekLst::setDate(const QDate &d) { - int w,y; - calcWeek(d,w,y,bStartOnMonday); - year=y; - _week=w; - header->setDate(date()); + bdate=d; + header->setDate(d); } + void DateBookWeekLst::setDbl(bool on) { dbl=on; redraw(); } void DateBookWeekLst::redraw() {getEvents();} -QDate DateBookWeekLst::date() const { - QDate d; - d.setYMD(year,1,1); - - int dow= d.dayOfWeek(); - if (!bStartOnMonday) - if (dow==7) { - dow=1; - } else { - dow++; - } - - d=d.addDays( (_week-1)*7 - dow + 1 ); - return d; +QDate DateBookWeekLst::date() { + return bdate; } void DateBookWeekLst::getEvents() { QDate start = date(); QDate stop = start.addDays(6); QValueList<EffectiveEvent> el = db->getEffectiveEvents(start, stop); if (view) delete view; if (dbl) { QDate start2=start.addDays(7); stop=start2.addDays(6); QValueList<EffectiveEvent> el2 = db->getEffectiveEvents(start2, stop); view=new DateBookWeekLstDblView(el,el2,start,bStartOnMonday,scroll); } else { view=new DateBookWeekLstView(el,start,bStartOnMonday,scroll); } connect (view, SIGNAL(editEvent(const Event &)), this, SIGNAL(editEvent(const Event &))); connect (view, SIGNAL(showDate(int,int,int)), this, SIGNAL(showDate(int,int,int))); connect (view, SIGNAL(addEvent(const QDateTime &, const QDateTime &, const QString &, const QString &)), this, SIGNAL(addEvent(const QDateTime &, const QDateTime &, const QString &, const QString &))); scroll->addChild(view); view->show(); scroll->updateScrollBars(); } -void DateBookWeekLst::dateChanged(int y, int w) { - year=y; - _week=w; +void DateBookWeekLst::dateChanged(QDate &newdate) { + bdate=newdate; getEvents(); } void DateBookWeekLst::keyPressEvent(QKeyEvent *e) { switch(e->key()) { case Key_Up: scroll->scrollBy(0, -20); break; case Key_Down: scroll->scrollBy(0, 20); break; case Key_Left: header->prevWeek(); break; case Key_Right: header->nextWeek(); break; default: e->ignore(); } }
\ No newline at end of file diff --git a/core/pim/datebook/datebookweeklst.h b/core/pim/datebook/datebookweeklst.h index f858c4f..0bfbcda 100644 --- a/core/pim/datebook/datebookweeklst.h +++ b/core/pim/datebook/datebookweeklst.h @@ -1,154 +1,155 @@ #ifndef DATEBOOKWEEKLST #define DATEBOOKWEEKLST #include <qwidget.h> #include <qdatetime.h> #include <qpe/event.h> #include <qlabel.h> #include <qscrollview.h> #include "datebookweeklstheader.h" #include "datebookweeklstdayhdr.h" #include <opie/oclickablelabel.h> class QDateTime; class DateBookDB; class DateBookWeekLstHeader: public DateBookWeekLstHeaderBase { Q_OBJECT public: DateBookWeekLstHeader(bool onM, QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~DateBookWeekLstHeader(); void setDate(const QDate &d); public slots: void nextWeek(); void prevWeek(); void nextMonth(); void prevMonth(); void pickDate(); void setDate(int y, int m, int d); signals: - void dateChanged(int y, int w); + void dateChanged(QDate &newdate); void setDbl(bool on); private: QDate date; // bool onMonday; bool bStartOnMonday; }; class DateBookWeekLstDayHdr: public DateBookWeekLstDayHdrBase { Q_OBJECT public: DateBookWeekLstDayHdr(const QDate &d, bool onM, QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); public slots: void showDay(); void newEvent(); signals: void showDate(int y, int m, int d); void addEvent(const QDateTime &start, const QDateTime &stop, const QString &str, const QString &location); private: QDate date; }; class DateBookWeekLstEvent: public OClickableLabel { Q_OBJECT public: DateBookWeekLstEvent(const EffectiveEvent &ev, int weeklistviewconfig =1, QWidget* parent = 0, const char* name = 0, WFlags fl = 0); signals: void editEvent(const Event &e); private slots: void editMe(); private: const EffectiveEvent event; }; class DateBookWeekLstView: public QWidget { Q_OBJECT public: DateBookWeekLstView(QValueList<EffectiveEvent> &ev, const QDate &d, bool onM, QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); ~DateBookWeekLstView(); signals: void editEvent(const Event &e); void showDate(int y, int m, int d); void addEvent(const QDateTime &start, const QDateTime &stop, const QString &str, const QString &location); private: bool bStartOnMonday; protected slots: void keyPressEvent(QKeyEvent *); }; class DateBookWeekLstDblView: public QWidget { Q_OBJECT public: DateBookWeekLstDblView(QValueList<EffectiveEvent> &ev1, QValueList<EffectiveEvent> &ev2, QDate &d, bool onM, QWidget* parent = 0, const char* name = 0, WFlags fl = 0 ); signals: void editEvent(const Event &e); void showDate(int y, int m, int d); void addEvent(const QDateTime &start, const QDateTime &stop, const QString &str, const QString &location); }; class DateBookWeekLst : public QWidget { Q_OBJECT public: DateBookWeekLst( bool ampm, bool onM, DateBookDB *newDB, QWidget *parent = 0, const char *name = 0 ); ~DateBookWeekLst(); void setDate( int y, int w ); void setDate(const QDate &d ); int week() const { return _week; }; - QDate date() const; + QDate date(); public slots: void redraw(); - void dateChanged(int y, int w); + void dateChanged(QDate &date); protected slots: void keyPressEvent(QKeyEvent *); void setDbl(bool on); signals: void showDate(int y, int m, int d); void addEvent(const QDateTime &start, const QDateTime &stop, const QString &str, const QString &location); void editEvent(const Event &e); private: DateBookDB *db; int startTime; bool ampm; bool bStartOnMonday; bool dbl; - int year, _week; + QDate bdate; + int year, _week,dow; DateBookWeekLstHeader *header; QWidget *view; QVBoxLayout *layout; QScrollView *scroll; void getEvents(); }; #endif |