-rw-r--r-- | core/pim/datebook/datebook.cpp | 50 | ||||
-rw-r--r-- | core/pim/datebook/datebook.pro | 6 | ||||
-rw-r--r-- | core/pim/datebook/datebookday.cpp | 127 | ||||
-rw-r--r-- | core/pim/datebook/datebookday.h | 6 | ||||
-rw-r--r-- | core/pim/datebook/datebookdayallday.cpp | 226 | ||||
-rw-r--r-- | core/pim/datebook/datebookdayallday.h | 80 | ||||
-rw-r--r-- | core/pim/datebook/datebooksettings.h | 5 | ||||
-rw-r--r-- | core/pim/datebook/datebookweek.cpp | 65 | ||||
-rw-r--r-- | core/pim/datebook/datebookweekheaderimpl.cpp | 12 | ||||
-rw-r--r-- | core/pim/datebook/datebookweeklst.cpp | 10 | ||||
-rw-r--r-- | core/pim/datebook/dateentryimpl.cpp | 2 | ||||
-rw-r--r-- | core/pim/datebook/opie-datebook.control | 6 | ||||
-rw-r--r-- | core/pim/datebook/repeatentry.cpp | 50 |
13 files changed, 564 insertions, 81 deletions
diff --git a/core/pim/datebook/datebook.cpp b/core/pim/datebook/datebook.cpp index b7e89b0..10a9b59 100644 --- a/core/pim/datebook/datebook.cpp +++ b/core/pim/datebook/datebook.cpp @@ -223,17 +223,21 @@ void DateBook::receive( const QCString &msg, const QByteArray &data ) else if ( monthAction->isOn() ) viewMonth(); } else if (msg == "editEvent(int)") { int uid; stream >> uid; Event e=db->eventByUID(uid); editEvent(e); - } + }else if (msg == "viewDefault(QDate)"){ + QDate day; + stream >> day; + viewDefault(day); + } } DateBook::~DateBook() { } void DateBook::slotSettings() { @@ -431,19 +435,29 @@ void DateBook::duplicateEvent( const Event &e ) #if defined(Q_WS_QWS) || defined(_WS_QWS_) editDlg.showMaximized(); #endif while (editDlg.exec() ) { Event newEv = entry->event(); QString error = checkEvent(newEv); if (!error.isNull()) { - if (QMessageBox::warning(this, "error box", error, "Fix it", "Continue", 0, 0, 1) == 0) + if (QMessageBox::warning(this, tr("error box"), error, tr("Fix it"), tr("Continue"), 0, 0, 1) == 0) continue; } + /* + * The problem: + * DateBookDB does remove repeating events not by uid but by the time + * the recurrence was created + * so we need to update that time as well + */ + Event::RepeatPattern rp = newEv.repeatPattern(); + rp.createTime = ::time( NULL ); + newEv.setRepeat( TRUE, rp ); // has repeat and repeatPattern... + db->addEvent(newEv); emit newEvent(); break; } } void DateBook::editEvent( const Event &e ) { @@ -471,17 +485,17 @@ void DateBook::editEvent( const Event &e ) #endif while (editDlg.exec() ) { Event newEv = entry->event(); if(newEv.description().isEmpty() && newEv.notes().isEmpty() ) break; newEv.setUid(e.uid()); // FIXME: Hack not to clear uid QString error = checkEvent(newEv); if (!error.isNull()) { - if (QMessageBox::warning(this, "error box", error, "Fix it", "Continue", 0, 0, 1) == 0) continue; + if (QMessageBox::warning(this, tr("error box"), error, tr("Fix it"), tr("Continue"), 0, 0, 1) == 0) continue; } db->editEvent(e, newEv); emit newEvent(); break; } } void DateBook::removeEvent( const Event &e ) @@ -514,18 +528,18 @@ void DateBook::showDay( int year, int month, int day ) view(DAY,d); } void DateBook::initDay() { if ( !dayView ) { dayView = new DateBookDay( ampm, onMonday, db, views, "day view" ); views->addWidget( dayView, DAY ); + dayView->setJumpToCurTime( bJumpToCurTime ); dayView->setStartViewTime( startTime ); - dayView->setJumpToCurTime( bJumpToCurTime ); dayView->setRowStyle( rowStyle ); connect( this, SIGNAL( newEvent() ), dayView, SLOT( redraw() ) ); connect( dayView, SIGNAL( newEvent() ), this, SLOT( fileNew() ) ); connect( dayView, SIGNAL( removeEvent( const Event & ) ), this, SLOT( removeEvent( const Event & ) ) ); connect( dayView, SIGNAL( editEvent( const Event & ) ), this, SLOT( editEvent( const Event & ) ) ); connect( dayView, SIGNAL( duplicateEvent( const Event & ) ), this, SLOT( duplicateEvent( const Event & ) ) ); connect( dayView, SIGNAL( beamEvent( const Event & ) ), this, SLOT( beamEvent( const Event & ) ) ); connect( dayView, SIGNAL(sigNewEvent(const QString &)), this, SLOT(slotNewEventFromKey(const QString &)) ); @@ -692,42 +706,58 @@ void DateBook::appMessage(const QCString& msg, const QByteArray& data) #endif needShow = dlg.exec(); if ( bSound ) killTimer( stopTimer ); } } } else if ( msg == "nextView()" ) { + needShow = true; if ( !qApp-> activeWindow ( )) { needShow = TRUE; } else { QWidget* cur = views->visibleWidget(); if ( cur ) { if ( cur == dayView ) viewWeek(); else if ( cur == weekView ) viewWeekLst(); else if ( cur == weekLstView ) viewMonth(); else if ( cur == monthView ) viewDay(); needShow = TRUE; } } - } + } else if (msg == "editEvent(int)") { + /* simple copy from receive */ + QDataStream stream(data,IO_ReadOnly); + int uid; + stream >> uid; + Event e=db->eventByUID(uid); + editEvent(e); + } else if (msg == "viewDefault(QDate)"){ + /* simple copy from receive */ + QDataStream stream(data,IO_ReadOnly); + QDate day; + stream >> day; + viewDefault(day); + needShow = true; + } + if ( needShow ) { #if defined(Q_WS_QWS) || defined(_WS_QWS_) - showMaximized(); +// showMaximized(); #else - show(); +// show(); #endif - raise(); +// raise(); QPEApplication::setKeepRunning(); - setActiveWindow(); +// setActiveWindow(); } } void DateBook::reload() { db->reload(); if ( dayAction->isOn() ) viewDay(); else if ( weekAction->isOn() ) viewWeek(); @@ -912,17 +942,17 @@ void DateBook::beamDone( Ir *ir ) delete ir; unlink( beamfile ); } void DateBook::slotFind() { // move it to the day view... viewDay(); - FindDialog frmFind( "Calendar", this ); + FindDialog frmFind( "Calendar", this ); // no tr needed frmFind.setUseDate( true ); frmFind.setDate( currentDate() ); QObject::connect( &frmFind, SIGNAL(signalFindClicked(const QString&, const QDate&, bool, bool, int)), this, SLOT(slotDoFind(const QString&, const QDate&, bool, bool, int)) ); diff --git a/core/pim/datebook/datebook.pro b/core/pim/datebook/datebook.pro index e8e0a98..ae30c8d 100644 --- a/core/pim/datebook/datebook.pro +++ b/core/pim/datebook/datebook.pro @@ -6,29 +6,31 @@ HEADERS = datebookday.h \ dateentryimpl.h \ datebookdayheaderimpl.h \ datebooksettings.h \ datebookweek.h \ datebookweeklst.h \ datebookweekheaderimpl.h \ repeatentry.h \ noteentryimpl.h \ - onoteedit.h + onoteedit.h \ + datebookdayallday.h SOURCES = main.cpp \ datebookday.cpp \ datebook.cpp \ dateentryimpl.cpp \ datebookdayheaderimpl.cpp \ datebooksettings.cpp \ datebookweek.cpp \ datebookweeklst.cpp \ datebookweekheaderimpl.cpp \ repeatentry.cpp \ noteentryimpl.cpp \ - onoteedit.cpp + onoteedit.cpp \ + datebookdayallday.cpp INTERFACES = dateentry.ui \ datebookdayheader.ui \ datebookweekheader.ui \ datebookweeklstheader.ui \ datebookweeklstdayhdr.ui \ repeatentrybase.ui \ datebooksettingsbase.ui \ noteentry.ui diff --git a/core/pim/datebook/datebookday.cpp b/core/pim/datebook/datebookday.cpp index 0b213e9..f4008e9 100644 --- a/core/pim/datebook/datebookday.cpp +++ b/core/pim/datebook/datebookday.cpp @@ -16,16 +16,17 @@ ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include <qmessagebox.h> #include "datebookday.h" #include "datebookdayheaderimpl.h" +#include "datebookdayallday.h" #include <qpe/datebookdb.h> #include <qpe/resource.h> #include <qpe/event.h> #include <qpe/qpeapplication.h> #include <qpe/timestring.h> #include <qpe/qpedebug.h> #include <qpe/ir.h> @@ -206,32 +207,40 @@ DateBookDayViewQuickLineEdit::DateBookDayViewQuickLineEdit(const QDateTime &star void DateBookDayViewQuickLineEdit::slotReturnPressed() { if(active && (!this->text().isEmpty())) { // Fix to avoid having this event beeing added multiple times. quickEvent.setDescription(this->text()); connect(this,SIGNAL(insertEvent(const Event &)),this->topLevelWidget(),SLOT(insertEvent(const Event &))); emit(insertEvent(quickEvent)); active=0; } - this->close(true); // Close and also delete this widget + /* we need to return to this object.. */ + QTimer::singleShot(500, this, SLOT(finallyCallClose()) ); // Close and also delete this widget +} +void DateBookDayViewQuickLineEdit::finallyCallClose() { + close(true); // also deletes this widget... } void DateBookDayViewQuickLineEdit::focusOutEvent ( QFocusEvent * e ) { slotReturnPressed(); // Reuse code to add event and close this widget. } //=========================================================================== DateBookDay::DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, QWidget *parent, const char *name ) : QVBox( parent, name ), currDate( QDate::currentDate() ), db( newDb ), startTime( 0 ) { widgetList.setAutoDelete( true ); header = new DateBookDayHeader( startOnMonday, this, "day header" ); header->setDate( currDate.year(), currDate.month(), currDate.day() ); + + m_allDays = new DatebookdayAllday(newDb, this, "all day event list" ); + m_allDays->hide(); + view = new DateBookDayView( ampm, this, "day view" ); connect( header, SIGNAL( dateChanged( int, int, int ) ), this, SLOT( dateChanged( int, int, int ) ) ); connect( header, SIGNAL( dateChanged( int, int, int ) ), view, SLOT( slotDateChanged( int, int, int ) ) ); connect( view, SIGNAL( sigColWidthChanged() ), this, SLOT( slotColWidthChanged() ) ); connect( qApp, SIGNAL(weekChanged(bool)), this, SLOT(slotWeekChanged(bool)) ); connect( view, SIGNAL(sigCapturedKey(const QString &)), this, SIGNAL(sigNewEvent(const QString&)) ); @@ -240,16 +249,17 @@ DateBookDay::DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, QWid connect( timer, SIGNAL(timeout()), this, SLOT(updateView()) ); //connect timer for updating timeMarker & daywidgetcolors timer->start( 1000*60*5, FALSE ); //update every 5min selectedWidget = 0; timeMarker = new DateBookDayTimeMarker( this ); timeMarker->setTime( QTime::currentTime() ); rowStyle = -1; // initialize with bogus values + jumpToCurTime = false; } void DateBookDay::setJumpToCurTime( bool bJump ) { jumpToCurTime = bJump; } void DateBookDay::setRowStyle( int style ) @@ -338,27 +348,41 @@ void DateBookDay::redraw() if ( isUpdatesEnabled() ) relayoutPage(); } void DateBookDay::getEvents() { widgetList.clear(); + /* clear the AllDay List */ + m_allDays->hide(); // just in case + m_allDays->removeAllEvents(); + QValueList<EffectiveEvent> eventList = db->getEffectiveEvents( currDate, currDate ); QValueListIterator<EffectiveEvent> it; + QObject* object = 0; for ( it = eventList.begin(); it != eventList.end(); ++it ) { EffectiveEvent ev=*it; if(!((ev.end().hour()==0) && (ev.end().minute()==0) && (ev.startDate()!=ev.date()))) { // Skip events ending at 00:00 starting at another day. + if (ev.event().type() == Event::AllDay ) { + object = m_allDays->addEvent( ev ); + if (!object) + continue; + }else { DateBookDayWidget* w = new DateBookDayWidget( *it, this ); - connect( w, SIGNAL( deleteMe( const Event & ) ), this, SIGNAL( removeEvent( const Event & ) ) ); - connect( w, SIGNAL( duplicateMe( const Event & ) ), this, SIGNAL( duplicateEvent( const Event & ) ) ); - connect( w, SIGNAL( editMe( const Event & ) ), this, SIGNAL( editEvent( const Event & ) ) ); - connect( w, SIGNAL( beamMe( const Event & ) ), this, SIGNAL( beamEvent( const Event & ) ) ); - widgetList.append( w ); + widgetList.append( w ); + object = w; + } + + connect( object, SIGNAL( deleteMe( const Event & ) ), this, SIGNAL( removeEvent( const Event & ) ) ); + connect( object, SIGNAL( duplicateMe( const Event & ) ), this, SIGNAL( duplicateEvent( const Event & ) ) ); + connect( object, SIGNAL( editMe( const Event & ) ), this, SIGNAL( editEvent( const Event & ) ) ); + connect( object, SIGNAL( beamMe( const Event & ) ), this, SIGNAL( beamEvent( const Event & ) ) ); + } } } static int place( const DateBookDayWidget *item, bool *used, int maxn ) { int place = 0; int start = item->event().start().hour(); @@ -391,19 +415,26 @@ static int place( const DateBookDayWidget *item, bool *used, int maxn ) } return place; } void DateBookDay::relayoutPage( bool fromResize ) { setUpdatesEnabled( FALSE ); - if ( !fromResize ) + if ( !fromResize ) { getEvents(); // no need we already have them! + if (m_allDays->items() > 0 ) + m_allDays->show(); + /* + * else if ( m_allDays->items() == 0 ) already hide in getEvents + */ + } + widgetList.sort(); //sorts the widgetList by the heights of the widget so that the tallest widgets are at the beginning //this is needed for the simple algo below to work correctly, otherwise some widgets would be drawn outside the view int wCount = widgetList.count(); int wid = view->columnWidth(0)-1; int wd; int n = 1; @@ -725,16 +756,38 @@ void DateBookDayWidget::paintEvent( QPaintEvent *e ) y += 20; } QSimpleRichText rt( text, font() ); rt.setWidth( geom.width() - d - 6 ); rt.draw( &p, 7, 0, e->region(), colorGroup() ); } +/* + * we need to find the real start date for a uid + * we need to check from one day to another... + */ +QDate DateBookDay::findRealStart( int uid, const QDate& isIncluded , DateBookDB* db) { + QDate dt( isIncluded ); + QDate fnd = dt; + + bool doAgain = true; + do{ + dt = dt.addDays( -1 ); + QValueList<EffectiveEvent> events = db->getEffectiveEvents( dt, dt ); + for (QValueList<EffectiveEvent>::Iterator it = events.begin(); it != events.end(); ++it ) { + EffectiveEvent ev = (*it); + if ( uid == ev.event().uid() && ev.start() != QTime(0, 0, 0 ) ) + return ev.date(); + } + }while (doAgain ); + + return fnd; +} + void DateBookDayWidget::mousePressEvent( QMouseEvent *e ) { DateBookDayWidget *item; item = dateBook->getSelectedWidget(); if (item) item->update(); @@ -742,26 +795,84 @@ void DateBookDayWidget::mousePressEvent( QMouseEvent *e ) update(); dateBook->repaint(); QPopupMenu m; m.insertItem( tr( "Edit" ), 1 ); m.insertItem( tr( "Duplicate" ), 4 ); m.insertItem( tr( "Delete" ), 2 ); if(Ir::supported()) m.insertItem( tr( "Beam" ), 3 ); + if(Ir::supported() && ev.event().doRepeat() ) m.insertItem( tr( "Beam this occurence"), 5 ); int r = m.exec( e->globalPos() ); if ( r == 1 ) { emit editMe( ev.event() ); } else if ( r == 2 ) { emit deleteMe( ev.event() ); } else if ( r == 3 ) { emit beamMe( ev.event() ); } else if ( r == 4 ) { emit duplicateMe( ev.event() ); - } + } else if ( r == 5 ) { + // create an Event and beam it... + /* + * Start with the easy stuff. If start and end date is the same we can just use + * the values of effective events + * If it is a multi day event we need to find the real start and end date... + */ + if ( ev.event().start().date() == ev.event().end().date() ) { + Event event( ev.event() ); + + QDateTime dt( ev.date(), ev.start() ); + event.setStart( dt ); + + dt.setTime( ev.end() ); + event.setEnd( dt ); + emit beamMe( event ); + }else { + /* + * at least the the Times are right now + */ + QDateTime start( ev.event().start() ); + QDateTime end ( ev.event().end () ); + + + /* + * ok we know the start date or we need to find it + */ + if ( ev.start() != QTime( 0, 0, 0 ) ) { + start.setDate( ev.date() ); + }else { + QDate dt = DateBookDay::findRealStart( ev.event().uid(), ev.date(), dateBook->db ); + start.setDate( dt ); + } + + + /* + * ok we know now the end date... + * else + * get to know the offset btw the real start and real end + * and then add it to the new start date... + */ + if ( ev.end() != QTime(23, 59, 59 ) ) { + end.setDate( ev.date() ); + }else{ + int days = ev.event().start().date().daysTo( ev.event().end().date() ); + end.setDate( start.date().addDays( days ) ); + } + + + + Event event( ev.event() ); + event.setStart( start ); + event.setEnd ( end ); + + + emit beamMe( event ); + } + } } void DateBookDayWidget::setGeometry( const QRect &r ) { geom = r; setFixedSize( r.width()+1, r.height()+1 ); dateBook->dayView()->moveChild( this, r.x(), r.y()-1 ); show(); diff --git a/core/pim/datebook/datebookday.h b/core/pim/datebook/datebookday.h index 961f60f..3898cbc 100644 --- a/core/pim/datebook/datebookday.h +++ b/core/pim/datebook/datebookday.h @@ -27,32 +27,34 @@ #include <qvbox.h> #include <qlist.h> #include "datebook.h" #include <qlineedit.h> class DateBookDayHeader; class DateBookDB; +class DatebookdayAllday; class QDateTime; class QMouseEvent; class QPaintEvent; class QResizeEvent; class DateBookDayViewQuickLineEdit : public QLineEdit { Q_OBJECT public: DateBookDayViewQuickLineEdit(const QDateTime &start, const QDateTime &end,QWidget * parent, const char *name=0); protected: Event quickEvent; int active; void focusOutEvent( QFocusEvent *e ); protected slots: void slotReturnPressed(void); + void finallyCallClose(); signals: void insertEvent(const Event &e); }; class DateBookDayView : public QTable { Q_OBJECT @@ -171,28 +173,31 @@ class WidgetListClass : public QList<DateBookDayWidget> }; class DateBookDay : public QVBox { Q_OBJECT + friend class DateBookDayWidget; // for beam this occurence and access to DateBookDB public: DateBookDay( bool ampm, bool startOnMonday, DateBookDB *newDb, QWidget *parent, const char *name ); void selectedDates( QDateTime &start, QDateTime &end ); QDate date() const; DateBookDayView *dayView() const { return view; } void setStartViewTime( int startHere ); int startViewTime() const; void setSelectedWidget( DateBookDayWidget * ); DateBookDayWidget * getSelectedWidget( void ); void setJumpToCurTime( bool bJump ); void setRowStyle( int style ); + static QDate findRealStart( int uid, const QDate& isIncluded, + DateBookDB* ); public slots: void setDate( int y, int m, int d ); void setDate( QDate ); void redraw(); void slotWeekChanged( bool bStartOnMonday ); void updateView(); //updates TimeMarker and DayWidget-colors @@ -213,16 +218,17 @@ private slots: private: void getEvents(); void relayoutPage( bool fromResize = false ); DateBookDayWidget *intersects( const DateBookDayWidget *item, const QRect &geom ); QDate currDate; DateBookDayView *view; DateBookDayHeader *header; + DatebookdayAllday *m_allDays; DateBookDB *db; WidgetListClass widgetList; //reimplemented QList for sorting widgets by height int startTime; bool jumpToCurTime; //should we jump to current time in dayview? int rowStyle; DateBookDayWidget *selectedWidget; //actual selected widget (obviously) DateBookDayTimeMarker *timeMarker; //marker for current time }; diff --git a/core/pim/datebook/datebookdayallday.cpp b/core/pim/datebook/datebookdayallday.cpp new file mode 100644 index 0000000..985f31a --- a/dev/null +++ b/core/pim/datebook/datebookdayallday.cpp @@ -0,0 +1,226 @@ +/**************************************************************************** +** GPL by Rajko Albrecht +** +** +** +** +** +****************************************************************************/ +#include "datebookdayallday.h" + +#include <qpushbutton.h> +#include <qlayout.h> +#include <qvariant.h> +#include <qtooltip.h> +#include <qwhatsthis.h> +#include <qobjectlist.h> +#include <qpe/event.h> +#include <qpe/ir.h> +#include <qpe/datebookdb.h> +#include <qpe/resource.h> +#include <qpopupmenu.h> +#include <qtimer.h> +#include <qregexp.h> +#include <qdatetime.h> + +#include "datebookday.h" + +/* + * Constructs a DatebookdayAllday which is a child of 'parent', with the + * name 'name' and widget flags set to 'f' + */ +DatebookdayAllday::DatebookdayAllday(DateBookDB* db, QWidget* parent, const char* name, WFlags fl ) + : QWidget( parent, name,fl ),item_count(0),dateBook(db) +{ + if ( !name ) + setName( "DatebookdayAllday" ); + setMinimumSize( QSize( 0, 0 ) ); + + datebookdayalldayLayout = new QVBoxLayout( this ); + datebookdayalldayLayout->setSpacing( 0 ); + datebookdayalldayLayout->setMargin( 0 ); + + lblDesc = new DatebookEventDesc(parent->parentWidget(),""); + lblDesc->setBackgroundColor(Qt::yellow); + lblDesc->hide(); + subWidgets.setAutoDelete(true); +} + +/* + * Destroys the object and frees any allocated resources + */ +DatebookdayAllday::~DatebookdayAllday() +{ + // no need to delete child widgets, Qt does it all for us +} + +DatebookAlldayDisp* DatebookdayAllday::addEvent(const EffectiveEvent&ev) +{ + DatebookAlldayDisp * lb; + lb = new DatebookAlldayDisp(dateBook,ev,this,NULL); + datebookdayalldayLayout->addWidget(lb); + subWidgets.append(lb); + + connect(lb,SIGNAL(displayMe(const Event &)),lblDesc,SLOT(disp_event(const Event&))); + ++item_count; + + return lb; +} + +void DatebookdayAllday::removeAllEvents() +{ + subWidgets.clear(); + item_count = 0; +} + +DatebookAlldayDisp::DatebookAlldayDisp(DateBookDB *db,const EffectiveEvent& ev, + QWidget* parent,const char* name,WFlags f) + : QLabel(parent,name,f),m_Ev(ev),dateBook(db) +{ + QString strDesc = m_Ev.description(); + strDesc = strDesc.replace(QRegExp("<"),"<"); + setBackgroundColor(yellow); + setText(strDesc); + setFrameStyle(QFrame::Raised|QFrame::Panel); + QSize s = sizeHint(); + setMaximumSize( QSize( 32767, s.height()-4 ) ); + setMinimumSize( QSize( 0, s.height()-4 ) ); +} + +DatebookAlldayDisp::~DatebookAlldayDisp() +{ +} + +void DatebookAlldayDisp::beam_single_event() +{ + // create an Event and beam it... + /* + * Start with the easy stuff. If start and end date is the same we can just use + * the values of effective m_Events + * If it is a multi day m_Event we need to find the real start and end date... + */ + if ( m_Ev.event().start().date() == m_Ev.event().end().date() ) { + Event m_Event( m_Ev.event() ); + + QDateTime dt( m_Ev.date(), m_Ev.start() ); + m_Event.setStart( dt ); + + dt.setTime( m_Ev.end() ); + m_Event.setEnd( dt ); + emit beamMe( m_Event ); + }else { + /* + * at least the the Times are right now + */ + QDateTime start( m_Ev.event().start() ); + QDateTime end ( m_Ev.event().end () ); + + /* + * ok we know the start date or we need to find it + */ + if ( m_Ev.start() != QTime( 0, 0, 0 ) ) { + start.setDate( m_Ev.date() ); + }else { + QDate dt = DateBookDay::findRealStart( m_Ev.event().uid(), m_Ev.date(), dateBook ); + start.setDate( dt ); + } + + /* + * ok we know now the end date... + * else + * get to know the offset btw the real start and real end + * and then add it to the new start date... + */ + if ( m_Ev.end() != QTime(23, 59, 59 ) ) { + end.setDate( m_Ev.date() ); + }else{ + int days = m_Ev.event().start().date().daysTo( m_Ev.event().end().date() ); + end.setDate( start.date().addDays( days ) ); + } + Event m_Event( m_Ev.event() ); + m_Event.setStart( start ); + m_Event.setEnd ( end ); + emit beamMe( m_Event ); + } +} + +void DatebookAlldayDisp::mousePressEvent(QMouseEvent*e) +{ + QColor b = backgroundColor(); + setBackgroundColor(green); + update(); + QPopupMenu m; + m.insertItem( DateBookDayWidget::tr( "Edit" ), 1 ); + m.insertItem( DateBookDayWidget::tr( "Duplicate" ), 4 ); + m.insertItem( DateBookDayWidget::tr( "Delete" ), 2 ); + if(Ir::supported()) m.insertItem( DateBookDayWidget::tr( "Beam" ), 3 ); + if(Ir::supported() && m_Ev.event().doRepeat() ) m.insertItem( DateBookDayWidget::tr( "Beam this occurence"), 5 ); + m.insertItem( tr( "Info"),6); + int r = m.exec( e->globalPos() ); + setBackgroundColor(b); + update(); + switch (r) { + case 1: + emit editMe( m_Ev.event() ); + break; + case 2: + emit deleteMe( m_Ev.event() ); + break; + case 3: + emit beamMe( m_Ev.event() ); + break; + case 4: + emit duplicateMe( m_Ev.event() ); + break; + case 5: + beam_single_event(); + break; + case 6: + emit displayMe( m_Ev.event() ); + break; + default: + break; + } +} + +DatebookEventDesc::DatebookEventDesc(QWidget*parent,const char*name) + :QLabel(parent,name) +{ + m_Timer=new QTimer(this); + connect(m_Timer,SIGNAL(timeout()),this,SLOT(hide())); + setFrameStyle(QFrame::Sunken|QFrame::Panel); + setTextFormat(RichText); +} + +DatebookEventDesc::~DatebookEventDesc() +{ +} + +void DatebookEventDesc::mousePressEvent(QMouseEvent*) +{ + hide(); + if (m_Timer->isActive()) m_Timer->stop(); +} + +void DatebookEventDesc::disp_event(const Event&e) +{ + if (m_Timer->isActive()) m_Timer->stop(); + QString text; + text = "<b><i>"+e.description()+"</i></b><br>"; + if (e.notes().length()>0) { + text+="<b>"+e.notes()+"</b><br>"; + } + if (e.location().length()>0) { + text+="<i>"+e.location()+"</i><br>"; + } + text = text.replace(QRegExp("\n"),"<br>"); + setText(text); + QSize s = sizeHint(); + s+=QSize(10,10); + resize(s); + move( QMAX(0,(parentWidget()->width()-width()) / 2), + (parentWidget()->height()-height())/2 ); + show(); + m_Timer->start(2000,true); +} + diff --git a/core/pim/datebook/datebookdayallday.h b/core/pim/datebook/datebookdayallday.h new file mode 100644 index 0000000..c781785 --- a/dev/null +++ b/core/pim/datebook/datebookdayallday.h @@ -0,0 +1,80 @@ +#ifndef DATEBOOKDAYALLDAYBASE_H +#define DATEBOOKDAYALLDAYBASE_H + +#include <qvariant.h> +#include <qframe.h> +#include <qlabel.h> +#include <qlist.h> +#include <qpe/event.h> + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class DatebookAlldayDisp; +class DatebookEventDesc; +class DateBookDB; + +class DatebookdayAllday : public QWidget +{ + Q_OBJECT + +public: + DatebookdayAllday(DateBookDB* db, + QWidget* parent = 0, const char* name = 0, WFlags fl = 0); + ~DatebookdayAllday(); + DatebookAlldayDisp* addEvent(const EffectiveEvent&e); + const unsigned int items()const{return item_count;} + +public slots: + void removeAllEvents(); + +protected: + QVBoxLayout* datebookdayalldayLayout; + DatebookEventDesc * lblDesc; + unsigned int item_count; + QList<DatebookAlldayDisp> subWidgets; + DateBookDB *dateBook; +}; + +class DatebookAlldayDisp : public QLabel +{ + Q_OBJECT + +public: + DatebookAlldayDisp(DateBookDB* db,const EffectiveEvent& e, + QWidget* parent=0,const char* name = 0, WFlags fl=0); + virtual ~DatebookAlldayDisp(); + +signals: + void deleteMe( const Event &e ); + void duplicateMe( const Event &e ); + void editMe( const Event &e ); + void beamMe( const Event &e ); + void displayMe(const Event &e); + +public slots: + +protected: + EffectiveEvent m_Ev; + DateBookDB* dateBook; + void mousePressEvent( QMouseEvent *e ); + void beam_single_event(); +}; + +class DatebookEventDesc: public QLabel +{ + Q_OBJECT + +public: + DatebookEventDesc(QWidget* Parent=0,const char* name = 0); + virtual ~DatebookEventDesc(); + +public slots: + void disp_event(const Event&e); + +protected: + void mousePressEvent(QMouseEvent*e); + QTimer* m_Timer; +}; + +#endif // DATEBOOKDAYALLDAYBASE_H diff --git a/core/pim/datebook/datebooksettings.h b/core/pim/datebook/datebooksettings.h index c3036e1..cf8a0ff 100644 --- a/core/pim/datebook/datebooksettings.h +++ b/core/pim/datebook/datebooksettings.h @@ -20,33 +20,34 @@ #ifndef DATEBOOKSETTINGS_H #define DATEBOOKSETTINGS_H #include "datebooksettingsbase.h" #include <qpe/categoryselect.h> class DateBookSettings : public DateBookSettingsBase { + Q_OBJECT public: DateBookSettings( bool whichClock, QWidget *parent = 0, const char *name = 0, bool modal = TRUE, WFlags = 0 ); ~DateBookSettings(); void setStartTime( int newStartViewTime ); int startTime() const; void setAlarmPreset( bool bAlarm, int presetTime ); bool alarmPreset() const; int presetTime() const; void setAlarmType( int alarmType ); int alarmType() const; - + void setJumpToCurTime( bool bJump ); bool jumpToCurTime() const; void setRowStyle( int style ); int rowStyle() const; - + private slots: void slot12Hour( int ); void slotChangeClock( bool ); private: void init(); bool ampm; int oldtime; diff --git a/core/pim/datebook/datebookweek.cpp b/core/pim/datebook/datebookweek.cpp index 2ad7aa9..ab7e963 100644 --- a/core/pim/datebook/datebookweek.cpp +++ b/core/pim/datebook/datebookweek.cpp @@ -15,31 +15,24 @@ ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #include "datebookweek.h" #include "datebookweekheaderimpl.h" -#include <qpe/calendar.h> #include <qpe/datebookdb.h> -#include <qpe/event.h> #include <qpe/qpeapplication.h> -#include <qpe/timestring.h> +#include <qpe/calendar.h> -#include <qdatetime.h> #include <qheader.h> #include <qlabel.h> #include <qlayout.h> -#include <qpainter.h> -#include <qpopupmenu.h> #include <qtimer.h> -#include <qspinbox.h> -#include <qstyle.h> //----------------------------------------------------------------- DateBookWeekItem::DateBookWeekItem( const EffectiveEvent e ) : ev( e ) { // with the current implementation change the color for all day events @@ -84,54 +77,47 @@ DateBookWeekView::DateBookWeekView( bool ap, bool startOnMonday, QFontMetrics fm( font() ); rowHeight = fm.height()+2; resizeContents( width(), 24*rowHeight ); } void DateBookWeekView::initNames() { +#warning Please review this ! (eilers) + + // Ok, I am Mr. Pedantic, but shouldn't we count until 6 instead of 7, if bOnMonday is false ? (eilers) + static bool bFirst = true; if ( bFirst ) { if ( bOnMonday ) { - header->addLabel( tr("Mo", "Monday" ) ); - header->addLabel( tr("Tu", "Tuesday") ); - header->addLabel( tr("We", "Wednesday" ) ); - header->addLabel( tr("Th", "Thursday" ) ); - header->addLabel( tr("Fr", "Friday" ) ); - header->addLabel( tr("Sa", "Saturday" ) ); - header->addLabel( tr("Su", "Sunday" ) ); + for ( int i = 1; i<=7; i++ ) { + header->addLabel( Calendar::nameOfDay( i ) ); + } + } else { - header->addLabel( tr("Su", "Sunday" ) ); - header->addLabel( tr("Mo", "Monday") ); - header->addLabel( tr("Tu", "Tuesday") ); - header->addLabel( tr("We", "Wednesday" ) ); - header->addLabel( tr("Th", "Thursday" ) ); - header->addLabel( tr("Fr", "Friday" ) ); - header->addLabel( tr("Sa", "Saturday" ) ); - } + header->addLabel( Calendar::nameOfDay( 7 ) ); + for ( int i = 1; i<7; i++ ) { + header->addLabel( Calendar::nameOfDay( i ) ); + } + } bFirst = false; } else { // we are change things... if ( bOnMonday ) { - header->setLabel( 1, tr("Mo", "Monday") ); - header->setLabel( 2, tr("Tu", "Tuesday") ); - header->setLabel( 3, tr("We", "Wednesday" ) ); - header->setLabel( 4, tr("Th", "Thursday" ) ); - header->setLabel( 5, tr("Fr", "Friday" ) ); - header->setLabel( 6, tr("Sa", "Saturday" ) ); - header->setLabel( 7, tr("Su", "Sunday" ) ); + for ( int i = 1; i<=7; i++ ) { + header->setLabel( i, Calendar::nameOfDay( i ) ); + } + } else { - header->setLabel( 1, tr("Su", "Sunday" ) ); - header->setLabel( 2, tr("Mo", "Monday") ); - header->setLabel( 3, tr("Tu", "Tuesday") ); - header->setLabel( 4, tr("We", "Wednesday" ) ); - header->setLabel( 5, tr("Th", "Thursday" ) ); - header->setLabel( 6, tr("Fr", "Friday" ) ); - header->setLabel( 7, tr("Sa", "Saturday" ) ); + header->setLabel( 1, Calendar::nameOfDay( 7 ) ); + for ( int i = 1; i<7; i++ ) { + header->setLabel( i+1, Calendar::nameOfDay( i ) ); + } + } } } void DateBookWeekView::showEvents( QValueList<EffectiveEvent> &ev ) { @@ -397,17 +383,18 @@ void DateBookWeek::keyPressEvent(QKeyEvent *e) } } void DateBookWeek::showDay( int day ) { QDate d=bdate; // Calculate offset to first day of week. - int dayoffset=d.dayOfWeek(); + int dayoffset=d.dayOfWeek() % 7; + if(bStartOnMonday) dayoffset--; day--; d=d.addDays(day-dayoffset); emit showDate( d.year(), d.month(), d.day() ); } void DateBookWeek::setDate( int y, int m, int d ) @@ -570,16 +557,18 @@ void DateBookWeek::slotClockChanged( bool ap ) // return the date at the beginning of the week... QDate DateBookWeek::weekDate() const { QDate d=bdate; // Calculate offset to first day of week. int dayoffset=d.dayOfWeek(); if(bStartOnMonday) dayoffset--; + else if( dayoffset == 7 ) + dayoffset = 0; 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.. diff --git a/core/pim/datebook/datebookweekheaderimpl.cpp b/core/pim/datebook/datebookweekheaderimpl.cpp index ff7626f..770410e 100644 --- a/core/pim/datebook/datebookweekheaderimpl.cpp +++ b/core/pim/datebook/datebookweekheaderimpl.cpp @@ -65,43 +65,51 @@ void DateBookWeekHeader::pickDate() } picker->setDate( date.year(), date.month(), date.day() ); m1->popup(mapToGlobal(labelDate->pos()+QPoint(0,labelDate->height()))); picker->setFocus(); } void DateBookWeekHeader::nextMonth() { + qWarning("nextMonth() " ); setDate(date.addDays(28)); } void DateBookWeekHeader::prevMonth() { + qWarning("prevMonth() " ); setDate(date.addDays(-28)); } void DateBookWeekHeader::nextWeek() { + qWarning("nextWeek() " ); setDate(date.addDays(7)); } void DateBookWeekHeader::prevWeek() { + qWarning("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--; + if(bStartOnMonday) + dayofweek--; + else if( dayofweek == 7 ) + /* we already have the right day -7 would lead to the current week..*/ + dayofweek = 0; + 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 ) +")"); diff --git a/core/pim/datebook/datebookweeklst.cpp b/core/pim/datebook/datebookweeklst.cpp index 7817042..aad1f3a 100644 --- a/core/pim/datebook/datebookweeklst.cpp +++ b/core/pim/datebook/datebookweeklst.cpp @@ -56,17 +56,22 @@ DateBookWeekLstHeader::DateBookWeekLstHeader(bool onM, QWidget* parent, const ch bStartOnMonday=onM; } DateBookWeekLstHeader::~DateBookWeekLstHeader(){} void DateBookWeekLstHeader::setDate(const QDate &d) { int year,week,dayofweek; date=d; dayofweek=d.dayOfWeek(); - if(bStartOnMonday) dayofweek--; + if(bStartOnMonday) + dayofweek--; + else if( dayofweek == 7 ) + /* we already have the right day -7 would lead to the same week */ + dayofweek = 0; + 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()) + "." + @@ -112,17 +117,17 @@ void DateBookWeekLstHeader::prevMonth() DateBookWeekLstDayHdr::DateBookWeekLstDayHdr(const QDate &d, bool /* onM */, QWidget* parent, const char* name, WFlags fl ) : DateBookWeekLstDayHdrBase(parent, name, fl) { date=d; - static const char *wdays={"MTWTFSSM"}; + static const QString wdays=tr("MTWTFSSM", "Week days"); 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)); @@ -232,16 +237,17 @@ DateBookWeekLstView::DateBookWeekLstView(QValueList<EffectiveEvent> &ev, } 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--; + else if( dayoffset == 7 ) dayoffset = 0; for (int i=0; i<7; i++) { // Header 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); diff --git a/core/pim/datebook/dateentryimpl.cpp b/core/pim/datebook/dateentryimpl.cpp index 13d2ce2..d9e5225 100644 --- a/core/pim/datebook/dateentryimpl.cpp +++ b/core/pim/datebook/dateentryimpl.cpp @@ -397,16 +397,18 @@ void DateEntry::slotRepeat() #if defined(Q_WS_QWS) || defined(_WS_QWS_) e->showMaximized(); #endif if ( e->exec() ) { rp = e->repeatPattern(); setRepeatLabel(); } + // deleting sounds like a nice idea... + delete e; } void DateEntry::slotChangeStartOfWeek( bool onMonday ) { startWeekOnMonday = onMonday; } Event DateEntry::event() diff --git a/core/pim/datebook/opie-datebook.control b/core/pim/datebook/opie-datebook.control index 1a28448..fe5a086 100644 --- a/core/pim/datebook/opie-datebook.control +++ b/core/pim/datebook/opie-datebook.control @@ -1,11 +1,11 @@ Package: opie-datebook -Files: bin/datebook apps/1Pim/datebook.desktop pics/datebook +Files: bin/datebook apps/1Pim/datebook.desktop Priority: optional Section: opie/applications Conflicts: qpe-tkccalendar Maintainer: Warwick Allison <warwick@trolltech.com> Architecture: arm -Version: $QPE_VERSION-$SUB_VERSION -Depends: task-opie-minimal, libopie1 +Depends: task-opie-minimal, libopie1, opie-pics Description: A datebook/appointment manager A datebook/appointment manager for the Opie environment. +Version: $QPE_VERSION$EXTRAVERSION diff --git a/core/pim/datebook/repeatentry.cpp b/core/pim/datebook/repeatentry.cpp index 5637c4d..b1a162d 100644 --- a/core/pim/datebook/repeatentry.cpp +++ b/core/pim/datebook/repeatentry.cpp @@ -28,57 +28,79 @@ #include <qlabel.h> #include <qpopupmenu.h> #include <qspinbox.h> #include <qtoolbutton.h> #include <time.h> // Global Templates for use in setting up the repeat label... -const QString strDayTemplate = QObject::tr("Every"); -const QString strYearTemplate = QObject::tr("%1 %2 every "); -const QString strMonthDateTemplate = QObject::tr("The %1 every "); -const QString strMonthDayTemplate = QObject::tr("The %1 %1 of every"); -const QString strWeekTemplate = QObject::tr("Every "); -const QString dayLabel[] = { QObject::tr("Monday"), - QObject::tr("Tuesday"), - QObject::tr("Wednesday"), - QObject::tr("Thursday"), - QObject::tr("Friday"), - QObject::tr("Saturday"), - QObject::tr("Sunday") }; +// the problem is these strings get initialized before QPEApplication can install the translator -zecke +namespace { +QString strDayTemplate; +QString strYearTemplate; +QString strMonthDateTemplate; +QString strMonthDayTemplate; +QString strWeekTemplate; +QString dayLabel[7]; +} +/* + * static linkage to not polute the symbol table... + * The problem is that const and static linkage are resolved prior to installing a translator + * leading to that the above strings are translted but to the original we delay the init of these strings... + * -zecke + */ +static void fillStrings() { + strDayTemplate = QObject::tr("Every"); + strYearTemplate = QObject::tr("%1 %2 every "); + strMonthDateTemplate = QObject::tr("The %1 every "); + strMonthDayTemplate = QObject::tr("The %1 %1 of every"); + strWeekTemplate = QObject::tr("Every "); + dayLabel[0] = QObject::tr("Monday"); + dayLabel[1] = QObject::tr("Tuesday"); + dayLabel[2] = QObject::tr("Wednesday"); + dayLabel[3] = QObject::tr("Thursday"); + dayLabel[4] = QObject::tr("Friday"); + dayLabel[5] = QObject::tr("Saturday"); + dayLabel[6] = QObject::tr("Sunday"); +} static QString numberPlacing( int x ); // return the proper word format for // x (1st, 2nd, etc) static int week( const QDate &dt ); // what week in the month is dt? RepeatEntry::RepeatEntry( bool startOnMonday, const QDate &newStart, QWidget *parent, const char *name, bool modal, WFlags fl ) : RepeatEntryBase( parent, name, modal, fl ), start( newStart ), currInterval( NONE ), startWeekOnMonday( startOnMonday ) { + if (strDayTemplate.isEmpty() ) + fillStrings(); + init(); fraType->setButton( currInterval ); chkNoEnd->setChecked( TRUE ); setupNone(); } RepeatEntry::RepeatEntry( bool startOnMonday, const Event::RepeatPattern &rp, const QDate &startDate, QWidget *parent, const char *name, bool modal, WFlags fl ) : RepeatEntryBase( parent, name, modal, fl ), start( startDate ), end( rp.endDate() ), startWeekOnMonday( startOnMonday ) { + if (strDayTemplate.isEmpty() ) + fillStrings(); // do some stuff with the repeat pattern init(); switch ( rp.type ) { default: case Event::NoRepeat: currInterval = NONE; setupNone(); break; @@ -401,17 +423,17 @@ void RepeatEntry::setupRepeatLabel( int x ) switch ( currInterval ) { case NONE: break; case DAY: if ( x > 1 ) strVar2 = tr( "days" ); else - strVar2 = tr( "day" ); + strVar2 = tr( "day" ); break; case WEEK: if ( x > 1 ) strVar2 = tr( "weeks" ); else strVar2 = tr( "week" ); break; case MONTH: @@ -495,17 +517,17 @@ void RepeatEntry::slotWeekLabel() } } else { if ( bNeedCarriage ) str += ",\n" + *itStr; else str += ", " + *itStr; } } - str = str.prepend( "on " ); + str = str.prepend( tr("on ") ); lblWeekVar->setText( str ); } void RepeatEntry::slotMonthLabel( int type ) { QString str; if ( currInterval != MONTH || type > 1 ) return; |