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 Incidence *ret = 0;
00254
00255 Incidence::List incList = cal->incidences();
00256 Incidence *inc = incList.first();
00257
00258 if ( !incList.isEmpty() && inc ) {
00259 inc = inc->clone();
00260
00261 inc->recreate();
00262
00263 if ( inc->type() == "Event" ) {
00264
00265 Event *anEvent = static_cast<Event*>( inc );
00266
00267 int daysOffset = anEvent->dtStart().date().daysTo(
00268 anEvent->dtEnd().date() );
00269
00270 KDateTime endDate( anEvent->dtEnd() );
00271 endDate.setDate( newDate.addDays( daysOffset ) );
00272
00273 KDateTime startDate( anEvent->dtStart() );
00274 startDate.setDate( newDate );
00275 if ( newTime ) {
00276
00277 int addSecsOffset( anEvent->dtStart().time().secsTo( *newTime ) );
00278 endDate=endDate.addSecs( addSecsOffset );
00279 startDate.setTime( *newTime );
00280 }
00281 anEvent->setDtStart( startDate );
00282 anEvent->setDtEnd( endDate );
00283
00284 } else if ( inc->type() == "Todo" ) {
00285 Todo *anTodo = static_cast<Todo*>( inc );
00286 KDateTime dueDate( anTodo->dtDue() );
00287 dueDate.setDate( newDate );
00288 if ( newTime ) {
00289 dueDate.setTime( *newTime );
00290 }
00291 anTodo->setDtDue( dueDate );
00292 } else if ( inc->type() == "Journal" ) {
00293 Journal *anJournal = static_cast<Journal*>( inc );
00294 KDateTime startDate( anJournal->dtStart() );
00295 startDate.setDate( newDate );
00296 if ( newTime ) {
00297 startDate.setTime( *newTime );
00298 } else {
00299 startDate.setTime( QTime( 0, 0, 0 ) );
00300 }
00301 anJournal->setDtStart( startDate );
00302 } else {
00303 kDebug() << "Trying to paste unknown incidence of type" << inc->type();
00304 }
00305
00306 ret = inc;
00307 }
00308 delete cal;
00309 return ret;
00310 }