void KOTodoView::changeIncidenceDisplay(Incidence *incidence, int action) { // The todo view only displays todos, so exit on all other incidences if ( incidence->type() != "Todo" ) return; CalFilter *filter = calendar()->filter(); bool isFiltered = filter && !filter->filterIncidence( incidence ); Todo *todo = static_cast<Todo *>(incidence); if ( todo ) { KOTodoViewItem *todoItem = 0; if ( mTodoMap.contains( todo ) ) { todoItem = mTodoMap[todo]; } switch ( action ) { case KOGlobals::INCIDENCEADDED: case KOGlobals::INCIDENCEEDITED: // If it's already there, edit it, otherwise just add if ( todoItem ) { if ( isFiltered ) { scheduleRemoveTodoItem( todoItem ); } else { // correctly update changes in relations Todo*parent = dynamic_cast<Todo*>( todo->relatedTo() ); KOTodoViewItem*parentItem = 0; if ( parent && mTodoMap.contains(parent) ) { parentItem = mTodoMap[ parent ]; } if ( todoItem->parent() != parentItem ) { // The relations changed if ( parentItem ) { parentItem->insertItem( todoItem ); } else { mTodoListView->insertItem( todoItem ); } } todoItem->construct(); } } else { if ( !isFiltered ) { insertTodoItem( todo ); } } mTodoListView->sort(); break; case KOGlobals::INCIDENCEDELETED: if ( todoItem ) { scheduleRemoveTodoItem( todoItem ); } break; default: QTimer::singleShot( 0, this, SLOT( updateView() ) ); } } else { // use a QTimer here, because when marking todos finished using // the checkbox, this slot gets called, but we cannot update the views // because we're still inside KOTodoViewItem::stateChange QTimer::singleShot(0,this,SLOT(updateView())); } }
Incidence * pasteIncidence( Incidence *inc, const QDate &newDate, const QTime *newTime = 0 ) { if ( inc ) { inc = inc->clone(); inc->recreate(); } if ( inc && newDate.isValid() ) { if ( inc->type() == "Event" ) { Event *anEvent = static_cast<Event*>( inc ); // Calculate length of event int daysOffset = anEvent->dtStart().date().daysTo( anEvent->dtEnd().date() ); // new end date if event starts at the same time on the new day KDateTime endDate( anEvent->dtEnd() ); endDate.setDate( newDate.addDays( daysOffset ) ); KDateTime startDate( anEvent->dtStart() ); startDate.setDate( newDate ); if ( newTime ) { // additional offset for new time of day int addSecsOffset( anEvent->dtStart().time().secsTo( *newTime ) ); endDate=endDate.addSecs( addSecsOffset ); startDate.setTime( *newTime ); } anEvent->setDtStart( startDate ); anEvent->setDtEnd( endDate ); } else if ( inc->type() == "Todo" ) { Todo *anTodo = static_cast<Todo*>( inc ); KDateTime dueDate( anTodo->dtDue() ); dueDate.setDate( newDate ); if ( newTime ) { dueDate.setTime( *newTime ); } anTodo->setDtDue( dueDate ); } else if ( inc->type() == "Journal" ) { Journal *anJournal = static_cast<Journal*>( inc ); KDateTime startDate( anJournal->dtStart() ); startDate.setDate( newDate ); if ( newTime ) { startDate.setTime( *newTime ); } else { startDate.setTime( QTime( 0, 0, 0 ) ); } anJournal->setDtStart( startDate ); } else { kDebug() << "Trying to paste unknown incidence of type" << inc->type(); } } return inc; }
void KOTodoView::setNewDate( QDate date ) { if ( !mActiveItem || !mChanger ) return; Todo *todo = mActiveItem->todo(); if ( !todo ) return; if ( !todo->isReadOnly() && mChanger->beginChange( todo ) ) { Todo *oldTodo = todo->clone(); QDateTime dt; dt.setDate( date ); if ( !todo->doesFloat() ) dt.setTime( todo->dtDue().time() ); if ( date.isNull() ) todo->setHasDueDate( false ); else if ( !todo->hasDueDate() ) todo->setHasDueDate( true ); todo->setDtDue( dt ); mActiveItem->construct(); mChanger->changeIncidence( oldTodo, todo, KOGlobals::COMPLETION_MODIFIED ); mChanger->endChange( todo ); delete oldTodo; } else { kdDebug(5850) << "No active item, active item is read-only, or locking failed" << endl; } }
void KOTodoView::setNewPriority(int index) { if ( !mActiveItem || !mChanger ) return; Todo *todo = mActiveItem->todo(); if ( !todo->isReadOnly () && mChanger->beginChange( todo ) ) { Todo *oldTodo = todo->clone(); todo->setPriority(mPriority[index]); mActiveItem->construct(); mChanger->changeIncidence( oldTodo, todo, KOGlobals::PRIORITY_MODIFIED ); mChanger->endChange( todo ); delete oldTodo; } }
void KOTodoView::addQuickTodo() { if ( ! mQuickAdd->text().stripWhiteSpace().isEmpty() ) { Todo *todo = new Todo(); todo->setSummary( mQuickAdd->text() ); todo->setOrganizer( Person( KOPrefs::instance()->fullName(), KOPrefs::instance()->email() ) ); if ( !mChanger->addIncidence( todo, this ) ) { KODialogManager::errorSaveIncidence( this, todo ); delete todo; return; } mQuickAdd->setText( QString::null ); } }
void TodoTest::testValidity() { QDate dt = QDate::currentDate(); Todo *todo = new Todo(); todo->setDtStart(KDateTime(dt)); todo->setDtDue(KDateTime(dt).addDays(1)); todo->setSummary(QStringLiteral("To-do1 Summary")); todo->setDescription(QStringLiteral("This is a description of the first to-do")); todo->setLocation(QStringLiteral("the place")); todo->setPercentComplete(5); //KDE5: QVERIFY( todo->typeStr() == i18n( "to-do" ) ); QVERIFY(todo->summary() == QLatin1String("To-do1 Summary")); QVERIFY(todo->location() == QLatin1String("the place")); QVERIFY(todo->percentComplete() == 5); }
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 TodoTest::testRoles() { const KDateTime today = KDateTime::currentUtcDateTime(); const KDateTime yesterday = today.addDays(-1); Todo todo; todo.setDtStart(today.addDays(-1)); todo.setDtDue(today); QCOMPARE(todo.dateTime(Incidence::RoleDisplayStart), today); QCOMPARE(todo.dateTime(Incidence::RoleDisplayEnd), today); todo.setDtDue(KDateTime()); QCOMPARE(todo.dateTime(Incidence::RoleDisplayStart), yesterday); QCOMPARE(todo.dateTime(Incidence::RoleDisplayEnd), yesterday); }
void ComparisonVisitorTest::testTodoComparison() { const QString summary = QLatin1String( "Testing comparison" ); const QString desc = QLatin1String( "Testing ComparisonVisitor" ); Todo reference; reference.setSummary( summary ); reference.setDescription( desc ); reference.setPercentComplete( 50 ); // create a copy of the reference incidence Todo todo( reference ); IncidenceBase *baseReference = &reference; IncidenceBase *baseIncidence = &todo; QVERIFY( mComparator.compare( baseIncidence, baseReference ) ); // change a property of Todo (but not of IncidenceBase) todo.setPercentComplete( 100 ); QVERIFY( !mComparator.compare( baseIncidence, baseReference ) ); }
void KOTodoView::changedCategories(int index) { if ( !mActiveItem || !mChanger ) return; Todo *todo = mActiveItem->todo(); if ( !todo ) return; if ( !todo->isReadOnly() && mChanger->beginChange( todo ) ) { Todo *oldTodo = todo->clone(); QStringList categories = todo->categories (); if ( categories.find( mCategory[index] ) != categories.end() ) categories.remove( mCategory[index] ); else categories.insert( categories.end(), mCategory[index] ); categories.sort(); todo->setCategories( categories ); mActiveItem->construct(); mChanger->changeIncidence( oldTodo, todo, KOGlobals::CATEGORY_MODIFIED ); mChanger->endChange( todo ); delete oldTodo; } else { kdDebug(5850) << "No active item, active item is read-only, or locking failed" << endl; } }
void KOTodoView::setNewPercentage( KOTodoViewItem *item, int percentage ) { kdDebug(5850) << "KOTodoView::setNewPercentage( " << percentage << "), item = " << item << endl; if ( !item || !mChanger ) return; Todo *todo = item->todo(); if ( !todo ) return; if ( !todo->isReadOnly () && mChanger->beginChange( todo ) ) { Todo *oldTodo = todo->clone(); /* Old code to make sub-items's percentage related to this one's: QListViewItem *myChild = firstChild(); KOTodoViewItem *item; while( myChild ) { item = static_cast<KOTodoViewItem*>(myChild); item->stateChange(state); myChild = myChild->nextSibling(); }*/ if ( percentage == 100 ) { todo->setCompleted( QDateTime::currentDateTime() ); // If the todo does recur, it doesn't get set as completed. However, the // item is still checked. Uncheck it again. if ( !todo->isCompleted() ) item->setState( QCheckListItem::Off ); else todo->setPercentComplete( percentage ); } else { todo->setCompleted( false ); todo->setPercentComplete( percentage ); } item->construct(); if ( todo->doesRecur() && percentage == 100 ) mChanger->changeIncidence( oldTodo, todo, KOGlobals::COMPLETION_MODIFIED_WITH_RECURRENCE ); else mChanger->changeIncidence( oldTodo, todo, KOGlobals::COMPLETION_MODIFIED ); mChanger->endChange( todo ); delete oldTodo; } else { item->construct(); kdDebug(5850) << "No active item, active item is read-only, or locking failed" << endl; } }
bool Todo::operator==( const Todo &todo ) const { return Incidence::operator==( todo ) && dtDue() == todo.dtDue() && hasDueDate() == todo.hasDueDate() && hasStartDate() == todo.hasStartDate() && completed() == todo.completed() && hasCompletedDate() == todo.hasCompletedDate() && percentComplete() == todo.percentComplete(); }
void KOTodoView::copyTodoToDate( QDate date ) { QDateTime dt( date ); if ( mActiveItem && mChanger ) { Todo *newTodo = mActiveItem->todo()->clone(); newTodo->recreate(); newTodo->setHasDueDate( !date.isNull() ); newTodo->setDtDue( dt ); newTodo->setPercentComplete( 0 ); // avoid forking if ( newTodo->doesRecur() ) newTodo->recurrence()->unsetRecurs(); mChanger->addIncidence( newTodo, this ); } }
/** Dissociate a single occurrence or all future occurrences from a recurring sequence. The new incidence is returned, but not automatically inserted into the calendar, which is left to the calling application */ Incidence *Calendar::dissociateOccurrence(Incidence *incidence, QDate date, bool single) { if(!incidence || !incidence->doesRecur()) return 0; Incidence *newInc = incidence->clone(); newInc->recreate(); newInc->setRelatedTo(incidence); Recurrence *recur = newInc->recurrence(); if(single) { recur->clear(); } else { // Adjust the recurrence for the future incidences. In particular // adjust the "end after n occurrences" rules! "No end date" and "end by ..." // don't need to be modified. int duration = recur->duration(); if(duration > 0) { int doneduration = recur->durationTo(date.addDays(-1)); if(doneduration >= duration) { kdDebug(5850) << "The dissociated event already occurred more often " << "than it was supposed to ever occur. ERROR!" << endl; recur->clear(); } else { recur->setDuration(duration - doneduration); } } } // Adjust the date of the incidence if(incidence->type() == "Event") { Event *ev = static_cast<Event *>(newInc); QDateTime start(ev->dtStart()); int daysTo = start.date().daysTo(date); ev->setDtStart(start.addDays(daysTo)); ev->setDtEnd(ev->dtEnd().addDays(daysTo)); } else if(incidence->type() == "Todo") { Todo *td = static_cast<Todo *>(newInc); bool haveOffset = false; int daysTo = 0; if(td->hasDueDate()) { QDateTime due(td->dtDue()); daysTo = due.date().daysTo(date); td->setDtDue(due.addDays(daysTo), true); haveOffset = true; } if(td->hasStartDate()) { QDateTime start(td->dtStart()); if(!haveOffset) daysTo = start.date().daysTo(date); td->setDtStart(start.addDays(daysTo)); haveOffset = true; } } recur = incidence->recurrence(); if(recur) { if(single) { recur->addExDate(date); } else { // Make sure the recurrence of the past events ends // at the corresponding day recur->setEndDate(date.addDays(-1)); } } return newInc; }
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); }
bool Scheduler::acceptReply(IncidenceBase *incidence,ScheduleMessage::Status /* status */, Method method) { if(incidence->type()=="FreeBusy") { return acceptFreeBusy(incidence, method); } bool ret = false; Event *ev = mCalendar->event(incidence->uid()); Todo *to = mCalendar->todo(incidence->uid()); // try harder to find the correct incidence if ( !ev && !to ) { const Incidence::List list = mCalendar->incidences(); for ( Incidence::List::ConstIterator it = list.begin(), end = list.end(); it != end; ++it ) { if ( (*it)->schedulingID() == incidence->uid() ) { ev = dynamic_cast<Event*>( *it ); to = dynamic_cast<Todo*>( *it ); break; } } } if (ev || to) { //get matching attendee in calendar kdDebug(5800) << "Scheduler::acceptTransaction match found!" << endl; Attendee::List attendeesIn = incidence->attendees(); Attendee::List attendeesEv; Attendee::List attendeesNew; if (ev) attendeesEv = ev->attendees(); if (to) attendeesEv = to->attendees(); Attendee::List::ConstIterator inIt; Attendee::List::ConstIterator evIt; for ( inIt = attendeesIn.begin(); inIt != attendeesIn.end(); ++inIt ) { Attendee *attIn = *inIt; bool found = false; for ( evIt = attendeesEv.begin(); evIt != attendeesEv.end(); ++evIt ) { Attendee *attEv = *evIt; if (attIn->email().lower()==attEv->email().lower()) { //update attendee-info kdDebug(5800) << "Scheduler::acceptTransaction update attendee" << endl; attEv->setStatus(attIn->status()); attEv->setDelegate(attIn->delegate()); attEv->setDelegator(attIn->delegator()); ret = true; found = true; } } if ( !found && attIn->status() != Attendee::Declined ) attendeesNew.append( attIn ); } bool attendeeAdded = false; for ( Attendee::List::ConstIterator it = attendeesNew.constBegin(); it != attendeesNew.constEnd(); ++it ) { Attendee* attNew = *it; QString msg = i18n("%1 wants to attend %2 but was not invited.").arg( attNew->fullName() ) .arg( ev ? ev->summary() : to->summary() ); if ( !attNew->delegator().isEmpty() ) msg = i18n("%1 wants to attend %2 on behalf of %3.").arg( attNew->fullName() ) .arg( ev ? ev->summary() : to->summary() ) .arg( attNew->delegator() ); if ( KMessageBox::questionYesNo( 0, msg, i18n("Uninvited attendee"), KGuiItem(i18n("Accept Attendance")), KGuiItem(i18n("Reject Attendance")) ) != KMessageBox::Yes ) { KCal::Incidence *cancel = dynamic_cast<Incidence*>( incidence ); if ( cancel ) cancel->addComment( i18n( "The organizer rejected your attendance at this meeting." ) ); performTransaction( cancel ? cancel : incidence, Scheduler::Cancel, attNew->fullName() ); delete cancel; continue; } Attendee *a = new Attendee( attNew->name(), attNew->email(), attNew->RSVP(), attNew->status(), attNew->role(), attNew->uid() ); a->setDelegate( attNew->delegate() ); a->setDelegator( attNew->delegator() ); if ( ev ) ev->addAttendee( a ); else if ( to ) to->addAttendee( a ); ret = true; attendeeAdded = true; } // send update about new participants if ( attendeeAdded ) { if ( ev ) { ev->setRevision( ev->revision() + 1 ); performTransaction( ev, Scheduler::Request ); } if ( to ) { to->setRevision( ev->revision() + 1 ); performTransaction( to, Scheduler::Request ); } } if ( ret ) { // We set at least one of the attendees, so the incidence changed // Note: This should not result in a sequence number bump if ( ev ) ev->updated(); else if ( to ) to->updated(); } if ( to ) { // for VTODO a REPLY can be used to update the completion status of // a task. see RFC2446 3.4.3 Todo *update = dynamic_cast<Todo*> ( incidence ); Q_ASSERT( update ); if ( update && ( to->percentComplete() != update->percentComplete() ) ) { to->setPercentComplete( update->percentComplete() ); to->updated(); } } } else kdError(5800) << "No incidence for scheduling\n"; if (ret) deleteTransaction(incidence); return ret; }
void KCalResourceSlox::slotLoadTodosResult( KJob *job ) { kDebug(); if ( job->error() ) { loadError( job->errorString() ); } else { kDebug() << "success"; QDomDocument doc = mLoadTodosJob->response(); mWebdavHandler.log( doc.toString( 2 ) ); QList<SloxItem> items = WebdavHandler::getSloxItems( this, doc ); bool changed = false; disableChangeNotification(); QList<SloxItem>::ConstIterator it; for( it = items.constBegin(); it != items.constEnd(); ++it ) { SloxItem item = *it; QString uid = sloxIdToTodoUid( item.sloxId ); if ( item.status == SloxItem::Delete ) { Todo *todo = calendar()->todo( uid ); if ( todo ) { calendar()->deleteTodo( todo ); changed = true; } } else if ( item.status == SloxItem::Create ) { Todo *newTodo = 0; Todo *todo = calendar()->todo( uid ); if ( !todo ) { newTodo = new Todo; todo = newTodo; todo->setUid( uid ); todo->setSecrecy( Incidence::SecrecyPrivate ); } todo->setCustomProperty( "SLOX", "ID", item.sloxId ); mWebdavHandler.clearSloxAttributeStatus(); QDomNode n; for( n = item.domNode.firstChild(); !n.isNull(); n = n.nextSibling() ) { QDomElement e = n.toElement(); mWebdavHandler.parseSloxAttribute( e ); parseIncidenceAttribute( e, todo ); parseTodoAttribute( e, todo ); } mWebdavHandler.setSloxAttributes( todo ); if ( newTodo ) calendar()->addTodo( todo ); changed = true; } } enableChangeNotification(); clearChanges(); if ( changed ) emit resourceChanged( this ); emit resourceLoaded( this ); } mLoadTodosJob = 0; if ( mLoadTodosProgress ) mLoadTodosProgress->setComplete(); mLoadTodosProgress = 0; }
void SearchDialog::search(const QRegExp &re) { QDate startDt = mStartDate->date(); QDate endDt = mEndDate->date(); Event::List events; if(mEventsCheck->isChecked()) { events = mCalendar->events(startDt, endDt, mInclusiveCheck->isChecked()); } Todo::List todos; if(mTodosCheck->isChecked()) { if(mIncludeUndatedTodos->isChecked()) { Todo::List alltodos = mCalendar->todos(); Todo::List::iterator it; Todo *todo; for(it = alltodos.begin(); it != alltodos.end(); ++it) { todo = *it; if((!todo->hasStartDate() && !todo->hasDueDate()) || // undated (todo->hasStartDate() && (todo->dtStart() >= startDt) && (todo->dtStart() <= endDt)) || // start dt in range (todo->hasDueDate() && (todo->dtDue().date() >= startDt) && (todo->dtDue() <= endDt)) || // due dt in range (todo->hasCompletedDate() && (todo->completed().date() >= startDt) && (todo->completed() <= endDt))) // completed dt in range { todos.append(todo); } } } else { QDate dt = startDt; while(dt <= endDt) { todos += mCalendar->todos(dt); dt = dt.addDays(1); } } } Journal::List journals; if(mJournalsCheck->isChecked()) { QDate dt = startDt; while(dt <= endDt) { journals += mCalendar->journals(dt); dt = dt.addDays(1); } } Incidence::List allIncidences = Calendar::mergeIncidenceList(events, todos, journals); mMatchedEvents.clear(); Incidence::List::ConstIterator it; for(it = allIncidences.begin(); it != allIncidences.end(); ++it) { Incidence *ev = *it; if(mSummaryCheck->isChecked()) { #if QT_VERSION >= 300 if(re.search(ev->summary()) != -1) { #else if(re.match(ev->summary()) != -1) { #endif mMatchedEvents.append(ev); continue; } } if(mDescriptionCheck->isChecked()) { #if QT_VERSION >= 300 if(re.search(ev->description()) != -1) { #else if(re.match(ev->description()) != -1) { #endif mMatchedEvents.append(ev); continue; } } if(mCategoryCheck->isChecked()) { #if QT_VERSION >= 300 if(re.search(ev->categoriesStr()) != -1) { #else if(re.match(ev->categoriesStr()) != -1) { #endif mMatchedEvents.append(ev); continue; } } } }
void HtmlExport::createTodoList ( QTextStream *ts ) { Todo::List rawTodoList = mCalendar->todos(); Todo::List::Iterator it = rawTodoList.begin(); while ( it != rawTodoList.end() ) { Todo *ev = *it; Todo *subev = ev; if ( ev->relatedTo() ) { if ( ev->relatedTo()->type()=="Todo" ) { if ( rawTodoList.find( static_cast<Todo *>( ev->relatedTo() ) ) == rawTodoList.end() ) { rawTodoList.append( static_cast<Todo *>( ev->relatedTo() ) ); } } } it = rawTodoList.find( subev ); ++it; } // FIXME: Sort list by priorities. This is brute force and should be // replaced by a real sorting algorithm. Todo::List todoList; for ( int i = 1; i <= 9; ++i ) { for( it = rawTodoList.begin(); it != rawTodoList.end(); ++it ) { if ( (*it)->priority() == i && checkSecrecy( *it ) ) { todoList.append( *it ); } } } for( it = rawTodoList.begin(); it != rawTodoList.end(); ++it ) { if ( (*it)->priority() == 0 && checkSecrecy( *it ) ) { todoList.append( *it ); } } int columns = 3; *ts << "<table border=\"0\" cellpadding=\"3\" cellspacing=\"3\">\n"; *ts << " <tr>\n"; *ts << " <th class=\"sum\">" << i18n("Task") << "</th>\n"; *ts << " <th>" << i18n("Priority") << "</th>\n"; *ts << " <th>" << i18n("Completed") << "</th>\n"; if ( mSettings->taskDueDate() ) { *ts << " <th>" << i18n("Due Date") << "</th>\n"; ++columns; } if ( mSettings->taskLocation() ) { *ts << " <th>" << i18n("Location") << "</th>\n"; ++columns; } if ( mSettings->taskCategories() ) { *ts << " <th>" << i18n("Categories") << "</th>\n"; ++columns; } if ( mSettings->taskAttendees() ) { *ts << " <th>" << i18n("Attendees") << "</th>\n"; ++columns; } *ts << " </tr>\n"; // Create top-level list. for( it = todoList.begin(); it != todoList.end(); ++it ) { if ( !(*it)->relatedTo() ) createTodo( ts, *it ); } // Create sub-level lists for( it = todoList.begin(); it != todoList.end(); ++it ) { Incidence::List relations = (*it)->relations(); if (relations.count()) { // Generate sub-task list of event ev *ts << " <tr>\n"; *ts << " <td class=\"subhead\" colspan="; *ts << "\"" << QString::number(columns) << "\""; *ts << "><a name=\"sub" << (*it)->uid() << "\"></a>" << i18n("Sub-Tasks of: ") << "<a href=\"#" << (*it)->uid() << "\"><b>" << cleanChars( (*it)->summary()) << "</b></a></td>\n"; *ts << " </tr>\n"; Todo::List sortedList; // FIXME: Sort list by priorities. This is brute force and should be // replaced by a real sorting algorithm. for ( int i = 1; i <= 9; ++i ) { Incidence::List::ConstIterator it2; for( it2 = relations.begin(); it2 != relations.end(); ++it2 ) { Todo *ev3 = dynamic_cast<Todo *>( *it2 ); if ( ev3 && ev3->priority() == i ) sortedList.append( ev3 ); } } Incidence::List::ConstIterator it2; for( it2 = relations.begin(); it2 != relations.end(); ++it2 ) { Todo *ev3 = dynamic_cast<Todo *>( *it2 ); if ( ev3 && ev3->priority() == 0 ) sortedList.append( ev3 ); } Todo::List::ConstIterator it3; for( it3 = sortedList.begin(); it3 != sortedList.end(); ++it3 ) { createTodo( ts, *it3 ); } } } *ts << "</table>\n"; }
void KOTodoListView::contentsDropEvent( QDropEvent *e ) { #ifndef KORG_NODND kdDebug(5850) << "KOTodoListView::contentsDropEvent" << endl; if ( !mCalendar || !mChanger || ( !ICalDrag::canDecode( e ) && !VCalDrag::canDecode( e ) && !QTextDrag::canDecode( e ) ) ) { e->ignore(); return; } DndFactory factory( mCalendar ); Todo *todo = factory.createDropTodo(e); if ( todo ) { e->acceptAction(); KOTodoViewItem *destination = (KOTodoViewItem *)itemAt(contentsToViewport(e->pos())); Todo *destinationEvent = 0; if (destination) destinationEvent = destination->todo(); Todo *existingTodo = mCalendar->todo(todo->uid()); if( existingTodo ) { kdDebug(5850) << "Drop existing Todo " << existingTodo << " onto " << destinationEvent << endl; Incidence *to = destinationEvent; while(to) { if (to->uid() == todo->uid()) { KMessageBox::information(this, i18n("Cannot move to-do to itself or a child of itself."), i18n("Drop To-do"), "NoDropTodoOntoItself" ); delete todo; return; } to = to->relatedTo(); } Todo*oldTodo = existingTodo->clone(); if ( mChanger->beginChange( existingTodo ) ) { existingTodo->setRelatedTo( destinationEvent ); mChanger->changeIncidence( oldTodo, existingTodo, KOGlobals::RELATION_MODIFIED ); mChanger->endChange( existingTodo ); } else { KMessageBox::sorry( this, i18n("Unable to change to-do's parent, " "because the to-do cannot be locked.") ); } delete oldTodo; delete todo; } else { // kdDebug(5850) << "Drop new Todo" << endl; todo->setRelatedTo(destinationEvent); if ( !mChanger->addIncidence( todo, this ) ) { KODialogManager::errorSaveIncidence( this, todo ); delete todo; return; } } } else { QString text; KOTodoViewItem *todoi = dynamic_cast<KOTodoViewItem *>(itemAt( contentsToViewport(e->pos()) )); if ( ! todoi ) { // Not dropped on a todo item: e->ignore(); kdDebug( 5850 ) << "KOTodoListView::contentsDropEvent(): Not dropped on a todo item" << endl; kdDebug( 5850 ) << "TODO: Create a new todo with the given data" << endl; // FIXME: Create a new todo with the given text/contact/whatever } else if ( QTextDrag::decode(e, text) ) { //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) ); kdDebug(5850) << "Dropped : " << text << endl; Todo*todo = todoi->todo(); if( mChanger->beginChange( todo ) ) { Todo*oldtodo = todo->clone(); if( text.startsWith( "file:" ) ) { todo->addAttachment( new Attachment( text ) ); } else { QStringList emails = KPIM::splitEmailAddrList( text ); for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) { kdDebug(5850) << " Email: " << (*it) << endl; int pos = (*it).find("<"); QString name = (*it).left(pos); QString email = (*it).mid(pos); if (!email.isEmpty() && todoi) { todo->addAttendee( new Attendee( name, email ) ); } } } mChanger->changeIncidence( oldtodo, todo ); mChanger->endChange( todo ); } else { KMessageBox::sorry( this, i18n("Unable to add attendees to the to-do, " "because the to-do cannot be locked.") ); } } else { kdDebug(5850) << "KOTodoListView::contentsDropEvent(): Todo from drop not decodable" << endl; e->ignore(); } } #endif }