korganizer

koviewmanager.cpp

00001 /*
00002     This file is part of KOrganizer.
00003 
00004     Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org>
00005     Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com>
00006 
00007     This program is free software; you can redistribute it and/or modify
00008     it under the terms of the GNU General Public License as published by
00009     the Free Software Foundation; either version 2 of the License, or
00010     (at your option) any later version.
00011 
00012     This program is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
00015     GNU General Public License for more details.
00016 
00017     You should have received a copy of the GNU General Public License
00018     along with this program; if not, write to the Free Software
00019     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00020 
00021     As a special exception, permission is given to link this program
00022     with any edition of Qt, and distribute the resulting executable,
00023     without including the source code for Qt in the source distribution.
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 //  kdDebug(5850) << "KOViewManager::updateView()" << endl;
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   // selecting an incidence
00200   connect( view, SIGNAL( incidenceSelected( Incidence * ) ),
00201            mMainView, SLOT( processMainViewSelection( Incidence * ) ) );
00202 
00203   // showing/editing/deleting an incidence. The calendar view takes care of the action.
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   // signals to create new incidences
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   // reload settings
00240   connect(mMainView, SIGNAL(configChanged()), view, SLOT(updateConfig()));
00241 
00242   // Notifications about added, changed and deleted incidences
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   // SIGNALS/SLOTS FOR TODO VIEW
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 /*    connect(mAgendaSideBySideView, SIGNAL( toggleExpand() ),
00353             mMainView, SLOT( toggleExpand() ) );
00354     connect(mMainView, SIGNAL( calendarViewExpanded( bool ) ),
00355             mAgendaSideBySideView, SLOT( setExpandedButton( bool ) ) );
00356 
00357     connect( mAgendaSideBySideView,SIGNAL( zoomViewHorizontally(const QDate &, int )),
00358              mMainView->dateNavigator(),SLOT( selectDates( const QDate &, int ) ) );*/
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 }
KDE Home | KDE Accessibility Home | Description of Access Keys