diff options
Diffstat (limited to 'korganizer/koviewmanager.cpp')
-rw-r--r-- | korganizer/koviewmanager.cpp | 477 |
1 files changed, 477 insertions, 0 deletions
diff --git a/korganizer/koviewmanager.cpp b/korganizer/koviewmanager.cpp new file mode 100644 index 000000000..d7929039e --- /dev/null +++ b/korganizer/koviewmanager.cpp @@ -0,0 +1,477 @@ +/* + This file is part of KOrganizer. + + Copyright (c) 2001,2003 Cornelius Schumacher <schumacher@kde.org> + Copyright (C) 2003-2004 Reinhold Kainhofer <reinhold@kainhofer.com> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + As a special exception, permission is given to link this program + with any edition of Qt, and distribute the resulting executable, + without including the source code for Qt in the source distribution. +*/ + +#include <qwidgetstack.h> +#include <qtabwidget.h> + +#include <kconfig.h> +#include <kglobal.h> + +#include "calendarview.h" +#include "datenavigator.h" +#include "kotodoview.h" +#include "koagendaview.h" +#include "komonthview.h" +#include "kolistview.h" +#include "kowhatsnextview.h" +#include "kojournalview.h" +#include "kotimelineview.h" +#include "koprefs.h" +#include "koglobals.h" +#include "navigatorbar.h" +#include "multiagendaview.h" + +#include "koviewmanager.h" +#include "koviewmanager.moc" + +KOViewManager::KOViewManager( CalendarView *mainView ) : + QObject(), mMainView( mainView ) +{ + mCurrentView = 0; + + mLastEventView = 0; + + mWhatsNextView = 0; + mTodoView = 0; + mAgendaView = 0; + mAgendaSideBySideView = 0; + mMonthView = 0; + mListView = 0; + mJournalView = 0; + mTimelineView = 0; + mAgendaViewTabs = 0; +} + +KOViewManager::~KOViewManager() +{ +} + + +KOrg::BaseView *KOViewManager::currentView() +{ + return mCurrentView; +} + +void KOViewManager::readSettings(KConfig *config) +{ + config->setGroup("General"); + QString view = config->readEntry("Current View"); + + if (view == "WhatsNext") showWhatsNextView(); + else if (view == "Month") showMonthView(); + else if (view == "List") showListView(); + else if (view == "Journal") showJournalView(); + else if (view == "Todo") showTodoView(); + else if (view == "Timeline") showTimelineView(); + else showAgendaView(); +} + +void KOViewManager::writeSettings(KConfig *config) +{ + config->setGroup("General"); + + QString view; + if (mCurrentView == mWhatsNextView) view = "WhatsNext"; + else if (mCurrentView == mMonthView) view = "Month"; + else if (mCurrentView == mListView) view = "List"; + else if (mCurrentView == mJournalView) view = "Journal"; + else if (mCurrentView == mTodoView) view = "Todo"; + else if (mCurrentView == mTimelineView) view = "Timeline"; + else view = "Agenda"; + + config->writeEntry("Current View",view); + + if (mAgendaView) { + mAgendaView->writeSettings(config); + } + if (mListView) { + mListView->writeSettings(config); + } + if (mTodoView) { + mTodoView->saveLayout(config,"Todo View"); + } +} + +void KOViewManager::showView(KOrg::BaseView *view) +{ + if( view == mCurrentView ) return; + + mCurrentView = view; + + if ( mCurrentView && mCurrentView->isEventView() ) { + mLastEventView = mCurrentView; + } + + if ( mAgendaView ) mAgendaView->deleteSelectedDateTime(); + + raiseCurrentView(); + mMainView->processIncidenceSelection( 0 ); + + mMainView->updateView(); + + mMainView->adaptNavigationUnits(); +} + +void KOViewManager::raiseCurrentView() +{ + if ((mMonthView && KOPrefs::instance()->mFullViewMonth && mCurrentView == mMonthView) || + (mTodoView && KOPrefs::instance()->mFullViewTodo && mCurrentView == mTodoView)) { + mMainView->showLeftFrame( false ); + if ( mCurrentView == mTodoView ) { + mMainView->navigatorBar()->hide(); + } else { + mMainView->navigatorBar()->show(); + } + } else { + mMainView->showLeftFrame( true ); + mMainView->navigatorBar()->hide(); + } + mMainView->viewStack()->raiseWidget( widgetForView( mCurrentView ) ); +} + +void KOViewManager::updateView() +{ + if ( mCurrentView ) mCurrentView->updateView(); +} + +void KOViewManager::updateView(const QDate &start, const QDate &end) +{ +// kdDebug(5850) << "KOViewManager::updateView()" << endl; + + if (mCurrentView) mCurrentView->showDates(start, end); + + if (mTodoView) mTodoView->updateView(); +} + +void KOViewManager::connectView(KOrg::BaseView *view) +{ + if (!view) return; + + // selecting an incidence + connect( view, SIGNAL( incidenceSelected( Incidence * ) ), + mMainView, SLOT( processMainViewSelection( Incidence * ) ) ); + + // showing/editing/deleting an incidence. The calendar view takes care of the action. + connect(view, SIGNAL(showIncidenceSignal(Incidence *)), + mMainView, SLOT(showIncidence(Incidence *))); + connect(view, SIGNAL(editIncidenceSignal(Incidence *)), + mMainView, SLOT(editIncidence(Incidence *))); + connect(view, SIGNAL(deleteIncidenceSignal(Incidence *)), + mMainView, SLOT(deleteIncidence(Incidence *))); + connect(view, SIGNAL(copyIncidenceSignal(Incidence *)), + mMainView, SLOT(copyIncidence(Incidence *))); + connect(view, SIGNAL(cutIncidenceSignal(Incidence *)), + mMainView, SLOT(cutIncidence(Incidence *))); + connect(view, SIGNAL(pasteIncidenceSignal()), + mMainView, SLOT(pasteIncidence())); + connect(view, SIGNAL(toggleAlarmSignal(Incidence *)), + mMainView, SLOT(toggleAlarm(Incidence *))); + connect(view,SIGNAL(dissociateOccurrenceSignal( Incidence *, const QDate & )), + mMainView, SLOT(dissociateOccurrence( Incidence *, const QDate & ))); + connect(view,SIGNAL(dissociateFutureOccurrenceSignal( Incidence *, const QDate & )), + mMainView, SLOT(dissociateFutureOccurrence( Incidence *, const QDate & ))); + + // signals to create new incidences + connect( view, SIGNAL( newEventSignal() ), + mMainView, SLOT( newEvent() ) ); + connect( view, SIGNAL( newEventSignal( const QDateTime & ) ), + mMainView, SLOT( newEvent( const QDateTime & ) ) ); + connect( view, SIGNAL( newEventSignal( const QDateTime &, const QDateTime & ) ), + mMainView, SLOT( newEvent( const QDateTime &, const QDateTime & ) ) ); + connect( view, SIGNAL( newEventSignal( const QDate & ) ), + mMainView, SLOT( newEvent( const QDate & ) ) ); + connect( view, SIGNAL( newTodoSignal( const QDate & ) ), + mMainView, SLOT( newTodo( const QDate & ) ) ); + connect( view, SIGNAL( newSubTodoSignal( Todo * ) ), + mMainView, SLOT( newSubTodo( Todo *) ) ); + connect( view, SIGNAL( newJournalSignal( const QDate & ) ), + mMainView, SLOT( newJournal( const QDate & ) ) ); + + // reload settings + connect(mMainView, SIGNAL(configChanged()), view, SLOT(updateConfig())); + + // Notifications about added, changed and deleted incidences + connect( mMainView, SIGNAL( dayPassed( const QDate & ) ), + view, SLOT( dayPassed( const QDate & ) ) ); + connect( view, SIGNAL( startMultiModify( const QString & ) ), + mMainView, SLOT( startMultiModify( const QString & ) ) ); + connect( view, SIGNAL( endMultiModify() ), + mMainView, SLOT( endMultiModify() ) ); + + connect( mMainView, SIGNAL( newIncidenceChanger( IncidenceChangerBase* ) ), + view, SLOT( setIncidenceChanger( IncidenceChangerBase * ) ) ); + view->setIncidenceChanger( mMainView->incidenceChanger() ); +} + +void KOViewManager::connectTodoView( KOTodoView* todoView ) +{ + if (!todoView) return; + + // SIGNALS/SLOTS FOR TODO VIEW + connect( todoView, SIGNAL( purgeCompletedSignal() ), + mMainView, SLOT( purgeCompleted() ) ); + connect( todoView, SIGNAL( unSubTodoSignal() ), + mMainView, SLOT( todo_unsub() ) ); + connect( todoView, SIGNAL( unAllSubTodoSignal() ), + mMainView, SLOT( makeSubTodosIndependents() ) ); +} + +void KOViewManager::zoomInHorizontally() +{ + if( mAgendaView == mCurrentView ) mAgendaView->zoomInHorizontally(); +} +void KOViewManager::zoomOutHorizontally() +{ + if( mAgendaView== mCurrentView ) mAgendaView->zoomOutHorizontally(); +} +void KOViewManager::zoomInVertically() +{ + if( mAgendaView== mCurrentView ) mAgendaView->zoomInVertically(); +} +void KOViewManager::zoomOutVertically() +{ + if( mAgendaView== mCurrentView ) mAgendaView->zoomOutVertically(); +} + +void KOViewManager::addView(KOrg::BaseView *view) +{ + connectView( view ); +#if QT_VERSION >= 300 + mMainView->viewStack()->addWidget( view ); +#else + mMainView->viewStack()->addWidget( view, 1 ); +#endif +} + +void KOViewManager::showWhatsNextView() +{ + if (!mWhatsNextView) { + mWhatsNextView = new KOWhatsNextView(mMainView->calendar(),mMainView->viewStack(), + "KOViewManager::WhatsNextView"); + addView(mWhatsNextView); + } + showView(mWhatsNextView); +} + +void KOViewManager::showListView() +{ + if (!mListView) { + mListView = new KOListView(mMainView->calendar(), mMainView->viewStack(), "KOViewManager::ListView"); + addView(mListView); + } + showView(mListView); +} + +void KOViewManager::showAgendaView() +{ + const bool showBoth = KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::AllCalendarViews; + const bool showMerged = showBoth || KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::CalendarsMerged; + const bool showSideBySide = showBoth || KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::CalendarsSideBySide; + + QWidget *parent = mMainView->viewStack(); + if ( !mAgendaViewTabs && showBoth ) { + mAgendaViewTabs = new QTabWidget( mMainView->viewStack() ); + connect( mAgendaViewTabs, SIGNAL( currentChanged( QWidget* ) ), + this, SLOT( currentAgendaViewTabChanged( QWidget* ) ) ); + parent = mAgendaViewTabs; + } + + if ( !mAgendaView && showMerged ) { + mAgendaView = new KOAgendaView(mMainView->calendar(), parent, "KOViewManager::AgendaView"); + + addView(mAgendaView); + + connect(mAgendaView, SIGNAL( toggleExpand() ), + mMainView, SLOT( toggleExpand() ) ); + connect(mMainView, SIGNAL( calendarViewExpanded( bool ) ), + mAgendaView, SLOT( setExpandedButton( bool ) ) ); + + connect( mAgendaView,SIGNAL( zoomViewHorizontally(const QDate &, int )), + mMainView->dateNavigator(),SLOT( selectDates( const QDate &, int ) ) ); + mAgendaView->readSettings(); + } + + if ( !mAgendaSideBySideView && showSideBySide ) { + mAgendaSideBySideView = + new MultiAgendaView( mMainView->calendar(), parent, + "KOViewManager::AgendaSideBySideView" ); + + addView(mAgendaSideBySideView); + +/* connect(mAgendaSideBySideView, SIGNAL( toggleExpand() ), + mMainView, SLOT( toggleExpand() ) ); + connect(mMainView, SIGNAL( calendarViewExpanded( bool ) ), + mAgendaSideBySideView, SLOT( setExpandedButton( bool ) ) ); + + connect( mAgendaSideBySideView,SIGNAL( zoomViewHorizontally(const QDate &, int )), + mMainView->dateNavigator(),SLOT( selectDates( const QDate &, int ) ) );*/ + } + + if ( showBoth && mAgendaViewTabs ) { + if ( mAgendaView && mAgendaViewTabs->indexOf( mAgendaView ) < 0 ) + mAgendaViewTabs->addTab( mAgendaView, i18n("Merged calendar") ); + if ( mAgendaSideBySideView && mAgendaViewTabs->indexOf( mAgendaSideBySideView ) < 0 ) + mAgendaViewTabs->addTab( mAgendaSideBySideView, i18n("Calendars Side by Side") ); + } else { + if ( mAgendaView && mMainView->viewStack()->id( mAgendaView ) < 0 ) + mMainView->viewStack()->addWidget( mAgendaView ); + if ( mAgendaSideBySideView && mMainView->viewStack()->id( mAgendaSideBySideView ) < 0 ) + mMainView->viewStack()->addWidget( mAgendaSideBySideView ); + } + + if ( mAgendaViewTabs && showBoth ) + showView( static_cast<KOrg::BaseView*>( mAgendaViewTabs->currentPage() ) ); + else if ( mAgendaView && showMerged ) + showView( mAgendaView ); + else if ( mAgendaSideBySideView && showSideBySide ) + showView( mAgendaSideBySideView ); +} + +void KOViewManager::showDayView() +{ + showAgendaView(); + mMainView->dateNavigator()->selectDates( 1 ); +} + +void KOViewManager::showWorkWeekView() +{ + showAgendaView(); + mMainView->dateNavigator()->selectWorkWeek(); +} + +void KOViewManager::showWeekView() +{ + showAgendaView(); + mMainView->dateNavigator()->selectWeek(); +} + +void KOViewManager::showNextXView() +{ + showAgendaView(); + mMainView->dateNavigator()->selectDates( QDate::currentDate(), + KOPrefs::instance()->mNextXDays ); +} + +void KOViewManager::showMonthView() +{ + if (!mMonthView) { + mMonthView = new KOMonthView(mMainView->calendar(), mMainView->viewStack(), "KOViewManager::MonthView"); + addView(mMonthView); + } + + showView(mMonthView); +} + +void KOViewManager::showTodoView() +{ + if ( !mTodoView ) { + mTodoView = new KOTodoView( mMainView->calendar(), mMainView->viewStack(), + "KOViewManager::TodoView" ); + mTodoView->setCalendar( mMainView->calendar() ); + addView( mTodoView ); + connectTodoView( mTodoView ); + + KConfig *config = KOGlobals::self()->config(); + mTodoView->restoreLayout( config, "Todo View" ); + } + + showView( mTodoView ); +} + +void KOViewManager::showJournalView() +{ + if (!mJournalView) { + mJournalView = new KOJournalView(mMainView->calendar(),mMainView->viewStack(), + "KOViewManager::JournalView"); + addView(mJournalView); + } + + showView(mJournalView); +} + + +void KOViewManager::showTimelineView() +{ + if (!mTimelineView) { + mTimelineView = new KOTimelineView(mMainView->calendar(),mMainView->viewStack(), + "KOViewManager::TimelineView"); + addView(mTimelineView); + } + showView(mTimelineView); +} + +void KOViewManager::showEventView() +{ + if ( mLastEventView ) showView( mLastEventView ); + else showWeekView(); +} + +Incidence *KOViewManager::currentSelection() +{ + if ( !mCurrentView ) return 0; + Incidence::List incidenceList = mCurrentView->selectedIncidences(); + if ( incidenceList.isEmpty() ) return 0; + + return incidenceList.first(); +} + +QDate KOViewManager::currentSelectionDate() +{ + QDate qd; + if (mCurrentView) { + DateList qvl = mCurrentView->selectedDates(); + if (!qvl.isEmpty()) qd = qvl.first(); + } + return qd; +} + +void KOViewManager::setDocumentId( const QString &id ) +{ + if (mTodoView) mTodoView->setDocumentId( id ); +} + + +QWidget* KOViewManager::widgetForView( KOrg::BaseView* view ) const +{ + const bool showBoth = KOPrefs::instance()->agendaViewCalendarDisplay() == KOPrefs::AllCalendarViews; + if ( (view == mAgendaView || view == mAgendaSideBySideView) && mAgendaViewTabs && showBoth ) { + return mAgendaViewTabs; + } + return view; +} + + +void KOViewManager::currentAgendaViewTabChanged( QWidget* widget ) +{ + showView( static_cast<KOrg::BaseView*>( widget ) ); +} + +void KOViewManager::resourcesChanged() +{ + if ( mAgendaView ) + mAgendaView->resourcesChanged(); + if ( mAgendaSideBySideView ) + mAgendaSideBySideView->resourcesChanged(); +} |