42 #include <KIconLoader>
45 #include <QtCore/QMimeData>
46 #include <QApplication>
52 using namespace KCalCore;
53 using namespace KCalUtils;
60 class KCalUtils::DndFactory::Private
64 : mCalendar ( calendar )
67 Incidence::Ptr pasteIncidence(
const Incidence::Ptr &incidence,
68 KDateTime newDateTime,
69 const QFlags<PasteFlag> &pasteOptions )
71 Incidence::Ptr inc( incidence );
74 inc = Incidence::Ptr( inc->clone() );
78 if ( inc && newDateTime.isValid() ) {
79 if ( inc->type() == Incidence::TypeEvent ) {
81 if ( pasteOptions & FlagPasteAtOriginalTime ) {
83 const QDate date = newDateTime.date();
85 newDateTime.setDate( date );
89 const int durationInSeconds =
event->dtStart().secsTo( event->dtEnd() );
90 const int durationInDays =
event->dtStart().daysTo( event->dtEnd() );
92 event->setDtStart( newDateTime );
94 if ( newDateTime.isDateOnly() ) {
95 event->setDtEnd( newDateTime.addDays( durationInDays ) );
97 event->setDtEnd( newDateTime.addSecs( durationInSeconds ) );
100 }
else if ( inc->type() == Incidence::TypeTodo ) {
102 const bool pasteAtDtStart = ( pasteOptions & FlagTodosPasteAtDtStart );
103 if ( pasteOptions & FlagPasteAtOriginalTime ) {
105 const QDate date = newDateTime.date();
106 newDateTime = pasteAtDtStart ? aTodo->
dtStart() : aTodo->dtDue();
107 newDateTime.setDate( date );
109 if ( pasteAtDtStart ) {
110 aTodo->setDtStart( newDateTime );
112 aTodo->setDtDue( newDateTime );
115 }
else if ( inc->type() == Incidence::TypeJournal ) {
116 if ( pasteOptions & FlagPasteAtOriginalTime ) {
118 const QDate date = newDateTime.date();
119 newDateTime = inc->dtStart();
120 newDateTime.setDate( date );
122 inc->setDtStart( newDateTime );
124 kDebug() <<
"Trying to paste unknown incidence of type" << int( inc->type() );
136 : d( new KCalUtils::
DndFactory::Private ( calendar ) )
140 DndFactory::~DndFactory()
147 QMimeData *mimeData =
new QMimeData;
157 QDrag *drag =
new QDrag( owner );
166 Incidence::Ptr i( incidence->clone() );
167 cal->addIncidence( i );
169 QMimeData *mimeData =
new QMimeData;
175 if ( uri.isValid() ) {
176 QMap<QString, QString> metadata;
177 metadata[
"labels"] = KUrl::toPercentEncoding( i->summary() );
178 uri.populateMimeData( mimeData, metadata );
186 QDrag *drag =
new QDrag( owner );
188 drag->setPixmap( BarIcon( incidence->iconName() ) );
199 const KDateTime::Spec &timeSpec )
229 if ( !events.isEmpty() ) {
255 if ( !todos.isEmpty() ) {
276 Incidence::List list;
277 list.append( selectedIncidence );
284 Incidence::List::ConstIterator it;
285 for ( it = incidences.constBegin(); it != incidences.constEnd(); ++it ) {
286 d->mCalendar->deleteIncidence( *it );
296 QClipboard *clipboard = QApplication::clipboard();
297 Q_ASSERT( clipboard );
300 Incidence::List::ConstIterator it;
301 for ( it = incidences.constBegin(); it != incidences.constEnd(); ++it ) {
303 calendar->addIncidence( Incidence::Ptr( ( *it )->clone() ) );
307 QMimeData *mimeData =
new QMimeData;
312 if ( calendar->incidences().isEmpty() ) {
315 clipboard->setMimeData( mimeData );
322 Incidence::List list;
323 list.append( selectedInc );
328 const QFlags<PasteFlag> &pasteOptions )
330 QClipboard *clipboard = QApplication::clipboard();
331 Q_ASSERT( clipboard );
333 Incidence::List list;
336 kDebug() <<
"Can't parse clipboard";
342 QHash<QString, Incidence::Ptr> oldUidToNewInc;
344 Incidence::List::ConstIterator it;
345 const Incidence::List incidences = calendar->incidences();
346 for ( it = incidences.constBegin();
347 it != incidences.constEnd(); ++it ) {
348 Incidence::Ptr incidence = d->pasteIncidence( *it, newDateTime, pasteOptions );
350 list.append( incidence );
351 oldUidToNewInc[(*it)->uid()] = *it;
356 for ( it = list.constBegin(); it != list.constEnd(); ++it ) {
357 Incidence::Ptr incidence = *it;
358 if ( oldUidToNewInc.contains( incidence->relatedTo() ) ) {
359 Incidence::Ptr parentInc = oldUidToNewInc[incidence->relatedTo()];
360 incidence->setRelatedTo( parentInc->uid() );
363 incidence->setRelatedTo( QString() );
371 const QFlags<PasteFlag> &pasteOptions )
373 QClipboard *clipboard = QApplication::clipboard();
377 kDebug() <<
"Can't parse clipboard";
378 return Incidence::Ptr();
381 Incidence::List incidenceList = calendar->incidences();
382 Incidence::Ptr incidence = incidenceList.isEmpty() ? Incidence::Ptr() : incidenceList.first();
384 return d->pasteIncidence( incidence, newDateTime, pasteOptions );