libkcal
dndfactory.cpp00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <qapplication.h>
00025 #include <qclipboard.h>
00026
00027 #include <kiconloader.h>
00028 #include <kdebug.h>
00029 #include <kmessagebox.h>
00030 #include <klocale.h>
00031
00032 #include "vcaldrag.h"
00033 #include "icaldrag.h"
00034 #include "calendar.h"
00035 #include "vcalformat.h"
00036 #include "icalformat.h"
00037 #include "calendarlocal.h"
00038
00039 #include "dndfactory.h"
00040
00041 using namespace KCal;
00042
00043 DndFactory::DndFactory( Calendar *cal ) :
00044 mCalendar( cal )
00045 {
00046 }
00047
00048 ICalDrag *DndFactory::createDrag( Incidence *incidence, QWidget *owner )
00049 {
00050 CalendarLocal cal( mCalendar->timeZoneId() );
00051 Incidence *i = incidence->clone();
00052 cal.addIncidence( i );
00053
00054 ICalDrag *icd = new ICalDrag( &cal, owner );
00055 if ( i->type() == "Event" )
00056 icd->setPixmap( BarIcon( "appointment" ) );
00057 else if ( i->type() == "Todo" )
00058 icd->setPixmap( BarIcon( "todo" ) );
00059
00060 return icd;
00061 }
00062
00063 Event *DndFactory::createDrop(QDropEvent *de)
00064 {
00065 kdDebug(5800) << "DndFactory::createDrop()" << endl;
00066
00067 CalendarLocal cal( mCalendar->timeZoneId() );
00068
00069 if ( ICalDrag::decode( de, &cal ) || VCalDrag::decode( de, &cal ) ) {
00070 de->accept();
00071
00072 Event::List events = cal.events();
00073 if ( !events.isEmpty() ) {
00074 Event *event = new Event( *events.first() );
00075 return event;
00076 }
00077 }
00078
00079 return 0;
00080 }
00081
00082 Todo *DndFactory::createDropTodo(QDropEvent *de)
00083 {
00084 kdDebug(5800) << "VCalFormat::createDropTodo()" << endl;
00085
00086 CalendarLocal cal( mCalendar->timeZoneId() );
00087
00088 if ( ICalDrag::decode( de, &cal ) || VCalDrag::decode( de, &cal ) ) {
00089 de->accept();
00090
00091 Todo::List todos = cal.todos();
00092 if ( !todos.isEmpty() ) {
00093 Todo *todo = new Todo( *todos.first() );
00094 return todo;
00095 }
00096 }
00097
00098 return 0;
00099 }
00100
00101
00102 void DndFactory::cutIncidence( Incidence *selectedInc )
00103 {
00104 if ( copyIncidence( selectedInc ) ) {
00105 mCalendar->deleteIncidence( selectedInc );
00106 }
00107 }
00108
00109 bool DndFactory::copyIncidence( Incidence *selectedInc )
00110 {
00111 if ( !selectedInc )
00112 return false;
00113 QClipboard *cb = QApplication::clipboard();
00114
00115 CalendarLocal cal( mCalendar->timeZoneId() );
00116 Incidence *inc = selectedInc->clone();
00117 cal.addIncidence( inc );
00118 cb->setData( new ICalDrag( &cal ) );
00119
00120 return true;
00121 }
00122
00123 Incidence *DndFactory::pasteIncidence(const QDate &newDate, const QTime *newTime)
00124 {
00125
00126
00127 CalendarLocal cal( mCalendar->timeZoneId() );
00128
00129 QClipboard *cb = QApplication::clipboard();
00130
00131 if ( !ICalDrag::decode( cb->data(), &cal ) &&
00132 !VCalDrag::decode( cb->data(), &cal ) ) {
00133 kdDebug(5800) << "Can't parse clipboard" << endl;
00134 return 0;
00135 }
00136
00137 Incidence::List incList = cal.incidences();
00138 Incidence *inc = incList.first();
00139
00140 if ( !incList.isEmpty() && inc ) {
00141 inc = inc->clone();
00142
00143 inc->recreate();
00144
00145 if ( inc->type() == "Event" ) {
00146
00147 Event *anEvent = static_cast<Event*>( inc );
00148
00149 int daysOffset = anEvent->dtStart().date().daysTo(
00150 anEvent->dtEnd().date() );
00151
00152 QDateTime endDate( newDate.addDays(daysOffset), anEvent->dtEnd().time() );
00153
00154 if ( newTime ) {
00155
00156 int addSecsOffset( anEvent->dtStart().time().secsTo( *newTime ));
00157 endDate=endDate.addSecs( addSecsOffset );
00158 anEvent->setDtStart( QDateTime( newDate, *newTime ) );
00159 } else {
00160 anEvent->setDtStart( QDateTime( newDate, anEvent->dtStart().time() ) );
00161 }
00162 anEvent->setDtEnd( endDate );
00163
00164 } else if ( inc->type() == "Todo" ) {
00165 Todo *anTodo = static_cast<Todo*>( inc );
00166 if ( newTime ) {
00167 anTodo->setDtDue( QDateTime( newDate, *newTime ) );
00168 } else {
00169 anTodo->setDtDue( QDateTime( newDate, anTodo->dtDue().time() ) );
00170 }
00171 } else if ( inc->type() == "Journal" ) {
00172 Journal *anJournal = static_cast<Journal*>( inc );
00173 if ( newTime ) {
00174 anJournal->setDtStart( QDateTime( newDate, *newTime ) );
00175 } else {
00176 anJournal->setDtStart( QDateTime( newDate ) );
00177 }
00178 } else {
00179 kdDebug(5850) << "Trying to paste unknown incidence of type " << inc->type() << endl;
00180 }
00181
00182 return inc;
00183
00184 }
00185
00186 return 0;
00187 }
|