From cc29364f06178f8f6b457384f2ec37a042bd9d43 Mon Sep 17 00:00:00 2001 From: tpearson Date: Wed, 1 Sep 2010 00:37:02 +0000 Subject: * Massive set of changes to bring in all fixes and enhancements from the Enterprise PIM branch * Ensured that the Trinity changes were applied on top of those enhancements, and any redundancy removed * Added journal read support to the CalDAV resource * Fixed CalDAV resource to use events URL for tasks and journals when separate URL checkbox unchecked git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdepim@1170461 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- korganizer/actionmanager.cpp | 323 ++++++++++++++++++++++++++++++++----------- 1 file changed, 246 insertions(+), 77 deletions(-) (limited to 'korganizer/actionmanager.cpp') diff --git a/korganizer/actionmanager.cpp b/korganizer/actionmanager.cpp index 99939ef1c..b9df9e869 100644 --- a/korganizer/actionmanager.cpp +++ b/korganizer/actionmanager.cpp @@ -26,7 +26,7 @@ */ #include "actionmanager.h" - +#include "previewdialog.h" #include "alarmclient.h" #include "calendarview.h" #include "kocore.h" @@ -34,13 +34,15 @@ #include "koglobals.h" #include "koprefs.h" #include "koviewmanager.h" +#include "koagendaview.h" +#include "multiagendaview.h" #include "kowindowlist.h" #include "kprocess.h" #include "konewstuff.h" #include "history.h" #include "kogroupware.h" #include "resourceview.h" -#include "importdialog.h" +#include "previewdialog.h" #include "eventarchiver.h" #include "stdcalendar.h" #include "freebusymanager.h" @@ -68,13 +70,13 @@ #include #include #include +#include #include #include #include #include - // FIXME: Several places in the file don't use KConfigXT yet! KOWindowList *ActionManager::mWindowList = 0; @@ -153,12 +155,12 @@ void ActionManager::init() connect( mCalendarView, TQT_SIGNAL( modifiedChanged( bool ) ), TQT_SLOT( setTitle() ) ); connect( mCalendarView, TQT_SIGNAL( configChanged() ), TQT_SLOT( updateConfig() ) ); - connect( mCalendarView, TQT_SIGNAL( incidenceSelected( Incidence * ) ), - this, TQT_SLOT( processIncidenceSelection( Incidence * ) ) ); + connect( mCalendarView, TQT_SIGNAL( incidenceSelected( Incidence *,const TQDate & ) ), + this, TQT_SLOT( processIncidenceSelection( Incidence *,const TQDate & ) ) ); connect( mCalendarView, TQT_SIGNAL( exportHTML( HTMLExportSettings * ) ), this, TQT_SLOT( exportHTML( HTMLExportSettings * ) ) ); - processIncidenceSelection( 0 ); + processIncidenceSelection( 0, TQDate() ); // Update state of paste action mCalendarView->checkClipboard(); @@ -197,7 +199,7 @@ void ActionManager::createCalendarResources() mResourceView = factory.resourceView(); connect( mCalendarResources, TQT_SIGNAL( calendarChanged() ), - mCalendarView, TQT_SLOT(resourcesChanged() ) ); + mCalendarView, TQT_SLOT( resourcesChanged() ) ); connect( mCalendarResources, TQT_SIGNAL( signalErrorMessage( const TQString & ) ), mCalendarView, TQT_SLOT( showErrorMessage( const TQString & ) ) ); @@ -250,9 +252,9 @@ void ActionManager::initActions() //~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT / EXPORT ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - new KAction( i18n("Import &Calendar..."), 0, this, TQT_SLOT( file_merge() ), + new KAction( i18n("Import &Event/Calendar (ICS-/VCS-File)..."), 0, this, TQT_SLOT( file_merge() ), mACollection, "import_icalendar" ); - new KAction( i18n("&Import From UNIX Ical tool"), 0, this, TQT_SLOT( file_icalimport() ), + new KAction( i18n("&Import From UNIX Ical tool (.calendar-File)"), 0, this, TQT_SLOT( file_icalimport() ), mACollection, "import_ical" ); new KAction( i18n("Get &Hot New Stuff..."), 0, this, TQT_SLOT( downloadNewStuff() ), mACollection, @@ -312,10 +314,10 @@ void ActionManager::initActions() mACollection, "edit_delete" ); if ( mIsPart ) { KStdAction::find( mCalendarView->dialogManager(), TQT_SLOT( showSearchDialog() ), - mACollection, "korganizer_find" ); + mACollection, "korganizer_find" ); } else { KStdAction::find( mCalendarView->dialogManager(), TQT_SLOT( showSearchDialog() ), - mACollection ); + mACollection ); } pasteAction->setEnabled( false ); mUndoAction->setEnabled( false ); @@ -447,11 +449,11 @@ void ActionManager::initActions() //************************** Actions MENU ********************************* new KAction( i18n("New E&vent..."), KOGlobals::self()->smallIcon( "newappointment" ), 0, - mCalendarView, TQT_SLOT( newEvent() ), + mCalendarView, TQT_SLOT(newEvent()), mACollection, "new_event" ); new KAction( i18n("New &To-do..."), KOGlobals::self()->smallIcon( "newtodo" ), 0, - mCalendarView, TQT_SLOT( newTodo() ), + mCalendarView, TQT_SLOT(newTodo()), mACollection, "new_todo" ); action = new KAction( i18n("New Su&b-to-do..."), 0, mCalendarView,TQT_SLOT( newSubTodo() ), @@ -461,7 +463,7 @@ void ActionManager::initActions() action,TQT_SLOT( setEnabled( bool ) ) ); new KAction( i18n("New &Journal..."), KOGlobals::self()->smallIcon( "newjournal" ), 0, - mCalendarView, TQT_SLOT( newJournal() ), + mCalendarView, TQT_SLOT(newJournal()), mACollection, "new_journal" ); mShowIncidenceAction = new KAction( i18n("&Show"), 0, @@ -498,40 +500,42 @@ void ActionManager::initActions() mACollection, "schedule_publish" ); mPublishEvent->setEnabled( false ); - action = new KAction( i18n("Send &Invitation to Attendees"),"mail_generic",0, - mCalendarView,TQT_SLOT( schedule_request() ), - mACollection,"schedule_request" ); - action->setEnabled( false ); - connect( mCalendarView, TQT_SIGNAL( organizerEventsSelected( bool ) ), - action, TQT_SLOT( setEnabled( bool ) ) ); - - action = new KAction( i18n("Re&quest Update"), 0, - mCalendarView, TQT_SLOT( schedule_refresh() ), - mACollection, "schedule_refresh" ); - action->setEnabled( false ); - connect( mCalendarView,TQT_SIGNAL( groupEventsSelected( bool ) ), - action,TQT_SLOT( setEnabled( bool ) ) ); - - action = new KAction( i18n("Send &Cancelation to Attendees"), 0, - mCalendarView, TQT_SLOT( schedule_cancel() ), - mACollection, "schedule_cancel" ); - action->setEnabled( false ); - connect( mCalendarView,TQT_SIGNAL( organizerEventsSelected( bool ) ), - action,TQT_SLOT( setEnabled( bool ) ) ); - - action = new KAction( i18n("Send Status &Update"),"mail_reply",0, - mCalendarView,TQT_SLOT( schedule_reply() ), - mACollection,"schedule_reply" ); - action->setEnabled( false ); - connect( mCalendarView,TQT_SIGNAL( groupEventsSelected( bool ) ), - action,TQT_SLOT( setEnabled( bool ) ) ); - - action = new KAction( i18n("counter proposal","Request Chan&ge"),0, - mCalendarView,TQT_SLOT( schedule_counter() ), - mACollection, "schedule_counter" ); - action->setEnabled( false ); - connect( mCalendarView,TQT_SIGNAL( groupEventsSelected( bool ) ), - action,TQT_SLOT( setEnabled( bool ) ) ); + mSendInvitation = new KAction( i18n( "Send &Invitation to Attendees" ), + "mail_generic", 0, + mCalendarView, TQT_SLOT(schedule_request()), + mACollection, "schedule_request" ); + mSendInvitation->setEnabled( false ); + connect( mCalendarView, TQT_SIGNAL(organizerEventsSelected(bool)), + mSendInvitation, TQT_SLOT(setEnabled(bool)) ); + + mRequestUpdate = new KAction( i18n( "Re&quest Update" ), 0, + mCalendarView, TQT_SLOT(schedule_refresh()), + mACollection, "schedule_refresh" ); + mRequestUpdate->setEnabled( false ); + connect( mCalendarView, TQT_SIGNAL(groupEventsSelected(bool)), + mRequestUpdate, TQT_SLOT(setEnabled(bool)) ); + + mSendCancel = new KAction( i18n( "Send &Cancelation to Attendees" ), 0, + mCalendarView, TQT_SLOT(schedule_cancel()), + mACollection, "schedule_cancel" ); + mSendCancel->setEnabled( false ); + connect( mCalendarView, TQT_SIGNAL(organizerEventsSelected(bool)), + mSendCancel, TQT_SLOT(setEnabled(bool)) ); + + mSendStatusUpdate = new KAction( i18n( "Send Status &Update" ), + "mail_reply", 0, + mCalendarView,TQT_SLOT(schedule_reply()), + mACollection, "schedule_reply" ); + mSendStatusUpdate->setEnabled( false ); + connect( mCalendarView, TQT_SIGNAL(groupEventsSelected(bool)), + mSendStatusUpdate, TQT_SLOT(setEnabled(bool)) ); + + mRequestChange = new KAction( i18n( "counter proposal", "Request Chan&ge" ), 0, + mCalendarView, TQT_SLOT(schedule_counter()), + mACollection, "schedule_counter" ); + mRequestChange->setEnabled( false ); + connect( mCalendarView, TQT_SIGNAL(groupEventsSelected(bool)), + mRequestChange, TQT_SLOT(setEnabled(bool)) ); mForwardEvent = new KAction( i18n("&Send as iCalendar..."), "mail_forward", 0, mCalendarView, TQT_SLOT(schedule_forward()), @@ -719,7 +723,7 @@ void ActionManager::file_open( const KURL &url ) // is that URL already opened somewhere else? Activate that window KOrg::MainWindow *korg=ActionManager::findInstance( url ); if ( ( 0 != korg )&&( korg != mMainWindow ) ) { - KWin::setActiveWindow( korg->topLevelWidget()->winId() ); + KWin::activateWindow( korg->topLevelWidget()->winId() ); return; } @@ -745,7 +749,7 @@ void ActionManager::file_icalimport() if ( !TQFile::exists( homeDir ) ) { KMessageBox::error( dialogParent(), - i18n( "You have no ical file in your home directory.\n" + i18n( "You have no .calendar file in your home directory.\n" "Import cannot proceed.\n" ) ); return; } @@ -1055,6 +1059,11 @@ void ActionManager::exportHTML( HTMLExportSettings *settings ) { if ( !settings || settings->outputFile().isEmpty() ) return; + kdDebug()<<" settings->outputFile() :"<outputFile()<outputFile() ).exists() ) { + if(KMessageBox::questionYesNo( dialogParent(), i18n("Do you want to overwrite file \"%1\"").arg( settings->outputFile()) ) == KMessageBox::No) + return; + } settings->setEMail( KOPrefs::instance()->email() ); settings->setName( KOPrefs::instance()->fullName() ); @@ -1376,11 +1385,16 @@ TQString ActionManager::getCurrentURLasString() const return mURL.url(); } -bool ActionManager::editIncidence( const TQString& uid ) +bool ActionManager::editIncidence( const TQString &uid ) { return mCalendarView->editIncidence( uid ); } +bool ActionManager::editIncidence( const TQString &uid, const TQDate &date ) +{ + return mCalendarView->editIncidence( uid, date ); +} + bool ActionManager::deleteIncidence( const TQString& uid, bool force ) { return mCalendarView->deleteIncidence( uid, force ); @@ -1454,7 +1468,7 @@ class ActionManager::ActionStringsVisitor : public IncidenceBase::Visitor KAction *mDelete; }; -void ActionManager::processIncidenceSelection( Incidence *incidence ) +void ActionManager::processIncidenceSelection( Incidence *incidence, const TQDate & ) { // kdDebug(5850) << "ActionManager::processIncidenceSelection()" << endl; @@ -1490,6 +1504,11 @@ void ActionManager::enableIncidenceActions( bool enabled ) mDeleteAction->setEnabled( enabled ); mPublishEvent->setEnabled( enabled ); mForwardEvent->setEnabled( enabled ); + mSendInvitation->setEnabled( enabled ); + mSendCancel->setEnabled( enabled ); + mSendStatusUpdate->setEnabled( enabled ); + mRequestChange->setEnabled( enabled ); + mRequestUpdate->setEnabled( enabled ); } void ActionManager::keyBindings() @@ -1525,16 +1544,108 @@ KCalendarIface::ResourceRequestReply ActionManager::resourceRequest( const TQVal return reply; } +QPair ActionManager::viewSubResourceCalendar() +{ + QPair p( 0, TQString() ); + + // return now if we are running as a part and we aren't the currently active part + if ( mIsPart && !mMainWindow->isCurrentlyActivePart() ) { + return p; + } + + KOrg::BaseView *cV = mCalendarView->viewManager()->currentView(); + if ( cV && cV == mCalendarView->viewManager()->multiAgendaView() ) { + cV = mCalendarView->viewManager()->multiAgendaView()->selectedAgendaView(); + } + if ( cV ) { + p = qMakePair( cV->resourceCalendar(), cV->subResourceCalendar() ); + } + return p; +} + +bool ActionManager::isWritable( ResourceCalendar *res, const TQString &subRes, + const TQString &contentsType ) +{ + + if ( res && res->isActive() ) { + // Check specified resource for writability. + if ( res->readOnly() || !res->subresourceWritable( subRes ) ) { + TQString resName = res->resourceName(); + if ( res->canHaveSubresources() ) { + resName = res->labelForSubresource( subRes ); + } + KMessageBox::sorry( + dialogParent(), + i18n( "\"%1\" is read-only. " + "Please select a writable calendar before attempting to create a new item." ). + arg( resName ), + i18n( "Read-only calendar" ) ); + return false; + } else { + return true; + } + } else { + // No specific resource so let's check all possible calendars for writability. + CalendarResourceManager *m = mCalendarResources->resourceManager(); + CalendarResourceManager::ActiveIterator it; + for ( it = m->activeBegin(); it != m->activeEnd(); ++it ) { + ResourceCalendar *res = (*it); + if ( res->canHaveSubresources() ) { + TQStringList subResources = res->subresources(); + for ( TQStringList::ConstIterator subit = subResources.constBegin(); + subit != subResources.constEnd(); ++subit ) { + if ( res->subresourceWritable( (*subit) ) && res->subresourceActive( (*subit) ) ) { + if ( res->subresourceType( *subit ).isEmpty() || + res->subresourceType( *subit ) == contentsType ) { + return true; + } + } + } + } else if ( !res->readOnly() ) { + return true; + } + } + // we don't have any writable calendars + TQString errorText; + if ( contentsType == "event" ) { + errorText = + i18n( "You have no active, writable event folder so saving will not be possible.\n" + "Please create or activate at least one writable event folder and try again." ); + } else if ( contentsType == "todo" ) { + errorText = + i18n( "You have no active, writable to-do (task) folders so saving will not be possible.\n" + "Please create or activate at least one writable to-do folder and try again." ); + } else if ( contentsType == "journal" ) { + errorText = + i18n( "You have no active, writable journal folder so saving will not be possible.\n" + "Please create or activate at least one writable journal folder and try again." ); + } else { + errorText = + i18n( "You have no active, writable calendar folder so saving will not be possible.\n" + "Please create or activate at least one writable calendar folder and try again." ); + } + KMessageBox::sorry( + dialogParent(), + errorText, + i18n( "No writable calendar" ) ); + return false; + } +} + void ActionManager::openEventEditor( const TQString& text ) { - mCalendarView->newEvent( text ); + QPairp = viewSubResourceCalendar(); + if ( isWritable( p.first, p.second, "event" ) ) { + mCalendarView->newEvent( p.first, p.second, text ); + } } void ActionManager::openEventEditor( const TQString& summary, const TQString& description, const TQString& attachment ) { - mCalendarView->newEvent( summary, description, attachment ); + QPairp = viewSubResourceCalendar(); + mCalendarView->newEvent( p.first, p.second, summary, description, attachment ); } void ActionManager::openEventEditor( const TQString& summary, @@ -1542,7 +1653,7 @@ void ActionManager::openEventEditor( const TQString& summary, const TQString& attachment, const TQStringList& attendees ) { - mCalendarView->newEvent( summary, description, attachment, attendees ); + mCalendarView->newEvent( 0, TQString(), summary, description, attachment, attendees ); } void ActionManager::openEventEditor( const TQString & summary, @@ -1637,19 +1748,25 @@ void ActionManager::openEventEditor( const TQString & summary, return; } - mCalendarView->newEvent( summary, description, attData, attendees, attachmentMimetype, action != KOPrefs::Link ); + QPairp = viewSubResourceCalendar(); + mCalendarView->newEvent( p.first, p.second, summary, description, attData, + attendees, attachmentMimetype, action != KOPrefs::Link ); } void ActionManager::openTodoEditor( const TQString& text ) { - mCalendarView->newTodo( text ); + QPairp = viewSubResourceCalendar(); + if ( isWritable( p.first, p.second, "todo" ) ) { + mCalendarView->newTodo( p.first, p.second, text ); + } } void ActionManager::openTodoEditor( const TQString& summary, const TQString& description, const TQString& attachment ) { - mCalendarView->newTodo( summary, description, attachment ); + QPairp = viewSubResourceCalendar(); + mCalendarView->newTodo( p.first, p.second, summary, description, attachment ); } void ActionManager::openTodoEditor( const TQString& summary, @@ -1657,7 +1774,8 @@ void ActionManager::openTodoEditor( const TQString& summary, const TQString& attachment, const TQStringList& attendees ) { - mCalendarView->newTodo( summary, description, attachment, attendees ); + QPairp = viewSubResourceCalendar(); + mCalendarView->newTodo( p.first, p.second, summary, description, attachment, attendees ); } void ActionManager::openTodoEditor(const TQString & summary, @@ -1665,7 +1783,8 @@ void ActionManager::openTodoEditor(const TQString & summary, const TQString & uri, const TQString & file, const TQStringList & attendees, - const TQString & attachmentMimetype) + const TQString & attachmentMimetype, + bool isTask ) { int action = KOPrefs::instance()->defaultTodoAttachMethod(); if ( attachmentMimetype != "message/rfc822" ) { @@ -1680,37 +1799,48 @@ void ActionManager::openTodoEditor(const TQString & summary, delete menu; } - TQString attData; + TQStringList attData; switch ( action ) { case KOPrefs::TodoAttachAsk: return; case KOPrefs::TodoAttachLink: - attData = uri; + attData << uri; break; - case KOPrefs::TodoAttachInlineFull: - attData = file; + case KOPrefs::TodoAttachInlineFull: + attData << file; break; default: // menu could have been closed by cancel, if so, do nothing return; } - mCalendarView->newTodo( summary, description, attData, attendees, attachmentMimetype, action != KOPrefs::Link ); + QPairp = viewSubResourceCalendar(); + mCalendarView->newTodo( p.first, p.second, + summary, description, + attData, attendees, + TQStringList( attachmentMimetype ), + action != KOPrefs::TodoAttachLink, + isTask ); } void ActionManager::openJournalEditor( const TQDate& date ) { - mCalendarView->newJournal( date ); + QPairp = viewSubResourceCalendar(); + mCalendarView->newJournal( p.first, p.second, date ); } void ActionManager::openJournalEditor( const TQString& text, const TQDate& date ) { - mCalendarView->newJournal( text, date ); + QPairp = viewSubResourceCalendar(); + mCalendarView->newJournal( p.first, p.second, text, date ); } void ActionManager::openJournalEditor( const TQString& text ) { - mCalendarView->newJournal( text ); + QPairp = viewSubResourceCalendar(); + if ( isWritable( p.first, p.second, "journal" ) ) { + mCalendarView->newJournal( p.first, p.second, text ); + } } //TODO: @@ -1718,7 +1848,8 @@ void ActionManager::openJournalEditor( const TQString& text ) // const TQString& description, // const TQString& attachment ) // { -// mCalendarView->newJournal( summary, description, attachment ); +// QPairp = viewSubResourceCalendar(); +// mCalendarView->newJournal( p.first, p.second, summary, description, attachment ); // } @@ -1879,21 +2010,23 @@ void ActionManager::importCalendar( const KURL &url ) return; } - ImportDialog *dialog; - dialog = new ImportDialog( url, mMainWindow->topLevelWidget() ); - connect( dialog, TQT_SIGNAL( dialogFinished( ImportDialog * ) ), - TQT_SLOT( slotImportDialogFinished( ImportDialog * ) ) ); + PreviewDialog *dialog; + dialog = new PreviewDialog( url, mMainWindow->topLevelWidget() ); + connect( dialog, TQT_SIGNAL( dialogFinished( PreviewDialog * ) ), + TQT_SLOT( slotPreviewDialogFinished( PreviewDialog * ) ) ); connect( dialog, TQT_SIGNAL( openURL( const KURL &, bool ) ), TQT_SLOT( openURL( const KURL &, bool ) ) ); - connect( dialog, TQT_SIGNAL( newWindow( const KURL & ) ), - TQT_SIGNAL( actionNew( const KURL & ) ) ); connect( dialog, TQT_SIGNAL( addResource( const KURL & ) ), TQT_SLOT( addResource( const KURL & ) ) ); - dialog->show(); + if ( dialog->loadCalendar() ) { + dialog->show(); + } else { + KMessageBox::error( dialogParent(), i18n("Unable to open the calendar") ); + } } -void ActionManager::slotImportDialogFinished( ImportDialog *dlg ) +void ActionManager::slotPreviewDialogFinished( PreviewDialog *dlg ) { dlg->deleteLater(); mCalendarView->updateView(); @@ -1959,6 +2092,42 @@ void ActionManager::saveToProfile( const TQString & path ) const ::copyConfigEntry( cfg, &profile, "Views", "Agenda View Calendar Display" ); } +bool ActionManager::handleCommandLine() +{ + KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); + KOrg::MainWindow *mainWindow = ActionManager::findInstance( KURL() ); + + bool ret = true; + + if ( !mainWindow ) { + kdError() << "Unable to find default calendar resources view." << endl; + ret = false; + } else if ( args->count() <= 0 ) { + // No filenames given => all other args are meaningless, show main Window + mainWindow->topLevelWidget()->show(); + } else if ( !args->isSet( "open" ) ) { + // Import, merge, or ask => we need the resource calendar window anyway. + mainWindow->topLevelWidget()->show(); + + // Check for import, merge or ask + if ( args->isSet( "import" ) ) { + for( int i = 0; i < args->count(); ++i ) { + mainWindow->actionManager()->addResource( args->url( i ) ); + } + } else if ( args->isSet( "merge" ) ) { + for( int i = 0; i < args->count(); ++i ) { + mainWindow->actionManager()->mergeURL( args->url( i ).url() ); + } + } else { + for( int i = 0; i < args->count(); ++i ) { + mainWindow->actionManager()->importCalendar( args->url( i ) ); + } + } + } + + return ret; +} + TQWidget *ActionManager::dialogParent() { return mCalendarView->topLevelWidget(); -- cgit v1.2.1