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(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   // signals to create new incidences
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   // reload settings
00213   connect(mMainView, SIGNAL(configChanged()), view, SLOT(updateConfig()));
00214 
00215   // Notifications about added, changed and deleted incidences
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   // SIGNALS/SLOTS FOR TODO VIEW
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 /*    connect(mAgendaSideBySideView, SIGNAL( toggleExpand() ),
00324             mMainView, SLOT( toggleExpand() ) );
00325     connect(mMainView, SIGNAL( calendarViewExpanded( bool ) ),
00326             mAgendaSideBySideView, SLOT( setExpandedButton( bool ) ) );
00327 
00328     connect( mAgendaSideBySideView,SIGNAL( zoomViewHorizontally(const QDate &, int )),
00329              mMainView->dateNavigator(),SLOT( selectDates( const QDate &, int ) ) );*/
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 }
KDE Home | KDE Accessibility Home | Description of Access Keys