From 8ce63b1df3d811bb203a9e88cb23ea9a70216c35 Mon Sep 17 00:00:00 2001 From: tpearson Date: Sun, 29 Aug 2010 18:08:07 +0000 Subject: * Fixed crash when modifying single instance of recurring meeeting in agenda view * Allow CalDAV tasks read/write to continue even if events read/write failed * Documentation cleanup git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1169577 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- korganizer/calendarview.cpp | 8 ++-- korganizer/koagenda.cpp | 91 +++++++++++++++++++++++++++++++++------------ 2 files changed, 72 insertions(+), 27 deletions(-) (limited to 'korganizer') diff --git a/korganizer/calendarview.cpp b/korganizer/calendarview.cpp index ae4a5b6e2..eb294fe74 100644 --- a/korganizer/calendarview.cpp +++ b/korganizer/calendarview.cpp @@ -1258,9 +1258,11 @@ void CalendarView::dissociateOccurrence( Incidence *incidence, const TQDate &dat Incidence* newInc = mCalendar->dissociateOccurrence( incidence, date, true ); if ( newInc ) { - // TODO: Use the same resource instead of asking again! - mChanger->changeIncidence( oldincidence, incidence ); - mChanger->addIncidence( newInc, this ); + // TODO [FIXME]: Use the same resource instead of asking again! + // See also koagenda.cpp: endItemAction() + bool success = mChanger->addIncidence( newInc, this ); + if ( success ) + mChanger->changeIncidence( oldincidence, incidence ); } else { KMessageBox::sorry( this, i18n("Dissociating the occurrence failed."), i18n("Dissociating Failed") ); diff --git a/korganizer/koagenda.cpp b/korganizer/koagenda.cpp index 270ca8f80..589c13285 100644 --- a/korganizer/koagenda.cpp +++ b/korganizer/koagenda.cpp @@ -1046,6 +1046,12 @@ void KOAgenda::endItemAction() bool multiModify = false; // FIXME: do the cloning here... Incidence* inc = mActionItem->incidence(); + // Store modification information in case it is needed to recreate the changes with a new actionitem... + int mai_xl = mActionItem->cellXLeft(); + int mai_xr = mActionItem->cellXRight(); + int mai_yt = mActionItem->cellYTop(); + int mai_yb = mActionItem->cellYBottom(); + Incidence* newInc; if ( mItemMoved ) { bool modify = true; @@ -1061,6 +1067,9 @@ void KOAgenda::endItemAction() // Moving the whole sequene of events is handled by the itemModified below. modify = true; break; + // FIXME: The following two cases do the following bad things: + // 1. Pop up a message box asking which resource to save the disassociated event to (!) + // 2. Crash at mActionItem->endMove(); below. case KMessageBox::Yes: { // Just this occurrence // Dissociate this occurrence: // create clone of event, set relation to old event, set cloned event @@ -1073,16 +1082,18 @@ void KOAgenda::endItemAction() emit startMultiModify( i18n("Dissociate event from recurrence") ); Incidence* oldInc = mActionItem->incidence(); Incidence* oldIncSaved = mActionItem->incidence()->clone(); - Incidence* newInc = mCalendar->dissociateOccurrence( + newInc = mCalendar->dissociateOccurrence( oldInc, mActionItem->itemDate() ); if ( newInc ) { // don't recreate items, they already have the correct position emit enableAgendaUpdate( false ); mActionItem->dissociateFromMultiItem(); mActionItem->setIncidence( newInc ); - mChanger->addIncidence( newInc, this ); + bool success = mChanger->addIncidence( newInc, this ); emit enableAgendaUpdate( true ); - mChanger->changeIncidence( oldIncSaved, oldInc ); + if ( success ) { + mChanger->changeIncidence( oldIncSaved, oldInc ); + } } else { KMessageBox::sorry( this, i18n("Unable to add the exception item to the " "calendar. No change will be done."), i18n("Error Occurred") ); @@ -1101,15 +1112,17 @@ void KOAgenda::endItemAction() emit startMultiModify( i18n("Split future recurrences") ); Incidence* oldInc = mActionItem->incidence(); Incidence* oldIncSaved = mActionItem->incidence()->clone(); - Incidence* newInc = mCalendar->dissociateOccurrence( + newInc = mCalendar->dissociateOccurrence( oldInc, mActionItem->itemDate(), false ); if ( newInc ) { emit enableAgendaUpdate( false ); mActionItem->dissociateFromMultiItem(); mActionItem->setIncidence( newInc ); - mChanger->addIncidence( newInc, this ); + bool success = mChanger->addIncidence( newInc, this ); emit enableAgendaUpdate( true ); - mChanger->changeIncidence( oldIncSaved, oldInc ); + if ( success ) { + mChanger->changeIncidence( oldIncSaved, oldInc ); + } } else { KMessageBox::sorry( this, i18n("Unable to add the future items to the " "calendar. No change will be done."), i18n("Error Occurred") ); @@ -1124,28 +1137,58 @@ void KOAgenda::endItemAction() } if ( modify ) { - mActionItem->endMove(); - KOAgendaItem *placeItem = mActionItem->firstMultiItem(); - if ( !placeItem ) { - placeItem = mActionItem; + if ( multiModify ) { + // mActionItem does not exist any more, seeing as we just got done deleting it + // (by deleting/replacing the original incidence it was created from through + // user modification of said incidence) above! + // Therefore we have to find the new KOAgendaItem that matches the new incidence + // Then we can apply the saved X/Y settings from the original move operation as shown. + + KOAgendaItem *koai_insertedItem; + for ( koai_insertedItem = mItems.first(); koai_insertedItem; koai_insertedItem = mItems.next() ) { + if (koai_insertedItem->incidence() == newInc) { + selectItem( koai_insertedItem ); + mSelectedItem->startMove(); + mSelectedItem->setCellY(mai_yt, mai_yb); + mSelectedItem->setCellX(mai_xl, mai_xr); + mActionItem = mSelectedItem; + //mSelectedItem->endMove(); + break; + } + } + +// mActionItem->startMove(); +// mActionItem->setCellY(mai_yt, mai_yb); +// mActionItem->setCellX(mai_xl, mai_xr); +// mActionItem->endMove(); } + } + + if ( modify ) { +// if ( !multiModify ) { + mActionItem->endMove(); + KOAgendaItem *placeItem = mActionItem->firstMultiItem(); + if ( !placeItem ) { + placeItem = mActionItem; + } - KOAgendaItem *modif = placeItem; + KOAgendaItem *modif = placeItem; - TQPtrList oldconflictItems = placeItem->conflictItems(); - KOAgendaItem *item; - for ( item = oldconflictItems.first(); item != 0; - item = oldconflictItems.next() ) { - placeSubCells( item ); - } - while ( placeItem ) { - placeSubCells( placeItem ); - placeItem = placeItem->nextMultiItem(); - } + TQPtrList oldconflictItems = placeItem->conflictItems(); + KOAgendaItem *item; + for ( item = oldconflictItems.first(); item != 0; + item = oldconflictItems.next() ) { + placeSubCells( item ); + } + while ( placeItem ) { + placeSubCells( placeItem ); + placeItem = placeItem->nextMultiItem(); + } - // Notify about change - // the agenda view will apply the changes to the actual Incidence*! - emit itemModified( modif ); + // Notify about change + // the agenda view will apply the changes to the actual Incidence*! + emit itemModified( modif ); +// } } // FIXME: If the change failed, we need to update the view! mChanger->endChange( inc ); -- cgit v1.2.1