korganizer Library API Documentation

actionmanager.cpp

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