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 Calendar *cal = new CalendarLocal( d->mCalendar->timeSpec() );
00137
00138 if ( ICalDrag::fromMimeData( md, cal ) ||
00139 VCalDrag::fromMimeData( md, cal ) ){
00140 return cal;
00141 }
00142 return 0;
00143 }
00144
00145 Calendar *DndFactory::createDropCalendar( QDropEvent *de )
00146 {
00147 Calendar *cal = createDropCalendar( de->mimeData() );
00148 if ( cal ) {
00149 de->accept();
00150 return cal;
00151 }
00152 return 0;
00153 }
00154
00155 Event *DndFactory::createDropEvent( const QMimeData *md )
00156 {
00157 kDebug();
00158 Event *ev = 0;
00159 Calendar *cal = createDropCalendar( md );
00160
00161 if ( cal ) {
00162 Event::List events = cal->events();
00163 if ( !events.isEmpty() ) {
00164 ev = new Event( *events.first() );
00165 }
00166 delete cal;
00167 }
00168 return ev;
00169 }
00170
00171 Event *DndFactory::createDropEvent( QDropEvent *de )
00172 {
00173 Event *ev = createDropEvent( de->mimeData() );
00174
00175 if ( ev ) {
00176 de->accept();
00177 }
00178
00179 return ev;
00180 }
00181
00182 Todo *DndFactory::createDropTodo( const QMimeData *md )
00183 {
00184 kDebug();
00185 Todo *todo = 0;
00186 Calendar *cal = createDropCalendar( md );
00187
00188 if ( cal ) {
00189 Todo::List todos = cal->todos();
00190 if ( !todos.isEmpty() ) {
00191 todo = new Todo( *todos.first() );
00192 }
00193 delete cal;
00194 }
00195
00196 return todo;
00197 }
00198
00199 Todo *DndFactory::createDropTodo( QDropEvent *de )
00200 {
00201 Todo *todo = createDropTodo( de->mimeData() );
00202
00203 if ( todo ) {
00204 de->accept();
00205 }
00206
00207 return todo;
00208 }
00209
00210 void DndFactory::cutIncidence( Incidence *selectedInc )
00211 {
00212 if ( copyIncidence( selectedInc ) ) {
00213 d->mCalendar->deleteIncidence( selectedInc );
00214 }
00215 }
00216
00217 bool DndFactory::copyIncidence( Incidence *selectedInc )
00218 {
00219 if ( !selectedInc ) {
00220 return false;
00221 }
00222
00223 QClipboard *cb = QApplication::clipboard();
00224
00225 CalendarLocal cal( d->mCalendar->timeSpec() );
00226 Incidence *inc = selectedInc->clone();
00227 cal.addIncidence( inc );
00228
00229 QMimeData *mimeData = new QMimeData;
00230 cb->setMimeData( mimeData );
00231
00232 ICalDrag::populateMimeData( mimeData, &cal );
00233 VCalDrag::populateMimeData( mimeData, &cal );
00234
00235 return true;
00236 }
00237
00238 Incidence *DndFactory::pasteIncidence( const QDate &newDate, const QTime *newTime )
00239 {
00240 QClipboard *cb = QApplication::clipboard();
00241 Calendar *cal = createDropCalendar( cb->mimeData() );
00242
00243 if ( !cal ) {
00244 kDebug() << "Can't parse clipboard";
00245 return 0;
00246 }
00247 Incidence *ret = 0;
00248
00249 Incidence::List incList = cal->incidences();
00250 Incidence *inc = incList.first();
00251
00252 if ( !incList.isEmpty() && inc ) {
00253 inc = inc->clone();
00254
00255 inc->recreate();
00256
00257 if ( inc->type() == "Event" ) {
00258
00259 Event *anEvent = static_cast<Event*>( inc );
00260
00261 int daysOffset = anEvent->dtStart().date().daysTo(
00262 anEvent->dtEnd().date() );
00263
00264 KDateTime endDate( anEvent->dtEnd() );
00265 endDate.setDate( newDate.addDays(daysOffset) );
00266
00267 KDateTime startDate( anEvent->dtStart() );
00268 startDate.setDate( newDate );
00269 if ( newTime ) {
00270
00271 int addSecsOffset( anEvent->dtStart().time().secsTo( *newTime ) );
00272 endDate=endDate.addSecs( addSecsOffset );
00273 startDate.setTime( *newTime );
00274 }
00275 anEvent->setDtStart( startDate );
00276 anEvent->setDtEnd( endDate );
00277
00278 } else if ( inc->type() == "Todo" ) {
00279 Todo *anTodo = static_cast<Todo*>( inc );
00280 KDateTime dueDate( anTodo->dtDue() );
00281 dueDate.setDate( newDate );
00282 if ( newTime ) {
00283 dueDate.setTime( *newTime );
00284 }
00285 anTodo->setDtDue( dueDate );
00286 } else if ( inc->type() == "Journal" ) {
00287 Journal *anJournal = static_cast<Journal*>( inc );
00288 KDateTime startDate( anJournal->dtStart() );
00289 startDate.setDate( newDate );
00290 if ( newTime ) {
00291 startDate.setTime( *newTime );
00292 } else {
00293 startDate.setTime( QTime( 0, 0, 0 ) );
00294 }
00295 anJournal->setDtStart( startDate );
00296 } else {
00297 kDebug() << "Trying to paste unknown incidence of type" << inc->type();
00298 }
00299
00300 ret = inc;
00301 }
00302 delete cal;
00303 return ret;
00304 }