00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "actionmanager.h"
00027
00028 #include <qapplication.h>
00029 #include <qtimer.h>
00030
00031 #include <dcopclient.h>
00032 #include <kaction.h>
00033 #include <kfiledialog.h>
00034 #include <kio/netaccess.h>
00035 #include <kkeydialog.h>
00036 #include <kpopupmenu.h>
00037 #include <kstandarddirs.h>
00038 #include <ktip.h>
00039 #include <ktempfile.h>
00040 #include <kxmlguiclient.h>
00041 #include <kwin.h>
00042 #include <knotifyclient.h>
00043
00044 #include <libkcal/htmlexport.h>
00045 #include <libkcal/calendarlocal.h>
00046 #include <libkcal/calendarresources.h>
00047 #include <libkcal/resourcelocal.h>
00048
00049 #include "alarmclient.h"
00050 #include "calendarview.h"
00051 #include "kocore.h"
00052 #include "kodialogmanager.h"
00053 #include "koglobals.h"
00054 #include "koprefs.h"
00055 #include "koviewmanager.h"
00056 #include "kowindowlist.h"
00057 #include "korganizer.h"
00058 #include "kprocess.h"
00059 #include "konewstuff.h"
00060 #include "history.h"
00061 #include "kogroupware.h"
00062 #include "resourceview.h"
00063 #include "resourceimportdialog.h"
00064
00065 KOWindowList *ActionManager::mWindowList = 0;
00066
00067 ActionManager::ActionManager( KXMLGUIClient *client, CalendarView *widget,
00068 QObject *parent, KOrg::MainWindow *mainWindow,
00069 bool isPart )
00070 : QObject( parent ), KCalendarIface(), mRecent( 0 ), mCalendar( 0 ),
00071 mCalendarResources( 0 ), mIsClosing( false )
00072 {
00073 mGUIClient = client;
00074 mACollection = mGUIClient->actionCollection();
00075 mCalendarView = widget;
00076 mIsPart = isPart;
00077 mTempFile = 0;
00078 mNewStuff = 0;
00079 mHtmlExportSync = false;
00080 mMainWindow = mainWindow;
00081 }
00082
00083 ActionManager::~ActionManager()
00084 {
00085 delete mNewStuff;
00086
00087
00088 KOCore::self()->unloadParts( mMainWindow, mParts );
00089
00090 delete mTempFile;
00091
00092
00093 mWindowList->removeWindow( mMainWindow );
00094
00095 delete mCalendarView;
00096
00097 delete mCalendar;
00098 delete mCalendarResources;
00099
00100 kdDebug(5850) << "~ActionManager() done" << endl;
00101 }
00102
00103
00104 void ActionManager::ActionManager::init()
00105 {
00106
00107 if ( !mWindowList ) {
00108 mWindowList = new KOWindowList;
00109
00110 if ( !mIsPart )
00111 QTimer::singleShot( 0, this, SLOT( showTipOnStart() ) );
00112 }
00113
00114
00115
00116 mWindowList->addWindow( mMainWindow );
00117
00118 initActions();
00119
00120
00121 mAutoSaveTimer = new QTimer( this );
00122 connect( mAutoSaveTimer,SIGNAL( timeout() ), SLOT( checkAutoSave() ) );
00123 if ( KOPrefs::instance()->mAutoSave &&
00124 KOPrefs::instance()->mAutoSaveInterval > 0 ) {
00125 mAutoSaveTimer->start( 1000 * 60 * KOPrefs::instance()->mAutoSaveInterval );
00126 }
00127
00128 setTitle();
00129
00130 connect( mCalendarView, SIGNAL( modifiedChanged( bool ) ), SLOT( setTitle() ) );
00131 connect( mCalendarView, SIGNAL( configChanged() ), SLOT( updateConfig() ) );
00132
00133 connect( mCalendarView, SIGNAL( incidenceSelected( Incidence * ) ),
00134 this, SLOT( processIncidenceSelection( Incidence * ) ) );
00135
00136 processIncidenceSelection( 0 );
00137
00138
00139 mCalendarView->checkClipboard();
00140
00141 mCalendarView->lookForOutgoingMessages();
00142 mCalendarView->lookForIncomingMessages();
00143 }
00144
00145 void ActionManager::createCalendarLocal()
00146 {
00147 mCalendar = new CalendarLocal( KOPrefs::instance()->mTimeZoneId );
00148 mCalendarView->setCalendar( mCalendar );
00149 mCalendarView->readSettings();
00150
00151 initCalendar( mCalendar );
00152 }
00153
00154 void ActionManager::createCalendarResources()
00155 {
00156 mCalendarResources = KOCore::self()->calendarResources();
00157
00158 CalendarResourceManager *manager = mCalendarResources->resourceManager();
00159
00160 kdDebug(5850) << "CalendarResources used by KOrganizer:" << endl;
00161 CalendarResourceManager::Iterator it;
00162 for( it = manager->begin(); it != manager->end(); ++it ) {
00163 (*it)->dump();
00164 }
00165
00166 setDestinationPolicy();
00167
00168 mCalendarView->setCalendar( mCalendarResources );
00169 mCalendarView->readSettings();
00170
00171
00172 KOGroupware::create( mCalendarView, mCalendarResources );
00173
00174 ResourceViewFactory factory( mCalendarResources, mCalendarView );
00175 mCalendarView->addExtension( &factory );
00176
00177 connect( mCalendarResources, SIGNAL( calendarChanged() ),
00178 mCalendarView, SLOT( slotCalendarChanged() ) );
00179
00180 connect( mCalendarView, SIGNAL( configChanged() ),
00181 SLOT( updateConfig() ) );
00182
00183 initCalendar( mCalendarResources );
00184 }
00185
00186 void ActionManager::initCalendar( Calendar *cal )
00187 {
00188 cal->setOwner( KOPrefs::instance()->fullName() );
00189 cal->setEmail( KOPrefs::instance()->email() );
00190
00191 mCalendarView->setModified( false );
00192 }
00193
00194 void ActionManager::initActions()
00195 {
00196 KAction *action;
00197
00198
00199 if ( mIsPart ) {
00200 if ( mMainWindow->hasDocument() ) {
00201 new KAction( i18n("&New"), "filenew", CTRL+Key_N, this,
00202 SLOT( file_new() ), mACollection, "korganizer_openNew" );
00203 KStdAction::open( this, SLOT( file_open() ), mACollection, "korganizer_open" );
00204 mRecent = new KRecentFilesAction( i18n("Open &Recent"), 0, 0, this,
00205 SLOT( file_openRecent( const KURL & ) ),
00206 mACollection, "korganizer_openRecent" );
00207 new KAction( i18n("Re&vert"), "revert", 0, this,
00208 SLOT( file_revert() ), mACollection, "korganizer_revert" );
00209 KStdAction::saveAs( this,
00210 SLOT( file_saveas() ), mACollection, "korganizer_saveAs" );
00211 KStdAction::close( this,
00212 SLOT( file_close() ), mACollection, "korganizer_close" );
00213 }
00214 KStdAction::save( this,
00215 SLOT( file_save() ), mACollection, "korganizer_save" );
00216 } else {
00217 KStdAction::openNew(this, SLOT(file_new()), mACollection);
00218 KStdAction::open(this, SLOT(file_open()), mACollection);
00219 mRecent = KStdAction::openRecent(this, SLOT(file_openRecent(const KURL&)),
00220 mACollection);
00221 KStdAction::revert(this,SLOT(file_revert()),mACollection);
00222 KStdAction::save(this, SLOT(file_save()), mACollection);
00223 KStdAction::saveAs(this, SLOT(file_saveas()), mACollection);
00224 KStdAction::close(this, SLOT(file_close()), mACollection);
00225 }
00226
00227 (void)new KAction(i18n("&Import From Ical"), 0, this, SLOT(file_import()),
00228 mACollection, "import_ical");
00229 (void)new KAction(i18n("&Merge Calendar..."), 0, this, SLOT(file_merge()),
00230 mACollection, "merge_calendar");
00231 (void)new KAction(i18n("Archive Old Entries..."), 0, this, SLOT(file_archive()),
00232 mACollection, "file_archive");
00233
00234
00235
00236 (void)new KAction(i18n("Configure &Date && Time..."), 0,
00237 this,SLOT(configureDateTime()),
00238 mACollection, "conf_datetime");
00239
00240 mFilterViewAction = new KToggleAction(i18n("Show Filter"),0,this,
00241 SLOT(toggleFilterView()),
00242 mACollection,
00243 "show_filter");
00244
00245 KStdAction::tipOfDay( this, SLOT( showTip() ), mACollection,
00246 "help_tipofday" );
00247
00248 new KAction( i18n("Get Hot New Stuff..."), 0, this,
00249 SLOT( downloadNewStuff() ), mACollection,
00250 "downloadnewstuff" );
00251
00252 new KAction( i18n("Upload Hot New Stuff..."), 0, this,
00253 SLOT( uploadNewStuff() ), mACollection,
00254 "uploadnewstuff" );
00255
00256 (void)new KAction(i18n("iCalendar..."), 0,
00257 mCalendarView, SLOT(exportICalendar()),
00258 mACollection, "export_icalendar");
00259 (void)new KAction(i18n("vCalendar..."), 0,
00260 mCalendarView, SLOT(exportVCalendar()),
00261 mACollection, "export_vcalendar");
00262
00263
00264 #if 0
00265 (void)new KAction(i18n("Print Setup..."), 0,
00266 mCalendarView, SLOT(printSetup()),
00267 mACollection, "print_setup");
00268 #endif
00269
00270 if (mIsPart) {
00271 KStdAction::print(mCalendarView, SLOT(print()), mACollection, "korganizer_print" );
00272 } else {
00273 KStdAction::print(mCalendarView, SLOT(print()), mACollection);
00274 }
00275
00276 #if 1
00277 if (mIsPart) {
00278 KStdAction::printPreview(mCalendarView, SLOT(printPreview()), mACollection, "korganizer_quickprint" );
00279 } else {
00280 KStdAction::printPreview(mCalendarView, SLOT(printPreview()),
00281 mACollection);
00282 }
00283 #endif
00284
00285 new KAction( i18n("delete completed To-Dos","Purge Completed"), 0,
00286 mCalendarView, SLOT( purgeCompleted() ), mACollection,
00287 "purge_completed" );
00288
00289 KOrg::History *h = mCalendarView->history();
00290
00291 KAction *pasteAction;
00292
00293 if ( mIsPart ) {
00294
00295 mCutAction = new KAction(i18n("Cu&t"), "editcut", CTRL+Key_X, mCalendarView,
00296 SLOT(edit_cut()), mACollection, "korganizer_cut");
00297 mCopyAction = new KAction(i18n("&Copy"), "editcopy", CTRL+Key_C, mCalendarView,
00298 SLOT(edit_copy()), mACollection, "korganizer_copy");
00299 pasteAction = new KAction(i18n("&Paste"), "editpaste", CTRL+Key_V, mCalendarView,
00300 SLOT(edit_paste()), mACollection, "korganizer_paste");
00301 mUndoAction = new KAction( i18n("&Undo"), "undo", CTRL+Key_Z, h,
00302 SLOT( undo() ), mACollection, "korganizer_undo" );
00303 mRedoAction = new KAction( i18n("Re&do"), "redo", CTRL+SHIFT+Key_Z, h,
00304 SLOT( redo() ), mACollection, "korganizer_redo" );
00305 } else {
00306 mCutAction = KStdAction::cut(mCalendarView,SLOT(edit_cut()),
00307 mACollection);
00308
00309 mCopyAction = KStdAction::copy(mCalendarView,SLOT(edit_copy()),
00310 mACollection);
00311
00312 pasteAction = KStdAction::paste(mCalendarView,SLOT(edit_paste()),
00313 mACollection);
00314
00315 mUndoAction = KStdAction::undo( h, SLOT( undo() ), mACollection );
00316 mRedoAction = KStdAction::redo( h, SLOT( redo() ), mACollection );
00317 }
00318
00319 pasteAction->setEnabled( false );
00320 connect( mCalendarView, SIGNAL( pasteEnabled( bool ) ),
00321 pasteAction, SLOT( setEnabled( bool ) ) );
00322
00323 connect( h, SIGNAL( undoAvailable( const QString & ) ),
00324 SLOT( updateUndoAction( const QString & ) ) );
00325 connect( h, SIGNAL( redoAvailable( const QString & ) ),
00326 SLOT( updateRedoAction( const QString & ) ) );
00327 mUndoAction->setEnabled( false );
00328 mRedoAction->setEnabled( false );
00329
00330 mDeleteAction = new KAction(i18n("&Delete"),"editdelete",0,
00331 mCalendarView,SLOT(appointment_delete()),
00332 mACollection, "edit_delete");
00333
00334 if ( mIsPart ) {
00335 new KAction(i18n("&Find..."),"find",CTRL+Key_F,
00336 mCalendarView->dialogManager(), SLOT(showSearchDialog()),
00337 mACollection, "korganizer_find");
00338 } else {
00339 KStdAction::find(mCalendarView->dialogManager(), SLOT(showSearchDialog()),
00340 mACollection);
00341 }
00342
00343
00344
00345 (void)new KAction(i18n("What's &Next"), "whatsnext", 0,
00346 mCalendarView->viewManager(), SLOT(showWhatsNextView()),
00347 mACollection, "view_whatsnext");
00348 (void)new KAction(i18n("&List"), "list", 0,
00349 mCalendarView->viewManager(), SLOT(showListView()),
00350 mACollection, "view_list");
00351 (void)new KAction(i18n("&Day"), "1day", 0,
00352 mCalendarView->viewManager(), SLOT(showDayView()),
00353 mACollection, "view_day");
00354 (void)new KAction(i18n("W&ork Week"), "5days", 0,
00355 mCalendarView->viewManager(), SLOT(showWorkWeekView()),
00356 mACollection, "view_workweek");
00357 (void)new KAction(i18n("&Week"), "7days", 0,
00358 mCalendarView->viewManager(), SLOT(showWeekView()),
00359 mACollection, "view_week");
00360 mNextXDays = new KAction("", "xdays", 0,mCalendarView->viewManager(),
00361 SLOT(showNextXView()),mACollection, "view_nextx");
00362 mNextXDays->setText(i18n("&Next Day", "Ne&xt %n Days", KOPrefs::instance()->mNextXDays));
00363 (void)new KAction(i18n("&Month"), "month", 0,
00364 mCalendarView->viewManager(), SLOT(showMonthView()),
00365 mACollection, "view_month");
00366 (void)new KAction(i18n("&To-Do List"), "todo", 0,
00367 mCalendarView->viewManager(), SLOT(showTodoView()),
00368 mACollection, "view_todo");
00369 (void)new KAction(i18n("&Journal"), "journal", 0,
00370 mCalendarView->viewManager(), SLOT(showJournalView()),
00371 mACollection, "view_journal");
00372 (void)new KAction(i18n("&Time Span"), "timespan", 0,
00373 mCalendarView->viewManager(), SLOT(showTimeSpanView()),
00374 mACollection, "view_timespan");
00375 (void)new KAction(i18n("&Update"), 0,
00376 mCalendarView, SLOT( updateView() ),
00377 mACollection, "update");
00378
00379
00380
00381 (void)new KAction(i18n("New E&vent..."), "appointment", 0,
00382 mCalendarView,SLOT( newEvent() ),
00383 mACollection, "new_event");
00384 (void)new KAction(i18n("New &To-Do..."), "newtodo", 0,
00385 mCalendarView,SLOT(newTodo()),
00386 mACollection, "new_todo");
00387 action = new KAction(i18n("New Su&b-To-Do..."), 0,
00388 mCalendarView,SLOT(newSubTodo()),
00389 mACollection, "new_subtodo");
00390 action->setEnabled(false);
00391 connect(mCalendarView,SIGNAL(todoSelected(bool)),
00392 action,SLOT(setEnabled(bool)));
00393
00394 mShowIncidenceAction = new KAction(i18n("&Show"), 0,
00395 mCalendarView,SLOT(showIncidence()),
00396 mACollection, "show_incidence");
00397 mEditIncidenceAction = new KAction(i18n("&Edit..."), 0,
00398 mCalendarView,SLOT(editIncidence()),
00399 mACollection, "edit_incidence");
00400 mDeleteIncidenceAction = new KAction(i18n("&Delete"), Key_Delete,
00401 mCalendarView,SLOT(deleteIncidence()),
00402 mACollection, "delete_incidence");
00403
00404 #if 0
00405 action = new KAction(i18n("T&ake over Event"), 0,
00406 mCalendarView,SLOT(takeOverEvent()),
00407 mACollection, "takeover_event");
00408 connect(mCalendarView,SIGNAL(eventsSelected(bool)),
00409 action,SLOT(setEnabled(bool)));
00410 (void)new KAction(i18n("T&ake over Calendar"), 0,
00411 mCalendarView,SLOT(takeOverCalendar()),
00412 mACollection, "takeover_calendar");
00413
00414 action = new KAction(i18n("&Mail Appointment"), "mail_generic", 0,
00415 mCalendarView,SLOT(action_mail()),
00416 mACollection, "mail_appointment");
00417 connect(mCalendarView,SIGNAL(eventsSelected(bool)),
00418 action,SLOT(setEnabled(bool)));
00419 #endif
00420
00421 action = new KAction(i18n("&Make Sub-To-Do Independent"), 0,
00422 mCalendarView,SLOT(todo_unsub()),
00423 mACollection, "unsub_todo");
00424 action->setEnabled(false);
00425 connect(mCalendarView,SIGNAL(todoSelected(bool)),
00426 action,SLOT(setEnabled(bool)));
00427
00428
00429
00430 (void)new KAction(i18n("Outgoing Messages"),0,
00431 mCalendarView->dialogManager(),SLOT(showOutgoingDialog()),
00432 mACollection,"outgoing");
00433 (void)new KAction(i18n("Incoming Messages"),0,
00434 mCalendarView->dialogManager(),SLOT(showIncomingDialog()),
00435 mACollection,"incoming");
00436 mPublishEvent = new KAction(i18n("Publish..."),"mail_send",0,
00437 mCalendarView,SLOT(schedule_publish()),
00438 mACollection,"publish");
00439 mPublishEvent->setEnabled(false);
00440 action = new KAction(i18n("Request"),"mail_generic",0,
00441 mCalendarView,SLOT(schedule_request()),
00442 mACollection,"request");
00443 action->setEnabled(false);
00444 connect(mCalendarView,SIGNAL(organizerEventsSelected(bool)),
00445 action,SLOT(setEnabled(bool)));
00446 action = new KAction(i18n("Refresh"),0,
00447 mCalendarView,SLOT(schedule_refresh()),
00448 mACollection,"refresh");
00449 action->setEnabled(false);
00450 connect(mCalendarView,SIGNAL(groupEventsSelected(bool)),
00451 action,SLOT(setEnabled(bool)));
00452 action = new KAction(KStdGuiItem::cancel(),0,
00453 mCalendarView,SLOT(schedule_cancel()),
00454 mACollection,"cancel");
00455 action->setEnabled(false);
00456 connect(mCalendarView,SIGNAL(organizerEventsSelected(bool)),
00457 action,SLOT(setEnabled(bool)));
00458
00459
00460
00461
00462
00463 action = new KAction(i18n("Reply"),"mail_reply",0,
00464 mCalendarView,SLOT(schedule_reply()),
00465 mACollection,"reply");
00466 action->setEnabled(false);
00467 connect(mCalendarView,SIGNAL(groupEventsSelected(bool)),
00468 action,SLOT(setEnabled(bool)));
00469 action = new KAction(i18n("counter proposal","Counter"),0,
00470 mCalendarView,SLOT(schedule_counter()),
00471 mACollection,"counter");
00472 action->setEnabled(false);
00473 connect(mCalendarView,SIGNAL(groupEventsSelected(bool)),
00474 action,SLOT(setEnabled(bool)));
00475 action = new KAction(i18n("Publish Free Busy Information"),0,
00476 mCalendarView,SLOT(schedule_publish_freebusy()),
00477 mACollection,"publish_freebusy");
00478 action->setEnabled(true);
00479
00480
00481
00482
00483
00484
00485 if ( !mIsPart ) {
00486 action = new KAction(i18n("Addressbook"),"contents",0,
00487 mCalendarView,SLOT(openAddressbook()),
00488 mACollection,"addressbook");
00489 }
00490
00491
00492 bool isRTL = QApplication::reverseLayout();
00493
00494 (void)new KAction(i18n("Go to &Today"), "today", 0,
00495 mCalendarView,SLOT(goToday()),
00496 mACollection, "go_today");
00497
00498 action = new KAction(i18n("Go &Backward"), isRTL ? "1rightarrow" : "1leftarrow", 0,
00499 mCalendarView,SLOT(goPrevious()),
00500 mACollection, "go_previous");
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510
00511 action = new KAction(i18n("Go &Forward"), isRTL ? "1leftarrow" : "1rightarrow", 0,
00512 mCalendarView,SLOT(goNext()),
00513 mACollection, "go_next");
00514
00515
00516
00517
00518
00519
00520
00521 if ( mIsPart ) {
00522 new KAction( i18n("&Configure KOrganizer..."),
00523 "configure", 0, mCalendarView,
00524 SLOT(edit_options()), mACollection,
00525 "korganizer_configure" );
00526 new KAction( i18n("Configure S&hortcuts..."),
00527 "configure_shortcuts", 0, this,
00528 SLOT(keyBindings()), mACollection,
00529 "korganizer_configure_shortcuts" );
00530 } else {
00531 KStdAction::preferences(mCalendarView, SLOT(edit_options()),
00532 mACollection);
00533 KStdAction::keyBindings(this, SLOT(keyBindings()), mACollection);
00534 }
00535
00536 (void)new KAction(i18n("Edit C&ategories..."), 0,
00537 mCalendarView->dialogManager(),
00538 SLOT(showCategoryEditDialog()),
00539 mACollection,"edit_categories");
00540 (void)new KAction(i18n("Edit &Filters..."), 0,
00541 mCalendarView,SLOT(editFilters()),
00542 mACollection,"edit_filters");
00543 (void)new KAction(i18n("Configure &Plugins..."), 0,
00544 mCalendarView->dialogManager(),SLOT(showPluginDialog()),
00545 mACollection,"configure_plugins");
00546
00547 #if 0
00548 (void)new KAction(i18n("Show Intro Page"), 0,
00549 mCalendarView,SLOT(showIntro()),
00550 mACollection,"show_intro");
00551 #endif
00552
00553 KConfig *config = KOGlobals::self()->config();
00554 config->setGroup("Settings");
00555 mFilterViewAction->setChecked(config->readBoolEntry("Filter Visible",false));
00556 toggleFilterView();
00557 }
00558
00559 void ActionManager::readSettings()
00560 {
00561
00562
00563
00564 KConfig *config = KOGlobals::self()->config();
00565 if ( mRecent ) mRecent->loadEntries( config );
00566 mCalendarView->readSettings();
00567 }
00568
00569 void ActionManager::writeSettings()
00570 {
00571 kdDebug(5850) << "ActionManager::writeSettings" << endl;
00572 KConfig *config = KOGlobals::self()->config();
00573 mCalendarView->writeSettings();
00574
00575 config->setGroup( "Settings" );
00576 config->writeEntry( "Filter Visible", mFilterViewAction->isChecked() );
00577 if ( mRecent ) mRecent->saveEntries( config );
00578 }
00579
00580 void ActionManager::file_new()
00581 {
00582 emit actionNew();
00583 }
00584
00585 void ActionManager::file_open()
00586 {
00587 KURL url;
00588 QString defaultPath = locateLocal("data","korganizer/");
00589 url = KFileDialog::getOpenURL(defaultPath,i18n("*.vcs *.ics|Calendar Files"),
00590 mCalendarView->topLevelWidget());
00591
00592 if (url.isEmpty()) return;
00593
00594 KOrg::MainWindow *korg=ActionManager::findInstance(url);
00595 if ((0 != korg)&&(korg != mMainWindow)) {
00596 KWin::setActiveWindow(korg->topLevelWidget()->winId());
00597 return;
00598 }
00599
00600 kdDebug(5850) << "ActionManager::file_open(): " << url.prettyURL() << endl;
00601
00602
00603 if (!mCalendarView->isModified() && mFile.isEmpty() && !mCalendarResources ) {
00604 openURL(url);
00605 } else {
00606 emit actionNew( url );
00607 }
00608 }
00609
00610 void ActionManager::file_openRecent(const KURL& url)
00611 {
00612 if (!url.isEmpty()) {
00613 KOrg::MainWindow *korg=ActionManager::findInstance(url);
00614 if ((0 != korg)&&(korg != mMainWindow)) {
00615 KWin::setActiveWindow(korg->topLevelWidget()->winId());
00616 return;
00617 }
00618 openURL(url);
00619 }
00620 }
00621
00622 void ActionManager::file_import()
00623 {
00624
00625
00626 int retVal = -1;
00627 QString progPath;
00628 KTempFile tmpfn;
00629
00630 QString homeDir = QDir::homeDirPath() + QString::fromLatin1("/.calendar");
00631
00632 if (!QFile::exists(homeDir)) {
00633 KMessageBox::error(mCalendarView->topLevelWidget(),
00634 i18n("You have no ical file in your home directory.\n"
00635 "Import cannot proceed.\n"));
00636 return;
00637 }
00638
00639 KProcess proc;
00640 proc << "ical2vcal" << tmpfn.name();
00641 bool success = proc.start( KProcess::Block );
00642
00643 if ( !success ) {
00644 kdDebug(5850) << "Error starting ical2vcal." << endl;
00645 return;
00646 } else {
00647 retVal = proc.exitStatus();
00648 }
00649
00650 kdDebug(5850) << "ical2vcal return value: " << retVal << endl;
00651
00652 if (retVal >= 0 && retVal <= 2) {
00653
00654 mCalendarView->openCalendar(tmpfn.name(),1);
00655 if (!retVal)
00656 KMessageBox::information(mCalendarView->topLevelWidget(),
00657 i18n("KOrganizer successfully imported and "
00658 "merged your .calendar file from ical "
00659 "into the currently opened calendar."));
00660 else
00661 KMessageBox::information(mCalendarView->topLevelWidget(),
00662 i18n("KOrganizer encountered some unknown fields while "
00663 "parsing your .calendar ical file, and had to "
00664 "discard them. Please check to see that all "
00665 "your relevant data was correctly imported."),
00666 i18n("ICal Import Successful With Warning"));
00667 } else if (retVal == -1) {
00668 KMessageBox::error(mCalendarView->topLevelWidget(),
00669 i18n("KOrganizer encountered an error parsing your "
00670 ".calendar file from ical. Import has failed."));
00671 } else if (retVal == -2) {
00672 KMessageBox::error(mCalendarView->topLevelWidget(),
00673 i18n("KOrganizer doesn't think that your .calendar "
00674 "file is a valid ical calendar. Import has failed."));
00675 }
00676 tmpfn.unlink();
00677 }
00678
00679 void ActionManager::file_merge()
00680 {
00681 KURL url = KFileDialog::getOpenURL(locateLocal("data","korganizer/"),
00682 i18n("*.vcs *.ics|Calendar Files"),
00683 mCalendarView->topLevelWidget());
00684 openURL(url,true);
00685 }
00686
00687 void ActionManager::file_archive()
00688 {
00689 mCalendarView->archiveCalendar();
00690 }
00691
00692 void ActionManager::file_revert()
00693 {
00694 openURL(mURL);
00695 }
00696
00697 void ActionManager::file_saveas()
00698 {
00699 KURL url = getSaveURL();
00700
00701 if (url.isEmpty()) return;
00702
00703 saveAsURL(url);
00704 }
00705
00706 void ActionManager::file_save()
00707 {
00708 if ( mMainWindow->hasDocument() ) {
00709 if (mURL.isEmpty()) {
00710 file_saveas();
00711 } else {
00712 saveURL();
00713 }
00714 } else {
00715 mCalendarView->calendar()->save();
00716 }
00717 }
00718
00719 void ActionManager::file_close()
00720 {
00721 if (!saveModifiedURL()) return;
00722
00723 mCalendarView->closeCalendar();
00724 KIO::NetAccess::removeTempFile(mFile);
00725 mURL="";
00726 mFile="";
00727
00728 setTitle();
00729 }
00730
00731 bool ActionManager::openURL(const KURL &url,bool merge)
00732 {
00733 kdDebug(5850) << "ActionManager::openURL()" << endl;
00734
00735 if (url.isEmpty()) {
00736 kdDebug(5850) << "ActionManager::openURL(): Error! Empty URL." << endl;
00737 return false;
00738 }
00739 if ( !url.isValid() ) {
00740 kdDebug(5850) << "ActionManager::openURL(): Error! URL is malformed." << endl;
00741 return false;
00742 }
00743
00744 QString tmpFile;
00745 if( KIO::NetAccess::download( url, tmpFile, view() ) ) {
00746 kdDebug(5850) << "--- Downloaded to " << tmpFile << endl;
00747 bool success = mCalendarView->openCalendar(tmpFile,merge);
00748 if (merge) {
00749 KIO::NetAccess::removeTempFile(tmpFile);
00750 if (success)
00751 mMainWindow->showStatusMessage(i18n("Merged calendar '%1'.").arg(url.prettyURL()));
00752 } else {
00753 if (success) {
00754 KIO::NetAccess::removeTempFile(mFile);
00755 mURL = url;
00756 mFile = tmpFile;
00757 KConfig *config = KOGlobals::self()->config();
00758 config->setGroup("General");
00759 setTitle();
00760 kdDebug(5850) << "-- Add recent URL: " << url.prettyURL() << endl;
00761 if ( mRecent ) mRecent->addURL(url);
00762 mMainWindow->showStatusMessage(i18n("Opened calendar '%1'.").arg(mURL.prettyURL()));
00763 }
00764 }
00765 return success;
00766 } else {
00767 QString msg;
00768 msg = i18n("Cannot download calendar from '%1'.").arg(url.prettyURL());
00769 KMessageBox::error(mCalendarView->topLevelWidget(),msg);
00770 return false;
00771 }
00772 }
00773
00774 void ActionManager::closeURL()
00775 {
00776 kdDebug(5850) << "ActionManager::closeURL()" << endl;
00777
00778 file_close();
00779 }
00780
00781 bool ActionManager::saveURL()
00782 {
00783 QString ext;
00784
00785 if ( mURL.isLocalFile() ) {
00786 ext = mFile.right( 4 );
00787 } else {
00788 ext = mURL.filename().right( 4 );
00789 }
00790
00791 if ( ext == ".vcs" ) {
00792 int result = KMessageBox::warningContinueCancel(
00793 mCalendarView->topLevelWidget(),
00794 i18n("Your calendar will be saved in iCalendar format. Use "
00795 "'Export vCalendar' to save in vCalendar format."),
00796 i18n("Format Conversion"), i18n("Proceed"), "dontaskFormatConversion",
00797 true );
00798 if ( result != KMessageBox::Continue ) return false;
00799
00800 QString filename = mURL.fileName();
00801 filename.replace( filename.length() - 4, 4, ".ics" );
00802 mURL.setFileName( filename );
00803 if ( mURL.isLocalFile() ) {
00804 mFile = mURL.path();
00805 }
00806 setTitle();
00807 if ( mRecent ) mRecent->addURL( mURL );
00808 }
00809
00810 if ( !mCalendarView->saveCalendar( mFile ) ) {
00811 kdDebug(5850) << "ActionManager::saveURL(): calendar view save failed."
00812 << endl;
00813 return false;
00814 } else {
00815 mCalendarView->setModified( false );
00816 }
00817
00818 if ( !mURL.isLocalFile() ) {
00819 if ( !KIO::NetAccess::upload( mFile, mURL, view() ) ) {
00820 QString msg = i18n("Cannot upload calendar to '%1'")
00821 .arg( mURL.prettyURL() );
00822 KMessageBox::error( mCalendarView->topLevelWidget() ,msg );
00823 return false;
00824 }
00825 }
00826
00827
00828 if (KOPrefs::instance()->mAutoSave) {
00829 mAutoSaveTimer->stop();
00830 mAutoSaveTimer->start(1000*60*KOPrefs::instance()->mAutoSaveInterval);
00831 }
00832
00833 mMainWindow->showStatusMessage(i18n("Saved calendar '%1'.").arg(mURL.prettyURL()));
00834
00835
00836 if ( KOPrefs::instance()->mHtmlWithSave==true &&
00837 !KOPrefs::instance()->mHtmlExportFile.isNull() ) {
00838 KURL dest( KOPrefs::instance()->mHtmlExportFile );
00839 KCal::HtmlExport mExport( mCalendarView->calendar() );
00840 mExport.setEmail( KOPrefs::instance()->email() );
00841 mExport.setFullName( KOPrefs::instance()->fullName() );
00842
00843 KConfig *cfg = KOGlobals::self()->config();
00844 cfg->setGroup( "HtmlExport" );
00845
00846 mExport.setMonthViewEnabled( cfg->readBoolEntry( "Month", false ) );
00847 mExport.setEventsEnabled( cfg->readBoolEntry( "Event", true ) );
00848 mExport.setTodosEnabled( cfg->readBoolEntry( "Todo", true ) );
00849 mExport.setCategoriesEventEnabled( cfg->readBoolEntry( "CategoriesEvent", false ) );
00850 mExport.setAttendeesEventEnabled( cfg->readBoolEntry( "AttendeesEvent", false ) );
00851 mExport.setExcludePrivateEventEnabled( cfg->readBoolEntry( "ExcludePrivateEvent", true ) );
00852 mExport.setExcludeConfidentialEventEnabled( cfg->readBoolEntry( "ExcludeConfidentialEvent", true ) );
00853 mExport.setCategoriesTodoEnabled( cfg->readBoolEntry( "CategoriesTodo", false ) );
00854 mExport.setAttendeesTodoEnabled( cfg->readBoolEntry( "AttendeesTodo", false ) );
00855 mExport.setExcludePrivateTodoEnabled( cfg->readBoolEntry( "ExcludePrivateTodo", true ) );
00856 mExport.setExcludeConfidentialTodoEnabled( cfg->readBoolEntry( "ExcludeConfidentialTodo", true ) );
00857 mExport.setDueDateEnabled( cfg->readBoolEntry( "DueDates", true ) );
00858 QDate qd1;
00859 qd1 = QDate::currentDate();
00860 QDate qd2;
00861 qd2 = QDate::currentDate();
00862 if ( mExport.monthViewEnabled() )
00863 qd2.addMonths( 1 );
00864 else
00865 qd2.addDays( 7 );
00866
00867 mExport.setDateRange( qd1, qd2 );
00868 QDate cdate=qd1;
00869 while (cdate<=qd2)
00870 {
00871 if ( !KOCore::self()->holiday(cdate).isEmpty() )
00872 mExport.addHoliday( cdate, KOCore::self()->holiday(cdate) );
00873 cdate = cdate.addDays(1);
00874 }
00875
00876 if ( dest.isLocalFile() ) {
00877 mExport.save( dest.path() );
00878 } else {
00879 KTempFile tf;
00880 QString tfile = tf.name();
00881 tf.close();
00882 mExport.save( tfile );
00883 if (!KIO::NetAccess::upload( tfile, dest, view() ) ) {
00884 KNotifyClient::event ( view()->winId(),
00885 i18n("Could not upload file.") );
00886 }
00887 tf.unlink();
00888 }
00889 }
00890
00891 return true;
00892 }
00893
00894 bool ActionManager::saveAsURL(const KURL &url)
00895 {
00896 kdDebug(5850) << "ActionManager::saveAsURL() " << url.prettyURL() << endl;
00897
00898 if ( url.isEmpty() ) {
00899 kdDebug(5850) << "ActionManager::saveAsURL(): Empty URL." << endl;
00900 return false;
00901 }
00902 if ( !url.isValid() ) {
00903 kdDebug(5850) << "ActionManager::saveAsURL(): Malformed URL." << endl;
00904 return false;
00905 }
00906
00907 QString fileOrig = mFile;
00908 KURL URLOrig = mURL;
00909
00910 KTempFile *tempFile = 0;
00911 if (url.isLocalFile()) {
00912 mFile = url.path();
00913 } else {
00914 tempFile = new KTempFile;
00915 mFile = tempFile->name();
00916 }
00917 mURL = url;
00918
00919 bool success = saveURL();
00920 if (success) {
00921 delete mTempFile;
00922 mTempFile = tempFile;
00923 KIO::NetAccess::removeTempFile(fileOrig);
00924 KConfig *config = KOGlobals::self()->config();
00925 config->setGroup("General");
00926 setTitle();
00927 if ( mRecent ) mRecent->addURL(mURL);
00928 } else {
00929 kdDebug(5850) << "ActionManager::saveAsURL() failed" << endl;
00930 mURL = URLOrig;
00931 mFile = fileOrig;
00932 delete tempFile;
00933 }
00934
00935 return success;
00936 }
00937
00938
00939 bool ActionManager::saveModifiedURL()
00940 {
00941 kdDebug(5850) << "ActionManager::saveModifiedURL()" << endl;
00942
00943
00944 if (!mCalendarView->isModified()) return true;
00945
00946 mHtmlExportSync = true;
00947 if (KOPrefs::instance()->mAutoSave && !mURL.isEmpty()) {
00948
00949 return saveURL();
00950 } else {
00951 int result = KMessageBox::warningYesNoCancel(
00952 mCalendarView->topLevelWidget(),
00953 i18n("The calendar has been modified.\nDo you want to save it?"),
00954 QString::null,
00955 KStdGuiItem::save(), KStdGuiItem::discard());
00956 switch(result) {
00957 case KMessageBox::Yes:
00958 if (mURL.isEmpty()) {
00959 KURL url = getSaveURL();
00960 return saveAsURL(url);
00961 } else {
00962 return saveURL();
00963 }
00964 case KMessageBox::No:
00965 return true;
00966 case KMessageBox::Cancel:
00967 default:
00968 {
00969 mHtmlExportSync = false;
00970 return false;
00971 }
00972 }
00973 }
00974 }
00975
00976
00977 KURL ActionManager::getSaveURL()
00978 {
00979 KURL url = KFileDialog::getSaveURL(locateLocal("data","korganizer/"),
00980 i18n("*.vcs *.ics|Calendar Files"),
00981 mCalendarView->topLevelWidget());
00982
00983 if (url.isEmpty()) return url;
00984
00985 QString filename = url.fileName(false);
00986
00987 QString e = filename.right(4);
00988 if (e != ".vcs" && e != ".ics") {
00989
00990 filename += ".ics";
00991 }
00992
00993 url.setFileName(filename);
00994
00995 kdDebug(5850) << "ActionManager::getSaveURL(): url: " << url.url() << endl;
00996
00997 return url;
00998 }
00999
01000 void ActionManager::saveProperties(KConfig *config)
01001 {
01002 kdDebug() << "ActionManager::saveProperties" << endl;
01003
01004 config->writeEntry( "UseResourceCalendar", !mMainWindow->hasDocument() );
01005 if ( mMainWindow->hasDocument() ) {
01006 config->writePathEntry("Calendar",mURL.url());
01007 }
01008 }
01009
01010 void ActionManager::readProperties(KConfig *config)
01011 {
01012 kdDebug() << "ActionManager::readProperties" << endl;
01013
01014 bool isResourceCalendar(
01015 config->readBoolEntry( "UseResourceCalendar", true ) );
01016 QString calendarUrl = config->readPathEntry("Calendar");
01017
01018 if (!isResourceCalendar && !calendarUrl.isEmpty()) {
01019 mMainWindow->init( true );
01020 KURL u(calendarUrl);
01021 openURL(u);
01022 } else {
01023 mMainWindow->init( false );
01024 }
01025 }
01026
01027 void ActionManager::checkAutoSave()
01028 {
01029 kdDebug(5850) << "ActionManager::checkAutoSave()" << endl;
01030
01031
01032 if (KOPrefs::instance()->mAutoSaveInterval == 0) return;
01033
01034
01035 if ( KOPrefs::instance()->mAutoSave ) {
01036 if ( mCalendarResources || ( mCalendar && !url().isEmpty() ) ) {
01037 saveCalendar();
01038 }
01039 }
01040 }
01041
01042
01043
01044 void ActionManager::updateConfig()
01045 {
01046 kdDebug(5850) << "ActionManager::updateConfig()" << endl;
01047
01048 if ( KOPrefs::instance()->mAutoSave && !mAutoSaveTimer->isActive() ) {
01049 checkAutoSave();
01050 if ( KOPrefs::instance()->mAutoSaveInterval > 0) {
01051 mAutoSaveTimer->start( 1000 * 60 *
01052 KOPrefs::instance()->mAutoSaveInterval );
01053 }
01054 }
01055 if ( !KOPrefs::instance()->mAutoSave ) mAutoSaveTimer->stop();
01056 mNextXDays->setText( i18n( "&Next Day", "&Next %n Days",
01057 KOPrefs::instance()->mNextXDays ) );
01058
01059 KOCore::self()->reloadPlugins();
01060 mParts = KOCore::self()->reloadParts( mMainWindow, mParts );
01061
01062 setDestinationPolicy();
01063 }
01064
01065 void ActionManager::setDestinationPolicy()
01066 {
01067 if ( mCalendarResources ) {
01068 if ( KOPrefs::instance()->mDestination == KOPrefs::askDestination )
01069 mCalendarResources->setAskDestinationPolicy();
01070 else
01071 mCalendarResources->setStandardDestinationPolicy();
01072 }
01073 }
01074
01075 void ActionManager::configureDateTime()
01076 {
01077 KProcess *proc = new KProcess;
01078 *proc << "kcmshell" << "language";
01079
01080 connect(proc,SIGNAL(processExited(KProcess *)),
01081 SLOT(configureDateTimeFinished(KProcess *)));
01082
01083 if (!proc->start()) {
01084 KMessageBox::sorry(mCalendarView->topLevelWidget(),
01085 i18n("Couldn't start control module for date and time format."));
01086 delete proc;
01087 }
01088 }
01089
01090 void ActionManager::showTip()
01091 {
01092 KTipDialog::showTip(mCalendarView->topLevelWidget(),QString::null,true);
01093 }
01094
01095 void ActionManager::showTipOnStart()
01096 {
01097 KTipDialog::showTip(mCalendarView->topLevelWidget());
01098 }
01099
01100 KOrg::MainWindow *ActionManager::findInstance( const KURL &url )
01101 {
01102 if ( mWindowList ) {
01103 if ( url.isEmpty() ) return mWindowList->defaultInstance();
01104 else return mWindowList->findInstance( url );
01105 } else {
01106 return 0;
01107 }
01108 }
01109
01110 void ActionManager::dumpText(const QString &str)
01111 {
01112 kdDebug(5850) << "ActionManager::dumpText(): " << str << endl;
01113 }
01114
01115 void ActionManager::toggleFilterView()
01116 {
01117 bool visible = mFilterViewAction->isChecked();
01118 mCalendarView->showFilter(visible);
01119 }
01120
01121 bool ActionManager::openURL(QString url)
01122 {
01123 return openURL(KURL(url));
01124 }
01125
01126 bool ActionManager::mergeURL(QString url)
01127 {
01128 return openURL(KURL(url),true);
01129 }
01130
01131 bool ActionManager::saveAsURL(QString url)
01132 {
01133 return saveAsURL(KURL(url));
01134 }
01135
01136 QString ActionManager::getCurrentURLasString() const
01137 {
01138 return mURL.url();
01139 }
01140
01141 bool ActionManager::deleteEvent(QString uid)
01142 {
01143 return mCalendarView->deleteEvent(uid);
01144 }
01145
01146 bool ActionManager::eventRequest(QString request, QCString receiver,
01147 QString ical)
01148 {
01149 if( !KOGroupware::instance() ) return false;
01150 return KOGroupware::instance()->incomingEventRequest(request, receiver,
01151 ical);
01152 }
01153
01154 bool ActionManager::eventReply( QString ical )
01155 {
01156 if( !KOGroupware::instance() ) return false;
01157 return KOGroupware::instance()->incidenceAnswer( ical );
01158 }
01159
01160 void ActionManager::configureDateTimeFinished(KProcess *proc)
01161 {
01162 delete proc;
01163 }
01164
01165 void ActionManager::downloadNewStuff()
01166 {
01167 kdDebug(5850) << "ActionManager::downloadNewStuff()" << endl;
01168
01169 if ( !mNewStuff ) mNewStuff = new KONewStuff( mCalendarView );
01170 mNewStuff->download();
01171 }
01172
01173 void ActionManager::uploadNewStuff()
01174 {
01175 if ( !mNewStuff ) mNewStuff = new KONewStuff( mCalendarView );
01176 mNewStuff->upload();
01177 }
01178
01179 QString ActionManager::localFileName()
01180 {
01181 return mFile;
01182 }
01183
01184 void ActionManager::processIncidenceSelection( Incidence *incidence )
01185 {
01186
01187
01188 if ( !incidence ) {
01189 enableIncidenceActions( false );
01190 return;
01191 }
01192
01193 enableIncidenceActions( true );
01194
01195 if ( incidence->type() == "Event" ) {
01196 mShowIncidenceAction->setText( i18n("&Show Event") );
01197 mEditIncidenceAction->setText( i18n("&Edit Event...") );
01198 mDeleteIncidenceAction->setText( i18n("&Delete Event") );
01199 } else if ( incidence->type() == "Todo" ) {
01200 mShowIncidenceAction->setText( i18n("&Show To-Do") );
01201 mEditIncidenceAction->setText( i18n("&Edit To-Do...") );
01202 mDeleteIncidenceAction->setText( i18n("&Delete To-Do") );
01203 } else {
01204 mShowIncidenceAction->setText( i18n("&Show") );
01205 mEditIncidenceAction->setText( i18n("&Edit...") );
01206 mDeleteIncidenceAction->setText( i18n("&Delete") );
01207 }
01208 }
01209
01210 void ActionManager::enableIncidenceActions( bool enabled )
01211 {
01212 mShowIncidenceAction->setEnabled( enabled );
01213 mEditIncidenceAction->setEnabled( enabled );
01214 mDeleteIncidenceAction->setEnabled( enabled );
01215
01216 mCutAction->setEnabled( enabled );
01217 mCopyAction->setEnabled( enabled );
01218 mDeleteAction->setEnabled( enabled );
01219 mPublishEvent->setEnabled( enabled );
01220 }
01221
01222 void ActionManager::keyBindings()
01223 {
01224 emit actionKeyBindings();
01225 }
01226
01227
01228 void ActionManager::loadParts()
01229 {
01230 mParts = KOCore::self()->loadParts( mMainWindow );
01231 }
01232
01233 void ActionManager::setTitle()
01234 {
01235 mMainWindow->setTitle();
01236 }
01237
01238 KCalendarIface::ResourceRequestReply ActionManager::resourceRequest( const QValueList<QPair<QDateTime, QDateTime> >&,
01239 const QCString& resource,
01240 const QString& vCalIn )
01241 {
01242 kdDebug(5850) << k_funcinfo << "resource=" << resource << " vCalIn=" << vCalIn << endl;
01243 KCalendarIface::ResourceRequestReply reply;
01244 reply.vCalOut = "VCalOut";
01245 return reply;
01246 }
01247
01248 void ActionManager::openEventEditor( QString text )
01249 {
01250 mCalendarView->newEvent( text );
01251 }
01252
01253 void ActionManager::openEventEditor( QString summary, QString description,
01254 QString attachment )
01255 {
01256 mCalendarView->newEvent( summary, description, attachment );
01257 }
01258
01259 void ActionManager::openTodoEditor( QString text )
01260 {
01261 mCalendarView->newTodo( text );
01262 }
01263
01264 void ActionManager::openTodoEditor( QString summary, QString description,
01265 QString attachment )
01266 {
01267 mCalendarView->newTodo( summary, description, attachment );
01268 }
01269
01270 void ActionManager::showTodoView()
01271 {
01272 mCalendarView->viewManager()->showTodoView();
01273 }
01274
01275 void ActionManager::showEventView()
01276 {
01277 mCalendarView->viewManager()->showEventView();
01278 }
01279
01280 void ActionManager::updateUndoAction( const QString &text )
01281 {
01282 if ( text.isNull() ) {
01283 mUndoAction->setEnabled( false );
01284 mUndoAction->setText( i18n("Undo") );
01285 } else {
01286 mUndoAction->setEnabled( true );
01287 if ( text.isEmpty() ) mUndoAction->setText( i18n("Undo") );
01288 else mUndoAction->setText( i18n("Undo (%1)").arg( text ) );
01289 }
01290 }
01291
01292 void ActionManager::updateRedoAction( const QString &text )
01293 {
01294 if ( text.isNull() ) {
01295 mRedoAction->setEnabled( false );
01296 mRedoAction->setText( i18n("Redo") );
01297 } else {
01298 mRedoAction->setEnabled( true );
01299 if ( text.isEmpty() ) mRedoAction->setText( i18n("Redo") );
01300 else mRedoAction->setText( i18n("Redo (%1)").arg( text ) );
01301 }
01302 }
01303
01304 bool ActionManager::queryClose()
01305 {
01306 kdDebug() << "ActionManager::queryClose()" << endl;
01307
01308 bool close = true;
01309
01310 if ( mCalendar ) {
01311 close = saveModifiedURL();
01312 } else if ( mCalendarResources ) {
01313 mCalendarResources->resourceManager()->writeConfig();
01314 if ( !mIsClosing ) {
01315 kdDebug(5850) << "!mIsClosing" << endl;
01316 if ( !saveResourceCalendar() ) return false;
01317
01318
01319 mIsClosing = true;
01320
01321
01322
01323 }
01324 if ( mCalendarResources->isSaving() ) {
01325 kdDebug(5850) << "KOrganizer::queryClose(): isSaving" << endl;
01326 close = false;
01327 } else {
01328 kdDebug(5850) << "KOrganizer::queryClose(): close = true" << endl;
01329 close = true;
01330 }
01331 } else {
01332 close = true;
01333 }
01334
01335 return close;
01336 }
01337
01338 void ActionManager::saveCalendar()
01339 {
01340 if ( mCalendar ) {
01341 if ( view()->isModified() ) {
01342 if ( !url().isEmpty() ) {
01343 saveURL();
01344 } else {
01345 QString location = locateLocal( "data", "korganizer/kontact.ics" );
01346 saveAsURL( location );
01347 }
01348 }
01349 } else if ( mCalendarResources ) {
01350 mCalendarResources->save();
01351
01352 }
01353 }
01354
01355 bool ActionManager::saveResourceCalendar()
01356 {
01357 if ( !mCalendarResources ) return false;
01358 CalendarResourceManager *m = mCalendarResources->resourceManager();
01359
01360 CalendarResourceManager::ActiveIterator it;
01361 for ( it = m->activeBegin(); it != m->activeEnd(); ++it ) {
01362 if ( (*it)->readOnly() ) continue;
01363 if ( !(*it)->save() ) {
01364 int result = KMessageBox::warningContinueCancel( view(),
01365 i18n("Saving '%1' failed. Please check, if the resource is "
01366 "properly configured.\nIgnore problem and continue without "
01367 "saving or cancel save?").arg( (*it)->resourceName() ),
01368 i18n("Save Error"), i18n("Don't save") );
01369 if ( result == KMessageBox::Cancel ) return false;
01370 }
01371 }
01372 return true;
01373 }
01374
01375 void ActionManager::importResource( const QString &url )
01376 {
01377 ResourceImportDialog *dialog;
01378 dialog = new ResourceImportDialog( url, mMainWindow->topLevelWidget() );
01379 dialog->show();
01380 }
01381
01382 #include "actionmanager.moc"