summaryrefslogtreecommitdiffstats
path: root/korganizer/koagenda.cpp
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-08-29 18:08:07 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-08-29 18:08:07 +0000
commit8ce63b1df3d811bb203a9e88cb23ea9a70216c35 (patch)
treed88cbcc03d717201bf5667220290be2d9d6dca22 /korganizer/koagenda.cpp
parent5abbdb459be7870848ef16691174e91c68958304 (diff)
downloadtdepim-8ce63b1df3d811bb203a9e88cb23ea9a70216c35.tar.gz
tdepim-8ce63b1df3d811bb203a9e88cb23ea9a70216c35.zip
* 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
Diffstat (limited to 'korganizer/koagenda.cpp')
-rw-r--r--korganizer/koagenda.cpp91
1 files changed, 67 insertions, 24 deletions
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<KOAgendaItem> oldconflictItems = placeItem->conflictItems();
- KOAgendaItem *item;
- for ( item = oldconflictItems.first(); item != 0;
- item = oldconflictItems.next() ) {
- placeSubCells( item );
- }
- while ( placeItem ) {
- placeSubCells( placeItem );
- placeItem = placeItem->nextMultiItem();
- }
+ TQPtrList<KOAgendaItem> 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 );