diff -r f979ecb2b13e -r c198609911f9 calendarui/views/src/calendayviewwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/calendarui/views/src/calendayviewwidget.cpp Fri Apr 16 14:57:40 2010 +0300 @@ -0,0 +1,999 @@ +/* +* Copyright (c) 2009 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: CalenDayViewWidget implementation +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "calendayviewwidget.h" +#include "calencommon.h" +#include "calendayview.h" +#include "calendocloader.h" +#include "calenservices.h" +#include "calencontext.h" +#include "calendateutils.h" +#include "CalenUid.h" +#include "caleneventlistviewitem.h" + +// Constants +static const QString singleSpace(" "); +static const QString newLine("\n"); +static const QString customLayout("custom"); +static const char *stretchLayout("stretchItem"); +// TODO: Replace with actual image names later +static const QString toDoIcon("qtg_small_todo"); +static const QString reminderIcon("qtg_mono_alarm"); +static const QString locationIcon("qtg_mono_location"); +static const QString repeatIcon("qtg_mono_repeat"); +static const QString allDayIcon(":/qgn_indi_cdr_meeting_layer0.svg"); +static const QString exceptionIcon(":/qtg_mono_exception.png"); +static const int singleColumn(1); + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::CalenDayViewWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +CalenDayViewWidget::CalenDayViewWidget(MCalenServices &services, + CalenDocLoader *docLoader) : +mServices(services), +mDocLoader(docLoader) +{ + // Construct the list view prototype + mListViewPrototype = new CalenEventListViewItem(this); + + // Create the list model + mListModel = new QStandardItemModel(this); + + // Register the custom docml and css to provide our own style to the list items + HbStyleLoader::registerFilePath(":/"); +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::~CalenDayViewWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +CalenDayViewWidget::~CalenDayViewWidget() +{ + if (mListViewPrototype) { + delete mListViewPrototype; + mListViewPrototype = NULL; + } + if (mListModel) { + // Do not delete the model since its owned by the view + mListModel->clear(); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::setupWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::setupWidget(CalenDayView *view) +{ + // Store the view for future reference + mView = view; + + if (!mDocLoader) { + // Nothing much can be done. Simply return + return; + } + + // Initialize the child widgets + initChildWidgets(); +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::showWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::showWidget() +{ + // Get the date for which this view has been launched + mDate = mServices.Context().focusDateAndTimeL(); + + // Set the heading text + setHeadingText(); + + // Get the instance list + getInstanceList(); + + // Load the appropriate section based on the number of events for the day + if (0 == mInstanceArray.count()) { + // There are no entries for the day + // Load and show the empty list section + bool loadSuccess = false; + + // Hide the list which shows the events + mEventsList->hide(); + + // Show the empty list text + mEmptyListLabel->show(); + + // Get the current device orientation + int orientation = mServices.MainWindow().orientation(); + if (Qt::Vertical == orientation) { + mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "emptyList", &loadSuccess); + } else { + mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "emptyLandscape", &loadSuccess); + } + if (!loadSuccess) { + qFatal("calendayviewwidget.cpp : Unable to load empty list section"); + } + } else { + // Hide the empty view label + mEmptyListLabel->hide(); + + // Show the events list + mEventsList->show(); + + // There are one or more events. Load the non-empty section + bool loadSuccess = false; + mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "nonEmptyList", &loadSuccess); + if (!loadSuccess) { + qFatal("calendayviewwidget.cpp : Unable to load non-empty list section"); + } + // Now populate the list with the events + populateListWidget(); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::orientationChanged +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::orientationChanged(Qt::Orientation orientation) +{ + // Load the appropriate section based on the number of events for the day + if (0 == mInstanceArray.count()) { + // There are no entries for the day + // Load and show the empty list section + bool loadSuccess = false; + + // Hide the list which shows the events + mEventsList->hide(); + + // Show the empty list text + mEmptyListLabel->show(); + + if (Qt::Vertical == orientation) { + mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "emptyList", &loadSuccess); + } else { + mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "emptyLandscape", &loadSuccess); + } + if (!loadSuccess) { + qFatal("calendayviewwidget.cpp : Unable to load empty list section"); + } + } else { + // Hide the empty view label + mEmptyListLabel->hide(); + + // Show the events list + mEventsList->show(); + + // There are one or more events. Load the non-empty section + bool loadSuccess = false; + mDocLoader->load(CALEN_DAYVIEW_XML_FILE, "nonEmptyList", &loadSuccess); + if (!loadSuccess) { + qFatal("calendayviewwidget.cpp : Unable to load non-empty list section"); + } + handleListItemStretching(orientation); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::handleLocaleChange +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::handleLocaleChange() +{ + if(mListViewPrototype) { + HbExtendedLocale locale = HbExtendedLocale::system(); + HbExtendedLocale::TimeStyle timeStyle = locale.timeStyle(); + if (HbExtendedLocale::Time12 == timeStyle) { + mListViewPrototype->setTimeFormat12Hr(true); + } else { + mListViewPrototype->setTimeFormat12Hr(false); + } + + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::setContextFromHighlight +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::setContextFromHighlight(AgendaEntry entry) +{ + if (entry.isTimedEntry()) { + // Timed entry. + QDateTime start = entry.startTime(); + // start.setDate(mDate.date()); + mServices.Context().setFocusDateAndTimeAndInstanceL(start, + TCalenInstanceId::create(entry), + KCalenDayViewUidValue); + } else { + // Untimed entry. + if (CalenDateUtils::onSameDay(TCalenInstanceId::create(entry).mInstanceTime, + mDate)) { + mServices.Context().setInstanceIdL(TCalenInstanceId::create(entry), + KCalenDayViewUidValue); + } else { + // Multi-day untimed note (either multi-day day note or weird todo). + // Focus on the instance and set the focus time to the highlighted day. + mServices.Context().setFocusDateAndTimeAndInstanceL(mDate, + TCalenInstanceId::create(entry), + KCalenDayViewUidValue); + } + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::initChildWidgets +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::initChildWidgets() +{ + // Get the pointer to the events list + mEventsList = static_cast (mDocLoader->findWidget(CALEN_DAYVIEW_LISTWIDGET)); + if (!mEventsList) { + qFatal("calendayviewwidget.cpp : Unable to find the events list"); + } + // NOTE: Layout name MUST be same as the name mentioned in the css + mEventsList->setLayoutName(customLayout); + + // TODO : remove this line after gestures are available + mEventsList->installEventFilter(mView); + + // Connect to the long press and activation signals + connect(mEventsList, SIGNAL(longPressed(HbAbstractViewItem*, const QPointF&)), + this, SLOT(itemLongPressed(HbAbstractViewItem*, const QPointF&))); + connect(mEventsList, SIGNAL(activated(const QModelIndex&)), this, + SLOT(itemActivated(const QModelIndex&))); + + // Get the pointer to label from the loader. + mHeadingLabel = qobject_cast (mDocLoader->findWidget(CALEN_DAYVIEW_HEADING)); + if (!mHeadingLabel) { + qFatal("calendayviewwidget.cpp : Unable to find heading widget"); + } + + // Get the pointer to the empty view label + mEmptyListLabel = qobject_cast (mDocLoader->findWidget("noEventsLabel")); + if (!mEmptyListLabel) { + qFatal("calendayviewwidget.cpp : Unable to find empty list label"); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::populateListWidget +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::populateListWidget() +{ + // Recycle the list items so that only needed rows + // are added or removed + if (mInstanceArray.count() == 0) { + // Reset the list + mEventsList->reset(); + // Clear the model to ensure it does not have any old items + mListModel->clear(); + return; + } else if (mInstanceArray.count() > mListModel->rowCount()) { + // There are more events than the number of items + // in the list. Add more rows + mListModel->insertRows(0, mInstanceArray.count() - mListModel->rowCount()); + } else if (mInstanceArray.count() < mListModel->rowCount()) { + // There are less number of events than the number + // of items in the list. Remove the extra rows + mListModel->removeRows(0, mListModel->rowCount() - mInstanceArray.count()); + } + mListModel->setColumnCount(singleColumn); + + // Add all the events to the list + for (int index = 0; index < mInstanceArray.count(); index++) { + // Get each of the entry details + AgendaEntry entry = mInstanceArray[index]; + // Create a list item for each entry + createListItem(index, entry); + } + // Add the item on to the list widget + mEventsList->setModel(mListModel, mListViewPrototype); + + // Now get the item to scroll to + int scrollToIndex = getIndexToScrollTo(); + if (mListModel->rowCount() > 0) { + // Scroll to the index only if index is valid + mEventsList->scrollTo(mListModel->index(scrollToIndex, 0)); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::getInstanceList +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::getInstanceList() +{ + // Clear the previous instance list + mInstanceArray.clear(); + + // Check if the date is valid + if (!CalenDateUtils::isValidDay(mDate)) { + mDate = CalenDateUtils::today(); + } + + // Set the filter flags to fetch all relevant entries + AgendaUtil::FilterFlags filter = AgendaUtil::FilterFlags(AgendaUtil::IncludeAnniversaries | + AgendaUtil::IncludeAppointments | + AgendaUtil::IncludeEvents | + AgendaUtil::IncludeReminders | + AgendaUtil::IncludeIncompletedTodos); + + // Fetch the instance list from the agenda interface + mInstanceArray = mServices.agendaInterface()->createEntryIdListForDay(mDate, filter); + + if (0 == mInstanceArray.count()) { + // There are no events to populate + // Hide the events list + mEventsList->hide(); + // Show the empty list text + mEmptyListLabel->show(); + // Inform the view about the change + mView->hasEvents(false); + return; + } else { + mView->hasEvents(true); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::setDateToLabel +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::setHeadingText() + { + // 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(singleSpace); + // 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))); +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::createListItem +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::createListItem(int index, AgendaEntry entry) +{ + if (index < 0 || entry.isNull()) { + // Not a valid index or entry. Dont do anything + return; + } + // Check if the entry is a timed entry + // TODO: Right now, only appointment/meeting type is being handled + // Handle other timed entry types like reminder etc + if (entry.isTimedEntry()) { + // Get the text and icon data for the entry + addTimedEventToList(index, entry); + } else { + addNonTimedEventToList(index, entry); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::addTimedEventToList +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::addTimedEventToList(int index, AgendaEntry entry) +{ + // Create text and icon list to set to the model + QVariantList textData; + QVariantList iconData; + bool twoLines = false; + + /** + * IMPORTANT NOTE: All the text and icon items must be + * inserted into the variant list in a specific order. + * If not, chaos will set it!!! + * On a more serious note, the mesh layout depends on the + * fact that the icons and text data will be added in a + * particular order. If one of the items go missing, the + * layout might get messed up. Also in case a particular item + * is not required to be added in the middle of the list, an + * empty QVariant must be added to indicate to the list view + * that the item must be removed from the layout. + * Do not mess with the order in case you are not sure what + * you are exactly doing. + */ + + // The first icon to show to-do or all day should not be shown + // Append empty data to the icons list + iconData << QVariant(); + + // Check if alarm is enabled for the entry + if (entry.alarm().isNull()) { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + } else { + iconData << HbIcon(reminderIcon); + } + + // Check if the entry is recurring + if (entry.isRepeating()) { + iconData << HbIcon(repeatIcon); + } else if (!entry.recurrenceId().isNull()) { + // This is an exceptional entry + iconData << HbIcon(exceptionIcon); + } else { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + } + + HbExtendedLocale locale = HbExtendedLocale::system(); + // Get the start time and format as per the locale + QTime eventStartTime = entry.startTime().time(); + QString eventTime = locale.format(eventStartTime, r_qtn_time_usual_with_zero); + + // Get the event end time + QTime eventEndTime = entry.endTime().time(); + + if (eventStartTime < eventEndTime) { + // Raise the flag to indicate that the list item + // would wrap to two lines + twoLines = true; + // Append '-' to indicate an end time is present + eventTime.append("-"); + // Append new line to wrap to next line + eventTime.append(newLine); + // Event is a not a zero duration meeting + // Only in this case, append the end time + eventTime.append(locale.format(eventEndTime, r_qtn_time_usual_with_zero)); + } else { + // Append new line to wrap to next line + eventTime.append(newLine); + } + // Add the event time to the text list + // This MUST be the first item to be added to the list + textData << eventTime; + + // Get the entry subject + QString subject = entry.summary(); + if (subject.isEmpty() || subject.isNull()) { + // No subject. Add "(No subject)" text + subject.append(hbTrId("txt_calendar_dblist_unnamed")); + } + // Add the subject to the text list + // This MUST be the second item in the list + textData << subject; + + // Check if the entry has location + // TODO: This must change to check for geo-location + // This MUST be the third item in the list + if (entry.location().isEmpty()) { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + if (twoLines) { + /** + * NOTE: If the primary text is wrapping to two + * lines, then the location must be set as blank + * since the bottom of the list item is anchored to + * the bottom of the secondary text. Else the bottom + * of the list will overlap on the primary text + */ + textData << singleSpace; + } else { + /** + * Else, set the secondary text to empty to indicate + * to the list view to remove the item itself and + * shrink its size to a single line size + */ + textData << QVariant(); + } + } else { + // TODO: Location icon must be shown + // only if valid geo-coordinates are present + // iconData << HbIcon(locationIcon); + textData << entry.location(); + } + + // Get the list model index and set the text and icon data + QModelIndex listIndex = mListModel->index(index, 0); + mListModel->setData(listIndex, textData, Qt::DisplayRole); + mListModel->setData(listIndex, iconData, Qt::DecorationRole); + + // Disable item stretching by removing the dynamic property + HbListViewItem *listViewItem = static_cast + (mEventsList->itemByIndex(mListModel->index(index, 0))); + if (listViewItem) { + listViewItem->setProperty(stretchLayout, false); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::addNonTimedEventToList +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::addNonTimedEventToList(int index, AgendaEntry entry) +{ + QVariantList textData; + QVariantList iconData; + + /** + * IMPORTANT NOTE: All the text and icon items must be + * inserted into the variant list in a specific order. + * If not, chaos will set it!!! + * On a more serious note, the mesh layout depends on the + * fact that the icons and text data will be added in a + * particular order. If one of the items go missing, the + * layout might get messed up. Also in case a particular item + * is not required to be added in the middle of the list, an + * empty QVariant must be added to indicate to the list view + * that the item must be removed from the layout. + * Do not mess with the order in case you are not sure what + * you are exactly doing. + */ + + // The first column text has to be empty + textData << QVariant(); + + // Get the entry subject + QString subject = entry.summary(); + if (subject.isEmpty() || subject.isNull()) { + // No subject. Add "(No subject)" text + subject.append(hbTrId("txt_calendar_dblist_unnamed")); + } + // Add the subject to the text list + // This MUST be the second item in the list + textData << subject; + + // Get the entry type + AgendaEntry::Type entryType = entry.type(); + + if (entryType == AgendaEntry::TypeAnniversary) { + // Nothing to do as of now as anniversary events + // cannot be created + // TODO: To be handled in case of sync + } else if (entryType == AgendaEntry::TypeEvent) { + // This is an all day event + // Append the all-day icon + iconData << HbIcon(allDayIcon); + + // Check if alarm is enabled for the entry + if (entry.alarm().isNull()) { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + } else { + iconData << HbIcon(reminderIcon); + } + + // Check if the entry is recurring + if (entry.isRepeating()) { + iconData << HbIcon(repeatIcon); + } else { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + } + + // Append the location + if (!entry.location().isEmpty()) { + textData << entry.location(); + // TODO: Location icon must be shown + // only if valid geo-coordinates are present + // iconData << HbIcon(locationIcon); + } else { + textData << singleSpace; + } + + } else if (entryType == AgendaEntry::TypeTodo) { + // Append the to-do icon + iconData << HbIcon(toDoIcon); + + // Get the due date + QDateTime dueDate = entry.endTime(); + + // Append the date first + QString dueDateString(hbTrId("txt_calendar_dblist_val_due_on_1")); + QString dueText; + dueText.setNum(dueDate.date().day()); + dueText.append(singleSpace); + + // Append the month name next + HbExtendedLocale locale = HbExtendedLocale::system(); + QString month = locale.monthName(dueDate.date().month()); + dueText.append(month); + dueText.append(singleSpace); + + // Append the year + QString year; + year.setNum(dueDate.date().year()); + dueText.append(year); + + textData << dueDateString.arg(dueText); + + // Check if alarm is enabled for the entry + if (entry.alarm().isNull()) { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + } else { + iconData << HbIcon(reminderIcon); + } + + // Check if the entry is recurring + if (entry.isRepeating()) { + iconData << HbIcon(repeatIcon); + } else { + // Insert a blank icon. Else the next icon + // will get replaced in this icon's position + iconData << QVariant(); + } + } + + // Get the list model index and set the text and icon data + QModelIndex listIndex = mListModel->index(index, 0); + mListModel->setData(listIndex, textData, Qt::DisplayRole); + mListModel->setData(listIndex, iconData, Qt::DecorationRole); + + // Enable item stretching by adding the dynamic property + HbListViewItem *listViewItem = static_cast + (mEventsList->itemByIndex(mListModel->index(index, 0))); + Qt::Orientation orientation = mServices.MainWindow().orientation(); + // Apply stretch only for landscape orientation + if (listViewItem) { + if (Qt::Horizontal == orientation) { + listViewItem->setProperty(stretchLayout, true); + } else { + listViewItem->setProperty(stretchLayout, false); + } + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::handleListItemStretching +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::handleListItemStretching(Qt::Orientation orientation) +{ + if (mInstanceArray.count() == 0) { + // Nothing much to do. Simply return + return; + } + for(int index = 0; index < mInstanceArray.count() ; index ++) { + AgendaEntry entry = mInstanceArray[index]; + if (!entry.isNull()) { + AgendaEntry::Type eventType = entry.type(); + switch(eventType) { + // Apply the stretching to only to-do's, + // anniversary and all-day event types + case AgendaEntry::TypeTodo: + case AgendaEntry::TypeEvent: + case AgendaEntry::TypeAnniversary: + { + // Get the list view item corresponding to the index + HbListViewItem *listItem = static_cast + (mEventsList->itemByIndex(mListModel->index(index, 0))); + if (listItem) { + if (orientation == Qt::Horizontal) { + // Set a dynamic property to indicate that this list item + // must be stretched in landscape. + // NOTE: Property name MUST match the name specified in + // css file, else wierd things might happen + listItem->setProperty(stretchLayout, true); + } + } + } + break; + default: + { + HbListViewItem *listItem = static_cast + (mEventsList->itemByIndex(mListModel->index(index, 0))); + if (listItem) { + listItem->setProperty(stretchLayout, false); + } + break; + } + } + } + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::getIndexToScrollTo +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +int CalenDayViewWidget::getIndexToScrollTo() +{ + int scrollIndex = 0; + TCalenInstanceId instanceId = mServices.Context().instanceId(); + if (instanceId == TCalenInstanceId::nullInstanceId()) { + // If the instance is not set, then scroll to zero index + return scrollIndex; + } + + for (int index = 0 ; index < mInstanceArray.count() ; index++) { + AgendaEntry entry = mInstanceArray[index]; + if (entry.id() == instanceId.mEntryLocalUid) { + // Match found. + scrollIndex = index; + break; + } + } + return scrollIndex; +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::createNewEvent +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::createNewEvent() +{ + // Issue a command to launch editor to create + // a new event + mServices.IssueCommandL(ECalenNewMeeting); +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::editEntry +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::editEntry() +{ + // Check if the selected index is valid + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + return; + } + + // Get the entry details first + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + if (AgendaEntry::TypeTodo == entry.type()) { + // Launch the to-do editor + mNotesEditor = new NotesEditor(mView); + mNotesEditor->edit(entry); + connect(mNotesEditor, SIGNAL(editingCompleted(bool)), this, SLOT(noteEditingCompleted(bool))); + } else { + // Set the context + setContextFromHighlight(entry); + // Issue a command to launch the editor to edit this entry + mServices.IssueCommandL(ECalenEditCurrentEntry); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::viewEntry +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::viewEntry() +{ + // Get the entry details first + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + + // Set the context + setContextFromHighlight(entry); + + // Launch the event viewer. + mServices.IssueCommandL(ECalenEventView); +} + + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::deleteEntry +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::deleteEntry() +{ + // Check if the selected index is valid + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + return; + } + + // Get the entry details + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + // Set the context + setContextFromHighlight(entry); + // Issue the command to delete the entry + mServices.IssueCommandL(ECalenDeleteCurrentEntry); +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::markAsDone +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::markAsDone() +{ + // Check if the selected index is valid + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + return; + } + + // Get the entry details + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + + // Check again if the event is of type to-to + if (AgendaEntry::TypeTodo == entry.type()) { + // Set the status of the to-do as completed + entry.setStatus(AgendaEntry::TodoCompleted); + // Update the completed date and time + entry.setCompletedDateTime(mDate); + + // Update the entry in the database + AgendaUtil agendaUtil; + agendaUtil.setCompleted(entry, true, mDate); + + mServices.IssueCommandL(ECalenStartActiveStep); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::itemLongPressed +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::itemLongPressed(HbAbstractViewItem* listViewItem, + const QPointF& coords) +{ + // Update the selection index first + mSelectedIndex = listViewItem->modelIndex().row(); + + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + // Invalid index + return; + } + + AgendaEntry entry = mInstanceArray[mSelectedIndex]; + + // Create new menu. + HbMenu *contextMenu = new HbMenu(); + + // Add the open option + HbAction *openAction = contextMenu->addAction(hbTrId("txt_common_menu_open")); + connect(openAction, SIGNAL(triggered()), this, SLOT(viewEntry())); + + // Check the type of event + if (AgendaEntry::TypeTodo == entry.type()) { + // Add an option to mark the note as complete + HbAction *completeAction = contextMenu->addAction(hbTrId("txt_calendar_menu_mark_as_done")); + connect(completeAction, SIGNAL(triggered()), this, SLOT(markAsDone())); + } + + // Add the edit option + HbAction *editAction = contextMenu->addAction(hbTrId("txt_common_menu_edit")); + connect(editAction, SIGNAL(triggered()), this, SLOT(editEntry())); + + // Add the delete option + HbAction *deleteAction = contextMenu->addAction(hbTrId("txt_common_menu_delete")); + connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteEntry())); + + contextMenu->setDismissPolicy(HbMenu::TapAnywhere); + + // Show context sensitive menu. + // Param const QPointF& coordinate - is a longpress position. + contextMenu->exec(coords); +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::itemActivated +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::itemActivated(const QModelIndex &index) +{ + // Update the selection index first + mSelectedIndex = index.row(); + + // Check if the selected index is valid + if (mSelectedIndex < 0 || mSelectedIndex > mInstanceArray.count()) { + return; + } + + // Open the event for viewing + viewEntry(); +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::itemActivated +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::noteEditingCompleted(bool status) +{ + Q_UNUSED(status); + // Delete the notes editor instance + mNotesEditor->deleteLater(); + + // We need to refresh the list since user + // might have marked the to-do as complete or + // edited it or deleted it. So get the instance + // list again + if (status) { + mServices.IssueCommandL(ECalenStartActiveStep); + } +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::goToToday +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::goToToday() +{ + // First check if we are not already + // showing today's agenda + if (mDate == CalenDateUtils::today()) { + return; + } + + // Set the context for the current day + mServices.Context().setFocusDateL(CalenDateUtils::today(), KCalenDayViewUidValue); + + // Issue a command to re-populate the entire view + mServices.IssueCommandL(ECalenStartActiveStep); +} + +// ---------------------------------------------------------------------------- +// CalenDayViewWidget::deleteEntries +// Rest of the details are commented in the header +// ---------------------------------------------------------------------------- +// +void CalenDayViewWidget::deleteEntries() +{ + // TODO: Show a checklist to allow multiple delete +} + +// End of file --Don't remove this.