00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include <tqlayout.h>
00026 #include <tqtextbrowser.h>
00027 #include <tqtextcodec.h>
00028 #include <tqfileinfo.h>
00029 #include <tqlabel.h>
00030
00031 #include <tdeglobal.h>
00032 #include <tdelocale.h>
00033 #include <kdebug.h>
00034 #include <kiconloader.h>
00035 #include <tdemessagebox.h>
00036
00037 #include <libkcal/calendar.h>
00038 #include <libkcal/incidenceformatter.h>
00039
00040 #include "koglobals.h"
00041 #include "koprefs.h"
00042 #include "koeventviewerdialog.h"
00043
00044 #include "kowhatsnextview.h"
00045
00046 using namespace KOrg;
00047
00048 void WhatsNextTextBrowser::setSource(const TQString& n)
00049 {
00050 kdDebug(5850) << "WhatsNextTextBrowser::setSource(): " << n << endl;
00051
00052 if (n.startsWith("event:")) {
00053 emit showIncidence(n);
00054 return;
00055 } else if (n.startsWith("todo:")) {
00056 emit showIncidence(n);
00057 return;
00058 } else {
00059 TQTextBrowser::setSource(n);
00060 }
00061 }
00062
00063 KOWhatsNextView::KOWhatsNextView(Calendar *calendar, TQWidget *parent,
00064 const char *name)
00065 : KOrg::BaseView(calendar, parent, name)
00066 {
00067
00068
00069
00070
00071
00072 mView = new WhatsNextTextBrowser(this);
00073 connect(mView,TQT_SIGNAL(showIncidence(const TQString &)),TQT_SLOT(showIncidence(const TQString &)));
00074
00075 TQBoxLayout *topLayout = new TQVBoxLayout(this);
00076
00077 topLayout->addWidget(mView);
00078 }
00079
00080 KOWhatsNextView::~KOWhatsNextView()
00081 {
00082 }
00083
00084 int KOWhatsNextView::currentDateCount()
00085 {
00086 return mStartDate.daysTo( mEndDate );
00087 }
00088
00089 void KOWhatsNextView::updateView()
00090 {
00091 TDEIconLoader kil("tdepim");
00092 TQString *ipath = new TQString();
00093 kil.loadIcon("tdepim",TDEIcon::NoGroup,32,TDEIcon::DefaultState,ipath);
00094
00095 mText = "<table width=\"100%\">\n";
00096 mText += "<tr bgcolor=\"#3679AD\"><td><h1>";
00097 mText += "<img src=\"";
00098 mText += *ipath;
00099 mText += "\">";
00100 mText += "<font color=\"white\"> ";
00101 mText += i18n("What's Next?") + "</font></h1>";
00102 mText += "</td></tr>\n<tr><td>";
00103
00104 mText += "<h2>";
00105 if ( mStartDate.daysTo( mEndDate ) < 1 ) {
00106 mText += TDEGlobal::locale()->formatDate( mStartDate );
00107 } else {
00108 mText += i18n("Date from - to", "%1 - %2")
00109 .arg( TDEGlobal::locale()->formatDate( mStartDate ) )
00110 .arg( TDEGlobal::locale()->formatDate( mEndDate ) );
00111 }
00112 mText+="</h2>\n";
00113
00114 Event::List events;
00115 for ( TQDate date = mStartDate; date <= mEndDate; date = date.addDays( 1 ) )
00116 events += calendar()->events(date, EventSortStartDate, SortDirectionAscending);
00117
00118 if (events.count() > 0) {
00119 mText += "<p></p>";
00120 kil.loadIcon("appointment",TDEIcon::NoGroup,22,TDEIcon::DefaultState,ipath);
00121 mText += "<h2><img src=\"";
00122 mText += *ipath;
00123 mText += "\">";
00124 mText += i18n("Events:") + "</h2>\n";
00125 mText += "<table>\n";
00126 Event::List::ConstIterator it;
00127 for( it = events.begin(); it != events.end(); ++it ) {
00128 Event *ev = *it;
00129 if ( !ev->doesRecur() ){
00130 appendEvent(ev);
00131 } else {
00132
00133
00134
00135 Recurrence *recur = ev->recurrence();
00136 int duration = ev->dtStart().secsTo( ev->dtEnd() );
00137 TQDateTime start = recur->getPreviousDateTime(
00138 TQDateTime( mStartDate, TQTime() ) );
00139 TQDateTime end = start.addSecs( duration );
00140 if ( end.date() >= mStartDate ) {
00141 appendEvent( ev, start, end );
00142 }
00143 start = recur->getNextDateTime( start );
00144 while ( start.isValid() && start.date() <= mEndDate ) {
00145 appendEvent( ev, start );
00146 start = recur->getNextDateTime( start );
00147 }
00148 }
00149 }
00150 mText += "</table>\n";
00151 }
00152
00153 mTodos.clear();
00154 Todo::List todos = calendar()->todos( TodoSortDueDate, SortDirectionAscending );
00155 if ( todos.count() > 0 ) {
00156 kil.loadIcon("todo",TDEIcon::NoGroup,22,TDEIcon::DefaultState,ipath);
00157 mText += "<h2><img src=\"";
00158 mText += *ipath;
00159 mText += "\">";
00160 mText += i18n("To-do:") + "</h2>\n";
00161 mText += "<ul>\n";
00162 Todo::List::ConstIterator it;
00163 for( it = todos.begin(); it != todos.end(); ++it ) {
00164 Todo *todo = *it;
00165 if ( !todo->isCompleted() && todo->hasDueDate() && todo->dtDue().date() <= mEndDate )
00166 appendTodo(todo);
00167 }
00168 bool gotone = false;
00169 int priority = 1;
00170 while (!gotone && priority<=9 ) {
00171 for( it = todos.begin(); it != todos.end(); ++it ) {
00172 Todo *todo = *it;
00173 if (!todo->isCompleted() && (todo->priority() == priority) ) {
00174 appendTodo(todo);
00175 gotone = true;
00176 }
00177 }
00178 priority++;
00179 kdDebug(5850) << "adding the todos..." << endl;
00180 }
00181 mText += "</ul>\n";
00182 }
00183
00184 TQStringList myEmails( KOPrefs::instance()->allEmails() );
00185 int replies = 0;
00186 events = calendar()->events( TQDate::currentDate(), TQDate(2975,12,6) );
00187 Event::List::ConstIterator it2;
00188 for( it2 = events.begin(); it2 != events.end(); ++it2 ) {
00189 Event *ev = *it2;
00190 Attendee *me = ev->attendeeByMails( myEmails );
00191 if (me!=0) {
00192 if (me->status()==Attendee::NeedsAction && me->RSVP()) {
00193 if (replies == 0) {
00194 mText += "<p></p>";
00195 kil.loadIcon("reply",TDEIcon::NoGroup,22,TDEIcon::DefaultState,ipath);
00196 mText += "<h2><img src=\"";
00197 mText += *ipath;
00198 mText += "\">";
00199 mText += i18n("Events and to-dos that need a reply:") + "</h2>\n";
00200 mText += "<table>\n";
00201 }
00202 replies++;
00203 appendEvent( ev );
00204 }
00205 }
00206 }
00207 todos = calendar()->todos();
00208 Todo::List::ConstIterator it3;
00209 for( it3 = todos.begin(); it3 != todos.end(); ++it3 ) {
00210 Todo *to = *it3;
00211 Attendee *me = to->attendeeByMails( myEmails );
00212 if (me!=0) {
00213 if (me->status()==Attendee::NeedsAction && me->RSVP()) {
00214 if (replies == 0) {
00215 mText += "<p></p>";
00216 kil.loadIcon("reply",TDEIcon::NoGroup,22,TDEIcon::DefaultState,ipath);
00217 mText += "<h2><img src=\"";
00218 mText += *ipath;
00219 mText += "\">";
00220 mText += i18n("Events and to-dos that need a reply:") + "</h2>\n";
00221 mText += "<table>\n";
00222 }
00223 replies++;
00224 appendEvent(to);
00225 }
00226 }
00227 kdDebug () << "check for todo-replies..." << endl;
00228 }
00229 if (replies > 0 ) mText += "</table>\n";
00230
00231
00232 mText += "</td></tr>\n</table>\n";
00233
00234 kdDebug(5850) << "KOWhatsNextView::updateView: text: " << mText << endl;
00235
00236 delete ipath;
00237
00238 mView->setText(mText);
00239 }
00240
00241 void KOWhatsNextView::showDates( const TQDate &start, const TQDate &end )
00242 {
00243 mStartDate = start;
00244 mEndDate = end;
00245 updateView();
00246 }
00247
00248 void KOWhatsNextView::showIncidences( const Incidence::List &, const TQDate & )
00249 {
00250 }
00251
00252 void KOWhatsNextView::changeIncidenceDisplay(Incidence *, int action)
00253 {
00254 switch(action) {
00255 case KOGlobals::INCIDENCEADDED:
00256 case KOGlobals::INCIDENCEEDITED:
00257 case KOGlobals::INCIDENCEDELETED:
00258 updateView();
00259 break;
00260 default:
00261 kdDebug(5850) << "KOWhatsNextView::changeIncidenceDisplay(): Illegal action " << action << endl;
00262 }
00263 }
00264
00265 void KOWhatsNextView::appendEvent( Incidence *ev, const TQDateTime &start,
00266 const TQDateTime &end )
00267 {
00268 kdDebug(5850) << "KOWhatsNextView::appendEvent(): " << ev->uid() << endl;
00269
00270 mText += "<tr><td><b>";
00271
00272 if (ev->type()=="Event") {
00273 Event *event = static_cast<Event *>(ev);
00274 TQDateTime starttime( start );
00275 if ( !starttime.isValid() )
00276 starttime = event->dtStart();
00277 TQDateTime endtime( end );
00278 if ( !endtime.isValid() )
00279 endtime = starttime.addSecs(
00280 event->dtStart().secsTo( event->dtEnd() ) );
00281
00282 if ( starttime.date().daysTo( endtime.date() ) >= 1 ) {
00283 mText += i18n("date from - to", "%1 - %2")
00284 .arg( TDEGlobal::locale()->formatDateTime( starttime ) )
00285 .arg( TDEGlobal::locale()->formatDateTime( endtime ) );
00286 } else {
00287
00288 mText += i18n("date, from - to", "%1, %2 - %3")
00289 .arg( TDEGlobal::locale()->formatDate( starttime.date(), true ) )
00290 .arg( TDEGlobal::locale()->formatTime( starttime.time() ) )
00291 .arg( TDEGlobal::locale()->formatTime( endtime.time() ) );
00292 }
00293 }
00294
00295 mText += "</b></td><td><a ";
00296 if (ev->type()=="Event") mText += "href=\"event:";
00297 if (ev->type()=="Todo") mText += "href=\"todo:";
00298 mText += ev->uid() + "\">";
00299 mText += ev->summary();
00300 mText += "</a></td></tr>\n";
00301 }
00302
00303 void KOWhatsNextView::appendTodo( Incidence *ev )
00304 {
00305 if ( mTodos.find( ev ) != mTodos.end() ) return;
00306
00307 mTodos.append( ev );
00308
00309 mText += "<li><a href=\"todo:" + ev->uid() + "\">";
00310 mText += ev->summary();
00311 mText += "</a>";
00312
00313 if ( ev->type()=="Todo" ) {
00314 Todo *todo = static_cast<Todo*>(ev);
00315 if ( todo->hasDueDate() ) {
00316 mText += i18n( " (Due: %1)" ).
00317 arg( IncidenceFormatter::dateTimeToString( todo->dtDue(), todo->doesFloat() ) );
00318 }
00319 }
00320 mText += "</li>\n";
00321 }
00322
00323 void KOWhatsNextView::showIncidence( const TQString &uid )
00324 {
00325 kdDebug(5850) << "KOWhatsNextView::showIncidence(): " << uid << endl;
00326 Incidence *incidence = 0;
00327
00328 if ( uid.startsWith( "event://" ) ) {
00329 incidence = calendar()->incidence( uid.mid( 8 ) );
00330 } else if ( uid.startsWith( "todo://" ) ) {
00331 incidence = calendar()->incidence( uid.mid( 7 ) );
00332 }
00333 if ( incidence ) {
00334 emit showIncidenceSignal( incidence, TQDate() );
00335 }
00336 }
00337
00338 #include "kowhatsnextview.moc"