diff options
Diffstat (limited to 'korganizer/kowhatsnextview.cpp')
-rw-r--r-- | korganizer/kowhatsnextview.cpp | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/korganizer/kowhatsnextview.cpp b/korganizer/kowhatsnextview.cpp new file mode 100644 index 000000000..d4b6618aa --- /dev/null +++ b/korganizer/kowhatsnextview.cpp @@ -0,0 +1,335 @@ +/* + This file is part of KOrganizer. + + Copyright (c) 2001 Cornelius Schumacher <schumacher@kde.org> + + 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 <qlayout.h> +#include <qtextbrowser.h> +#include <qtextcodec.h> +#include <qfileinfo.h> +#include <qlabel.h> + +#include <kglobal.h> +#include <klocale.h> +#include <kdebug.h> +#include <kiconloader.h> +#include <kmessagebox.h> + +#include <libkcal/calendar.h> + +#include "koglobals.h" +#include "koprefs.h" +#include "koeventviewerdialog.h" + +#include "kowhatsnextview.h" + +using namespace KOrg; + +void WhatsNextTextBrowser::setSource(const QString& n) +{ + kdDebug(5850) << "WhatsNextTextBrowser::setSource(): " << n << endl; + + if (n.startsWith("event:")) { + emit showIncidence(n); + return; + } else if (n.startsWith("todo:")) { + emit showIncidence(n); + return; + } else { + QTextBrowser::setSource(n); + } +} + +KOWhatsNextView::KOWhatsNextView(Calendar *calendar, QWidget *parent, + const char *name) + : KOrg::BaseView(calendar, parent, name) +{ +// QLabel *dateLabel = +// new QLabel(KGlobal::locale()->formatDate(QDate::currentDate()),this); +// dateLabel->setMargin(2); +// dateLabel->setAlignment(AlignCenter); + + mView = new WhatsNextTextBrowser(this); + connect(mView,SIGNAL(showIncidence(const QString &)),SLOT(showIncidence(const QString &))); + + QBoxLayout *topLayout = new QVBoxLayout(this); +// topLayout->addWidget(dateLabel); + topLayout->addWidget(mView); +} + +KOWhatsNextView::~KOWhatsNextView() +{ +} + +int KOWhatsNextView::currentDateCount() +{ + return mStartDate.daysTo( mEndDate ); +} + +void KOWhatsNextView::updateView() +{ + KIconLoader kil("kdepim"); + QString *ipath = new QString(); + kil.loadIcon("kdepim",KIcon::NoGroup,32,KIcon::DefaultState,ipath); + + mText = "<table width=\"100%\">\n"; + mText += "<tr bgcolor=\"#3679AD\"><td><h1>"; + mText += "<img src=\""; + mText += *ipath; + mText += "\">"; + mText += "<font color=\"white\"> "; + mText += i18n("What's Next?") + "</font></h1>"; + mText += "</td></tr>\n<tr><td>"; + + mText += "<h2>"; + if ( mStartDate.daysTo( mEndDate ) < 1 ) { + mText += KGlobal::locale()->formatDate( mStartDate ); + } else { + mText += i18n("Date from - to", "%1 - %2") + .arg( KGlobal::locale()->formatDate( mStartDate ) ) + .arg( KGlobal::locale()->formatDate( mEndDate ) ); + } + mText+="</h2>\n"; + + Event::List events; + for ( QDate date = mStartDate; date <= mEndDate; date = date.addDays( 1 ) ) + events += calendar()->events(date, EventSortStartDate, SortDirectionAscending); + + if (events.count() > 0) { + mText += "<p></p>"; + kil.loadIcon("appointment",KIcon::NoGroup,22,KIcon::DefaultState,ipath); + mText += "<h2><img src=\""; + mText += *ipath; + mText += "\">"; + mText += i18n("Events:") + "</h2>\n"; + mText += "<table>\n"; + Event::List::ConstIterator it; + for( it = events.begin(); it != events.end(); ++it ) { + Event *ev = *it; + if ( !ev->doesRecur() ){ + appendEvent(ev); + } else { + // FIXME: This should actually be cleaned up. Libkcal should + // provide a method to return a list of all recurrences in a + // given time span. + Recurrence *recur = ev->recurrence(); + int duration = ev->dtStart().secsTo( ev->dtEnd() ); + QDateTime start = recur->getPreviousDateTime( + QDateTime( mStartDate, QTime() ) ); + QDateTime end = start.addSecs( duration ); + if ( end.date() >= mStartDate ) { + appendEvent( ev, start, end ); + } + start = recur->getNextDateTime( start ); + while ( start.isValid() && start.date() <= mEndDate ) { + appendEvent( ev, start ); + start = recur->getNextDateTime( start ); + } + } + } + mText += "</table>\n"; + } + + mTodos.clear(); + Todo::List todos = calendar()->todos( TodoSortDueDate, SortDirectionAscending ); + if ( todos.count() > 0 ) { + kil.loadIcon("todo",KIcon::NoGroup,22,KIcon::DefaultState,ipath); + mText += "<h2><img src=\""; + mText += *ipath; + mText += "\">"; + mText += i18n("To-do:") + "</h2>\n"; + mText += "<ul>\n"; + Todo::List::ConstIterator it; + for( it = todos.begin(); it != todos.end(); ++it ) { + Todo *todo = *it; + if ( !todo->isCompleted() && todo->hasDueDate() && todo->dtDue().date() <= mEndDate ) + appendTodo(todo); + } + bool gotone = false; + int priority = 1; + while (!gotone && priority<=9 ) { + for( it = todos.begin(); it != todos.end(); ++it ) { + Todo *todo = *it; + if (!todo->isCompleted() && (todo->priority() == priority) ) { + appendTodo(todo); + gotone = true; + } + } + priority++; + kdDebug(5850) << "adding the todos..." << endl; + } + mText += "</ul>\n"; + } + + QStringList myEmails( KOPrefs::instance()->allEmails() ); + int replies = 0; + events = calendar()->events( QDate::currentDate(), QDate(2975,12,6) ); + Event::List::ConstIterator it2; + for( it2 = events.begin(); it2 != events.end(); ++it2 ) { + Event *ev = *it2; + Attendee *me = ev->attendeeByMails( myEmails ); + if (me!=0) { + if (me->status()==Attendee::NeedsAction && me->RSVP()) { + if (replies == 0) { + mText += "<p></p>"; + kil.loadIcon("reply",KIcon::NoGroup,22,KIcon::DefaultState,ipath); + mText += "<h2><img src=\""; + mText += *ipath; + mText += "\">"; + mText += i18n("Events and to-dos that need a reply:") + "</h2>\n"; + mText += "<table>\n"; + } + replies++; + appendEvent( ev ); + } + } + } + todos = calendar()->todos(); + Todo::List::ConstIterator it3; + for( it3 = todos.begin(); it3 != todos.end(); ++it3 ) { + Todo *to = *it3; + Attendee *me = to->attendeeByMails( myEmails ); + if (me!=0) { + if (me->status()==Attendee::NeedsAction && me->RSVP()) { + if (replies == 0) { + mText += "<p></p>"; + kil.loadIcon("reply",KIcon::NoGroup,22,KIcon::DefaultState,ipath); + mText += "<h2><img src=\""; + mText += *ipath; + mText += "\">"; + mText += i18n("Events and to-dos that need a reply:") + "</h2>\n"; + mText += "<table>\n"; + } + replies++; + appendEvent(to); + } + } + kdDebug () << "check for todo-replies..." << endl; + } + if (replies > 0 ) mText += "</table>\n"; + + + mText += "</td></tr>\n</table>\n"; + + kdDebug(5850) << "KOWhatsNextView::updateView: text: " << mText << endl; + + delete ipath; + + mView->setText(mText); +} + +void KOWhatsNextView::showDates( const QDate &start, const QDate &end ) +{ + mStartDate = start; + mEndDate = end; + updateView(); +} + +void KOWhatsNextView::showIncidences( const Incidence::List & ) +{ +} + +void KOWhatsNextView::changeIncidenceDisplay(Incidence *, int action) +{ + switch(action) { + case KOGlobals::INCIDENCEADDED: + case KOGlobals::INCIDENCEEDITED: + case KOGlobals::INCIDENCEDELETED: + updateView(); + break; + default: + kdDebug(5850) << "KOWhatsNextView::changeIncidenceDisplay(): Illegal action " << action << endl; + } +} + +void KOWhatsNextView::appendEvent( Incidence *ev, const QDateTime &start, + const QDateTime &end ) +{ + kdDebug(5850) << "KOWhatsNextView::appendEvent(): " << ev->uid() << endl; + + mText += "<tr><td><b>"; +// if (!ev->doesFloat()) { + if (ev->type()=="Event") { + Event *event = static_cast<Event *>(ev); + QDateTime starttime( start ); + if ( !starttime.isValid() ) + starttime = event->dtStart(); + QDateTime endtime( end ); + if ( !endtime.isValid() ) + endtime = starttime.addSecs( + event->dtStart().secsTo( event->dtEnd() ) ); + + if ( starttime.date().daysTo( endtime.date() ) >= 1 ) { + mText += i18n("date from - to", "%1 - %2") + .arg( KGlobal::locale()->formatDateTime( starttime ) ) + .arg( KGlobal::locale()->formatDateTime( endtime ) ); + } else { + /*if (reply) */ + mText += i18n("date, from - to", "%1, %2 - %3") + .arg( KGlobal::locale()->formatDate( starttime.date(), true ) ) + .arg( KGlobal::locale()->formatTime( starttime.time() ) ) + .arg( KGlobal::locale()->formatTime( endtime.time() ) ); + } + } +// } + mText += "</b></td><td><a "; + if (ev->type()=="Event") mText += "href=\"event:"; + if (ev->type()=="Todo") mText += "href=\"todo:"; + mText += ev->uid() + "\">"; + mText += ev->summary(); + mText += "</a></td></tr>\n"; +} + +void KOWhatsNextView::appendTodo( Incidence *ev ) +{ + if ( mTodos.find( ev ) != mTodos.end() ) return; + + mTodos.append( ev ); + + mText += "<li><a href=\"todo:" + ev->uid() + "\">"; + mText += ev->summary(); + mText += "</a>"; + + if ( ev->type()=="Todo" ) { + Todo *todo = static_cast<Todo*>(ev); + if ( todo->hasDueDate() ) { + mText += i18n(" (Due: %1)") + .arg( (todo->doesFloat())?(todo->dtDueDateStr()):(todo->dtDueStr()) ); + } + } + mText += "</li>\n"; +} + +void KOWhatsNextView::showIncidence( const QString &uid ) +{ + kdDebug(5850) << "KOWhatsNextView::showIncidence(): " << uid << endl; + Incidence *incidence = 0; + + if ( uid.startsWith( "event://" ) ) { + incidence = calendar()->incidence( uid.mid( 8 ) ); + } else if ( uid.startsWith( "todo://" ) ) { + incidence = calendar()->incidence( uid.mid( 7 ) ); + } + if ( incidence ) emit showIncidenceSignal( incidence ); +} + +#include "kowhatsnextview.moc" |