--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/views/dayview/src/calendayview.cpp Mon Jun 28 15:22:02 2010 +0530
@@ -0,0 +1,516 @@
+/*
+ * 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 <hbaction.h>
+#include <hbmenu.h>
+#include <hbmainwindow.h>
+#include <hbmodeliterator.h>
+#include <hbstyleloader.h>
+#include <hbgroupbox.h>
+#include <hbextendedlocale.h>
+#include <agendautil.h>
+//user includes
+#include "calendayview.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"
+
+//constants
+
+// -----------------------------------------------------------------------------
+// CalenDayView()
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+CalenDayView::CalenDayView(MCalenServices &services) :
+ CalenNativeView(services), mContentScrollArea(NULL), mContentWidget(NULL),
+ mHourScrollArea(NULL), mSettingsManager(NULL),
+ mRegionalInfo(XQSettingsKey::TargetCentralRepository, KCRUidCalendar,
+ KCalendarShowRegionalInfo),
+ mServices(services), mRegionalInfoGroupBox(NULL), mGoToTodayMenuAction(NULL)
+{
+ setupMenu();
+
+ // Create model manager
+ mModelManager = new CalenDayModelManager(mServices, true, this);
+
+ mVLayout = new QGraphicsLinearLayout(Qt::Vertical, NULL);
+ mVLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0);
+ mVLayout->setSpacing(0.0);
+
+ // Create heading label and insert into layout
+ mHeadingLabel = new HbGroupBox();
+ HbEffect::add(mHeadingLabel, ":/fade_out.fxml", "fadeOut");
+ HbEffect::add(mHeadingLabel, ":/fade_in.fxml", "fadeIn");
+
+ mSettingsManager = new XQSettingsManager(this);
+
+ // Add day info
+ mVLayout->addItem(mHeadingLabel);
+
+ //show regional info if set so
+ showRegionalInformationFadeIn();
+ mSettingsManager->startMonitoring(mRegionalInfo);
+
+ // Put hour scroll area and content scroll area into horizontal layout
+ QGraphicsLinearLayout *hLayout = new QGraphicsLinearLayout(Qt::Horizontal, NULL);
+ hLayout->setContentsMargins(0.0, 0.0, 0.0, 0.0);
+ hLayout->setSpacing(0.0);
+
+ // Create scroll area for content (events)
+ mContentScrollArea = new CalenDayContentScrollArea(this);
+
+ // Create and apply central widget for scroll area
+ mContentWidget = new CalenDayContentWidget(*mModelManager, mContentScrollArea);
+ mContentScrollArea->setContentWidget(mContentWidget);
+
+ // Create scroll area for hour elements
+ mHourScrollArea = new CalenDayHourScrollArea(this);
+
+ hLayout->addItem(mHourScrollArea);
+ hLayout->addItem(mContentScrollArea);
+
+ mVLayout->addItem(hLayout);
+ setLayout(mVLayout);
+
+ setupSlots();
+
+ //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");
+}
+
+// -----------------------------------------------------------------------------
+// ~CalenDayView()
+// Destructor.
+// -----------------------------------------------------------------------------
+//
+CalenDayView::~CalenDayView()
+{
+ mSettingsManager->stopMonitoring(mRegionalInfo);
+}
+
+// -----------------------------------------------------------------------------
+// onLocaleChanged()
+// Handles locale change.
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::onLocaleChanged(int reason)
+{
+ Q_UNUSED( reason )
+}
+
+// -----------------------------------------------------------------------------
+// From CalenView
+// doPopulation()
+// 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);
+ }
+
+ setupViewport();
+
+ populationComplete();
+}
+
+// -----------------------------------------------------------------------------
+// From CalenView
+// populationComplete()
+// Informs the organizer that the view's population is complete.
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::populationComplete()
+{
+ CalenNativeView::populationComplete();
+}
+
+// -----------------------------------------------------------------------------
+// From MCalenNotificationHandler
+// HandleNotification()
+// The function handles calendar notifications.
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::HandleNotification(const TCalenNotification notification)
+{
+ Q_UNUSED( notification )
+}
+
+// -----------------------------------------------------------------------------
+// setupView()
+// Sets up the view accroding to the 'xml'
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::setupView(CalenDocLoader* docLoader)
+{
+ Q_UNUSED( docLoader )
+}
+
+//private slots
+
+// -----------------------------------------------------------------------------
+// onBack()
+// Handles 'back' functionality;
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::onBack()
+{
+ TRAP_IGNORE(mServices.IssueCommandL(ECalenMonthView));
+}
+
+// -----------------------------------------------------------------------------
+// dayChange()
+// -----------------------------------------------------------------------------
+//
+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");
+ HbEffect::start(mRegionalInfoGroupBox, "fadeOut", this, "showRegionalInformation");
+
+ mServices.Context().setFocusDate(mDate);
+}
+
+// -----------------------------------------------------------------------------
+// dayChanged()
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::dayChanged(CalenScrollDirection direction)
+{
+ mModelManager->viewsScrollingFinished(direction);
+ mHourScrollArea->setDateTime(mDate);
+}
+
+// -----------------------------------------------------------------------------
+// getCurrentDate()
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::getCurrentDate()
+{
+ mDate = CalenNativeView::mServices.Context().focusDateAndTime();
+}
+
+// -----------------------------------------------------------------------------
+// setupMenu()
+// -----------------------------------------------------------------------------
+//
+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 Ot 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));
+}
+
+// -----------------------------------------------------------------------------
+// setupSlots()
+// -----------------------------------------------------------------------------
+//
+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(mSettingsManager, SIGNAL(valueChanged(XQSettingsKey, QVariant)),
+ this, SLOT(showHideRegionalInformationChanged(XQSettingsKey, QVariant)));
+}
+
+// -----------------------------------------------------------------------------
+// runNewMeeting()
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::runNewMeeting()
+{
+ QDateTime dateTime(mDate);
+ TRAP_IGNORE(
+ dateTime.setTime(mServices.Context().defaultCalTimeForViewsL().time());
+ mServices.Context().setFocusDateAndTime(dateTime);
+ mServices.IssueCommandL(ECalenNewMeeting)
+ );
+}
+
+// -----------------------------------------------------------------------------
+// runGoToToday()
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::runGoToToday()
+{
+ mServices.Context().setFocusDateAndTime(CalenDateUtils::today());
+ TRAP_IGNORE(mServices.IssueCommandL(ECalenGotoToday));
+ refreshViewOnGoToDate();
+}
+
+
+// -----------------------------------------------------------------------------
+// changeView()
+// -----------------------------------------------------------------------------
+//
+void CalenDayView::changeView(TCalenCommandId viewId)
+{
+ TRAP_IGNORE(mServices.IssueCommandL(viewId));
+}
+
+// ----------------------------------------------------------------------------
+// CalenDayView::setHeadingText
+// Sets heading text according to date from model and locale.
+// It's connected to modelReset signal
+// ----------------------------------------------------------------------------
+//
+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(hbTrId("txt_calendar_subhead_1_2").arg(dayString).arg(
+ systemLocale.format(mDate.date(), r_qtn_date_usual_with_zero)));
+
+ HbEffect::start(mHeadingLabel, "fadeIn");
+}
+
+// ----------------------------------------------------------------------------
+// CalenDayView::showHideRegionalInformation
+// To run effect on lunar data label
+// ----------------------------------------------------------------------------
+//
+void CalenDayView::showRegionalInformation(const HbEffect::EffectStatus &status)
+{
+ Q_UNUSED(status);
+ showRegionalInformationFadeIn();
+}
+
+// ----------------------------------------------------------------------------
+// CalenDayView::showRegionalInformationFadeIn
+// To run effect on lunar data label and change text according to date change
+// ----------------------------------------------------------------------------
+//
+void CalenDayView::showRegionalInformationFadeIn()
+ {
+ showHideRegionalInformationChanged(mRegionalInfo, 3);
+ HbEffect::start(mRegionalInfoGroupBox, "fadeIn");
+ }
+
+// ----------------------------------------------------------------------------
+// CalenDayView::showHideRegionalInformationChanged
+// To Show and hide regional plugin label depends upon settings
+// ----------------------------------------------------------------------------
+//
+void CalenDayView::showHideRegionalInformationChanged(const XQSettingsKey& key, const QVariant&)
+ {
+ if (key.key() == mRegionalInfo.key())
+ {
+ int showRegionalInfo =
+ mSettingsManager->readItemValue(mRegionalInfo).toUInt();
+
+ if (showRegionalInfo)
+ {
+ QString *pluginString = pluginText();
+ if (pluginString)
+ {
+ if (!mRegionalInfoGroupBox)
+ {
+ mRegionalInfoGroupBox = new HbGroupBox();
+ CalenPluginLabel *regionalInfo = new CalenPluginLabel(
+ mServices, this);
+ HbEffect::add(mRegionalInfoGroupBox, ":/fade_out.fxml",
+ "fadeOut");
+ HbEffect::add(mRegionalInfoGroupBox, ":/fade_in.fxml", "fadeIn");
+
+ // add margins to calenpluginlabel
+
+ HbStyle style;
+ HbDeviceProfile deviceProfile;
+ qreal marginLeft = 0.0;
+ qreal marginRight = 0.0;
+ qreal marginTop = 0.0;
+ qreal marginBottom = 0.0;
+ style.parameter(QString("hb-param-margin-gene-left"), marginLeft, deviceProfile);
+ style.parameter(QString("hb-param-margin-gene-right"), marginRight, deviceProfile);
+ style.parameter(QString("hb-param-margin-gene-top"), marginTop, deviceProfile);
+ style.parameter(QString("hb-param-margin-gene-bottom"), marginBottom, deviceProfile);
+
+ regionalInfo->setContentsMargins(1, 1, 1, 1);
+
+ // qreal width = mRegionalInfoGroupBox->size().width();
+ // qreal height = mRegionalInfoGroupBox->size().height() + marginTop + marginBottom;
+
+ // mRegionalInfoGroupBox->resize(width, height);
+
+ mRegionalInfoGroupBox->setContentWidget(regionalInfo);
+ }
+
+ if (pluginEnabled())
+ {
+ HbLabel *pluginInfoLabel = qobject_cast<HbLabel *> (
+ mRegionalInfoGroupBox->contentWidget());
+
+ pluginInfoLabel->setPlainText(*pluginString);
+
+ mVLayout->insertItem(1, mRegionalInfoGroupBox);
+ }
+ }
+ }
+ else
+ {
+
+ if (mRegionalInfoGroupBox)
+ {
+ mVLayout->removeItem(mRegionalInfoGroupBox);
+ delete mRegionalInfoGroupBox;
+ mRegionalInfoGroupBox = NULL;
+ }
+ }
+ }
+ }
+
+// ----------------------------------------------------------------------------
+// CalenDayView::setupViewport
+// Scrolls view according to current day and events
+// ----------------------------------------------------------------------------
+//
+void CalenDayView::setupViewport()
+{
+ QDateTime currentTime = QDateTime::currentDateTime();
+
+ //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, currentTime, filter);
+
+ // If we have event in current day and hour, scroll to this event
+ if(mDate.date() == currentTime.date() && !list.isEmpty()){
+ int hourToScrollTo(list.first().startTime().time().hour());
+ mHourScrollArea->scrollToHour(hourToScrollTo);
+ }
+ else{
+ //Scroll view to 7am
+ mHourScrollArea->scrollToHour(7);
+ }
+}
+
+//End of File