You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
233 lines
9.6 KiB
233 lines
9.6 KiB
/* |
|
Copyright (c) 2010 Frederik Gladhorn <gladhorn@kde.org> |
|
|
|
This library is free software; you can redistribute it and/or modify it |
|
under the terms of the GNU Library General Public License as published by |
|
the Free Software Foundation; either version 2 of the License, or (at your |
|
option) any later version. |
|
|
|
This library 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 Library General Public |
|
License for more details. |
|
|
|
You should have received a copy of the GNU Library General Public License |
|
along with this library; see the file COPYING.LIB. If not, write to the |
|
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA |
|
02110-1301, USA. |
|
*/ |
|
|
|
#include "eventdatacontainer.h" |
|
|
|
#include <KSystemTimeZones> |
|
|
|
#include <KCalCore/Event> |
|
#include <KCalCore/Todo> |
|
#include <KCalCore/Journal> |
|
#include <KCalUtils/Stringify> |
|
|
|
using namespace Akonadi; |
|
|
|
EventDataContainer::EventDataContainer(const Akonadi::ETMCalendar::Ptr &calendar, const QString& name, const KDateTime& start, const KDateTime& end, QObject* parent) |
|
: Plasma::DataContainer(parent), |
|
m_calendar(calendar), |
|
m_name(name), |
|
m_startDate(start), |
|
m_endDate(end) |
|
{ |
|
// name under which this dataEngine source appears |
|
setObjectName(name); |
|
|
|
// Connect directly to the calendar for now |
|
connect(calendar.data(), SIGNAL(calendarChanged()), this, SLOT(updateData())); |
|
|
|
// create the initial data |
|
updateData(); |
|
} |
|
|
|
void EventDataContainer::updateData() |
|
{ |
|
removeAllData(); |
|
updateEventData(); |
|
updateTodoData(); |
|
updateJournalData(); |
|
checkForUpdate(); |
|
} |
|
|
|
void EventDataContainer::updateEventData() |
|
{ |
|
KCalCore::Event::List events = m_calendar->events(m_startDate.date(), m_endDate.date(), m_calendar->timeSpec()); |
|
|
|
foreach (const KCalCore::Event::Ptr &event, events) { |
|
Plasma::DataEngine::Data eventData; |
|
populateIncidenceData(event, eventData); |
|
|
|
// Event specific fields |
|
eventData["EventMultiDay"] = event->allDay(); |
|
eventData["EventHasEndDate"] = event->hasEndDate(); |
|
if (event->transparency() == KCalCore::Event::Opaque) { |
|
eventData["EventTransparency"] = "Opaque"; |
|
} else if (event->transparency() == KCalCore::Event::Transparent) { |
|
eventData["EventTransparency"] = "Transparent"; |
|
} else { |
|
eventData["EventTransparency"] = "Unknown"; |
|
} |
|
|
|
setData(event->uid(), eventData); |
|
} |
|
} |
|
|
|
void EventDataContainer::updateTodoData() |
|
{ |
|
QDate todoDate = m_startDate.date(); |
|
while(todoDate <= m_endDate.date()) { |
|
KCalCore::Todo::List todos = m_calendar->todos(todoDate); |
|
|
|
foreach (const KCalCore::Todo::Ptr &todo, todos) { |
|
Plasma::DataEngine::Data todoData; |
|
populateIncidenceData(todo, todoData); |
|
|
|
QVariant var; |
|
// Todo specific fields |
|
todoData["TodoHasStartDate"] = todo->hasStartDate(); |
|
todoData["TodoIsOpenEnded"] = todo->isOpenEnded(); |
|
todoData["TodoHasDueDate"] = todo->hasDueDate(); |
|
var.setValue(todo->dtDue().toTimeSpec(m_calendar->timeSpec())); |
|
todoData["TodoDueDate"] = var; |
|
todoData["TodoIsCompleted"] = todo->isCompleted(); |
|
todoData["TodoIsInProgress"] = todo->isInProgress(false); // ??? |
|
todoData["TodoIsNotStarted"] = todo->isNotStarted(false); // ??? |
|
todoData["TodoPercentComplete"] = todo->percentComplete(); |
|
todoData["TodoHasCompletedDate"] = todo->hasCompletedDate(); |
|
var.setValue(todo->completed().toTimeSpec(m_calendar->timeSpec())); |
|
todoData["TodoCompletedDate"] = var; |
|
|
|
setData(todo->uid(), todoData); |
|
} |
|
|
|
todoDate = todoDate.addDays(1); |
|
} |
|
} |
|
|
|
void EventDataContainer::updateJournalData() |
|
{ |
|
QDate journalDate = m_startDate.date(); |
|
while(journalDate <= m_endDate.date()) { |
|
KCalCore::Journal::List journals = m_calendar->journals(journalDate); |
|
|
|
foreach (const KCalCore::Journal::Ptr &journal, journals) { |
|
Plasma::DataEngine::Data journalData; |
|
populateIncidenceData(journal, journalData); |
|
|
|
// No Journal specific fields |
|
setData(journal->uid(), journalData); |
|
} |
|
|
|
journalDate = journalDate.addDays(1); |
|
} |
|
} |
|
|
|
void EventDataContainer::populateIncidenceData(const KCalCore::Incidence::Ptr &incidence, Plasma::DataEngine::Data &incidenceData) |
|
{ |
|
QVariant var; |
|
incidenceData["UID"] = incidence->uid(); |
|
incidenceData["Type"] = incidence->typeStr(); |
|
incidenceData["Summary"] = incidence->summary(); |
|
incidenceData["Description"] = incidence->description(); |
|
incidenceData["Comments"] = incidence->comments(); |
|
incidenceData["Location"] = incidence->location(); |
|
incidenceData["OrganizerName"] = incidence->organizer()->name(); |
|
incidenceData["OrganizerEmail"] = incidence->organizer()->email(); |
|
incidenceData["Priority"] = incidence->priority(); |
|
var.setValue(incidence->dtStart().toTimeSpec(m_calendar->timeSpec())); |
|
incidenceData["StartDate"] = var; |
|
|
|
KCalCore::Event* event = dynamic_cast<KCalCore::Event*>(incidence.data()); |
|
if (event) { |
|
var.setValue(event->dtEnd().toTimeSpec(m_calendar->timeSpec())); |
|
incidenceData["EndDate"] = var; |
|
} |
|
// Build the Occurance Index, this lists all occurences of the Incidence in the required range |
|
// Single occurance events just repeat the standard start/end dates |
|
// Recurring Events use each recurrence start/end date |
|
// The OccurenceUid is redundant, but it makes it easy for clients to just take() the data structure intact as a separate index |
|
QList<QVariant> occurences; |
|
// Build the recurrence list of start dates for recurring incidences only |
|
QList<QVariant> recurrences; |
|
if (incidence->recurs()) { |
|
KCalCore::DateTimeList recurList = incidence->recurrence()->timesInInterval(m_startDate.toTimeSpec(m_calendar->timeSpec()), m_endDate.toTimeSpec(m_calendar->timeSpec())); |
|
foreach(const KDateTime &recurDateTime, recurList) { |
|
var.setValue(recurDateTime.toTimeSpec(m_calendar->timeSpec())); |
|
recurrences.append(var); |
|
Plasma::DataEngine::Data occurence; |
|
occurence.insert("OccurrenceUid", incidence->uid()); |
|
occurence.insert("OccurrenceStartDate", var); |
|
var.setValue(incidence->endDateForStart(recurDateTime).toTimeSpec(m_calendar->timeSpec())); |
|
occurence.insert("OccurrenceEndDate", var); |
|
occurences.append(QVariant(occurence)); |
|
} |
|
} else { |
|
Plasma::DataEngine::Data occurence; |
|
occurence.insert("OccurrenceUid", incidence->uid()); |
|
var.setValue(incidence->dtStart().toTimeSpec(m_calendar->timeSpec())); |
|
occurence.insert("OccurrenceStartDate", var); |
|
if (event) { |
|
var.setValue(event->dtEnd().toTimeSpec(m_calendar->timeSpec())); |
|
occurence.insert("OccurrenceEndDate", var); |
|
} |
|
occurences.append(QVariant(occurence)); |
|
} |
|
incidenceData["RecurrenceDates"] = QVariant(recurrences); |
|
incidenceData["Occurrences"] = QVariant(occurences); |
|
if (incidence->status() == KCalCore::Incidence::StatusNone) { |
|
incidenceData["Status"] = "None"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusTentative) { |
|
incidenceData["Status"] = "Tentative"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusConfirmed) { |
|
incidenceData["Status"] = "Confirmed"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusDraft) { |
|
incidenceData["Status"] = "Draft"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusFinal) { |
|
incidenceData["Status"] = "Final"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusCompleted) { |
|
incidenceData["Status"] = "Completed"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusInProcess) { |
|
incidenceData["Status"] = "InProcess"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusCanceled) { |
|
incidenceData["Status"] = "Cancelled"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusNeedsAction) { |
|
incidenceData["Status"] = "NeedsAction"; |
|
} else if (incidence->status() == KCalCore::Incidence::StatusX) { |
|
incidenceData["Status"] = "NonStandard"; |
|
} else { |
|
incidenceData["Status"] = "Unknown"; |
|
} |
|
incidenceData["StatusName"] = KCalUtils::Stringify::incidenceStatus( incidence->status() ); |
|
|
|
if (incidence->secrecy() == KCalCore::Incidence::SecrecyPublic) { |
|
incidenceData["Secrecy"] = "Public"; |
|
} else if (incidence->secrecy() == KCalCore::Incidence::SecrecyPrivate) { |
|
incidenceData["Secrecy"] = "Private"; |
|
} else if (incidence->secrecy() == KCalCore::Incidence::SecrecyConfidential) { |
|
incidenceData["Secrecy"] = "Confidential"; |
|
} else { |
|
incidenceData["Secrecy"] = "Unknown"; |
|
} |
|
incidenceData["SecrecyName"] = KCalUtils::Stringify::secrecyName( incidence->secrecy() ); |
|
incidenceData["Recurs"] = incidence->recurs(); |
|
incidenceData["AllDay"] = incidence->allDay(); |
|
incidenceData["Categories"] = incidence->categories(); |
|
incidenceData["Resources"] = incidence->resources(); |
|
incidenceData["DurationDays"] = incidence->duration().asDays(); |
|
incidenceData["DurationSeconds"] = incidence->duration().asSeconds(); |
|
|
|
//TODO Attendees |
|
//TODO Attachments |
|
//TODO Relations |
|
//TODO Alarms |
|
//TODO Custom Properties |
|
//TODO Lat/Lon |
|
//TODO Collection/Source |
|
} |
|
|
|
|
|
|