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