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