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 <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 //  kdDebug(5850) << "KOViewManager::updateView()" << endl;
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   // selecting an incidence
00173   connect( view, SIGNAL( incidenceSelected( Incidence * ) ),
00174            mMainView, SLOT( processMainViewSelection( Incidence * ) ) );
00175 
00176   // showing/editing/deleting an incidence. The calendar view takes care of the action.
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(toggleAlarmSignal(Incidence *)),
00188           mMainView, SLOT(toggleAlarm(Incidence *)));
00189   connect(view,SIGNAL(dissociateOccurrenceSignal( Incidence *, const QDate & )),
00190           mMainView, SLOT(dissociateOccurrence( Incidence *, const QDate & )));
00191   connect(view,SIGNAL(dissociateFutureOccurrenceSignal( Incidence *, const QDate & )),
00192           mMainView, SLOT(dissociateFutureOccurrence( Incidence *, const QDate & )));
00193 
00194   // signals to create new incidences
00195   connect( view, SIGNAL( newEventSignal() ),
00196            mMainView, SLOT( newEvent() ) );
00197   connect( view, SIGNAL( newEventSignal( const QDateTime & ) ),
00198            mMainView, SLOT( newEvent( const QDateTime & ) ) );
00199   connect( view, SIGNAL( newEventSignal( const QDateTime &, const QDateTime & ) ),
00200            mMainView, SLOT( newEvent( const QDateTime &, const QDateTime & ) ) );
00201   connect( view, SIGNAL( newEventSignal( const QDate & ) ),
00202            mMainView, SLOT( newEvent( const QDate & ) ) );
00203   connect( view, SIGNAL( newTodoSignal( const QDate & ) ),
00204            mMainView, SLOT( newTodo( const QDate & ) ) );
00205   connect( view, SIGNAL( newSubTodoSignal( Todo * ) ),
00206            mMainView, SLOT( newSubTodo( Todo *) ) );
00207   connect( view, SIGNAL( newJournalSignal( const QDate & ) ),
00208            mMainView, SLOT( newJournal( const QDate & ) ) );
00209 
00210   // reload settings
00211   connect(mMainView, SIGNAL(configChanged()), view, SLOT(updateConfig()));
00212 
00213   // Notifications about added, changed and deleted incidences
00214   connect( mMainView, SIGNAL( dayPassed( const QDate & ) ),
00215            view, SLOT( dayPassed( const QDate & ) ) );
00216   connect( view, SIGNAL( startMultiModify( const QString & ) ),
00217            mMainView, SLOT( startMultiModify( const QString & ) ) );
00218   connect( view, SIGNAL( endMultiModify() ),
00219            mMainView, SLOT( endMultiModify() ) );
00220 
00221   connect( mMainView, SIGNAL( newIncidenceChanger( IncidenceChangerBase* ) ),
00222            view, SLOT( setIncidenceChanger( IncidenceChangerBase * ) ) );
00223   view->setIncidenceChanger( mMainView->incidenceChanger() );
00224 }
00225 
00226 void KOViewManager::connectTodoView( KOTodoView* todoView )
00227 {
00228   if (!todoView) return;
00229 
00230   // SIGNALS/SLOTS FOR TODO VIEW
00231   connect( todoView, SIGNAL( purgeCompletedSignal() ),
00232            mMainView, SLOT( purgeCompleted() ) );
00233   connect( todoView, SIGNAL( unSubTodoSignal() ),
00234            mMainView, SLOT( todo_unsub() ) );
00235   connect( todoView, SIGNAL( unAllSubTodoSignal() ),
00236            mMainView, SLOT( makeSubTodosIndependents() ) );
00237 }
00238 
00239 void KOViewManager::zoomInHorizontally()
00240 {
00241   if( mAgendaView == mCurrentView ) mAgendaView->zoomInHorizontally();
00242 }
00243 void KOViewManager::zoomOutHorizontally()
00244 {
00245   if( mAgendaView== mCurrentView ) mAgendaView->zoomOutHorizontally();
00246 }
00247 void KOViewManager::zoomInVertically()
00248 {
00249   if( mAgendaView== mCurrentView ) mAgendaView->zoomInVertically();
00250 }
00251 void KOViewManager::zoomOutVertically()
00252 {
00253   if( mAgendaView== mCurrentView ) mAgendaView->zoomOutVertically();
00254 }
00255 
00256 void KOViewManager::addView(KOrg::BaseView *view)
00257 {
00258   connectView( view );
00259 #if QT_VERSION >= 300
00260   mMainView->viewStack()->addWidget( view );
00261 #else
00262   mMainView->viewStack()->addWidget( view, 1 );
00263 #endif
00264 }
00265 
00266 void KOViewManager::showWhatsNextView()
00267 {
00268   if (!mWhatsNextView) {
00269     mWhatsNextView = new KOWhatsNextView(mMainView->calendar(),mMainView->viewStack(),
00270                                          "KOViewManager::WhatsNextView");
00271     addView(mWhatsNextView);
00272   }
00273   showView(mWhatsNextView);
00274 }
00275 
00276 void KOViewManager::showListView()
00277 {
00278   if (!mListView) {
00279     mListView = new KOListView(mMainView->calendar(), mMainView->viewStack(), "KOViewManager::ListView");
00280     addView(mListView);
00281   }
00282   showView(mListView);
00283 }
00284 
00285 void KOViewManager::showAgendaView()
00286 {
00287   const bool showBoth = KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::AllCalendarViews;
00288   const bool showMerged = showBoth || KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::CalendarsMerged;
00289   const bool showSideBySide = showBoth || KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::CalendarsSideBySide;
00290 
00291   QWidget *parent = mMainView->viewStack();
00292   if ( !mAgendaViewTabs && showBoth ) {
00293     mAgendaViewTabs = new QTabWidget( mMainView->viewStack() );
00294     connect( mAgendaViewTabs, SIGNAL( currentChanged( QWidget* ) ),
00295              this, SLOT( currentAgendaViewTabChanged( QWidget* ) ) );
00296     parent = mAgendaViewTabs;
00297   }
00298 
00299   if ( !mAgendaView && showMerged ) {
00300     mAgendaView = new KOAgendaView(mMainView->calendar(), parent, "KOViewManager::AgendaView");
00301 
00302     addView(mAgendaView);
00303 
00304     connect(mAgendaView, SIGNAL( toggleExpand() ),
00305             mMainView, SLOT( toggleExpand() ) );
00306     connect(mMainView, SIGNAL( calendarViewExpanded( bool ) ),
00307             mAgendaView, SLOT( setExpandedButton( bool ) ) );
00308 
00309     connect( mAgendaView,SIGNAL( zoomViewHorizontally(const QDate &, int )),
00310              mMainView->dateNavigator(),SLOT( selectDates( const QDate &, int ) ) );
00311     mAgendaView->readSettings();
00312   }
00313 
00314   if ( !mAgendaSideBySideView && showSideBySide ) {
00315     mAgendaSideBySideView =
00316       new MultiAgendaView( mMainView->calendar(), parent,
00317                         "KOViewManager::AgendaSideBySideView" );
00318 
00319     addView(mAgendaSideBySideView);
00320 
00321 /*    connect(mAgendaSideBySideView, SIGNAL( toggleExpand() ),
00322             mMainView, SLOT( toggleExpand() ) );
00323     connect(mMainView, SIGNAL( calendarViewExpanded( bool ) ),
00324             mAgendaSideBySideView, SLOT( setExpandedButton( bool ) ) );
00325 
00326     connect( mAgendaSideBySideView,SIGNAL( zoomViewHorizontally(const QDate &, int )),
00327              mMainView->dateNavigator(),SLOT( selectDates( const QDate &, int ) ) );*/
00328   }
00329 
00330   if ( showBoth && mAgendaViewTabs ) {
00331     if ( mAgendaView && mAgendaViewTabs->indexOf( mAgendaView ) < 0 )
00332       mAgendaViewTabs->addTab( mAgendaView, i18n("Merged calendar") );
00333     if ( mAgendaSideBySideView  && mAgendaViewTabs->indexOf( mAgendaSideBySideView ) < 0 )
00334       mAgendaViewTabs->addTab( mAgendaSideBySideView, i18n("Calendars Side by Side") );
00335   } else {
00336     if ( mAgendaView && mMainView->viewStack()->id( mAgendaView ) < 0 )
00337       mMainView->viewStack()->addWidget( mAgendaView );
00338     if ( mAgendaSideBySideView && mMainView->viewStack()->id( mAgendaSideBySideView ) < 0 )
00339       mMainView->viewStack()->addWidget( mAgendaSideBySideView );
00340   }
00341 
00342   if ( mAgendaViewTabs && showBoth )
00343     showView( static_cast<KOrg::BaseView*>( mAgendaViewTabs->currentPage() ) );
00344   else if ( mAgendaView && showMerged )
00345     showView( mAgendaView );
00346   else if ( mAgendaSideBySideView && showSideBySide )
00347     showView( mAgendaSideBySideView );
00348 }
00349 
00350 void KOViewManager::showDayView()
00351 {
00352   showAgendaView();
00353   mMainView->dateNavigator()->selectDates( 1 );
00354 }
00355 
00356 void KOViewManager::showWorkWeekView()
00357 {
00358   showAgendaView();
00359   mMainView->dateNavigator()->selectWorkWeek();
00360 }
00361 
00362 void KOViewManager::showWeekView()
00363 {
00364   showAgendaView();
00365   mMainView->dateNavigator()->selectWeek();
00366 }
00367 
00368 void KOViewManager::showNextXView()
00369 {
00370   showAgendaView();
00371   mMainView->dateNavigator()->selectDates( QDate::currentDate(),
00372                                            KOPrefs::instance()->mNextXDays );
00373 }
00374 
00375 void KOViewManager::showMonthView()
00376 {
00377   if (!mMonthView) {
00378     mMonthView = new KOMonthView(mMainView->calendar(), mMainView->viewStack(), "KOViewManager::MonthView");
00379     addView(mMonthView);
00380   }
00381 
00382   showView(mMonthView);
00383 }
00384 
00385 void KOViewManager::showTodoView()
00386 {
00387   if ( !mTodoView ) {
00388     mTodoView = new KOTodoView( mMainView->calendar(), mMainView->viewStack(),
00389                                 "KOViewManager::TodoView" );
00390     mTodoView->setCalendar( mMainView->calendar() );
00391     addView( mTodoView );
00392     connectTodoView( mTodoView );
00393 
00394     KConfig *config = KOGlobals::self()->config();
00395     mTodoView->restoreLayout( config, "Todo View" );
00396   }
00397 
00398   showView( mTodoView );
00399 }
00400 
00401 void KOViewManager::showJournalView()
00402 {
00403   if (!mJournalView) {
00404     mJournalView = new KOJournalView(mMainView->calendar(),mMainView->viewStack(),
00405                                      "KOViewManager::JournalView");
00406     addView(mJournalView);
00407   }
00408 
00409   showView(mJournalView);
00410 }
00411 
00412 
00413 void KOViewManager::showTimelineView()
00414 {
00415   if (!mTimelineView) {
00416     mTimelineView = new KOTimelineView(mMainView->calendar(),mMainView->viewStack(),
00417                                      "KOViewManager::TimelineView");
00418     addView(mTimelineView);
00419   }
00420   showView(mTimelineView);
00421 }
00422 
00423 void KOViewManager::showEventView()
00424 {
00425   if ( mLastEventView ) showView( mLastEventView );
00426   else showWeekView();
00427 }
00428 
00429 Incidence *KOViewManager::currentSelection()
00430 {
00431   if ( !mCurrentView ) return 0;
00432   Incidence::List incidenceList = mCurrentView->selectedIncidences();
00433   if ( incidenceList.isEmpty() ) return 0;
00434 
00435   return incidenceList.first();
00436 }
00437 
00438 QDate KOViewManager::currentSelectionDate()
00439 {
00440   QDate qd;
00441   if (mCurrentView) {
00442     DateList qvl = mCurrentView->selectedDates();
00443     if (!qvl.isEmpty()) qd = qvl.first();
00444   }
00445   return qd;
00446 }
00447 
00448 void KOViewManager::setDocumentId( const QString &id )
00449 {
00450   if (mTodoView) mTodoView->setDocumentId( id );
00451 }
00452 
00453 
00454 QWidget* KOViewManager::widgetForView( KOrg::BaseView* view ) const
00455 {
00456   const bool showBoth = KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::AllCalendarViews;
00457   if ( (view == mAgendaView || view == mAgendaSideBySideView) && mAgendaViewTabs && showBoth ) {
00458     return mAgendaViewTabs;
00459   }
00460   return view;
00461 }
00462 
00463 
00464 void KOViewManager::currentAgendaViewTabChanged( QWidget* widget )
00465 {
00466   showView( static_cast<KOrg::BaseView*>( widget ) );
00467 }
KDE Home | KDE Accessibility Home | Description of Access Keys