--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/calendarui/agendaeventviewer/src/agendaeventview.cpp Fri Apr 16 14:57:40 2010 +0300
@@ -0,0 +1,1138 @@
+/*
+* 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:
+*
+*/
+
+// System includes
+#include <QObject>
+#include <QDebug>
+#include <QDateTime>
+#include <qtranslator.h>
+#include <QGraphicsLinearLayout>
+#include <HbInstance>
+#include <hbapplication.h>
+#include <HbMainWindow>
+#include <HbView>
+#include <HbMenu>
+#include <HbGroupBox>
+#include <HbScrollArea>
+#include <HbIcon>
+#include <HbAction>
+#include <HbExtendedLocale>
+#include <HbToolBar>
+#include <hbi18ndef.h>
+#include <HbRadioButtonList>
+#include <HbMessageBox>
+#include <HbDialog>
+#include <HbLabel>
+
+// User includes
+#include <agendautil.h>
+#include <noteseditor.h>
+#include <caleneditor.h>
+#include "agendaeventview.h"
+#include "agendaeventviewerdocloader.h"
+#include "agendaeventviewercommon.h"
+#include "agendaeventviewer_p.h"
+#include "agendaeventvieweritem.h"
+#include "calendateutils.h"
+
+// Constants
+#define CHARACTER_HYPHEN "-"
+#define CHARACTER_SPACE " "
+#define CHARACTER_NEW_LINE "\n"
+/*!
+ \class AgendaEventView.
+
+ Responsible for viewing viewing agenda entries. This is friend of
+ AgendaEventViewerPrivate and it handles all the cases
+ related to agenda entry viewing.
+ */
+
+/*!
+ Default constructor.
+
+ \param owner pointer to AgendaEventViewerPrivate.
+ \param parent pointer to QGraphicsWidget.
+ */
+AgendaEventView::AgendaEventView(
+ AgendaEventViewerPrivate *owner, QObject *parent):
+ QObject(parent),
+ mOwner(owner),
+ mReminderWidgetAdded(true),
+ mMainWindow(NULL)
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::AgendaEventView -->";
+
+ // Load the translator based on locale
+ mTranslator = new QTranslator;
+ QString lang = QLocale::system().name();
+ QString path = "Z:/resource/qt/translations/";
+ mTranslator->load("caleneventviewer_en_GB",":/translations");
+ // TODO: Load the appropriate .qm file based on locale
+ //bool loaded = mTranslator->load("caleneventviewer_" + lang, path);
+ HbApplication::instance()->installTranslator(mTranslator);
+
+ mDocLoader = new AgendaEventViewerDocLoader;
+
+ // Load to-do viewer's docml.
+ bool loadSuccess;
+ mDocLoader->load(AGENDA_EVENT_VIEWER_DOCML, &loadSuccess);
+ if (!loadSuccess) {
+ qFatal("agendaeventview.cpp : Unable to load XML");
+ }
+ // Load the to-viewer's view.
+ mViewer = qobject_cast<HbView *> (mDocLoader->findWidget(
+ AGENDA_EVENT_VIEWER_VIEW_OBJECT));
+
+ // Load all the widgets.
+ mSubjectWidget = qobject_cast<AgendaEventViewerItem *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_SUBJECT_WIDGET));
+
+ mDateTimeWidget = qobject_cast<AgendaEventViewerItem *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_DATE_TIME_WIDGET));
+
+ mLocationWidget = qobject_cast<AgendaEventViewerItem *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_LOCATION_WIDGET));
+
+ mReminderWidget = qobject_cast<AgendaEventViewerItem *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_REMINDER_WIDGET));
+
+ mRepeatWidget = qobject_cast<AgendaEventViewerItem *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_REPEAT_WIDGET));
+
+ mDescriptionWidget = qobject_cast<AgendaEventViewerItem *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_DESCRIPTION_WIDGET));
+
+ HbWidget *scrollAreaWidget = qobject_cast<HbWidget *>(
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_SCROLLAREA_CONTENTS));
+
+ mLinearLayout =
+ static_cast<QGraphicsLinearLayout *> (scrollAreaWidget->layout());
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::AgendaEventView <--";
+
+}
+
+/*!
+ Destructor.
+ */
+AgendaEventView::~AgendaEventView()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::~AgendaEventView -->";
+
+ // Remove the translator
+ HbApplication::instance()->removeTranslator(mTranslator);
+ if (mTranslator) {
+ delete mTranslator;
+ mTranslator = 0;
+ }
+
+ mDocLoader->reset();
+ delete mDocLoader;
+
+ // Delete the mainwindow if we have created any
+ if (mMainWindow) {
+ delete mMainWindow;
+ mMainWindow = NULL;
+ }
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::~AgendaEventView <--";
+}
+
+/*!
+ Displays the to-do viewer and populates the to-do entry attributes.
+
+ \param entry Agenda entry from which attributes have to be read.
+ */
+void AgendaEventView::execute(AgendaEntry entry,
+ AgendaEventViewer::Actions action)
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::execute -->";
+
+ mOriginalAgendaEntry = entry;
+ mAgendaEntry = entry;
+
+ // Add the viewer data reading from the agenda entry.
+ addViewerData();
+
+ // Remove unnecessary widget from event viewer.
+ removeWidget();
+
+ // Add the menu items to event viewer.
+ addMenuItem();
+
+ // Add the toolbar items to event viewer
+ addToolBarItem(action);
+
+ // Add the title to event viewer.
+ addGroupBoxData();
+
+ // Connect for the entry updation and addtion signal to refresh the view
+ // when the same is edited in editor.
+ connect(mOwner->mAgendaUtil, SIGNAL(entryUpdated(ulong)),
+ this, SLOT(handleEntryUpdation(ulong)));
+
+ connect(mOwner->mAgendaUtil, SIGNAL(entryAdded(ulong)),
+ this, SLOT(handleEntryUpdation(ulong)));
+
+ // Connect for entry deletion signal to close the event viewer.
+ connect(mOwner->mAgendaUtil, SIGNAL(entryDeleted(ulong)), this,
+ SLOT(handleEntryDeletion(ulong)));
+
+ // Add the view to the main window.
+ HbMainWindow *window = hbInstance->allMainWindows().first();
+ if (!window) {
+ // Might be some non-ui based app called us
+ // so create mainwindow now
+ mMainWindow = new HbMainWindow();
+ mMainWindow->addView(mViewer);
+ mMainWindow->setCurrentView(mViewer);
+ } else {
+ window->addView(mViewer);
+ window->setCurrentView(mViewer);
+ }
+
+ // Add softkey after adding view on window
+ mBackAction = new HbAction(Hb::BackAction);
+ mViewer->setNavigationAction(mBackAction);
+
+ connect(mBackAction, SIGNAL(triggered()), this, SLOT(close()));
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::execute <--";
+}
+
+/*!
+ Refreshes the to-do viewer after the to-do editor is closed.
+ */
+void AgendaEventView::addViewerData()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addViewerData -->";
+
+ // Set the summary & priority to viewer.
+ addSubjectAndPriorityData();
+
+ // Set Date & Time to viewer.
+ addDateTimeData();
+
+ // Add agenda entry specific fields to the viewer
+ switch (mAgendaEntry.type()) {
+ case AgendaEntry::TypeAppoinment:
+ case AgendaEntry::TypeEvent:
+ addLocationData();
+ addReminderData();
+ addRepeatData();
+ break;
+ case AgendaEntry::TypeAnniversary:
+ break;
+ case AgendaEntry::TypeTodo:
+ if (AgendaEntry::TodoCompleted == mAgendaEntry.status()) {
+ addCompletedTodoData();
+ } else {
+ addReminderData();
+ }
+ break;
+ default:
+ break;
+ }
+
+ // Set the description.
+ addDescriptionData();
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::addViewerData <--";
+}
+
+/*!
+ Add the menu item depends up on entry type
+ */
+void AgendaEventView::addMenuItem()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addMenuItem -->";
+
+ if (mAgendaEntry.type() == AgendaEntry::TypeTodo) {
+
+ HbMenu *menu = qobject_cast<HbMenu *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_MENU));
+
+ mMarkTodoAction = new HbAction(this);
+ if (mAgendaEntry.status() == AgendaEntry::TodoCompleted) {
+ mMarkTodoAction->setText(
+ hbTrId("txt_calendar_menu_mark_as_not_done"));
+ } else {
+ mMarkTodoAction->setText(hbTrId("txt_calendar_menu_mark_as_done"));
+ }
+ connect(mMarkTodoAction, SIGNAL(triggered()), this,
+ SLOT(markTodoStatus()));
+ menu->addAction(mMarkTodoAction);
+ }
+ qDebug() << "AgendaEventViewer: AgendaEventView::addMenuItem <--";
+}
+
+/*!
+ Add the toolbar item
+ */
+void AgendaEventView::addToolBarItem(AgendaEventViewer::Actions action)
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addToolBarItem -->";
+
+ HbToolBar *toolBar = qobject_cast<HbToolBar *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_TOOLBAR));
+
+ // Load all the actions for event viewer
+
+ if ((action == AgendaEventViewer::ActionEditDelete) || (action
+ == AgendaEventViewer::ActionEdit)) {
+ HbAction *editAction = new HbAction(HbIcon("qtg_mono_edit"),
+ hbTrId("txt_calendar_button_edit"));
+ connect(editAction, SIGNAL(triggered()), this, SLOT(edit()));
+ toolBar->addAction(editAction);
+ }
+
+ if ((action == AgendaEventViewer::ActionEditDelete) || (action
+ == AgendaEventViewer::ActionDelete)) {
+ HbAction *deleteAction = new HbAction(HbIcon("qtg_mono_delete"),
+ hbTrId("txt_calendar_button_delete"));
+ connect(deleteAction, SIGNAL(triggered()), this,
+ SLOT(deleteAgendaEntry()));
+ toolBar->addAction(deleteAction);
+ }
+
+ if (action == AgendaEventViewer::ActionSave) {
+ HbAction *saveAction = new HbAction(
+ hbTrId("txt_calendar_button_save_to_calendar"));
+ connect(saveAction, SIGNAL(triggered()), this, SLOT(saveAgendaEntry()));
+ toolBar->addAction(saveAction);
+ }
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::addToolBarItem <--";
+}
+
+/*!
+ Add the groupbox data depends up on entry type
+ */
+void AgendaEventView::addGroupBoxData()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addGroupBoxData -->";
+
+ HbGroupBox *groupBox = qobject_cast<HbGroupBox *> (
+ mDocLoader->findWidget(AGENDA_EVENT_VIEWER_GROUPBOX));
+
+ if (mAgendaEntry.type() == AgendaEntry::TypeTodo) {
+ groupBox->setHeading(hbTrId("txt_calendar_subhead_to_do"));
+ } else if (mAgendaEntry.type() == AgendaEntry::TypeNote) {
+ groupBox->setHeading(tr("Note"));
+ } else {
+ // TODO: Add the text id based on the entry type Anniversary or meeting
+ groupBox->setHeading(hbTrId("txt_calendar_subhead_event"));
+ }
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::addGroupBoxData <--";
+}
+
+/*!
+ Add subject and priority data to Event viewer
+ */
+void AgendaEventView::addSubjectAndPriorityData()
+{
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::addSubjectAndPriorityData -->";
+
+ QStringList itemList;
+ itemList.append(hbTrId("txt_calendar_dblist_subject"));
+ if (mAgendaEntry.summary().isEmpty()) {
+ itemList.append(hbTrId("txt_calendar_dblist_val_unnamed"));
+ } else {
+ itemList.append(mAgendaEntry.summary());
+ }
+
+
+ mSubjectWidget->setEventViewerItemData(itemList, Qt::DisplayRole);
+
+ itemList.clear();
+ QString priorityIcon(QString::null);
+ getPriorityIcon(mAgendaEntry.priority(), priorityIcon);
+ itemList.append(priorityIcon);
+ itemList.append(QString::null);
+
+ mSubjectWidget->setEventViewerItemData(itemList, Qt::DecorationRole);
+
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::addSubjectAndPriorityData <--";
+}
+
+/*!
+ Add date & time data to Event viewer
+ */
+void AgendaEventView::addDateTimeData()
+{
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::addDateTimeData -->";
+
+
+ QStringList itemData;
+ HbExtendedLocale systemLocale = HbExtendedLocale::system();
+ QDateTime startDateTime = mAgendaEntry.startTime();
+ QDateTime endDateTime = mAgendaEntry.endTime();
+
+ itemData.append(QString::null);
+ itemData.append("qtg_small_calendar");
+ mDateTimeWidget->setEventViewerItemData(itemData, Qt::DecorationRole);
+ itemData.clear();
+ itemData.append(QString::null);
+
+ QString startTimeText;
+ QString endTimeText;
+ QString startDateText;
+ QString dateTimeText;
+ QString data;
+
+ // Add agenda entry specific fields to the viewer
+ switch (mAgendaEntry.type()) {
+ case AgendaEntry::TypeAppoinment:
+
+ startTimeText.append(systemLocale.format(
+ startDateTime.time(), r_qtn_time_usual_with_zero));
+
+ endTimeText.append(systemLocale.format(endDateTime.time(),
+ r_qtn_time_usual_with_zero));
+ startDateText.append(
+ systemLocale.format(startDateTime.date(),
+ r_qtn_date_usual_with_zero));
+ if (CalenDateUtils::onSameDay(startDateTime, endDateTime)) {
+ data.append(hbTrId("txt_calendar_dblist_start_end_time").arg(
+ startTimeText).arg(endTimeText));
+ data.append(CHARACTER_SPACE);
+ data.append(hbTrId("txt_calendar_dblist_meeting_date").arg(
+ startDateText));
+ } else {
+ data.append(hbTrId("txt_calendar_dblist_start_time_date").arg(
+ startTimeText).arg(startDateText));
+ QString endDateText;
+ endDateText.append(
+ systemLocale.format(endDateTime.date(),
+ r_qtn_date_usual_with_zero));
+ data.append(hbTrId("txt_calendar_dblist_end_time_date").arg(
+ endTimeText).arg(endDateText));
+ }
+ break;
+ case AgendaEntry::TypeAnniversary:
+ case AgendaEntry::TypeTodo:
+ dateTimeText.append(systemLocale.format(endDateTime.date(),
+ r_qtn_date_usual_with_zero));
+ data.append(hbTrId(
+ "txt_calendar_dblist_meeting_date").arg(dateTimeText));
+ break;
+ case AgendaEntry::TypeEvent:
+
+ dateTimeText.append(systemLocale.format(startDateTime.date(),
+ r_qtn_date_usual_with_zero));
+
+ if (CalenDateUtils::onSameDay(startDateTime, endDateTime)) {
+ data.append(hbTrId("txt_calendar_dblist_meeting_date").arg(
+ dateTimeText));
+ } else {
+ QString endDate;
+ endDate.append(
+ systemLocale.format(endDateTime.date(),
+ r_qtn_date_usual_with_zero));
+ data.append(hbTrId("txt_calendar_dblist_start_end_time").arg(
+ dateTimeText).arg(endDate));
+ }
+ break;
+ default:
+ break;
+ }
+ itemData.append(data);
+ mDateTimeWidget->setEventViewerItemData(itemData, Qt::DisplayRole);
+
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::addDateTimeData <--";
+}
+
+/*!
+ Add location data to Event viewer
+ */
+void AgendaEventView::addLocationData()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addLocationData -->";
+ QStringList itemData;
+ itemData.append(QString::null);
+ itemData.append("qtg_small_location");
+ mLocationWidget->setEventViewerItemData(itemData, Qt::DecorationRole);
+ itemData.clear();
+ itemData.append(QString::null);
+ itemData.append(mAgendaEntry.location());
+ mLocationWidget->setEventViewerItemData(itemData, Qt::DisplayRole);
+ qDebug() << "AgendaEventViewer: AgendaEventView::addLocationData <--";
+}
+
+/*!
+ Add reminder data to Event viewer
+ */
+void AgendaEventView::addReminderData()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addReminderData -->";
+ QStringList itemData;
+ itemData.append(QString::null);
+ itemData.append("qtg_small_reminder");
+ mReminderWidget->setEventViewerItemData(itemData, Qt::DecorationRole);
+ itemData.clear();
+ itemData.append(QString::null);
+ itemData.append(alarmTimeText());
+ mReminderWidget->setEventViewerItemData(itemData, Qt::DisplayRole);
+ qDebug() << "AgendaEventViewer: AgendaEventView::addReminderData <--";
+}
+
+/*!
+ Add completed to-do data to Event viewer
+ */
+void AgendaEventView::addCompletedTodoData()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addCompletedTodoData -->";
+ QStringList itemData;
+ QString completedText;
+ HbExtendedLocale systemLocale = HbExtendedLocale::system();;
+
+ itemData.append(QString::null);
+ itemData.append(QString::null);
+ mReminderWidget->setEventViewerItemData(itemData, Qt::DecorationRole);
+ itemData.clear();
+ completedText = systemLocale.format(mAgendaEntry.completedDateTime().date(),
+ r_qtn_date_usual_with_zero);
+ itemData.append(hbTrId("txt_calendar_dblist_completed_date"));
+ itemData.append(completedText);
+ mReminderWidget->setEventViewerItemData(itemData, Qt::DisplayRole);
+ qDebug() << "AgendaEventViewer: AgendaEventView::addCompletedTodoData <--";
+}
+
+/*!
+ Add repeat data to Event viewer
+ */
+void AgendaEventView::addRepeatData()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addRepeatData -->";
+ QStringList itemData;
+ itemData.append(QString::null);
+ itemData.append("qtg_mono_repeat.svg");
+ mRepeatWidget->setEventViewerItemData(itemData, Qt::DecorationRole);
+ itemData.clear();
+ itemData.append(QString::null);
+ itemData.append(repeatRule());
+ mRepeatWidget->setEventViewerItemData(itemData, Qt::DisplayRole);
+ qDebug() << "AgendaEventViewer: AgendaEventView::addRepeatData <--";
+}
+
+/*!
+ Add description data to Event viewer
+ */
+void AgendaEventView::addDescriptionData()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addDiscriptionData -->";
+ QStringList itemData;
+ itemData.append(QString::null);
+ itemData.append(QString::null);
+ mDescriptionWidget->setEventViewerItemData(itemData, Qt::DecorationRole);
+ itemData.clear();
+ itemData.append(hbTrId("txt_calendar_dblist_description"));
+ itemData.append(mAgendaEntry.description());
+ mDescriptionWidget->setEventViewerItemData(itemData, Qt::DisplayRole);
+ qDebug() << "AgendaEventViewer: AgendaEventView::addDiscriptionData <--";
+}
+
+/*!
+ Returns priority icon
+ */
+void AgendaEventView::getPriorityIcon(int priority, QString &priorityIcon)
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::getPriorityIcon -->";
+
+ switch(priority) {
+ case 1:priorityIcon.append("qtg_small_priority_high");
+ break;
+ case 3:priorityIcon.append("qtg_small_priority_low");
+ break;
+ default:
+ break;
+ }
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::getPriorityIcon <--";
+}
+
+/*!
+ Returns repeat rule
+ */
+QString AgendaEventView::repeatRule() const
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::repeatRule -->";
+
+ QString repeatRule;
+ if (mAgendaEntry.repeatRule().type() != AgendaRepeatRule::InvalidRule)
+ {
+ switch (mAgendaEntry.repeatRule().type()) {
+ case AgendaRepeatRule::DailyRule:
+ repeatRule.append(hbTrId("txt_calendar_dblist_repeats_daily"));
+ break;
+ case AgendaRepeatRule::WeeklyRule:
+ if (mAgendaEntry.repeatRule().interval() == 2) {
+ repeatRule.append(
+ hbTrId("txt_calendar_dblist_repeats_fortnightly"));
+ } else {
+ repeatRule.append(
+ hbTrId("txt_calendar_dblist_repeats_weekly"));
+ }
+ break;
+ case AgendaRepeatRule::MonthlyRule:
+ repeatRule.append(
+ hbTrId("txt_calendar_dblist_repeats_monthly"));
+ break;
+ case AgendaRepeatRule::YearlyRule:
+ repeatRule.append(
+ hbTrId("txt_calendar_dblist_repeats_yearly"));
+ break;
+ default:
+ break;
+ }
+ repeatRule.append(CHARACTER_NEW_LINE);
+ HbExtendedLocale systemLocale = HbExtendedLocale::system();
+ QString untilDateString = systemLocale.format(
+ mAgendaEntry.repeatRule().until(), r_qtn_date_usual_with_zero);
+ repeatRule.append(
+ hbTrId("txt_calendar_dblist_repeats_daily_val_until_1").
+ arg(untilDateString));
+ }
+ qDebug() << "AgendaEventViewer: AgendaEventView::repeatRule <--";
+
+ return repeatRule;
+}
+
+/*!
+ Alarm time text to display in the viewer.
+
+ \return QString Holds the alarm time text.
+ */
+QString AgendaEventView::alarmTimeText() const
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::alarmTimeText -->";
+
+ QString alarmDateTimeText;
+ QDateTime startTime;
+ QDateTime alarmDateTime;
+
+ if (mAgendaEntry.type() == AgendaEntry::TypeTodo) {
+ startTime = mAgendaEntry.endTime();
+ } else {
+ startTime = mAgendaEntry.startTime();
+ }
+ if (!mAgendaEntry.alarm().isNull()) {
+
+ int alarmTimeOffsetInMinutes = mAgendaEntry.alarm().timeOffset();
+ alarmDateTime = startTime.addSecs(-alarmTimeOffsetInMinutes * 60);
+
+ HbExtendedLocale systemLocale = HbExtendedLocale::system();
+ alarmDateTimeText.append(
+ hbTrId("txt_calendar_list_reminder_time_date").arg(
+ systemLocale.format(alarmDateTime.time(),
+ r_qtn_time_usual_with_zero)).arg(
+ systemLocale.format(alarmDateTime.date(),
+ r_qtn_date_usual_with_zero)));
+ }
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::alarmTimeText <--";
+ return alarmDateTimeText;
+}
+
+/*!
+ Remove unnecessary widget from layout.
+ */
+void AgendaEventView::removeWidget()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::removeWidget -->";
+
+ if (mAgendaEntry.location().isEmpty()) {
+ mLocationWidget->hide();
+ mLinearLayout->removeItem(mLocationWidget);
+ }
+
+ if (mAgendaEntry.alarm().isNull()) {
+ if (mAgendaEntry.type() == AgendaEntry::TypeTodo ) {
+ if (AgendaEntry::TodoNeedsAction == mAgendaEntry.status()) {
+ mReminderWidget->hide();
+ mLinearLayout->removeItem(mReminderWidget);
+ mReminderWidgetAdded = false;
+ }
+ } else {
+ mReminderWidget->hide();
+ mLinearLayout->removeItem(mReminderWidget);
+ mReminderWidgetAdded = false;
+ }
+ }
+
+ if (mAgendaEntry.repeatRule().type() == AgendaRepeatRule::InvalidRule) {
+ mRepeatWidget->hide();
+ mLinearLayout->removeItem(mRepeatWidget);
+ }
+
+ if (mAgendaEntry.description().isEmpty()) {
+ mDescriptionWidget->hide();
+ mLinearLayout->removeItem(mDescriptionWidget);
+ }
+
+ mLinearLayout->invalidate();
+ mLinearLayout->activate();
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::removeWidget <--";
+}
+
+/*!
+ Update the completed to-do or reminder data to event viewer.
+ */
+void AgendaEventView::updateCompletedReminderData()
+{
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::updateCompletedReminderData -->";
+
+ if (AgendaEntry::TodoCompleted == mAgendaEntry.status()) {
+ addCompletedTodoData();
+ if (!mReminderWidgetAdded) {
+ mReminderWidget->show();
+ mLinearLayout->insertItem(2, mReminderWidget);
+ mReminderWidgetAdded = true;
+ }
+
+ } else {
+ if (!mAgendaEntry.alarm().isNull()) {
+ addReminderData();
+ if (!mReminderWidgetAdded) {
+ mReminderWidget->show();
+ mLinearLayout->insertItem(2, mReminderWidget);
+ mReminderWidgetAdded = true;
+ }
+ } else {
+ if (mReminderWidgetAdded) {
+ mReminderWidget->hide();
+ mLinearLayout->removeItem(mReminderWidget);
+ mReminderWidgetAdded = false;
+ }
+ }
+
+ }
+
+ mLinearLayout->invalidate();
+ mLinearLayout->activate();
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::updateCompletedReminderData <--";
+}
+
+/*!
+ Remove all widgets from layout.
+ */
+void AgendaEventView::removeAllWidgets()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::removeAllWidgets -->";
+
+ for (int i = 2; i < mLinearLayout->count(); i++) {
+ mLinearLayout->removeAt(i);
+ }
+ mLinearLayout->invalidate();
+ mLinearLayout->activate();
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::removeAllWidgets <--";
+}
+
+/*!
+ Add all widgets to layout.
+ */
+void AgendaEventView::addAllWidgets()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::addAllWidgets -->";
+
+ mLinearLayout->addItem(mLocationWidget);
+ mLocationWidget->show();
+ mLinearLayout->addItem(mReminderWidget);
+ mReminderWidget->show();
+ mLinearLayout->addItem(mRepeatWidget);
+ mRepeatWidget->show();
+ mLinearLayout->addItem(mDescriptionWidget);
+ mDescriptionWidget->show();
+
+ mLinearLayout->invalidate();
+ mLinearLayout->activate();
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::addAllWidgets <--";
+}
+
+/*!
+ Queries user whether to delete whole series or just this single occurence
+ */
+void AgendaEventView::showDeleteOccurencePopup()
+{
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::showDeleteOccurencePopup -->";
+ HbDialog popUp;
+ popUp.setDismissPolicy(HbDialog::NoDismiss);
+ popUp.setTimeout(HbDialog::NoTimeout);
+
+ QGraphicsLinearLayout *layout = new QGraphicsLinearLayout(Qt::Vertical);
+ HbWidget *deleteWidget = new HbWidget(mViewer);
+ deleteWidget->setLayout(layout);
+
+ HbRadioButtonList *deleteButtonList = new HbRadioButtonList(mViewer);
+
+ QStringList list;
+ list << hbTrId("txt_calendar_info_this_occurrence_only")
+ << hbTrId("txt_calendar_info_all_occurences");
+
+ deleteButtonList->setItems(list);
+
+ layout->addItem(deleteButtonList);
+
+ popUp.setContentWidget(deleteWidget);
+ popUp.setHeadingWidget(new HbLabel(
+ hbTrId("txt_calendar_title_delete_repeated_entry")));
+
+ connect(deleteButtonList, SIGNAL(itemSelected(int)), this,
+ SLOT(handleDeleteOccurence(int)));
+ connect(deleteButtonList, SIGNAL(itemSelected(int)), &popUp, SLOT(close()));
+
+ // Create secondary action
+ HbAction *cancelAction = new HbAction(
+ hbTrId("txt_calendar_button_softkey1_cancel"));
+ popUp.setSecondaryAction(cancelAction);
+ connect(cancelAction, SIGNAL(triggered()), &popUp, SLOT(close()));
+
+ // Show the popup
+ popUp.exec();
+
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::showDeleteOccurencePopup <--";
+}
+
+
+/*!
+ * Show delete confirmation query
+ */
+int AgendaEventView::showDeleteConfirmationQuery()
+{
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::showDeleteConfirmationQuery -->";
+ int retStatus = 0;
+
+ HbMessageBox popup(HbMessageBox::MessageTypeQuestion);
+ popup.setDismissPolicy(HbDialog::NoDismiss);
+ popup.setTimeout(HbDialog::NoTimeout);
+ popup.setIconVisible(true);
+
+ QString text = 0;
+
+ switch (mAgendaEntry.type()) {
+ case AgendaEntry::TypeAppoinment:
+ case AgendaEntry::TypeEvent: {
+ text.append(hbTrId("txt_calendar_info_delete_meeting"));
+ break;
+ }
+ case AgendaEntry::TypeAnniversary: {
+ text.append(hbTrId("txt_calendar_info_delete_anniversary"));
+ break;
+ }
+ case AgendaEntry::TypeTodo: {
+ text.append(hbTrId("txt_calendar_info_delete_todo_note"));
+ break;
+ }
+ case AgendaEntry::TypeNote: {
+ text.append(hbTrId("txt_calendar_info_delete_anniversary"));
+ break;
+ }
+ }
+
+ popup.setText(text);
+
+ popup.setPrimaryAction(new HbAction(
+ hbTrId("txt_calendar_button_delete"), &popup));
+ popup.setSecondaryAction(new HbAction(
+ hbTrId("txt_calendar_button_cancel"), &popup));
+ HbAction *selected = popup.exec();
+ if (selected == popup.primaryAction()) {
+ retStatus = 1;
+ }
+
+ qDebug()
+ << "AgendaEventViewer: AgendaEventView::showDeleteConfirmationQuery <--";
+ return retStatus;
+}
+
+/*!
+ Marks to-do entry as done or undone based on the completed value.
+ */
+void AgendaEventView::markTodoStatus()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::markTodoStatus -->";
+
+ QDateTime currentDateTime = QDateTime::currentDateTime();
+
+ // Set the to-do status using the agenda util.
+ if (AgendaEntry::TodoNeedsAction == mAgendaEntry.status()) {
+
+ // Update the menu text to mark to-do as undone.
+ mMarkTodoAction->setText(hbTrId("txt_calendar_menu_mark_as_not_done"));
+
+ mAgendaEntry.setStatus(AgendaEntry::TodoCompleted);
+ mAgendaEntry.setCompletedDateTime(currentDateTime);
+ mOwner->mAgendaUtil->setCompleted(mAgendaEntry, true, currentDateTime);
+
+
+
+ } else if (AgendaEntry::TodoCompleted == mAgendaEntry.status()) {
+
+ // Update the menu text to mark to-do as done.
+ mMarkTodoAction->setText(hbTrId("txt_calendar_menu_mark_as_done"));
+
+ mAgendaEntry.setStatus(AgendaEntry::TodoNeedsAction);
+ mOwner->mAgendaUtil->setCompleted(mAgendaEntry, false, currentDateTime);
+
+
+ }
+
+ updateCompletedReminderData();
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::markTodoStatus <--";
+}
+
+/*!
+ Edits the agenda entry by lanching the to-do viewer.
+ */
+void AgendaEventView::edit()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::edit -->";
+
+ mOwner->editingStarted();
+
+ if (AgendaEntry::TypeTodo == mAgendaEntry.type()) {
+ // Launch the to-do editor using notes editor api
+ // Construct Note editor for launching the to-do editor
+ mNoteEditor = new NotesEditor(mOwner->mAgendaUtil, this);
+ mNoteEditor->edit(mAgendaEntry);
+
+ connect(
+ mNoteEditor, SIGNAL(editingCompleted(bool)),
+ this, SLOT(handleNoteEditorClosed(bool)));
+
+
+ } else {
+ // Launch the calendar entry editor using calendar editor api
+ mCalenEditor = new CalenEditor(mOwner->mAgendaUtil, this);
+ mCalenEditor->edit(mAgendaEntry, false);
+ connect(mCalenEditor, SIGNAL(dialogClosed()),
+ this, SLOT(handleCalendarEditorClosed()));
+
+ }
+ qDebug() << "AgendaEventViewer: AgendaEventView::edit <--";
+}
+
+/*!
+ Deletes the agenda entry.
+ */
+void AgendaEventView::deleteAgendaEntry()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::deleteAgendaEntry -->";
+
+ // Before we do anything, check in the entry is repeating
+ // OR its a child item
+ bool isChild = !(mAgendaEntry.recurrenceId().isNull());
+ bool isRepeating = mAgendaEntry.isRepeating();
+ if ((isChild || isRepeating)
+ && (mAgendaEntry.type() != AgendaEntry::TypeAnniversary)
+ && (mAgendaEntry.type() != AgendaEntry::TypeTodo)) {
+ // Query user if he wants to delete whole series or just this occurence
+ showDeleteOccurencePopup();
+ } else {
+ if (showDeleteConfirmationQuery()) {
+
+ // To notify client that deleting Started
+ // Calendar Application changing state from viewing to deleting.
+ mOwner->deletingStarted();
+
+ // Delete the entry.
+ mOwner->mAgendaUtil->deleteEntry(mAgendaEntry.id());
+ }
+ }
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::deleteAgendaEntry <--";
+}
+
+/*!
+ Save the agenda entry to calendar db.
+ */
+void AgendaEventView::saveAgendaEntry()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::saveAgendaEntry -->";
+
+ // Save entry to calendar.
+ mOwner->mAgendaUtil->addEntry(mAgendaEntry);
+
+ // Close the agenda entry viewer
+ close();
+ qDebug() << "AgendaEventViewer: AgendaEventView::saveAgendaEntry <--";
+}
+/*!
+ Closes the event viewer
+ */
+void AgendaEventView::close()
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::close -->";
+
+ // Remove the view from main window.
+ HbMainWindow *window = hbInstance->allMainWindows().first();
+
+ // Cleanup.
+ disconnect(
+ mBackAction, SIGNAL(triggered()),
+ this, SLOT(close()));
+
+ window->removeView(mViewer);
+ mOwner->viewingCompleted();
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::close <--";
+}
+
+/*!
+ Handles entry updation of the event entry.
+ */
+void AgendaEventView::handleEntryUpdation(ulong id)
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::handleEntryUpdation -->";
+
+ AgendaEntry updatedEntry = mOwner->mAgendaUtil->fetchById(id);
+
+ // Agenda entry is not null then refresh the view else close event viewer
+ if (!updatedEntry.isNull()) {
+
+ mAgendaEntry = updatedEntry;
+
+ if (updatedEntry.isRepeating() && mAgendaEntry.type()
+ != AgendaEntry::TypeTodo) {
+ // if start date of original entry is between start date of updated
+ // entry and until date of updated entry then only update time.
+ if (mOriginalAgendaEntry.startTime().date()
+ >= updatedEntry.startTime().date()
+ || mOriginalAgendaEntry.startTime().date()
+ <= updatedEntry.repeatRule().until()) {
+ QDateTime
+ startDateTime(mOriginalAgendaEntry.startTime().date(),
+ updatedEntry.startTime().time());
+ QDateTime endDateTime(mOriginalAgendaEntry.endTime().date(),
+ updatedEntry.endTime().time());
+ mAgendaEntry.setStartAndEndTime(startDateTime, endDateTime);
+ }
+ }
+
+ if (mOriginalAgendaEntry.status() == updatedEntry.status()) {
+
+ // Remove all widgets from layout.
+ removeAllWidgets();
+
+ // Add all widgets to layout.
+ addAllWidgets();
+
+ // Update the viewer's data using the modified entry from parent.
+ addViewerData();
+
+ // Remove unnecessary widget from event viewer.
+ removeWidget();
+ }
+ mOriginalAgendaEntry = mAgendaEntry;
+ } else {
+ // Close the agenda entry viewer
+ close();
+ }
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::handleEntryUpdation <--";
+}
+
+/*!
+ Handles the entry deletion of the agenda entry
+*/
+void AgendaEventView::handleEntryDeletion(ulong id)
+{
+ qDebug() <<"AgendaEventViewer: AgendaEventView::handleEntryDeletion -->";
+
+ if (id == mAgendaEntry.id()) {
+ // Close the agenda entry viewer
+ close();
+ mOwner->deletingCompleted();
+ }
+
+ qDebug() <<"AgendaEventViewer: AgendaEventView::handleEntryDeletion <--";
+}
+
+/*!
+ Handles the Note Editor editing completion of the agenda entry
+ */
+void AgendaEventView::handleNoteEditorClosed(bool status)
+{
+ Q_UNUSED(status);
+ qDebug() <<"AgendaEventViewer: AgendaEventView::handleNoteEditorClosed -->";
+
+ // Cleanup.
+ mNoteEditor->deleteLater();
+ mOwner->editingCompleted();
+
+ qDebug() <<"AgendaEventViewer: AgendaEventView::handleNoteEditorClosed <--";
+}
+
+/*!
+ Handles the Note Editor editing completion of the agenda entry
+ */
+void AgendaEventView::handleCalendarEditorClosed()
+{
+ qDebug()
+ <<"AgendaEventViewer: AgendaEventView::handleCalendarEditorClosed -->";
+
+ // Cleanup.
+ mCalenEditor->deleteLater();
+ mOwner->editingCompleted();
+
+ qDebug()
+ <<"AgendaEventViewer: AgendaEventView::handleCalendarEditorClosed <--";
+}
+
+/*!
+ Slot to handle User selection for series deleting or single occurence popup
+ */
+void AgendaEventView::handleDeleteOccurence(int index)
+{
+ qDebug() << "AgendaEventViewer: AgendaEventView::handleDeleteOccurence -->";
+
+ // To notify client that deleting Started
+ // Calendar Application changing state from viewing to deleting.
+ mOwner->deletingStarted();
+
+ switch (index) {
+ case 0:
+ // User wants to delete only this occurence
+ mOwner->mAgendaUtil->deleteRepeatedEntry(mAgendaEntry,
+ AgendaUtil::ThisOnly);
+
+ break;
+ case 1:
+ // User wants to delete all the occurences
+ mOwner->mAgendaUtil->deleteRepeatedEntry(mAgendaEntry,
+ AgendaUtil::ThisAndAll);
+ break;
+ }
+
+ qDebug() << "AgendaEventViewer: AgendaEventView::handleDeleteOccurence <--";
+}
+
+// End of file