calendarui/views/dayview/src/calendayview.cpp
branchRCL_3
changeset 65 12af337248b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/views/dayview/src/calendayview.cpp	Tue Aug 31 15:13:43 2010 +0300
@@ -0,0 +1,545 @@
+/*
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: CalenDayView class definition.
+ *
+ */
+
+// System includes
+#include <QDateTime>
+#include <QGraphicsLinearLayout>
+#include <xqsettingsmanager.h>
+#include <HbWidget>
+#include <HbFrameItem>
+#include <HbInstance>
+#include <HbAction>
+#include <HbMenu>
+#include <HbMainWindow>
+#include <HbModelIterator>
+#include <HbStyleLoader>
+#include <HbGroupBox>
+#include <HbExtendedLocale>
+#include <agendautil.h>
+
+// User includes
+#include "calendayview.h"
+#include "calencommon.h"
+#include "calencontext.h"
+#include "calenservices.h"
+#include "calendocloader.h"
+#include "calendateutils.h" //useful date/time utils
+#include "calendaycontentscrollarea.h"
+#include "calendaycontentwidget.h"
+#include "calendayhourscrollarea.h"
+#include "calendaymodelmanager.h"
+#include "CalenUid.h"
+#include "CalendarPrivateCRKeys.h"
+#include "calenpluginlabel.h"
+#include "calendaymodel.h"
+#include "calendayutils.h"
+
+//constants
+
+
+/*!
+ \brief Constructor
+*/
+CalenDayView::CalenDayView(MCalenServices &services) :
+    CalenNativeView(services), mContentScrollArea(NULL), mContentWidget(NULL),
+        mHourScrollArea(NULL), mVLayout(NULL), mMainContainer(NULL),
+        mDocLoader(NULL), mIsLaunching(true), mSettingsManager(NULL),
+        mRegionalInfoKey(XQSettingsKey::TargetCentralRepository,
+            KCRUidCalendar, KCalendarShowRegionalInfo), mServices(services),
+        mRegionalInfoGroupBox(NULL), mGoToTodayMenuAction(NULL), mBg(NULL)
+{
+    setupMenu();
+
+    // Create model manager
+    mModelManager = new CalenDayModelManager(mServices, true, this);
+    mSettingsManager = new XQSettingsManager(this);
+    mSettingsManager->startMonitoring(mRegionalInfoKey);
+
+    //setup Back functionality
+    if (ECalenDayView != mServices.getFirstView()) {
+        HbAction* action = new HbAction(Hb::BackNaviAction, this);
+        setNavigationAction(action);
+        // Connect to the signal triggered by clicking on back button.
+        connect(action, SIGNAL(triggered()), this, SLOT(onBack()));
+    }
+
+    HbStyleLoader::registerFilePath(":/calendayhourelement.css");
+    HbStyleLoader::registerFilePath(":/calendayhourelement.widgetml");
+    HbStyleLoader::registerFilePath(":/calendayitem.css");
+    HbStyleLoader::registerFilePath(":/calendayitem.widgetml");
+    HbStyleLoader::registerFilePath(":/calendayeventspane.css");
+    HbStyleLoader::registerFilePath(":/calendayhourscrollarea.css");
+}
+
+/*!
+ \brief Destructor
+*/
+CalenDayView::~CalenDayView()
+{
+    mSettingsManager->stopMonitoring(mRegionalInfoKey);
+    
+    if (mRegionalInfoGroupBox) {
+        delete mRegionalInfoGroupBox;
+        mRegionalInfoGroupBox = NULL;
+    }
+    
+    if (mDocLoader) {
+        delete mDocLoader;
+        mDocLoader = NULL;
+    }
+}
+
+/*!
+ \brief Handles locale change.
+ 
+ \param reason the reason of a change
+*/
+void CalenDayView::onLocaleChanged(int reason)
+{
+    Q_UNUSED( reason )
+}
+
+/*!
+ \brief Reimplemented from CalenView. Handles view (re)population
+*/
+void CalenDayView::doPopulation()
+{
+    // Triggers fading effect for heading label
+    getCurrentDate();
+    HbEffect::start(mHeadingLabel, "fadeOut", this, "setHeadingText");
+    
+    mModelManager->refreshAllModels();
+    //Set date and time for hour scroll area. 
+    //It's later used by hour element to display timeline
+    mHourScrollArea->setDateTime(mDate);
+    
+    //set in menu go to today visible
+    QDateTime currentDateTime = QDateTime::currentDateTime();
+    if (mGoToTodayMenuAction and currentDateTime.date() == mDate.date()) {
+        mGoToTodayMenuAction->setVisible(false);
+    }
+    else if(mGoToTodayMenuAction) {
+        mGoToTodayMenuAction->setVisible(true);
+    }
+    
+    // Call async. if the view is loaded first time (fix to ou1cimx1#482516)
+    if (mIsLaunching) {
+        mIsLaunching = false;
+        QMetaObject::invokeMethod(this, "setupViewport", Qt::QueuedConnection);
+    } else {
+        setupViewport();
+    }
+	
+    populationComplete();
+}
+
+/*!
+ \brief Reimplemented from CalenView. Informs the organizer that the view's population is complete.
+*/
+void CalenDayView::populationComplete()
+{
+    CalenNativeView::populationComplete();
+}
+
+/*!
+ \brief Reimplemented from MCalenNotificationHandler. The function handles calendar notifications
+ 
+ \param notification notification type
+*/
+void CalenDayView::HandleNotification(const TCalenNotification notification)
+{
+    Q_UNUSED( notification )
+}
+
+
+/*!
+ \brief Sets up the view accroding to the 'xml'
+ 
+ \param docLoader Pointer to document loader
+*/
+void CalenDayView::setupView(CalenDocLoader* docLoader)
+{
+    // Store document loader for further use
+    mDocLoader = docLoader;
+
+    // Get vertical layout from day view
+    mVLayout = static_cast<QGraphicsLinearLayout *> (this->layout());
+
+    // Set up day info
+    mHeadingLabel = qobject_cast<HbGroupBox *> (mDocLoader->findWidget(
+        CALEN_DAYVIEW_DAYINFO));
+    HbEffect::add(mHeadingLabel, ":/fade_out.fxml", "fadeOut");
+    HbEffect::add(mHeadingLabel, ":/fade_in.fxml", "fadeIn");
+    
+    // Set up main container for hour elements/content area
+    mMainContainer = qobject_cast<HbWidget *> (mDocLoader->findWidget(
+        CALEN_DAYVIEW_CONTENTWIDGET));
+    if (Qt::Vertical == CalenDayUtils::instance()->orientation()) {
+        mBg = new HbFrameItem(KCalenBackgroundColorPortrait,
+            HbFrameDrawer::OnePiece, this);
+    }
+    else {
+        mBg = new HbFrameItem(KCalenBackgroundColorLandscape,
+            HbFrameDrawer::OnePiece, this);
+    }
+    mMainContainer->setBackgroundItem(mBg);
+
+    // Set up hour scroll area
+    mHourScrollArea
+        = static_cast<CalenDayHourScrollArea *> (mDocLoader->findWidget(
+            CALEN_DAYVIEW_HOURSCROLLAREA));
+
+    // Set up content scroll area
+    mContentScrollArea
+        = static_cast<CalenDayContentScrollArea *> (mDocLoader->findWidget(
+            CALEN_DAYVIEW_CONTENTSCROLLAREA));
+    // Pass parent object to mContentWidget to install event filters on parent
+    mContentWidget = new CalenDayContentWidget(*mModelManager, mContentScrollArea);
+    mContentScrollArea->setContentWidget(mContentWidget);
+
+    setupSlots();
+    
+    // Set up regional info if variant is correct
+    showRegionalInformationFadeIn();
+}
+
+//private slots
+
+/*!
+ \brief Handles 'back' functionality
+*/
+void CalenDayView::onBack()
+{
+    TRAP_IGNORE(mServices.IssueCommandL(ECalenMonthView));
+}
+
+/*!
+ \brief Slot that handles first phase of day change
+ 
+ \param direction indicates to which day view needs to be scrolled (previous or next day)
+*/
+void CalenDayView::dayChangeStarted(CalenScrollDirection direction)
+{
+    if (direction == ECalenScrollToNext) {
+        mDate = mDate.addDays(1);	
+    }
+    else {
+        mDate = mDate.addDays(-1);
+    }
+    
+    //set in menu go to today visible
+    QDateTime currentDateTime = QDateTime::currentDateTime();
+    if (mGoToTodayMenuAction and currentDateTime.date() == mDate.date()) {
+        mGoToTodayMenuAction->setVisible(false);
+    }
+    else if(mGoToTodayMenuAction) {
+        mGoToTodayMenuAction->setVisible(true);
+    }
+    
+    // Triggers fading effect for heading label.
+    HbEffect::start(mHeadingLabel, "fadeOut", this, "setHeadingText");
+    if (mRegionalInfoGroupBox) {
+        HbEffect::start(mRegionalInfoGroupBox, "fadeOut", this,
+            "showRegionalInformation");
+    }
+    
+    mServices.Context().setFocusDate(mDate);
+}
+
+/*!
+ \brief Slot that is triggered when operation of day change is completed
+ 
+ \param direction ndicates to which day view was scrolled (previous or next day)
+*/
+void CalenDayView::dayChanged(CalenScrollDirection direction)
+{
+    mModelManager->viewsScrollingFinished(direction);
+	mHourScrollArea->setDateTime(mDate);
+}
+
+/*!
+ \brief Gets current date from context
+*/
+void CalenDayView::getCurrentDate()
+{
+    mDate = CalenNativeView::mServices.Context().focusDateAndTime();
+}
+
+/*!
+ \brief Sets the menu for day view
+*/
+void CalenDayView::setupMenu()
+{
+    menu()->addAction(hbTrId("txt_calendar_opt_new_event"), this, SLOT(runNewMeeting()));
+    //get pointer to this position, because need to change visibility
+    mGoToTodayMenuAction = menu()->addAction(hbTrId("txt_calendar_opt_go_to_today"), this, SLOT(runGoToToday()));
+    menu()->addAction(hbTrId("txt_calendar_opt_go_to_date"), this, SLOT(goToDate()));
+    //TODO: Add id for this text
+    //"Switch to Agenda view"
+    menu()->addAction(hbTrId("txt_calendar_opt_switch_to_agenda_view"), this, SLOT(runChangeToAgendaView()));
+    //TODO: Add id for this text (lunar data)
+    //"Show lunar data"
+    if (pluginEnabled())
+    	{
+		menu()->addAction(hbTrId("txt_calendar_opt_show_lunar_data"), this, SLOT(runLunarData()));
+    	}
+    menu()->addAction(hbTrId("txt_calendar_opt_settings"), this, SLOT(launchSettingsView()));
+}
+
+/*!
+   \brief To change Day view to Agenda View
+ */
+void CalenDayView::runChangeToAgendaView()
+{
+    changeView(ECalenAgendaView);
+}
+
+/*!
+   \brief Shows lunar data in popup box
+ */
+void CalenDayView::runLunarData()
+{
+	TRAP_IGNORE(mServices.IssueCommandL(ECalenRegionalPluginTapEvent));
+}
+
+/*!
+   \brief This is a helper function to established connections between signals and slots
+*/
+void CalenDayView::setupSlots()
+{
+    // Connecting other view-related signals/slots
+    connect(mContentScrollArea,
+        SIGNAL(scrollAreaMoveStarted(CalenScrollDirection)), this,
+        SLOT(dayChangeStarted(CalenScrollDirection)));
+
+    connect(mContentScrollArea,
+        SIGNAL(scrollAreaMoveFinished(CalenScrollDirection)), mContentWidget,
+        SLOT(relayoutWidgets(CalenScrollDirection)));
+
+    connect(mContentWidget, SIGNAL(
+        widgetsRelayoutFinished(CalenScrollDirection)), mContentScrollArea,
+        SLOT(scrollToMiddleWidget()));
+
+    connect(mContentWidget,
+        SIGNAL(widgetsRelayoutFinished(CalenScrollDirection)), this,
+        SLOT(dayChanged(CalenScrollDirection)));
+
+    connect(mContentWidget, SIGNAL(scrollPositionChanged(const QPointF &)),
+        mHourScrollArea, SLOT(scrollVertically(const QPointF &)));
+
+    connect(mHourScrollArea, SIGNAL(scrollPositionChanged(const QPointF &)),
+        mContentWidget, SLOT(widgetScrolled(const QPointF &)));
+
+    connect(CalenDayUtils::instance()->mainWindow(),
+        SIGNAL(orientationChanged(Qt::Orientation)), this,
+        SLOT(orientationChanged(Qt::Orientation)));
+
+    connect(mSettingsManager, SIGNAL(valueChanged(XQSettingsKey, QVariant)),
+        this, SLOT(showHideRegionalInformationChanged(XQSettingsKey, QVariant)));
+}
+
+/*!
+   \brief This slot triggers new meeting creation view
+*/
+void CalenDayView::runNewMeeting()
+{
+    QDateTime dateTime(mDate);
+    TRAP_IGNORE(
+        dateTime.setTime(mServices.Context().defaultCalTimeForViewsL().time());
+        mServices.Context().setFocusDateAndTime(dateTime);
+        mServices.IssueCommandL(ECalenNewMeeting)
+    );
+}
+
+/*!
+   \brief This slot switches current view to today
+*/
+void CalenDayView::runGoToToday()
+{
+    mServices.Context().setFocusDateAndTime(CalenDateUtils::today());
+    TRAP_IGNORE(mServices.IssueCommandL(ECalenGotoToday));
+    refreshViewOnGoToDate();
+}
+
+
+/*!
+   \brief This slot switches current view to the given by id
+   
+   \param viewId id of the view that needs to be displayed
+*/
+void CalenDayView::changeView(TCalenCommandId viewId)
+{
+    TRAP_IGNORE(mServices.IssueCommandL(viewId));
+}
+
+/*!
+   \brief Sets heading text according to date from model and locale.
+          It's connected to modelReset signal.
+   
+   \param status Parameter required in order to call this slot autmatically
+                 when an effect is complete.
+*/
+void CalenDayView::setHeadingText(const HbEffect::EffectStatus &status)
+{   
+    Q_UNUSED(status)
+
+    // Format the date as per the device locale settings
+    HbExtendedLocale systemLocale = HbExtendedLocale::system();
+
+    // Get localised name of the day from locale
+    QString dayString = systemLocale.dayName(mDate.date().dayOfWeek());
+    // Append a single space
+    dayString.append(" ");
+    // Set the heading
+
+    // Append the date which is formatted as per the locale   
+    mHeadingLabel->setHeading(QString("%1 %2").arg(dayString).arg(
+        systemLocale.format(mDate.date(), r_qtn_date_usual_with_zero)));
+
+    HbEffect::start(mHeadingLabel, "fadeIn");
+}
+
+/*!
+   \brief Displays regional information
+   
+   \param status Parameter required in order to call this slot autmatically
+                 when an effect is complete.
+*/
+void CalenDayView::showRegionalInformation(const HbEffect::EffectStatus &status)
+{
+	Q_UNUSED(status);
+	showRegionalInformationFadeIn();
+}
+
+/*!
+   \brief Runs effect on lunar data label and change text according to date change.
+*/
+void CalenDayView::showRegionalInformationFadeIn()
+{
+	showHideRegionalInformationChanged(mRegionalInfoKey, 3);
+	if (mRegionalInfoGroupBox) {
+	    HbEffect::start(mRegionalInfoGroupBox, "fadeIn");
+	}
+}
+
+/*!
+   \brief To Show and hide regional plugin label depends upon settings.
+*/
+void CalenDayView::showHideRegionalInformationChanged(
+    const XQSettingsKey& key,
+    const QVariant&)
+{
+    if ((key.key() == mRegionalInfoKey.key()) && pluginEnabled()) {
+        int showRegionalInfo =
+            mSettingsManager->readItemValue(mRegionalInfoKey).toUInt();
+        if (showRegionalInfo) {
+            if (!mRegionalInfoGroupBox) {
+                mRegionalInfoGroupBox = new HbGroupBox();
+                CalenPluginLabel *regionalInfo = new CalenPluginLabel(
+                    mServices, this);
+                regionalInfo->setFontSpec(HbFontSpec(HbFontSpec::Primary));
+
+                // Set margins in groupbox according to UI spec
+                HbStyle style;
+                HbDeviceProfile deviceProfile;
+                qreal leftMargin = 0.0;
+                qreal rightMargin = 0.0;
+                qreal topMargin = 0.0;
+                qreal bottomMargin = 0.0;
+                style.parameter(QString("hb-param-margin-gene-left"),
+                    leftMargin, deviceProfile);
+                style.parameter(QString("hb-param-margin-gene-right"),
+                    rightMargin, deviceProfile);
+                style.parameter(QString("hb-param-margin-gene-top"), topMargin,
+                    deviceProfile);
+                style.parameter(QString("hb-param-margin-gene-bottom"),
+                    bottomMargin, deviceProfile);
+                regionalInfo->setContentsMargins(leftMargin, topMargin,
+                    rightMargin, bottomMargin);
+                mRegionalInfoGroupBox->setContentWidget(regionalInfo);
+
+                mVLayout->insertItem(1, mRegionalInfoGroupBox);
+            }
+            QString *pluginString = pluginText();
+            HbLabel *pluginInfoLabel = qobject_cast<HbLabel *> (
+                mRegionalInfoGroupBox->contentWidget());
+            pluginInfoLabel->setPlainText(*pluginString);
+        }
+        else {
+            if (mRegionalInfoGroupBox) {
+                mVLayout->removeItem(mRegionalInfoGroupBox);
+                delete mRegionalInfoGroupBox;
+                mRegionalInfoGroupBox = NULL;
+            }
+        }
+    }
+}
+
+/*!
+   \brief Scrolls view according to current day and events.
+*/
+void CalenDayView::setupViewport()
+{
+    QDateTime currentTime = QDateTime::currentDateTime();
+
+    // If we have event in current day and hour, scroll to this event
+    if (mDate.date() == currentTime.date()){
+
+        QDateTime midnight = currentTime;
+        midnight.setTime(QTime(23, 59));
+
+        //Filter flags (only timed events)
+        AgendaUtil::FilterFlags filter = AgendaUtil::FilterFlags(AgendaUtil::IncludeAppointments);
+        QList<AgendaEntry> list;
+        // Fetch the instance list from the agenda interface
+        list = mServices.agendaInterface()->fetchEntriesInRange(currentTime, midnight, filter);
+
+        if(!list.isEmpty()){
+            int hourToScrollTo(list.first().startTime().time().hour());
+            mHourScrollArea->scrollToHour(hourToScrollTo);           
+        }
+        else{
+            mHourScrollArea->scrollToHour(currentTime.time().hour());
+        }
+    }
+    else {
+        //Scroll view to 7am
+        mHourScrollArea->scrollToHour(7);
+    }
+}
+
+/*!
+ \brief Slot which is called whenever the orientation of the device changes.
+ 
+ Changes the backgroung graphic element when orientation chandes.
+ 
+ \param orientation Current device orientation
+ */
+void CalenDayView::orientationChanged(Qt::Orientation orientation)
+{
+    if (Qt::Vertical == orientation) {
+        mBg = new HbFrameItem(KCalenBackgroundColorPortrait,
+            HbFrameDrawer::OnePiece, this);
+    }
+    else {
+        mBg = new HbFrameItem(KCalenBackgroundColorLandscape,
+            HbFrameDrawer::OnePiece, this);
+    }
+    mMainContainer->setBackgroundItem(mBg);
+}
+
+//End of File