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 <qwidgetstack.h>
00027 #include <qtabwidget.h>
00028
00029 #include <libkcal/calendarresources.h>
00030 #include <kactioncollection.h>
00031 #include <kconfig.h>
00032 #include <kglobal.h>
00033
00034 #include "actionmanager.h"
00035 #include "calendarview.h"
00036 #include "datenavigator.h"
00037 #include "kotodoview.h"
00038 #include "koagendaview.h"
00039 #include "komonthview.h"
00040 #include "kolistview.h"
00041 #include "kowhatsnextview.h"
00042 #include "kojournalview.h"
00043 #include "kotimelineview.h"
00044 #include "koprefs.h"
00045 #include "koglobals.h"
00046 #include "navigatorbar.h"
00047 #include "multiagendaview.h"
00048 #include <korganizer/mainwindow.h>
00049
00050 #include "koviewmanager.h"
00051 #include "koviewmanager.moc"
00052
00053 KOViewManager::KOViewManager( CalendarView *mainView ) :
00054 QObject(), mMainView( mainView )
00055 {
00056 mCurrentView = 0;
00057
00058 mLastEventView = 0;
00059
00060 mWhatsNextView = 0;
00061 mTodoView = 0;
00062 mAgendaView = 0;
00063 mAgendaSideBySideView = 0;
00064 mMonthView = 0;
00065 mListView = 0;
00066 mJournalView = 0;
00067 mTimelineView = 0;
00068 mAgendaViewTabs = 0;
00069 mAgendaViewTabIndex = 0;
00070 mAgendaMode = AGENDA_NONE;
00071 }
00072
00073 KOViewManager::~KOViewManager()
00074 {
00075 }
00076
00077
00078 KOrg::BaseView *KOViewManager::currentView()
00079 {
00080 return mCurrentView;
00081 }
00082
00083 void KOViewManager::readSettings(KConfig *config)
00084 {
00085 config->setGroup("General");
00086 QString view = config->readEntry("Current View");
00087
00088 if (view == "WhatsNext") showWhatsNextView();
00089 else if (view == "Month") showMonthView();
00090 else if (view == "List") showListView();
00091 else if (view == "Journal") showJournalView();
00092 else if (view == "Todo") showTodoView();
00093 else if (view == "Timeline") showTimelineView();
00094 else {
00095 mAgendaMode = AgendaMode( config->readNumEntry( "Agenda Mode", AGENDA_OTHER ) );
00096
00097 switch ( mAgendaMode ) {
00098 case AGENDA_WORK_WEEK:
00099 showWorkWeekView();
00100 break;
00101 case AGENDA_WEEK:
00102 showWeekView();
00103 break;
00104 case AGENDA_NEXTX:
00105 showNextXView();
00106 break;
00107 case AGENDA_DAY:
00108 showDayView();
00109 break;
00110 case AGENDA_NONE:
00111
00112 default:
00113 mAgendaMode = AGENDA_OTHER;
00114 showAgendaView();
00115 }
00116 }
00117 }
00118
00119 void KOViewManager::writeSettings(KConfig *config)
00120 {
00121 config->setGroup("General");
00122
00123 QString view;
00124 if (mCurrentView == mWhatsNextView) view = "WhatsNext";
00125 else if (mCurrentView == mMonthView) view = "Month";
00126 else if (mCurrentView == mListView) view = "List";
00127 else if (mCurrentView == mJournalView) view = "Journal";
00128 else if (mCurrentView == mTodoView) view = "Todo";
00129 else if (mCurrentView == mTimelineView) view = "Timeline";
00130 else {
00131 view = "Agenda";
00132 config->writeEntry( "Agenda Mode", mAgendaMode );
00133 }
00134
00135 config->writeEntry("Current View",view);
00136
00137 if (mAgendaView) {
00138 mAgendaView->writeSettings(config);
00139 }
00140 if (mListView) {
00141 mListView->writeSettings(config);
00142 }
00143 if (mTodoView) {
00144 mTodoView->saveLayout(config,"Todo View");
00145 }
00146 }
00147
00148 void KOViewManager::showView(KOrg::BaseView *view)
00149 {
00150 if( view == mCurrentView ) return;
00151
00152 mCurrentView = view;
00153
00154 if ( mCurrentView && mCurrentView->isEventView() ) {
00155 mLastEventView = mCurrentView;
00156 }
00157
00158 if ( mAgendaView ) mAgendaView->deleteSelectedDateTime();
00159
00160 raiseCurrentView();
00161
00162 mMainView->processIncidenceSelection( 0, QDate() );
00163
00164 mMainView->updateView();
00165
00166 mMainView->adaptNavigationUnits();
00167 }
00168
00169 void KOViewManager::goMenu( bool enable )
00170 {
00171 KOrg::MainWindow *w = ActionManager::findInstance( KURL() );
00172 if ( w ) {
00173 KActionCollection *ac = w->getActionCollection();
00174 if ( ac ) {
00175 KAction *action;
00176 action = ac->action( "go_today" );
00177 if ( action ) {
00178 action->setEnabled( enable );
00179 }
00180 action = ac->action( "go_previous" );
00181 if ( action ) {
00182 action->setEnabled( enable );
00183 }
00184 action = ac->action( "go_next" );
00185 if ( action ) {
00186 action->setEnabled( enable );
00187 }
00188 }
00189 }
00190 }
00191
00192 void KOViewManager::raiseCurrentView()
00193 {
00194 if ((mMonthView && KOPrefs::instance()->mFullViewMonth && mCurrentView == mMonthView) ||
00195 (mTodoView && KOPrefs::instance()->mFullViewTodo && mCurrentView == mTodoView)) {
00196 mMainView->showLeftFrame( false );
00197 if ( mCurrentView == mTodoView ) {
00198 mMainView->navigatorBar()->hide();
00199 } else {
00200 mMainView->navigatorBar()->show();
00201 }
00202 } else {
00203 mMainView->showLeftFrame( true );
00204 mMainView->navigatorBar()->hide();
00205 }
00206 mMainView->viewStack()->raiseWidget( widgetForView( mCurrentView ) );
00207 }
00208
00209 void KOViewManager::updateView()
00210 {
00211 if ( mCurrentView ) mCurrentView->updateView();
00212 }
00213
00214 void KOViewManager::updateView(const QDate &start, const QDate &end)
00215 {
00216
00217
00218 if (mCurrentView) mCurrentView->showDates(start, end);
00219
00220 if (mTodoView) mTodoView->updateView();
00221 }
00222
00223 void KOViewManager::connectView(KOrg::BaseView *view)
00224 {
00225 if (!view) return;
00226
00227
00228 connect( view, SIGNAL( incidenceSelected( Incidence *,const QDate & ) ),
00229 mMainView, SLOT( processMainViewSelection( Incidence *,const QDate & ) ) );
00230
00231
00232 connect( view, SIGNAL(showIncidenceSignal(Incidence *,const QDate &)),
00233 mMainView, SLOT(showIncidence(Incidence *,const QDate &)) );
00234 connect( view, SIGNAL(editIncidenceSignal(Incidence *,const QDate &)),
00235 mMainView, SLOT(editIncidence(Incidence *,const QDate &)) );
00236 connect( view, SIGNAL(deleteIncidenceSignal(Incidence *)),
00237 mMainView, SLOT(deleteIncidence(Incidence *)) );
00238 connect( view, SIGNAL(copyIncidenceSignal(Incidence *)),
00239 mMainView, SLOT(copyIncidence(Incidence *)) );
00240 connect( view, SIGNAL(cutIncidenceSignal(Incidence *)),
00241 mMainView, SLOT(cutIncidence(Incidence *)) );
00242 connect( view, SIGNAL(pasteIncidenceSignal()),
00243 mMainView, SLOT(pasteIncidence()));
00244 connect( view, SIGNAL(toggleAlarmSignal(Incidence *)),
00245 mMainView, SLOT(toggleAlarm(Incidence *)) );
00246 connect( view,SIGNAL(dissociateOccurrenceSignal(Incidence *,const QDate &)),
00247 mMainView, SLOT(dissociateOccurrence(Incidence *,const QDate &)) );
00248 connect( view,SIGNAL(dissociateFutureOccurrenceSignal(Incidence *,const QDate &)),
00249 mMainView, SLOT(dissociateFutureOccurrence(Incidence *,const QDate &)) );
00250
00251
00252 connect( view, SIGNAL(newEventSignal(ResourceCalendar *,const QString &)),
00253 mMainView, SLOT(newEvent(ResourceCalendar *,const QString &)) );
00254 connect( view, SIGNAL(newEventSignal(ResourceCalendar *,const QString &,const QDate &)),
00255 mMainView, SLOT(newEvent(ResourceCalendar *,const QString &,const QDate &)) );
00256 connect( view, SIGNAL(newEventSignal(ResourceCalendar *,const QString &,const QDateTime &)),
00257 mMainView, SLOT(newEvent(ResourceCalendar *,const QString &,const QDateTime &)) );
00258 connect( view, SIGNAL(newEventSignal(ResourceCalendar *,const QString &,const QDateTime &,const QDateTime &)),
00259 mMainView, SLOT(newEvent(ResourceCalendar *,const QString &,const QDateTime &,const QDateTime &)) );
00260
00261 connect( view, SIGNAL(newTodoSignal(ResourceCalendar *,const QString &,const QDate &)),
00262 mMainView, SLOT(newTodo(ResourceCalendar *,const QString &,const QDate &)) );
00263 connect( view, SIGNAL(newSubTodoSignal(Todo *)),
00264 mMainView, SLOT(newSubTodo(Todo *)) );
00265
00266 connect( view, SIGNAL(newJournalSignal(ResourceCalendar *,const QString &,const QDate &)),
00267 mMainView, SLOT(newJournal(ResourceCalendar *,const QString &,const QDate &)) );
00268
00269
00270 connect(mMainView, SIGNAL(configChanged()), view, SLOT(updateConfig()));
00271
00272
00273 connect( mMainView, SIGNAL( dayPassed( const QDate & ) ),
00274 view, SLOT( dayPassed( const QDate & ) ) );
00275 connect( view, SIGNAL( startMultiModify( const QString & ) ),
00276 mMainView, SLOT( startMultiModify( const QString & ) ) );
00277 connect( view, SIGNAL( endMultiModify() ),
00278 mMainView, SLOT( endMultiModify() ) );
00279
00280 connect( mMainView, SIGNAL( newIncidenceChanger( IncidenceChangerBase* ) ),
00281 view, SLOT( setIncidenceChanger( IncidenceChangerBase * ) ) );
00282 view->setIncidenceChanger( mMainView->incidenceChanger() );
00283 }
00284
00285 void KOViewManager::connectTodoView( KOTodoView* todoView )
00286 {
00287 if (!todoView) return;
00288
00289
00290 connect( todoView, SIGNAL( purgeCompletedSignal() ),
00291 mMainView, SLOT( purgeCompleted() ) );
00292 connect( todoView, SIGNAL( unSubTodoSignal() ),
00293 mMainView, SLOT( todo_unsub() ) );
00294 connect( todoView, SIGNAL( unAllSubTodoSignal() ),
00295 mMainView, SLOT( makeSubTodosIndependents() ) );
00296 }
00297
00298 void KOViewManager::zoomInHorizontally()
00299 {
00300 if( mAgendaView == mCurrentView ) mAgendaView->zoomInHorizontally();
00301 }
00302 void KOViewManager::zoomOutHorizontally()
00303 {
00304 if( mAgendaView== mCurrentView ) mAgendaView->zoomOutHorizontally();
00305 }
00306 void KOViewManager::zoomInVertically()
00307 {
00308 if( mAgendaView== mCurrentView ) mAgendaView->zoomInVertically();
00309 }
00310 void KOViewManager::zoomOutVertically()
00311 {
00312 if( mAgendaView== mCurrentView ) mAgendaView->zoomOutVertically();
00313 }
00314
00315 void KOViewManager::addView(KOrg::BaseView *view)
00316 {
00317 connectView( view );
00318 #if QT_VERSION >= 300
00319 mMainView->viewStack()->addWidget( view );
00320 #else
00321 mMainView->viewStack()->addWidget( view, 1 );
00322 #endif
00323 }
00324
00325 void KOViewManager::showWhatsNextView()
00326 {
00327 if (!mWhatsNextView) {
00328 mWhatsNextView = new KOWhatsNextView(mMainView->calendar(),mMainView->viewStack(),
00329 "KOViewManager::WhatsNextView");
00330 addView(mWhatsNextView);
00331 }
00332 goMenu( true );
00333 showView(mWhatsNextView);
00334 }
00335
00336 void KOViewManager::showListView()
00337 {
00338 if (!mListView) {
00339 mListView = new KOListView(mMainView->calendar(), mMainView->viewStack(), "KOViewManager::ListView");
00340 addView(mListView);
00341 }
00342 goMenu( true );
00343 showView(mListView);
00344 }
00345
00346 void KOViewManager::showAgendaView()
00347 {
00348
00349
00350 CalendarResources *calres = dynamic_cast<CalendarResources*>( mMainView->calendar() );
00351 bool isLocalFile = !calres;
00352
00353 int mode = KOPrefs::instance()->agendaViewCalendarDisplay();
00354
00355 const bool showBoth = ( mode == KOPrefs::AllCalendarViews && !isLocalFile );
00356
00357 const bool showMerged = showBoth || mode == KOPrefs::CalendarsMerged || isLocalFile;
00358
00359 const bool showSideBySide = !isLocalFile && ( showBoth || mode == KOPrefs::CalendarsSideBySide );
00360
00361 QWidget *parent = mMainView->viewStack();
00362 if ( !mAgendaViewTabs && showBoth ) {
00363 mAgendaViewTabs = new QTabWidget( mMainView->viewStack() );
00364 connect( mAgendaViewTabs, SIGNAL( currentChanged( QWidget* ) ),
00365 this, SLOT( currentAgendaViewTabChanged( QWidget* ) ) );
00366 parent = mAgendaViewTabs;
00367
00368 KConfig *config = KOGlobals::self()->config();
00369 config->setGroup( "Views" );
00370 mAgendaViewTabIndex = config->readNumEntry( "Agenda View Tab Index", 0 );
00371 }
00372
00373 if ( !mAgendaView && showMerged ) {
00374 mAgendaView = new KOAgendaView( mMainView->calendar(),
00375 mMainView,
00376 parent,
00377 "KOViewManager::AgendaView" );
00378
00379 addView(mAgendaView);
00380
00381 connect(mAgendaView, SIGNAL( toggleExpand() ),
00382 mMainView, SLOT( toggleExpand() ) );
00383 connect(mMainView, SIGNAL( calendarViewExpanded( bool ) ),
00384 mAgendaView, SLOT( setExpandedButton( bool ) ) );
00385
00386 connect( mAgendaView,SIGNAL( zoomViewHorizontally(const QDate &, int )),
00387 mMainView->dateNavigator(),SLOT( selectDates( const QDate &, int ) ) );
00388 mAgendaView->readSettings();
00389 }
00390
00391 if ( !mAgendaSideBySideView && showSideBySide ) {
00392 mAgendaSideBySideView =
00393 new MultiAgendaView( mMainView->calendar(), mMainView, parent,
00394 "KOViewManager::AgendaSideBySideView" );
00395
00396 addView(mAgendaSideBySideView);
00397
00398
00399
00400
00401
00402
00403
00404
00405 }
00406
00407 if ( showBoth && mAgendaViewTabs ) {
00408 if ( mAgendaView && mAgendaViewTabs->indexOf( mAgendaView ) < 0 )
00409 mAgendaViewTabs->addTab( mAgendaView, i18n("Merged calendar") );
00410 if ( mAgendaSideBySideView && mAgendaViewTabs->indexOf( mAgendaSideBySideView ) < 0 )
00411 mAgendaViewTabs->addTab( mAgendaSideBySideView, i18n("Calendars Side by Side") );
00412 mAgendaViewTabs->setCurrentPage( mAgendaViewTabIndex );
00413 } else {
00414 if ( mAgendaView && mMainView->viewStack()->id( mAgendaView ) < 0 )
00415 mMainView->viewStack()->addWidget( mAgendaView );
00416 if ( mAgendaSideBySideView && mMainView->viewStack()->id( mAgendaSideBySideView ) < 0 )
00417 mMainView->viewStack()->addWidget( mAgendaSideBySideView );
00418 }
00419
00420 goMenu( true );
00421 if ( mAgendaViewTabs && showBoth )
00422 showView( static_cast<KOrg::BaseView*>( mAgendaViewTabs->currentPage() ) );
00423 else if ( mAgendaView && showMerged )
00424 showView( mAgendaView );
00425 else if ( mAgendaSideBySideView && showSideBySide )
00426 showView( mAgendaSideBySideView );
00427 }
00428
00429 void KOViewManager::showDayView()
00430 {
00431 mAgendaMode = AGENDA_DAY;
00432 showAgendaView();
00433 mMainView->dateNavigator()->selectDates( 1 );
00434 }
00435
00436 void KOViewManager::showWorkWeekView()
00437 {
00438 mAgendaMode = AGENDA_WORK_WEEK;
00439 showAgendaView();
00440 mMainView->dateNavigator()->selectWorkWeek();
00441 }
00442
00443 void KOViewManager::showWeekView()
00444 {
00445 mAgendaMode = AGENDA_WEEK;
00446 showAgendaView();
00447 mMainView->dateNavigator()->selectWeek();
00448 }
00449
00450 void KOViewManager::showNextXView()
00451 {
00452 mAgendaMode = AGENDA_NEXTX;
00453 showAgendaView();
00454 mMainView->dateNavigator()->selectDates( QDate::currentDate(),
00455 KOPrefs::instance()->mNextXDays );
00456 }
00457
00458 void KOViewManager::showMonthView()
00459 {
00460 if (!mMonthView) {
00461 mMonthView = new KOMonthView(mMainView->calendar(), mMainView->viewStack(), "KOViewManager::MonthView");
00462 addView(mMonthView);
00463 }
00464
00465 goMenu( true );
00466 showView(mMonthView);
00467 }
00468
00469 void KOViewManager::showTodoView()
00470 {
00471 if ( !mTodoView ) {
00472 mTodoView = new KOTodoView( mMainView->calendar(), mMainView->viewStack(),
00473 "KOViewManager::TodoView" );
00474 mTodoView->setCalendar( mMainView->calendar() );
00475 addView( mTodoView );
00476 connectTodoView( mTodoView );
00477
00478 KConfig *config = KOGlobals::self()->config();
00479 mTodoView->restoreLayout( config, "Todo View" );
00480 }
00481
00482 goMenu( false );
00483 showView( mTodoView );
00484 }
00485
00486 void KOViewManager::showJournalView()
00487 {
00488 if (!mJournalView) {
00489 mJournalView = new KOJournalView(mMainView->calendar(),mMainView->viewStack(),
00490 "KOViewManager::JournalView");
00491 addView(mJournalView);
00492 }
00493
00494 goMenu( true );
00495 showView(mJournalView);
00496 }
00497
00498
00499 void KOViewManager::showTimelineView()
00500 {
00501 if (!mTimelineView) {
00502 mTimelineView = new KOTimelineView(mMainView->calendar(),mMainView->viewStack(),
00503 "KOViewManager::TimelineView");
00504 addView(mTimelineView);
00505 }
00506 goMenu( true );
00507 showView(mTimelineView);
00508 }
00509
00510 void KOViewManager::showEventView()
00511 {
00512 if ( mLastEventView ) {
00513 goMenu( true );
00514 showView( mLastEventView );
00515 } else {
00516 showWeekView();
00517 }
00518 }
00519
00520 Incidence *KOViewManager::currentSelection()
00521 {
00522 if ( !mCurrentView ) return 0;
00523 Incidence::List incidenceList = mCurrentView->selectedIncidences();
00524 if ( incidenceList.isEmpty() ) return 0;
00525
00526 return incidenceList.first();
00527 }
00528
00529 QDate KOViewManager::currentSelectionDate()
00530 {
00531 QDate qd;
00532 if (mCurrentView) {
00533 DateList qvl = mCurrentView->selectedIncidenceDates();
00534 if (!qvl.isEmpty()) qd = qvl.first();
00535 }
00536 return qd;
00537 }
00538
00539 void KOViewManager::setDocumentId( const QString &id )
00540 {
00541 if (mTodoView) mTodoView->setDocumentId( id );
00542 }
00543
00544
00545 QWidget* KOViewManager::widgetForView( KOrg::BaseView* view ) const
00546 {
00547 const bool showBoth = KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::AllCalendarViews;
00548 if ( (view == mAgendaView || view == mAgendaSideBySideView) && mAgendaViewTabs && showBoth ) {
00549 return mAgendaViewTabs;
00550 }
00551 return view;
00552 }
00553
00554
00555 void KOViewManager::currentAgendaViewTabChanged( QWidget* widget )
00556 {
00557 KConfig *config = KOGlobals::self()->config();
00558 config->setGroup( "Views" );
00559 config->writeEntry( "Agenda View Tab Index", mAgendaViewTabs->currentPageIndex() );
00560
00561 goMenu( true );
00562 showView( static_cast<KOrg::BaseView*>( widget ) );
00563 }
00564
00565 void KOViewManager::resourcesChanged()
00566 {
00567 if ( mAgendaView )
00568 mAgendaView->resourcesChanged();
00569 if ( mAgendaSideBySideView )
00570 mAgendaSideBySideView->resourcesChanged();
00571 }
00572
00573 void KOViewManager::updateMultiCalendarDisplay()
00574 {
00575 if ( agendaIsSelected() ) {
00576 showAgendaView();
00577 } else {
00578 updateView();
00579 }
00580 }
00581
00582 bool KOViewManager::agendaIsSelected() const
00583 {
00584 return mCurrentView == mAgendaView ||
00585 mCurrentView == mAgendaSideBySideView ||
00586 ( mAgendaViewTabs && mCurrentView == mAgendaViewTabs->currentPage() );
00587 }