KCal Library
dndfactory.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00038 #include "dndfactory.h"
00039 #include "vcaldrag.h"
00040 #include "icaldrag.h"
00041 #include "calendar.h"
00042 #include "calendarlocal.h"
00043
00044 #include <kiconloader.h>
00045 #include <kdebug.h>
00046 #include <klocale.h>
00047 #include <kurl.h>
00048
00049 #include <QtGui/QApplication>
00050 #include <QtGui/QClipboard>
00051 #include <QtGui/QDropEvent>
00052 #include <QtGui/QPixmap>
00053
00054 using namespace KCal;
00055
00060
00061 class KCal::DndFactory::Private
00062 {
00063 public:
00064 Private( Calendar *cal )
00065 : mCalendar ( cal )
00066 {}
00067 Calendar *mCalendar;
00068 };
00069
00070
00071 DndFactory::DndFactory( Calendar *cal )
00072 : d( new KCal::DndFactory::Private ( cal ) )
00073 {
00074 }
00075
00076 DndFactory::~DndFactory()
00077 {
00078 delete d;
00079 }
00080
00081 QMimeData *DndFactory::createMimeData()
00082 {
00083 QMimeData *mimeData = new QMimeData;
00084
00085 ICalDrag::populateMimeData( mimeData, d->mCalendar );
00086 VCalDrag::populateMimeData( mimeData, d->mCalendar );
00087
00088 return mimeData;
00089 }
00090
00091 QDrag *DndFactory::createDrag( QWidget *owner )
00092 {
00093 QDrag *drag = new QDrag( owner );
00094 drag->setMimeData( createMimeData() );
00095
00096 return drag;
00097 }
00098
00099 QMimeData *DndFactory::createMimeData( Incidence *incidence )
00100 {
00101 CalendarLocal cal( d->mCalendar->timeSpec() );
00102 Incidence *i = incidence->clone();
00103 cal.addIncidence( i );
00104
00105 QMimeData *mimeData = new QMimeData;
00106
00107 ICalDrag::populateMimeData( mimeData, &cal );
00108 VCalDrag::populateMimeData( mimeData, &cal );
00109
00110 KUrl uri = i->uri();
00111 if ( uri.isValid() ) {
00112 QMap<QString, QString> metadata;
00113 metadata["labels"] = KUrl::toPercentEncoding( i->summary() );
00114 uri.populateMimeData( mimeData, metadata );
00115 }
00116
00117 return mimeData;
00118 }
00119
00120 QDrag *DndFactory::createDrag( Incidence *incidence, QWidget *owner )
00121 {
00122 QDrag *drag = new QDrag( owner );
00123 drag->setMimeData( createMimeData( incidence ) );
00124
00125 if ( incidence->type() == "Event" ) {
00126 drag->setPixmap( BarIcon( "view-calendar-day" ) );
00127 } else if ( incidence->type() == "Todo" ) {
00128 drag->setPixmap( BarIcon( "view-calendar-tasks" ) );
00129 }
00130
00131 return drag;
00132 }
00133
00134 Calendar *DndFactory::createDropCalendar( const QMimeData *md )
00135 {
00136 return createDropCalendar( md, d->mCalendar->timeSpec() );
00137 }
00138
00139 Calendar *DndFactory::createDropCalendar( const QMimeData *md, const KDateTime::Spec &timeSpec )
00140 {
00141 Calendar *cal = new CalendarLocal( timeSpec );
00142
00143 if ( ICalDrag::fromMimeData( md, cal ) ||
00144 VCalDrag::fromMimeData( md, cal ) ){
00145 return cal;
00146 }
00147 delete cal;
00148 return 0;
00149 }
00150
00151 Calendar *DndFactory::createDropCalendar( QDropEvent *de )
00152 {
00153 Calendar *cal = createDropCalendar( de->mimeData() );
00154 if ( cal ) {
00155 de->accept();
00156 return cal;
00157 }
00158 return 0;
00159 }
00160
00161 Event *DndFactory::createDropEvent( const QMimeData *md )
00162 {
00163 kDebug();
00164 Event *ev = 0;
00165 Calendar *cal = createDropCalendar( md );
00166
00167 if ( cal ) {
00168 Event::List events = cal->events();
00169 if ( !events.isEmpty() ) {
00170 ev = new Event( *events.first() );
00171 }
00172 delete cal;
00173 }
00174 return ev;
00175 }
00176
00177 Event *DndFactory::createDropEvent( QDropEvent *de )
00178 {
00179 Event *ev = createDropEvent( de->mimeData() );
00180
00181 if ( ev ) {
00182 de->accept();
00183 }
00184
00185 return ev;
00186 }
00187
00188 Todo *DndFactory::createDropTodo( const QMimeData *md )
00189 {
00190 kDebug();
00191 Todo *todo = 0;
00192 Calendar *cal = createDropCalendar( md );
00193
00194 if ( cal ) {
00195 Todo::List todos = cal->todos();
00196 if ( !todos.isEmpty() ) {
00197 todo = new Todo( *todos.first() );
00198 }
00199 delete cal;
00200 }
00201
00202 return todo;
00203 }
00204
00205 Todo *DndFactory::createDropTodo( QDropEvent *de )
00206 {
00207 Todo *todo = createDropTodo( de->mimeData() );
00208
00209 if ( todo ) {
00210 de->accept();
00211 }
00212
00213 return todo;
00214 }
00215
00216 void DndFactory::cutIncidence( Incidence *selectedInc )
00217 {
00218 if ( copyIncidence( selectedInc ) ) {
00219 d->mCalendar->deleteIncidence( selectedInc );
00220 }
00221 }
00222
00223 bool DndFactory::copyIncidence( Incidence *selectedInc )
00224 {
00225 if ( !selectedInc ) {
00226 return false;
00227 }
00228
00229 QClipboard *cb = QApplication::clipboard();
00230
00231 CalendarLocal cal( d->mCalendar->timeSpec() );
00232 Incidence *inc = selectedInc->clone();
00233 cal.addIncidence( inc );
00234
00235 QMimeData *mimeData = new QMimeData;
00236 cb->setMimeData( mimeData );
00237
00238 ICalDrag::populateMimeData( mimeData, &cal );
00239 VCalDrag::populateMimeData( mimeData, &cal );
00240
00241 return true;
00242 }
00243
00244 Incidence *DndFactory::pasteIncidence( const QDate &newDate, const QTime *newTime )
00245 {
00246 QClipboard *cb = QApplication::clipboard();
00247 Calendar *cal = createDropCalendar( cb->mimeData() );
00248
00249 if ( !cal ) {
00250 kDebug() << "Can't parse clipboard";
00251 return 0;
00252 }
00253
00254 Incidence::List incList = cal->incidences();
00255 Incidence *inc = incList.isEmpty() ? 0 : incList.first();
00256
00257 if ( inc ) {
00258 inc = inc->clone();
00259 inc->recreate();
00260 }
00261
00262 if ( inc && newDate.isValid() ) {
00263 if ( inc->type() == "Event" ) {
00264 Event *anEvent = static_cast<Event*>( inc );
00265
00266 int daysOffset = anEvent->dtStart().date().daysTo(
00267 anEvent->dtEnd().date() );
00268
00269 KDateTime endDate( anEvent->dtEnd() );
00270 endDate.setDate( newDate.addDays( daysOffset ) );
00271
00272 KDateTime startDate( anEvent->dtStart() );
00273 startDate.setDate( newDate );
00274 if ( newTime ) {
00275
00276 int addSecsOffset( anEvent->dtStart().time().secsTo( *newTime ) );
00277 endDate=endDate.addSecs( addSecsOffset );
00278 startDate.setTime( *newTime );
00279 }
00280 anEvent->setDtStart( startDate );
00281 anEvent->setDtEnd( endDate );
00282
00283 } else if ( inc->type() == "Todo" ) {
00284 Todo *anTodo = static_cast<Todo*>( inc );
00285 KDateTime dueDate( anTodo->dtDue() );
00286 dueDate.setDate( newDate );
00287 if ( newTime ) {
00288 dueDate.setTime( *newTime );
00289 }
00290 anTodo->setDtDue( dueDate );
00291 } else if ( inc->type() == "Journal" ) {
00292 Journal *anJournal = static_cast<Journal*>( inc );
00293 KDateTime startDate( anJournal->dtStart() );
00294 startDate.setDate( newDate );
00295 if ( newTime ) {
00296 startDate.setTime( *newTime );
00297 } else {
00298 startDate.setTime( QTime( 0, 0, 0 ) );
00299 }
00300 anJournal->setDtStart( startDate );
00301 } else {
00302 kDebug() << "Trying to paste unknown incidence of type" << inc->type();
00303 }
00304 }
00305 delete cal;
00306 return inc;
00307 }