42 #include <KIconLoader>
45 #include <QtCore/QMimeData>
46 #include <QApplication>
54 using namespace KCalCore;
55 using namespace KCalUtils;
62 class KCalUtils::DndFactory::Private
69 Incidence::Ptr pasteIncidence(
const Incidence::Ptr &incidence,
70 KDateTime newDateTime,
71 const QFlags<PasteFlag> &pasteOptions)
73 Incidence::Ptr inc(incidence);
76 inc = Incidence::Ptr(inc->clone());
80 if (inc && newDateTime.isValid()) {
81 if (inc->type() == Incidence::TypeEvent) {
83 if (pasteOptions & FlagPasteAtOriginalTime) {
85 const QDate date = newDateTime.date();
87 newDateTime.setDate(date);
91 const int durationInSeconds =
event->dtStart().secsTo(event->dtEnd());
92 const int durationInDays =
event->dtStart().daysTo(event->dtEnd());
94 event->setDtStart(newDateTime);
96 if (newDateTime.isDateOnly()) {
97 event->setDtEnd(newDateTime.addDays(durationInDays));
99 event->setDtEnd(newDateTime.addSecs(durationInSeconds));
102 }
else if (inc->type() == Incidence::TypeTodo) {
104 const bool pasteAtDtStart = (pasteOptions & FlagTodosPasteAtDtStart);
105 if (pasteOptions & FlagPasteAtOriginalTime) {
107 const QDate date = newDateTime.date();
108 newDateTime = pasteAtDtStart ? aTodo->
dtStart() : aTodo->dtDue();
109 newDateTime.setDate(date);
111 if (pasteAtDtStart) {
112 aTodo->setDtStart(newDateTime);
114 aTodo->setDtDue(newDateTime);
117 }
else if (inc->type() == Incidence::TypeJournal) {
118 if (pasteOptions & FlagPasteAtOriginalTime) {
120 const QDate date = newDateTime.date();
121 newDateTime = inc->dtStart();
122 newDateTime.setDate(date);
124 inc->setDtStart(newDateTime);
126 kDebug() <<
"Trying to paste unknown incidence of type" << int(inc->type());
138 : d(new KCalUtils::
DndFactory::Private(calendar))
142 DndFactory::~DndFactory()
149 QMimeData *mimeData =
new QMimeData;
159 QDrag *drag =
new QDrag(owner);
168 Incidence::Ptr i(incidence->clone());
170 i->setRecurrenceId(KDateTime());
171 cal->addIncidence(i);
173 QMimeData *mimeData =
new QMimeData;
180 QMap<QString, QString> metadata;
181 metadata[
"labels"] = KUrl::toPercentEncoding(i->summary());
182 uri.populateMimeData(mimeData, metadata);
190 QDrag *drag =
new QDrag(owner);
192 drag->setPixmap(BarIcon(incidence->iconName()));
203 const KDateTime::Spec &timeSpec)
233 if (!events.isEmpty()) {
259 if (!todos.isEmpty()) {
280 Incidence::List list;
281 list.append(selectedIncidence);
288 Incidence::List::ConstIterator it;
289 for (it = incidences.constBegin(); it != incidences.constEnd(); ++it) {
290 d->mCalendar->deleteIncidence(*it);
300 QClipboard *clipboard = QApplication::clipboard();
304 Incidence::List::ConstIterator it;
305 for (it = incidences.constBegin(); it != incidences.constEnd(); ++it) {
307 calendar->addIncidence(Incidence::Ptr((*it)->clone()));
311 QMimeData *mimeData =
new QMimeData;
316 if (calendar->incidences().isEmpty()) {
319 clipboard->setMimeData(mimeData);
326 Incidence::List list;
327 list.append(selectedInc);
332 const QFlags<PasteFlag> &pasteOptions)
334 QClipboard *clipboard = QApplication::clipboard();
337 Incidence::List list;
340 kDebug() <<
"Can't parse clipboard";
346 QHash<QString, Incidence::Ptr> oldUidToNewInc;
348 Incidence::List::ConstIterator it;
349 const Incidence::List incidences = calendar->incidences();
350 for (it = incidences.constBegin();
351 it != incidences.constEnd(); ++it) {
352 Incidence::Ptr incidence = d->pasteIncidence(*it, newDateTime, pasteOptions);
354 list.append(incidence);
355 oldUidToNewInc[(*it)->uid()] = *it;
360 for (it = list.constBegin(); it != list.constEnd(); ++it) {
361 Incidence::Ptr incidence = *it;
362 if (oldUidToNewInc.contains(incidence->relatedTo())) {
363 Incidence::Ptr parentInc = oldUidToNewInc[incidence->relatedTo()];
364 incidence->setRelatedTo(parentInc->uid());
367 incidence->setRelatedTo(QString());
375 const QFlags<PasteFlag> &pasteOptions)
377 QClipboard *clipboard = QApplication::clipboard();
381 kDebug() <<
"Can't parse clipboard";
382 return Incidence::Ptr();
385 Incidence::List incidenceList = calendar->incidences();
386 Incidence::Ptr incidence = incidenceList.isEmpty() ? Incidence::Ptr() : incidenceList.first();
388 return d->pasteIncidence(incidence, newDateTime, pasteOptions);