From b35cd0e8350babc091667a5070f8ff6e359e5750 Mon Sep 17 00:00:00 2001
From: tpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>
Date: Fri, 3 Sep 2010 02:40:06 +0000
Subject: Hacked in a temporary fix for three GroupWare popups showing up when
 a single instance of a recurring meeting is resized in the agenda view

git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1171222 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
---
 korganizer/incidencechanger.cpp                    |  19 +-
 korganizer/incidencechanger.h                      |   5 +
 .../interfaces/korganizer/incidencechangerbase.h   |   6 +
 korganizer/koagenda.cpp                            |   9 +-
 korganizer/kogroupware.cpp                         | 197 +++++++++++----------
 korganizer/kogroupware.h                           |   3 +-
 6 files changed, 140 insertions(+), 99 deletions(-)

diff --git a/korganizer/incidencechanger.cpp b/korganizer/incidencechanger.cpp
index 1c41c5cd..f0dcb7b1 100644
--- a/korganizer/incidencechanger.cpp
+++ b/korganizer/incidencechanger.cpp
@@ -328,6 +328,14 @@ bool IncidenceChanger::myAttendeeStatusChanged( Incidence *oldInc, Incidence *ne
 bool IncidenceChanger::changeIncidence( Incidence *oldinc, Incidence *newinc,
                                         KOGlobals::WhatChanged action,
                                         TQWidget *parent )
+{
+  return changeIncidence( oldinc, newinc, action, parent, 0 );
+}
+
+bool IncidenceChanger::changeIncidence( Incidence *oldinc, Incidence *newinc,
+                                        KOGlobals::WhatChanged action,
+                                        TQWidget *parent,
+                                        int dontAskForGroupware )
 {
 kdDebug(5850)<<"IncidenceChanger::changeIncidence for incidence \""<<newinc->summary()<<"\" ( old one was \""<<oldinc->summary()<<"\")"<<endl;
   if ( incidencesEqual( newinc, oldinc ) ) {
@@ -347,7 +355,7 @@ kdDebug(5850)<<"IncidenceChanger::changeIncidence for incidence \""<<newinc->sum
       success = KOGroupware::instance()->sendICalMessage(
         parent,
         KCal::Scheduler::Request,
-        newinc, KOGlobals::INCIDENCEEDITED, attendeeStatusChanged );
+        newinc, KOGlobals::INCIDENCEEDITED, attendeeStatusChanged, dontAskForGroupware );
     }
 
     if ( success ) {
@@ -365,6 +373,13 @@ kdDebug(5850)<<"IncidenceChanger::changeIncidence for incidence \""<<newinc->sum
 bool IncidenceChanger::addIncidence( Incidence *incidence,
                                      ResourceCalendar *res, const TQString &subRes,
                                      TQWidget *parent )
+{
+  return addIncidence( incidence, res, subRes, parent, 0 );
+}
+
+bool IncidenceChanger::addIncidence( Incidence *incidence,
+                                     ResourceCalendar *res, const TQString &subRes,
+                                     TQWidget *parent, int dontAskForGroupware )
 {
   CalendarResources *stdcal = dynamic_cast<CalendarResources *>( mCalendar );
   if( stdcal && !stdcal->hasCalendarResources() ) {
@@ -440,7 +455,7 @@ bool IncidenceChanger::addIncidence( Incidence *incidence,
     if ( !KOGroupware::instance()->sendICalMessage(
            parent,
            KCal::Scheduler::Request,
-           incidence, KOGlobals::INCIDENCEADDED, false ) ) {
+           incidence, KOGlobals::INCIDENCEADDED, false, dontAskForGroupware ) ) {
       KMessageBox::sorry(
         parent,
         i18n( "Attempt to send the scheduling message failed. "
diff --git a/korganizer/incidencechanger.h b/korganizer/incidencechanger.h
index afa55064..5e559509 100644
--- a/korganizer/incidencechanger.h
+++ b/korganizer/incidencechanger.h
@@ -52,9 +52,14 @@ class IncidenceChanger : public KOrg::IncidenceChangerBase
     bool addIncidence( Incidence *incidence,
                        ResourceCalendar *res, const TQString &subRes,
                        TQWidget *parent );
+    bool addIncidence( Incidence *incidence,
+                       ResourceCalendar *res, const TQString &subRes,
+                       TQWidget *parent, int dontAskForGroupware );
 
     bool changeIncidence( Incidence *oldinc, Incidence *newinc,
                           KOGlobals::WhatChanged, TQWidget *parent );
+    bool changeIncidence( Incidence *oldinc, Incidence *newinc,
+                          KOGlobals::WhatChanged, TQWidget *parent, int dontAskForGroupware );
 
     bool deleteIncidence( Incidence *incidence, TQWidget *parent );
 
diff --git a/korganizer/interfaces/korganizer/incidencechangerbase.h b/korganizer/interfaces/korganizer/incidencechangerbase.h
index e7c13305..ec0288aa 100644
--- a/korganizer/interfaces/korganizer/incidencechangerbase.h
+++ b/korganizer/interfaces/korganizer/incidencechangerbase.h
@@ -57,9 +57,15 @@ public:
   virtual bool addIncidence( Incidence *incidence,
                              ResourceCalendar *res, const TQString &subRes,
                              TQWidget *parent ) = 0;
+  virtual bool addIncidence( Incidence *incidence,
+                             ResourceCalendar *res, const TQString &subRes,
+                             TQWidget *parent, int dontAskForGroupware) = 0;
 
   virtual bool changeIncidence( Incidence *oldinc, Incidence *newinc,
                                 KOGlobals::WhatChanged, TQWidget *parent ) = 0;
+  virtual bool changeIncidence( Incidence *oldinc, Incidence *newinc,
+                                KOGlobals::WhatChanged, TQWidget *parent, int dontAskForGroupware ) = 0;
+
   virtual bool deleteIncidence( Incidence *incidence, TQWidget *parent ) = 0;
 
   virtual bool cutIncidences( const Incidence::List &incidences, TQWidget *parent ) = 0;
diff --git a/korganizer/koagenda.cpp b/korganizer/koagenda.cpp
index 8329d161..bc456a78 100644
--- a/korganizer/koagenda.cpp
+++ b/korganizer/koagenda.cpp
@@ -1109,6 +1109,10 @@ void KOAgenda::endItemAction()
       if ( chosenOption == KOGlobals::ONLY_THIS_ONE ||
            chosenOption == KOGlobals::ONLY_FUTURE ) {
 
+        // FIXME Prompt for this...it is quite possible that the user does not want to broadcast the change
+        // That prompting dialog will require the ability to suppress/override the mChanger->endChange GroupWare communication though.
+        int autoAnswerGroupWare = 1;		// Send all possible GroupWare messages without prompting
+
         // 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();
@@ -1116,15 +1120,16 @@ void KOAgenda::endItemAction()
         int mai_yb = mActionItem->cellYBottom(); 
 
         multiModify = true;
+        emit startMultiModify( i18n("Dissociate event from recurrence") );
         enableAgendaUpdate( false );
 
-        mChanger->addIncidence( incToChange, mResPair.first, mResPair.second, this );
+        mChanger->addIncidence( incToChange, mResPair.first, mResPair.second, this, autoAnswerGroupWare );
         enableAgendaUpdate( true );
         KOGlobals::WhatChanged wc = chosenOption == KOGlobals::ONLY_THIS_ONE ?
                                     KOGlobals::RECURRENCE_MODIFIED_ONE_ONLY :
                                     KOGlobals::RECURRENCE_MODIFIED_ALL_FUTURE;
 
-        mChanger->changeIncidence( oldIncSaved, inc, wc, this );
+        mChanger->changeIncidence( oldIncSaved, inc, wc, this, autoAnswerGroupWare );
 
         // 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
diff --git a/korganizer/kogroupware.cpp b/korganizer/kogroupware.cpp
index 0edcdc9c..7b799eed 100644
--- a/korganizer/kogroupware.cpp
+++ b/korganizer/kogroupware.cpp
@@ -242,7 +242,8 @@ bool KOGroupware::sendICalMessage( TQWidget* parent,
                                    KCal::Scheduler::Method method,
                                    Incidence* incidence,
                                    KOGlobals::HowChanged action,
-                                   bool attendeeStatusChanged )
+                                   bool attendeeStatusChanged,
+                                   int dontAskForGroupware )
 {
   // If there are no attendees, don't bother
   if( incidence->attendees().isEmpty() )
@@ -264,108 +265,116 @@ bool KOGroupware::sendICalMessage( TQWidget* parent,
    *   insists on applying them.
    */
 
-  if ( isOrganizer ) {
-    /* We are the organizer. If there is more than one attendee, or if there is
-     * only one, and it's not the same as the organizer, ask the user to send
-     * mail. */
-    if ( incidence->attendees().count() > 1
-        || incidence->attendees().first()->email() != incidence->organizer().email() ) {
-
-      TQString txt;
-      switch( action ) {
-      case KOGlobals::INCIDENCEEDITED:
-        txt = i18n( "You changed the invitation \"%1\".\n"
-                    "Do you want to email the attendees an update message?" ).
-              arg( incidence->summary() );
-        break;
-      case KOGlobals::INCIDENCEDELETED:
-        Q_ASSERT( incidence->type() == "Event" || incidence->type() == "Todo" );
-        if ( incidence->type() == "Event" ) {
-          txt = i18n( "You removed the invitation \"%1\".\n"
-                      "Do you want to email the attendees that the event is canceled?" ).
-                arg( incidence->summary() );
-        } else if ( incidence->type() == "Todo" ) {
-          txt = i18n( "You removed the invitation \"%1\".\n"
-                      "Do you want to email the attendees that the todo is canceled?" ).
-                arg( incidence->summary() );
-        }
-        break;
-      case KOGlobals::INCIDENCEADDED:
-        if ( incidence->type() == "Event" ) {
-          txt = i18n( "The event \"%1\" includes other people.\n"
-                      "Do you want to email the invitation to the attendees?" ).
-                arg( incidence->summary() );
-        } else if ( incidence->type() == "Todo" ) {
-          txt = i18n( "The todo \"%1\" includes other people.\n"
-                      "Do you want to email the invitation to the attendees?" ).
+  if ( dontAskForGroupware == 1 ) {
+    rc = KMessageBox::Yes;
+  }
+  else if ( dontAskForGroupware == 2 ) {
+    rc = KMessageBox::No;
+  }
+  else {
+    if ( isOrganizer ) {
+      /* We are the organizer. If there is more than one attendee, or if there is
+       * only one, and it's not the same as the organizer, ask the user to send
+       * mail. */
+      if ( incidence->attendees().count() > 1
+          || incidence->attendees().first()->email() != incidence->organizer().email() ) {
+
+        TQString txt;
+        switch( action ) {
+        case KOGlobals::INCIDENCEEDITED:
+          txt = i18n( "You changed the invitation \"%1\".\n"
+                      "Do you want to email the attendees an update message?" ).
                 arg( incidence->summary() );
-        } else {
-          txt = i18n( "This incidence includes other people. "
-                      "Should an email be sent to the attendees?" );
+          break;
+        case KOGlobals::INCIDENCEDELETED:
+          Q_ASSERT( incidence->type() == "Event" || incidence->type() == "Todo" );
+          if ( incidence->type() == "Event" ) {
+            txt = i18n( "You removed the invitation \"%1\".\n"
+                        "Do you want to email the attendees that the event is canceled?" ).
+                  arg( incidence->summary() );
+          } else if ( incidence->type() == "Todo" ) {
+            txt = i18n( "You removed the invitation \"%1\".\n"
+                        "Do you want to email the attendees that the todo is canceled?" ).
+                  arg( incidence->summary() );
+          }
+          break;
+        case KOGlobals::INCIDENCEADDED:
+          if ( incidence->type() == "Event" ) {
+            txt = i18n( "The event \"%1\" includes other people.\n"
+                        "Do you want to email the invitation to the attendees?" ).
+                  arg( incidence->summary() );
+          } else if ( incidence->type() == "Todo" ) {
+            txt = i18n( "The todo \"%1\" includes other people.\n"
+                        "Do you want to email the invitation to the attendees?" ).
+                  arg( incidence->summary() );
+          } else {
+            txt = i18n( "This incidence includes other people. "
+                        "Should an email be sent to the attendees?" );
+          }
+          break;
+        default:
+          kdError() << "Unsupported HowChanged action" << int( action ) << endl;
+          break;
         }
-        break;
-      default:
-        kdError() << "Unsupported HowChanged action" << int( action ) << endl;
-        break;
-      }
 
-      rc = KMessageBox::questionYesNo(
-             parent, txt, i18n( "Group Scheduling Email" ),
-             KGuiItem( i18n( "Send Email" ) ), KGuiItem( i18n( "Do Not Send" ) ) );
-    } else {
-      return true;
-    }
-  } else if( incidence->type() == "Todo" ) {
-    if( method == Scheduler::Request )
-      // This is an update to be sent to the organizer
-      method = Scheduler::Reply;
-
-    // Ask if the user wants to tell the organizer about the current status
-    TQString txt = i18n( "Do you want to send a status update to the "
-                        "organizer of this task?");
-    rc = KMessageBox::questionYesNo( parent, txt, TQString::null, i18n("Send Update"), i18n("Do Not Send") );
-  } else if( incidence->type() == "Event" ) {
-    TQString txt;
-    if ( attendeeStatusChanged && method == Scheduler::Request ) {
-      txt = i18n( "Your status as an attendee of this event changed. "
-                  "Do you want to send a status update to the event organizer?" );
-      method = Scheduler::Reply;
+        rc = KMessageBox::questionYesNo(
+               parent, txt, i18n( "Group Scheduling Email" ),
+               KGuiItem( i18n( "Send Email" ) ), KGuiItem( i18n( "Do Not Send" ) ) );
+      } else {
+        return true;
+      }
+    } else if( incidence->type() == "Todo" ) {
+      if( method == Scheduler::Request )
+        // This is an update to be sent to the organizer
+        method = Scheduler::Reply;
+
+      // Ask if the user wants to tell the organizer about the current status
+      TQString txt = i18n( "Do you want to send a status update to the "
+                          "organizer of this task?");
       rc = KMessageBox::questionYesNo( parent, txt, TQString::null, i18n("Send Update"), i18n("Do Not Send") );
-    } else {
-      if( action == KOGlobals::INCIDENCEDELETED ) {
-        const TQStringList myEmails = KOPrefs::instance()->allEmails();
-        bool askConfirmation = false;
-        for ( TQStringList::ConstIterator it = myEmails.begin(); it != myEmails.end(); ++it ) {
-          TQString email = *it;
-          Attendee *me = incidence->attendeeByMail(email);
-          if (me && (me->status()==KCal::Attendee::Accepted || me->status()==KCal::Attendee::Delegated)) {
-            askConfirmation = true;
-            break;
+    } else if( incidence->type() == "Event" ) {
+      TQString txt;
+      if ( attendeeStatusChanged && method == Scheduler::Request ) {
+        txt = i18n( "Your status as an attendee of this event changed. "
+                    "Do you want to send a status update to the event organizer?" );
+        method = Scheduler::Reply;
+        rc = KMessageBox::questionYesNo( parent, txt, TQString::null, i18n("Send Update"), i18n("Do Not Send") );
+      } else {
+        if( action == KOGlobals::INCIDENCEDELETED ) {
+          const TQStringList myEmails = KOPrefs::instance()->allEmails();
+          bool askConfirmation = false;
+          for ( TQStringList::ConstIterator it = myEmails.begin(); it != myEmails.end(); ++it ) {
+            TQString email = *it;
+            Attendee *me = incidence->attendeeByMail(email);
+            if (me && (me->status()==KCal::Attendee::Accepted || me->status()==KCal::Attendee::Delegated)) {
+              askConfirmation = true;
+              break;
+            }
           }
-        }
 
-        if ( !askConfirmation ) {
-          return true;
-        }
+          if ( !askConfirmation ) {
+            return true;
+          }
 
-        txt = i18n( "You had previously accepted an invitation to this event. "
-                    "Do you want to send an updated response to the organizer "
-                    "declining the invitation?" );
-        rc = KMessageBox::questionYesNo(
-          parent, txt, i18n( "Group Scheduling Email" ),
-          KGuiItem( i18n( "Send Update" ) ), KGuiItem( i18n( "Do Not Send" ) ) );
-        setDoNotNotify( rc == KMessageBox::No );
-      } else {
-        txt = i18n( "You are not the organizer of this event. Editing it will "
-                    "bring your calendar out of sync with the organizer's calendar. "
-                    "Do you really want to edit it?" );
-        rc = KMessageBox::warningYesNo( parent, txt );
-        return ( rc == KMessageBox::Yes );
+          txt = i18n( "You had previously accepted an invitation to this event. "
+                      "Do you want to send an updated response to the organizer "
+                      "declining the invitation?" );
+          rc = KMessageBox::questionYesNo(
+            parent, txt, i18n( "Group Scheduling Email" ),
+            KGuiItem( i18n( "Send Update" ) ), KGuiItem( i18n( "Do Not Send" ) ) );
+          setDoNotNotify( rc == KMessageBox::No );
+        } else {
+          txt = i18n( "You are not the organizer of this event. Editing it will "
+                      "bring your calendar out of sync with the organizer's calendar. "
+                      "Do you really want to edit it?" );
+          rc = KMessageBox::warningYesNo( parent, txt );
+          return ( rc == KMessageBox::Yes );
+        }
       }
+    } else {
+      kdWarning(5850) << "Groupware messages for Journals are not implemented yet!" << endl;
+      return true;
     }
-  } else {
-    kdWarning(5850) << "Groupware messages for Journals are not implemented yet!" << endl;
-    return true;
   }
 
   if ( rc == KMessageBox::Yes ) {
diff --git a/korganizer/kogroupware.h b/korganizer/kogroupware.h
index f6695de0..5df80a6a 100644
--- a/korganizer/kogroupware.h
+++ b/korganizer/kogroupware.h
@@ -78,7 +78,8 @@ class KOGroupware : public QObject
     bool sendICalMessage( TQWidget *parent, KCal::Scheduler::Method method,
                           Incidence* incidence,
                           KOGlobals::HowChanged action,
-                          bool attendeeStatusChanged );
+                          bool attendeeStatusChanged,
+                          int dontAskForGroupware = 0 );
 
     /**
       Send counter proposal message.
-- 
cgit v1.2.3

