From d94b52aa95cc52aa1bef7c9cd99f43c725ed8042 Mon Sep 17 00:00:00 2001 From: zautrix Date: Sat, 29 Jan 2005 23:23:11 +0000 Subject: todo dnd --- diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index 0c39590..74aefb7 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -1531,7 +1531,7 @@ bool CalendarView::addAnniversary( QDate date, QString name, KCal::Attendee* a kind = i18n( "Anniversary" ); ev->setSummary( name + " (" + QString::number(date.year()) +") " + kind ); } - ev->setOrganizer(a->email()); + //ev->setOrganizer(a->email()); ev->setCategories( kind ); ev->setDtStart( QDateTime(date) ); ev->setDtEnd( QDateTime(date) ); @@ -2214,7 +2214,7 @@ void CalendarView::edit_cut() return; } DndFactory factory( mCalendar ); - factory.cutEvent(anEvent); + factory.cutIncidence(anEvent); changeEventDisplay(anEvent, KOGlobals::EVENTDELETED); } @@ -2235,7 +2235,7 @@ void CalendarView::edit_copy() return; } DndFactory factory( mCalendar ); - factory.copyEvent(anEvent); + factory.copyIncidence(anEvent); } void CalendarView::edit_paste() @@ -2243,7 +2243,7 @@ void CalendarView::edit_paste() QDate date = mNavigator->selectedDates().first(); DndFactory factory( mCalendar ); - Event *pastedEvent = factory.pasteEvent( date ); + Event *pastedEvent = (Event *)factory.pasteIncidence( date ); changeEventDisplay( pastedEvent, KOGlobals::EVENTADDED ); } diff --git a/korganizer/korganizer.pro b/korganizer/korganizer.pro index 4d67dca..3c7a1fb 100644 --- a/korganizer/korganizer.pro +++ b/korganizer/korganizer.pro @@ -9,9 +9,9 @@ include( ../variables.pri ) INCLUDEPATH += ../microkde ../ interfaces ../microkde/kdecore ../microkde/kdeui ../microkde/kio/kfile ../microkde/kio/kio ../libkdepim #../qtcompat -DEFINES += KORG_NODND KORG_NOPLUGINS KORG_NOARCHIVE KORG_NOMAIL +DEFINES += KORG_NOPLUGINS KORG_NOARCHIVE KORG_NOMAIL DEFINES += KORG_NODCOP KORG_NOKALARMD KORG_NORESOURCEVIEW KORG_NOSPLITTER -#KORG_NOPRINTER KORG_NOKABC +#KORG_NOPRINTER KORG_NOKABC KORG_NODND DEFINES += KORG_NOLVALTERNATION DEFINES += DESKTOP_VERSION unix : { diff --git a/korganizer/kotodoview.cpp b/korganizer/kotodoview.cpp index 1fb480d..8c1953d 100644 --- a/korganizer/kotodoview.cpp +++ b/korganizer/kotodoview.cpp @@ -139,27 +139,28 @@ void KOTodoListView::contentsDropEvent(QDropEvent *e) Todo *existingTodo = mCalendar->todo(todo->uid()); if(existingTodo) { -// kdDebug() << "Drop existing Todo" << endl; Incidence *to = destinationEvent; while(to) { if (to->uid() == todo->uid()) { KMessageBox::sorry(this, - i18n("Cannot move To-Do to itself or a child of itself"), + i18n("Cannot move To-Do to itself\nor a child of itself"), i18n("Drop To-Do")); delete todo; return; } to = to->relatedTo(); } - existingTodo->setRelatedTo(destinationEvent); - emit todoDropped(todo); + internalDrop = true; + if ( destinationEvent ) + reparentTodoSignal( destinationEvent, existingTodo ); + else + unparentTodoSignal(existingTodo); delete todo; } else { -// kdDebug() << "Drop new Todo" << endl; - todo->setRelatedTo(destinationEvent); mCalendar->addTodo(todo); - - emit todoDropped(todo); + emit todoDropped(todo, KOGlobals::EVENTADDED); + if ( destinationEvent ) + reparentTodoSignal( destinationEvent, todo ); } } else { @@ -167,10 +168,9 @@ void KOTodoListView::contentsDropEvent(QDropEvent *e) if (QTextDrag::decode(e,text)) { //QListViewItem *qlvi = itemAt( contentsToViewport(e->pos()) ); KOTodoViewItem *todoi = static_cast(itemAt( contentsToViewport(e->pos()) )); - kdDebug() << "Dropped : " << text << endl; + qDebug("Dropped : " + text); QStringList emails = QStringList::split(",",text); for(QStringList::ConstIterator it = emails.begin();it!=emails.end();++it) { - kdDebug() << " Email: " << (*it) << endl; int pos = (*it).find("<"); QString name = (*it).left(pos); QString email = (*it).mid(pos); @@ -180,7 +180,7 @@ void KOTodoListView::contentsDropEvent(QDropEvent *e) } } else { - kdDebug() << "KOTodoListView::contentsDropEvent(): Todo from drop not decodable" << endl; + qDebug("KOTodoListView::contentsDropEvent(): Todo from drop not decodable "); e->ignore(); } } @@ -189,10 +189,10 @@ void KOTodoListView::contentsDropEvent(QDropEvent *e) void KOTodoListView::contentsMousePressEvent(QMouseEvent* e) { - QListView::contentsMousePressEvent(e); #ifndef KORG_NODND QPoint p(contentsToViewport(e->pos())); QListViewItem *i = itemAt(p); + mMousePressed = false; if (i) { // if the user clicked into the root decoration of the item, don't // try to start a drag! @@ -207,35 +207,37 @@ void KOTodoListView::contentsMousePressEvent(QMouseEvent* e) } } #endif + QListView::contentsMousePressEvent(e); } void KOTodoListView::contentsMouseMoveEvent(QMouseEvent* e) { #ifndef KORG_NODND -// kdDebug() << "KOTodoListView::contentsMouseMoveEvent()" << endl; QListView::contentsMouseMoveEvent(e); if (mMousePressed && (mPressPos - e->pos()).manhattanLength() > QApplication::startDragDistance()) { mMousePressed = false; QListViewItem *item = itemAt(contentsToViewport(mPressPos)); if (item) { -// kdDebug() << "Start Drag for item " << item->text(0) << endl; DndFactory factory( mCalendar ); - ICalDrag *vd = factory.createDragTodo( + ICalDrag *vd = factory.createDrag( ((KOTodoViewItem *)item)->todo(),viewport()); + internalDrop = false; + // we cannot do any senseful here, because the DnD is still broken in Qt if (vd->drag()) { - kdDebug() << "KOTodoListView::contentsMouseMoveEvent(): Delete drag source" << endl; + if ( !internalDrop ) { + //emit deleteTodo( ((KOTodoViewItem *)item)->todo() ); + qDebug("Dnd: External move: Delete drag source "); + } else + qDebug("Dnd: Internal move "); + + } else { + if ( !internalDrop ) { + qDebug("Dnd: External Copy"); + } else + qDebug("DnD: Internal copy: Copy pending"); } -/* - QString source = fullPath(item); - if ( QFile::exists(source) ) { - QUriDrag* ud = new QUriDrag(viewport()); - ud->setFilenames( source ); - if ( ud->drag() ) - QMessageBox::information( this, "Drag source", - QString("Delete ")+source, "Not implemented" ); -*/ } } #endif @@ -489,8 +491,10 @@ KOTodoView::KOTodoView(Calendar *calendar,QWidget* parent,const char* name) : SLOT( itemClicked( QListViewItem * ) ) ); connect( mTodoListView, SIGNAL( double_Clicked( QListViewItem * ) ), SLOT( itemDoubleClicked( QListViewItem * ) ) ); - connect( mTodoListView, SIGNAL( todoDropped( Todo * ) ), + connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), SLOT( updateView() ) ); + connect( mTodoListView, SIGNAL( todoDropped( Todo *, int ) ), + SLOT( todoModified(Todo *, int) ) ); connect( mTodoListView, SIGNAL( expanded( QListViewItem * ) ), SLOT( itemStateChanged( QListViewItem * ) ) ); connect( mTodoListView, SIGNAL( collapsed( QListViewItem * ) ), @@ -504,6 +508,11 @@ KOTodoView::KOTodoView(Calendar *calendar,QWidget* parent,const char* name) : connect(mTodoListView,SIGNAL(pressed(QListViewItem *)), SLOT(selectionChanged(QListViewItem *))); #endif + + connect( mTodoListView, SIGNAL(reparentTodoSignal( Todo *,Todo * ) ), SIGNAL(reparentTodoSignal( Todo *,Todo * ) )); + connect( mTodoListView, SIGNAL(unparentTodoSignal(Todo *) ), SIGNAL(unparentTodoSignal(Todo *) )); + connect( mTodoListView, SIGNAL( deleteTodo(Todo *) ), SIGNAL(deleteTodoSignal(Todo *) )); + connect( mTodoListView, SIGNAL(selectionChanged() ), SLOT( processSelectionChange() ) ); connect( mQuickAdd, SIGNAL( returnPressed () ), diff --git a/korganizer/kotodoview.h b/korganizer/kotodoview.h index f11518d..68e29bb 100644 --- a/korganizer/kotodoview.h +++ b/korganizer/kotodoview.h @@ -60,9 +60,11 @@ class KOTodoListView : public KListView virtual ~KOTodoListView() {} signals: - void todoDropped(Todo *); + void todoDropped(Todo *, int); void double_Clicked(QListViewItem *item); - + void reparentTodoSignal( Todo *,Todo * ); + void unparentTodoSignal(Todo *); + void deleteTodo( Todo * ); protected: void contentsDragEnterEvent(QDragEnterEvent *); void contentsDragMoveEvent(QDragMoveEvent *); @@ -75,6 +77,7 @@ class KOTodoListView : public KListView void contentsMouseDoubleClickEvent(QMouseEvent *); private: + bool internalDrop; QString mName; Calendar *mCalendar; QPoint mPressPos; @@ -197,6 +200,8 @@ class KOTodoView : public KOrg::BaseView protected slots: void processSelectionChange(); void addQuickTodo(); + void setTodoModified( Todo* ); + void todoModified(Todo *, int ); private: /* @@ -209,7 +214,6 @@ class KOTodoView : public KOrg::BaseView * -- zecke 2002-07-08 */ friend class KOTodoViewItem; - void setTodoModified( Todo* ); QMap::ConstIterator insertTodoItem(Todo *todo); void restoreItemState( QListViewItem * ); @@ -235,7 +239,6 @@ class KOTodoView : public KOrg::BaseView QString mCurrentDoc; KOQuickTodo *mQuickAdd; bool mBlockUpdate; - void todoModified(Todo *, int ); void keyPressEvent ( QKeyEvent * ) ; KOTodoViewItem * pendingSubtodo; DateNavigator* mNavigator; diff --git a/libkcal/dndfactory.cpp b/libkcal/dndfactory.cpp new file mode 100644 index 0000000..cdcfae4 --- a/dev/null +++ b/libkcal/dndfactory.cpp @@ -0,0 +1,186 @@ +/* + This file is part of libkcal. + Copyright (c) 1998 Preston Brwon + Copyright (c) 2001,2002 Cornelius Schumacher + Copyright (C) 2003-2004 Reinhold Kainhofer + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include +#include + +#include +#include +#include +#include + +#include "vcaldrag.h" +#include "icaldrag.h" +#include "calendar.h" +#include "vcalformat.h" +#include "icalformat.h" +#include "calendarlocal.h" + +#include "dndfactory.h" + +using namespace KCal; + +DndFactory::DndFactory( Calendar *cal ) : + mCalendar( cal ) +{ +} + +ICalDrag *DndFactory::createDrag( Incidence *incidence, QWidget *owner ) +{ + CalendarLocal cal( mCalendar->timeZoneId() ); + Incidence *i = incidence->clone(); + cal.addIncidence( i ); + + ICalDrag *icd = new ICalDrag( &cal, owner ); + if ( i->type() == "Event" ) + icd->setPixmap( BarIcon( "appointment" ) ); + else if ( i->type() == "Todo" ) + icd->setPixmap( BarIcon( "todo" ) ); + + return icd; +} + +Event *DndFactory::createDrop(QDropEvent *de) +{ + kdDebug(5800) << "DndFactory::createDrop()" << endl; + + CalendarLocal cal( mCalendar->timeZoneId() ); + + if ( ICalDrag::decode( de, &cal ) || VCalDrag::decode( de, &cal ) ) { + de->accept(); + + QPtrList events = cal.events(); + if ( !events.isEmpty() ) { + Event *event = new Event( *events.first() ); + return event; + } + } + + return 0; +} + +Todo *DndFactory::createDropTodo(QDropEvent *de) +{ + kdDebug(5800) << "VCalFormat::createDropTodo()" << endl; + + CalendarLocal cal( mCalendar->timeZoneId() ); + + if ( ICalDrag::decode( de, &cal ) || VCalDrag::decode( de, &cal ) ) { + de->accept(); + + QPtrList todos = cal.todos(); + if ( !todos.isEmpty() ) { + Todo *todo = new Todo( *todos.first() ); + return todo; + } + } + + return 0; +} + + +void DndFactory::cutIncidence( Incidence *selectedInc ) +{ + if ( copyIncidence( selectedInc ) ) { + mCalendar->deleteIncidence( selectedInc ); + } +} + +bool DndFactory::copyIncidence( Incidence *selectedInc ) +{ + if ( !selectedInc ) + return false; + QClipboard *cb = QApplication::clipboard(); + + CalendarLocal cal( mCalendar->timeZoneId() ); + Incidence *inc = selectedInc->clone(); + cal.addIncidence( inc ); + cb->setData( new ICalDrag( &cal ) ); + + return true; +} + +Incidence *DndFactory::pasteIncidence(const QDate &newDate, const QTime *newTime) +{ +// kdDebug(5800) << "DnDFactory::pasteEvent()" << endl; + + CalendarLocal cal( mCalendar->timeZoneId() ); + + QClipboard *cb = QApplication::clipboard(); + + if ( !ICalDrag::decode( cb->data(), &cal ) && + !VCalDrag::decode( cb->data(), &cal ) ) { + kdDebug(5800) << "Can't parse clipboard" << endl; + return 0; + } + + QPtrList incList = cal.incidences(); + Incidence *inc = incList.first(); + + if ( !incList.isEmpty() && inc ) { + inc = inc->clone(); + + inc->recreate(); + + if ( inc->type() == "Event" ) { + + Event *anEvent = static_cast( inc ); + // Calculate length of event + int daysOffset = anEvent->dtStart().date().daysTo( + anEvent->dtEnd().date() ); + // new end date if event starts at the same time on the new day + QDateTime endDate( newDate.addDays(daysOffset), anEvent->dtEnd().time() ); + + if ( newTime ) { + // additional offset for new time of day + int addSecsOffset( anEvent->dtStart().time().secsTo( *newTime )); + endDate=endDate.addSecs( addSecsOffset ); + anEvent->setDtStart( QDateTime( newDate, *newTime ) ); + } else { + anEvent->setDtStart( QDateTime( newDate, anEvent->dtStart().time() ) ); + } + anEvent->setDtEnd( endDate ); + + } else if ( inc->type() == "Todo" ) { + Todo *anTodo = static_cast( inc ); + if ( newTime ) { + anTodo->setDtDue( QDateTime( newDate, *newTime ) ); + } else { + anTodo->setDtDue( QDateTime( newDate, anTodo->dtDue().time() ) ); + } + } else if ( inc->type() == "Journal" ) { + Journal *anJournal = static_cast( inc ); + if ( newTime ) { + anJournal->setDtStart( QDateTime( newDate, *newTime ) ); + } else { + anJournal->setDtStart( QDateTime( newDate ) ); + } + } else { + kdDebug(5850) << "Trying to paste unknown incidence of type " << inc->type() << endl; + } + + return inc; + + } + + return 0; +} diff --git a/libkcal/dndfactory.h b/libkcal/dndfactory.h index 6b73f34..7e2ca04 100644 --- a/libkcal/dndfactory.h +++ b/libkcal/dndfactory.h @@ -1,7 +1,9 @@ /* This file is part of libkcal. + Copyright (c) 1998 Preston Brown - Copyright (c) 2001,2002 Cornelius Schumacher + Copyright (c) 2001,2002,2003 Cornelius Schumacher + Copyright (C) 2003-2004 Reinhold Kainhofer This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -19,42 +21,52 @@ Boston, MA 02111-1307, USA. */ -// $Id$ - #ifndef KCAL_DNDFACTORY_H #define KCAL_DNDFACTORY_H -#include "vcalformat.h" - -class QDropEvent; +//#include "libkcal_export.h" namespace KCal { +class ICalDrag; +class Event; +class Todo; +class Calendar; +#define LIBKCAL_EXPORT + /** This class implements functions to create Drag and Drop objects used for Drag-and-Drop and Copy-and-Paste. - @short vCalendar Drag-and-Drop object factory. + @short vCalendar/iCalendar Drag-and-Drop object factory. */ -class DndFactory { +class LIBKCAL_EXPORT DndFactory +{ public: - DndFactory( Calendar * ) {} + DndFactory( Calendar * ); + + /** + Create a drag object. + */ + ICalDrag *createDrag( Incidence *incidence, QWidget *owner ); - /** create an object to be used with the Xdnd Drag And Drop protocol. */ - ICalDrag *createDrag(Event *, QWidget *) { return 0; } - /** create an object to be used with the Xdnd Drag And Drop protocol. */ - ICalDrag *createDragTodo(Todo *, QWidget *) { return 0; } /** Create Todo object from drop event */ - Todo *createDropTodo(QDropEvent *) { return 0; } + Todo *createDropTodo(QDropEvent *de); /** Create Event object from drop event */ - Event *createDrop(QDropEvent *) { return 0; } - - /** cut event to clipboard */ - void cutEvent(Event *) {} - /** cut, copy, and paste operations follow. */ - bool copyEvent(Event *) { return false; } - /** pastes the event and returns a pointer to the new event pasted. */ - Event *pasteEvent(const QDate &, const QTime *newTime = 0) { return 0; } + Event *createDrop(QDropEvent *de); + + /** cut incidence to clipboard */ + void cutIncidence( Incidence * ); + /** copy the incidence to clipboard */ + bool copyIncidence( Incidence * ); + /** pastes the event or todo and returns a pointer to the new incidence pasted. */ + Incidence *pasteIncidence( const QDate &, const QTime *newTime = 0 ); + + private: + Calendar *mCalendar; + + class Private; + Private *d; }; } diff --git a/libkcal/dndfactory_dummy.h b/libkcal/dndfactory_dummy.h new file mode 100644 index 0000000..6b73f34 --- a/dev/null +++ b/libkcal/dndfactory_dummy.h @@ -0,0 +1,62 @@ +/* + This file is part of libkcal. + Copyright (c) 1998 Preston Brown + Copyright (c) 2001,2002 Cornelius Schumacher + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +// $Id$ + +#ifndef KCAL_DNDFACTORY_H +#define KCAL_DNDFACTORY_H + +#include "vcalformat.h" + +class QDropEvent; + +namespace KCal { + +/** + This class implements functions to create Drag and Drop objects used for + Drag-and-Drop and Copy-and-Paste. + + @short vCalendar Drag-and-Drop object factory. +*/ +class DndFactory { + public: + DndFactory( Calendar * ) {} + + /** create an object to be used with the Xdnd Drag And Drop protocol. */ + ICalDrag *createDrag(Event *, QWidget *) { return 0; } + /** create an object to be used with the Xdnd Drag And Drop protocol. */ + ICalDrag *createDragTodo(Todo *, QWidget *) { return 0; } + /** Create Todo object from drop event */ + Todo *createDropTodo(QDropEvent *) { return 0; } + /** Create Event object from drop event */ + Event *createDrop(QDropEvent *) { return 0; } + + /** cut event to clipboard */ + void cutEvent(Event *) {} + /** cut, copy, and paste operations follow. */ + bool copyEvent(Event *) { return false; } + /** pastes the event and returns a pointer to the new event pasted. */ + Event *pasteEvent(const QDate &, const QTime *newTime = 0) { return 0; } +}; + +} + +#endif diff --git a/libkcal/libkcal.pro b/libkcal/libkcal.pro index 171c726..33c63c3 100644 --- a/libkcal/libkcal.pro +++ b/libkcal/libkcal.pro @@ -59,6 +59,7 @@ kincidenceformatter.h \ recurrence.h \ scheduler.h \ todo.h \ +dndfactory.h \ vcaldrag.h \ vcalformat.h \ versit/port.h \ @@ -98,6 +99,7 @@ SOURCES = \ recurrence.cpp \ scheduler.cpp \ todo.cpp \ +dndfactory.cpp \ vcaldrag.cpp \ vcalformat.cpp \ versit/vcc.c \ -- cgit v0.9.0.2