diff -r 96907930389d -r 12af337248b1 notes/notesui/notesmodel/src/notesmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/notes/notesui/notesmodel/src/notesmodel.cpp Tue Aug 31 15:13:43 2010 +0300 @@ -0,0 +1,1119 @@ +/* +* 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: +* Definition file for class NotesModel. +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include + +// User includes +#include "notesmodel.h" +#include +#include +#include "notescommon.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "notesmodelTraces.h" +#endif + + +/*! + \class NotesModel + + This is the source model class for the notes application views. This owns + a QStandardItemModel which is a model for the data containing notes, todos + and reminders. + */ + +/*! + Constructor. + + \param agendaUtil Pointer to the object of AgendaUtil. + \param parent Parent of type QObject. + */ +NotesModel::NotesModel(AgendaUtil *agendaUtil, QObject *parent) +:QObject(parent), + mAgendaUtil(agendaUtil) +{ + OstTraceFunctionEntry0( NOTESMODEL_NOTESMODEL_ENTRY ); + // Construct the source model. + mSourceModel = new QStandardItemModel(0, 1, this); + + connect( + mAgendaUtil, SIGNAL(entriesChanged(QList)), + this, SLOT(populateSourceModel(QList))); + + // Connect to entryAdded signal of agendautil. + connect( + mAgendaUtil, SIGNAL(entryAdded(ulong)), + this, SLOT(addEntryToModel(ulong))); + // Connect to entryDeleted signal of agendautil. + connect( + mAgendaUtil, SIGNAL(entryDeleted(ulong)), + this, SLOT(removeEntryFromModel(ulong))); + // Connect to entryUpdated signal of agendautil. + connect( + mAgendaUtil, SIGNAL(entryUpdated(ulong)), + this, SLOT(updateSourceModel(ulong))); + + // Connect for instance view creation completed signal + connect( + mAgendaUtil, SIGNAL(instanceViewCreationCompleted(int)), + this,SLOT(handleInstanceViewCreationCompleted(int))); + OstTraceFunctionExit0( NOTESMODEL_NOTESMODEL_EXIT ); +} + +/*! + Destructor. + */ +NotesModel::~NotesModel() +{ + OstTraceFunctionEntry0( DUP1_NOTESMODEL_NOTESMODEL_ENTRY ); + // Nothing yet. + OstTraceFunctionExit0( DUP1_NOTESMODEL_NOTESMODEL_EXIT ); +} + +/*! + Returns the source model to be used with a view. + + \return QAbstractItemModel + \sa QAbstractItemModel, HbListView. + */ +QAbstractItemModel *NotesModel::sourceModel() +{ + OstTraceFunctionEntry0( NOTESMODEL_SOURCEMODEL_ENTRY ); + Q_ASSERT(mSourceModel); + OstTraceFunctionExit0( NOTESMODEL_SOURCEMODEL_EXIT ); + return mSourceModel; +} + +/*! + Populates the source model. + */ +void NotesModel::populateSourceModel() +{ + OstTraceFunctionEntry0( NOTESMODEL_POPULATESOURCEMODEL_ENTRY ); + // Clear the model if it has any data already + mSourceModel->clear(); + mSourceModel->setColumnCount(1); + mNotesCount = mInCompTodoCount = mCompTodoCount = 0; + + // The order of appending the items to the model is: + // 1. Notes, 2. Incompleted to-dos, 3. Completed to-dos. + // First get only the notes and populate the model. + QList agendaEntyList = mAgendaUtil->fetchAllEntries( + (AgendaUtil::FilterFlags) (AgendaUtil::IncludeNotes)); + + // Add the notes to the model. + appendNotesToModel(agendaEntyList); + + // Get the incompleted to-dos. + agendaEntyList.clear(); + agendaEntyList = mAgendaUtil->fetchAllEntries( + (AgendaUtil::FilterFlags) (AgendaUtil::IncludeIncompletedTodos)); + + // Add the incompleted to-dos to the model. + appendInCompTodosToModel(agendaEntyList); + + // Get the completed to-dos. + agendaEntyList.clear(); + agendaEntyList = mAgendaUtil->fetchAllEntries( + (AgendaUtil::FilterFlags) (AgendaUtil::IncludeCompletedTodos)); + + // Add the completed to-dos to the model. + appendCompTodosToModel(agendaEntyList); + OstTraceFunctionExit0( NOTESMODEL_POPULATESOURCEMODEL_EXIT ); +} + +/*! + Updates the source model with the given entry `id'. + The entry could be either have undergone a status change or have just been + modified. + + \param id Of type ulong, identifies the entry which was changed. + */ +void NotesModel::updateSourceModel(ulong id) +{ + OstTraceFunctionEntry0( NOTESMODEL_UPDATESOURCEMODEL_ENTRY ); + AgendaEntry entry = mAgendaUtil->fetchById(id); + if (entry.isNull()) { + OstTraceFunctionExit0( NOTESMODEL_UPDATESOURCEMODEL_EXIT ); + return; + } + + // Entry can be updated in many ways. + // 1. Notes can just change their content or can be marked/unmarked as + // favourites. So for any change with a note, we move the model index + // representing the note to the top of the list. + if (AgendaEntry::TypeNote == entry.type()) { + QModelIndex foundIndex; + for (int iter = 0; iter < mNotesCount; iter++) { + foundIndex = mSourceModel->index(iter, 0); + if (!foundIndex.isValid()) { + continue; + } + + ulong noteId = foundIndex.data( + NotesNamespace::IdRole).value(); + if (id == noteId) { + break; + } + } + QStandardItem *item = mSourceModel->takeItem(foundIndex.row()); + mSourceModel->removeRow(foundIndex.row()); + mNotesCount--; + + // Insert the note to the 0th postion. + insertNoteToModel(foundIndex, id); + + } else if (AgendaEntry::TypeTodo == entry.type()) { + // 2. To-dos content can be modified. + // So we check the status of the to-do. If the status has changed, we + // check the previous status and remove the model index from the + // corresponding section. Else we just update the to-do contents. + QModelIndex foundIndex; + for (int iter = mNotesCount; + iter < mNotesCount + mInCompTodoCount + mCompTodoCount + 1; + iter++) { + foundIndex = mSourceModel->index(iter, 0); + if (!foundIndex.isValid()) { + continue; + } + + ulong noteId = foundIndex.data( + NotesNamespace::IdRole).value(); + if (id == noteId) { + break; + } + } + + // Get the status of the to-do. + AgendaEntry::Status entryStatus = (AgendaEntry::Status) foundIndex.data( + NotesNamespace::StatusRole).value(); + + if (entry.status() == entryStatus) { + if (AgendaEntry::TodoNeedsAction == entryStatus) { + // Make sure that the old model index is removed. + mSourceModel->removeRow(foundIndex.row()); + mInCompTodoCount--; + + // Now insert the to-do. + insertInCompTodoToModel(foundIndex, id); + + } else if (AgendaEntry::TodoCompleted == entryStatus) { + // Make sure that the old model index is removed. + mSourceModel->removeRow(foundIndex.row()); + mCompTodoCount--; + + // Now insert the completed to-do. + insertCompTodoToModel(foundIndex, id); + + } + } else { + if (AgendaEntry::TodoNeedsAction == entryStatus) { + // Here the to-do was marked completed. Hence we need to remove + // the incompleted to-do and insert a completed to-do. + mSourceModel->removeRow(foundIndex.row()); + mInCompTodoCount--; + + // Now insert the completed to-do. + insertCompTodoToModel(foundIndex, id); + + } else if (AgendaEntry::TodoCompleted == entryStatus) { + // Here the to-do was marked incompleted. Hence we need to + // remove the completed to-do and insert an incompleted to-do. + mSourceModel->removeRow(foundIndex.row()); + mCompTodoCount--; + + // Now insert the incompleted to-do. + insertInCompTodoToModel(foundIndex, id); + + } + } + } + OstTraceFunctionExit0( DUP1_NOTESMODEL_UPDATESOURCEMODEL_EXIT ); +} + +/*! + Populates the source model. This slot is called when we get a db change + notification from agenda server caused by another session. + + \param ids List of ids containing the entries that got changed. + */ +void NotesModel::populateSourceModel(QList ids) +{ + OstTraceFunctionEntry0( DUP1_NOTESMODEL_POPULATESOURCEMODEL_ENTRY ); + Q_UNUSED(ids) + + QTimer::singleShot(1, this, SLOT(populateSourceModel())); + OstTraceFunctionExit0( DUP1_NOTESMODEL_POPULATESOURCEMODEL_EXIT ); +} + +/*! + Adds an entry to the model i.e., creates a QModelIndex and inserts it to the + model. + + \param id The id of the entry to be added to the model. + */ +void NotesModel::addEntryToModel(ulong id) +{ + OstTraceFunctionEntry0( NOTESMODEL_ADDENTRYTOMODEL_ENTRY ); + // We have different logic for adding a note or an incompleted to-do or a + // completed to-do. + AgendaEntry entry = mAgendaUtil->fetchById(id); + if (entry.isNull()) { + OstTraceFunctionExit0( NOTESMODEL_ADDENTRYTOMODEL_EXIT ); + return; + } + bool notify = false; + QModelIndex indexToNotify; + + if (AgendaEntry::TypeNote == entry.type()) { + // All new notes are inserted at the top of the list by default. + // Create a new model index at the 0th position. + notify = insertNoteToModel(indexToNotify, id); + + } else if (AgendaEntry::TypeTodo == entry.type()) { + if (AgendaEntry::TodoNeedsAction == entry.status()) { + // Try to insert the to-do at its appropriate position. + notify = insertInCompTodoToModel(indexToNotify, id); + + } else if (AgendaEntry::TodoCompleted == entry.status()) { + // Try to insert the to-do at its appropriate position. + insertCompTodoToModel(indexToNotify, id); + } + } + + if (notify) { + emit rowAdded(indexToNotify); + } + OstTraceFunctionExit0( DUP1_NOTESMODEL_ADDENTRYTOMODEL_EXIT ); +} + +/*! + Deletes an entry from model. + + \param Deletes the entry from model and hence updating the view. + */ +void NotesModel::removeEntryFromModel(ulong id) +{ + OstTraceFunctionEntry0( NOTESMODEL_REMOVEENTRYFROMMODEL_ENTRY ); + for (int iter = 0; iter < mSourceModel->rowCount(); iter++) { + QModelIndex mdlIndex = mSourceModel->index(iter, 0); + + if (!mdlIndex.isValid()) { + OstTraceFunctionExit0( NOTESMODEL_REMOVEENTRYFROMMODEL_EXIT ); + return; + } + + ulong noteId = mdlIndex.data( + NotesNamespace::IdRole).value(); + AgendaEntry::Type entryType = (AgendaEntry::Type) mdlIndex.data( + NotesNamespace::TypeRole).value(); + AgendaEntry::Status entryStatus = (AgendaEntry::Status) mdlIndex.data( + NotesNamespace::StatusRole).value(); + + if (id == noteId) { + mSourceModel->removeRow(mdlIndex.row()); + + // Update the note, to-do counts depending on the type. + if (entryType == AgendaEntry::TypeNote) { + mNotesCount--; + } else if (entryType == AgendaEntry::TypeTodo) { + if (entryStatus == AgendaEntry::TodoCompleted) { + mCompTodoCount--; + } else if (entryStatus == AgendaEntry::TodoNeedsAction) { + mInCompTodoCount--; + } + } + break; + } + } + OstTraceFunctionExit0( DUP1_NOTESMODEL_REMOVEENTRYFROMMODEL_EXIT ); +} + +/*! + Populate the model after instance view creation. + */ +void NotesModel::handleInstanceViewCreationCompleted(int status) +{ + OstTraceFunctionEntry0( NOTESMODEL_HANDLEINSTANCEVIEWCREATIONCOMPLETED_ENTRY ); + Q_UNUSED(status); + populateSourceModel(); + OstTraceFunctionExit0( NOTESMODEL_HANDLEINSTANCEVIEWCREATIONCOMPLETED_EXIT ); +} + +/*! + Modifies the content of a given `row' with the data of the entry given by + `id'. + + \param id The id of the entry. + \param row The row corresponding to the given id. + */ +void NotesModel::modifyEntryInModel(ulong id, int row) +{ + OstTraceFunctionEntry0( NOTESMODEL_MODIFYENTRYINMODEL_ENTRY ); + // Get the model index. + QModelIndex modelIndex = mSourceModel->index(row, 0); + Q_ASSERT(modelIndex.isValid()); + + // Fetch the entry + AgendaEntry entry = mAgendaUtil->fetchById(id); + Q_ASSERT(!entry.isNull()); + + // Set the note id. + mSourceModel->setData( + modelIndex, (qulonglong) id, NotesNamespace::IdRole); + // Set the type of the note. + mSourceModel->setData( + modelIndex, entry.type(), NotesNamespace::TypeRole); + + // Set the display data to the index. + if (AgendaEntry::TypeNote == entry.type()) { + QString displayText; + QString dateTimeText; + QString modifiedText; + + // Read modification time from agenda entry + QDateTime entryStartDateTime = entry.startTime(); + + // If modified on today,show only modified time otherwise show the + // modified date. + if ((QDate::currentDate()) == entryStartDateTime.date() ) { + dateTimeText = + hbTrId("txt_notes_dblist_note_modified_at_time"); + modifiedText = + entryStartDateTime.time().toString(timeFormatString()); + } else { + dateTimeText = + hbTrId("txt_notes_dblist_note_modified_on_date"); + modifiedText = + entryStartDateTime.date().toString(dateFormatString()); + } + + displayText = dateTimeText.arg(modifiedText); + + QStringList stringList; + stringList << entry.description().left(15) << displayText; + // Set the data. + mSourceModel->setData( + modelIndex, stringList, Qt::DisplayRole); + // Set the favourite icon. + if (entry.favourite()) { + QList iconList; + iconList.append(HbIcon("qtg_small_note")); + iconList.append(HbIcon("qtg_mono_favourites")); + mSourceModel->setData(modelIndex, iconList, Qt::DecorationRole); + } else { + QList iconList; + iconList.append(HbIcon("qtg_small_note")); + iconList.append(QVariant(QVariant::Invalid)); + mSourceModel->setData(modelIndex, iconList, Qt::DecorationRole); + } + } else if (AgendaEntry::TypeTodo == entry.type()) { + QStringList stringList; + if (entry.summary().isEmpty()) { + // If empty set unnamed text + stringList<setData( + modelIndex, stringList, Qt::DisplayRole); + + // Set the to-do done/undone icon based on the status. + QList iconList; + if (AgendaEntry::TodoCompleted == entry.status()) { + iconList.append(HbIcon("qtg_small_todo_done")); + } else { + iconList.append(HbIcon("qtg_small_todo")); + } + + if (1 == entry.priority()) { + // Set the High Priority icon if priority is high. + iconList.append(HbIcon("qtg_small_priority_high")); + } else if (!entry.alarm().isNull()) { + // Set the alarm if set. + iconList.append(HbIcon("qtg_mono_alarm")); + } else { + iconList.append(QVariant(QVariant::Invalid)); + } + + // Set the icons. + mSourceModel->setData(modelIndex, iconList, Qt::DecorationRole); + } + OstTraceFunctionExit0( NOTESMODEL_MODIFYENTRYINMODEL_EXIT ); +} + +/*! + Appends notes to the model. + + \param ids QList of uids containing the notes. + */ +void NotesModel::appendNotesToModel(QList &agendaEntryList) +{ + OstTraceFunctionEntry0( NOTESMODEL_APPENDNOTESTOMODEL_ENTRY ); + int entriesCount = agendaEntryList.count(); + // Iterate and add notes to the model. + mSourceModel->insertRows(mSourceModel->rowCount(), entriesCount); + int rowCount = mSourceModel->rowCount(); + for (int idIter = 0, modelIter = rowCount - entriesCount; + idIter < entriesCount; idIter++, modelIter++) { + + // Read the note details. + AgendaEntry entry = agendaEntryList[rowCount - 1 - idIter]; + + if (AgendaEntry::TypeNote != entry.type()) { + continue; + } + + // Create a model index. + QModelIndex mdlIndex = mSourceModel->index(qAbs(modelIter), 0); + + // Set the note id. + mSourceModel->setData( + mdlIndex, (qulonglong) entry.id(), NotesNamespace::IdRole); + // Set the type of the note. + mSourceModel->setData( + mdlIndex, entry.type(), NotesNamespace::TypeRole); + // Set the favourite property. + mSourceModel->setData( + mdlIndex, entry.favourite(), NotesNamespace::FavouriteRole); + + // Set the display data now. + // Read modification time from agenda entry + QString displayText; + QString dateTimeText; + QString modifiedText; + + // Show the creation time if entry is not modified. + if (entry.dtStamp().isValid()) { + QDateTime creationDateTime = entry.dtStamp(); + + // If created on today,show only creation time otherwise show the + // creation date. + if ((QDate::currentDate()) == creationDateTime.date()) { + dateTimeText = + hbTrId("txt_notes_dblist_note_created_at_time"); + modifiedText = + creationDateTime.time().toString(timeFormatString()); + } else { + dateTimeText = + hbTrId("txt_notes_dblist_note_created_on_date"); + modifiedText = + creationDateTime.date().toString(dateFormatString()); + } + } else { + QDateTime modifiedDateTime = entry.lastModifiedDateTime(); + + // If modified on today,show only modified time otherwise show the + // modified date. + if ((QDate::currentDate()) == modifiedDateTime.date() ) { + dateTimeText = + hbTrId("txt_notes_dblist_note_modified_at_time"); + modifiedText = + modifiedDateTime.time().toString(timeFormatString()); + } else { + dateTimeText = + hbTrId("txt_notes_dblist_note_modified_on_date"); + modifiedText = + modifiedDateTime.date().toString(dateFormatString()); + } + } + + displayText = dateTimeText.arg(modifiedText); + + QStringList stringList; + stringList << entry.description().left(100) << displayText; + // Set the data. + mSourceModel->setData( + mdlIndex, stringList, Qt::DisplayRole); + + if (entry.favourite()) { + // Set the favourite icon. + QList iconList; + iconList.append(HbIcon("qtg_small_note")); + iconList.append(HbIcon("qtg_mono_favourites")); + mSourceModel->setData(mdlIndex, iconList, Qt::DecorationRole); + } else { + QList iconList; + iconList.append(HbIcon("qtg_small_note")); + iconList.append(QVariant(QVariant::Invalid)); + mSourceModel->setData(mdlIndex, iconList, Qt::DecorationRole); + } + + // Update the notes count. + mNotesCount++; + } + OstTraceFunctionExit0( NOTESMODEL_APPENDNOTESTOMODEL_EXIT ); +} + +/*! + Appends incompleted to-dos to the model. + + \param ids QList of uids containing the incompleted to-dos. + */ +void NotesModel::appendInCompTodosToModel(QList &agendaEntryList) +{ + OstTraceFunctionEntry0( NOTESMODEL_APPENDINCOMPTODOSTOMODEL_ENTRY ); + int entriesCount = agendaEntryList.count(); + // Iterate and add incomplete to-do to the model. + mSourceModel->insertRows(mSourceModel->rowCount(), entriesCount); + int rowCount = mSourceModel->rowCount(); + for (int idIter = 0, modelIter = rowCount - entriesCount; + idIter < entriesCount; idIter++, modelIter++) { + + // Read the to-do details. + AgendaEntry entry = agendaEntryList[idIter]; + + if (AgendaEntry::TypeTodo != entry.type()) { + continue; + } + + if (AgendaEntry::TodoNeedsAction != entry.status()) { + continue; + } + + // Create a model index. + QModelIndex mdlIndex = mSourceModel->index(modelIter, 0); + + // Set the to-do id. + mSourceModel->setData( + mdlIndex, (qulonglong) entry.id(), NotesNamespace::IdRole); + // Set the type of the to-do. + mSourceModel->setData( + mdlIndex, entry.type(), NotesNamespace::TypeRole); + // Set the status of the to-do. + mSourceModel->setData( + mdlIndex, (int) entry.status(), NotesNamespace::StatusRole); + + // Set the display data now. + QStringList stringList; + if (entry.summary().isEmpty()) { + // If empty set unnamed text + stringList<setData(mdlIndex, stringList, Qt::DisplayRole); + // Set the to-do done/undone icon based on the status. + QList iconList; + iconList.append(HbIcon("qtg_small_todo")); + + if (1 == entry.priority()) { + // Set the High Priority icon if priority is high. + iconList.append(HbIcon("qtg_small_priority_high")); + } else if (!entry.alarm().isNull()) { + // Set the alarm if set. + iconList.append(HbIcon("qtg_mono_alarm")); + } else { + iconList.append(QVariant(QVariant::Invalid)); + } + + // Set the icons. + mSourceModel->setData(mdlIndex, iconList, Qt::DecorationRole); + + // Update the incompleted to-do count. + mInCompTodoCount++; + } + OstTraceFunctionExit0( NOTESMODEL_APPENDINCOMPTODOSTOMODEL_EXIT ); +} + +/*! + Appends incompleted to-dos to the model. + + \param ids QList of uids containing the completed to-dos. + */ +void NotesModel::appendCompTodosToModel(QList &agendaEntryList) +{ + OstTraceFunctionEntry0( NOTESMODEL_APPENDCOMPTODOSTOMODEL_ENTRY ); + int entriesCount = agendaEntryList.count(); + // Iterate and add complete to-do to the model. + mSourceModel->insertRows(mSourceModel->rowCount(), entriesCount); + int rowCount = mSourceModel->rowCount(); + for (int idIter = 0, modelIter = rowCount - entriesCount; + idIter < entriesCount; idIter++, modelIter++) { + + // Read the completed to-do details. + AgendaEntry entry = agendaEntryList[idIter]; + + if (AgendaEntry::TypeTodo != entry.type()) { + continue; + } + + if (AgendaEntry::TodoCompleted != entry.status()) { + continue; + } + + // Create a model index. + QModelIndex mdlIndex = mSourceModel->index(modelIter, 0); + + // Set the to-do id. + mSourceModel->setData( + mdlIndex, (qulonglong) entry.id(), NotesNamespace::IdRole); + // Set the type of the to-do. + mSourceModel->setData( + mdlIndex, entry.type(), NotesNamespace::TypeRole); + // Set the status of the to-do. + mSourceModel->setData( + mdlIndex, (int) entry.status(), NotesNamespace::StatusRole); + + // Set the display data now. + QStringList stringList; + if (entry.summary().isEmpty()) { + // If empty set unnamed text + stringList<setData(mdlIndex, stringList, Qt::DisplayRole); + + // Set the to-do done icon. + QList iconList; + iconList.append(HbIcon("qtg_small_todo_done")); + // To-do is already completed. No need to set alarm. + iconList.append(QVariant(QVariant::Invalid)); + + // Set the icons. + mSourceModel->setData(mdlIndex, iconList, Qt::DecorationRole); + + // Update the completed to-do count. + mCompTodoCount++; + } + OstTraceFunctionExit0( NOTESMODEL_APPENDCOMPTODOSTOMODEL_EXIT ); +} + +/*! + Inserts a note at the 0th position. + + \param index Will contain the model index of the newly created row. + \param id The id of the note to be inserted. + \return bool true if the insertion was successful, false otherwise. + */ +bool NotesModel::insertNoteToModel(QModelIndex &index, ulong id) +{ + OstTraceFunctionEntry0( NOTESMODEL_INSERTNOTETOMODEL_ENTRY ); + AgendaEntry entry = mAgendaUtil->fetchById(id); + if (entry.isNull()) { + OstTraceFunctionExit0( NOTESMODEL_INSERTNOTETOMODEL_EXIT ); + return false; + } + + mSourceModel->insertRows(0, 1); + QModelIndex mdlIndex = mSourceModel->index(0, 0); + + // Now set the details of this note. + // Set the note id. + mSourceModel->setData( + mdlIndex, (qulonglong) id, NotesNamespace::IdRole); + // Set the type of the note. + mSourceModel->setData( + mdlIndex, entry.type(), NotesNamespace::TypeRole); + // Set the favourite property. + mSourceModel->setData( + mdlIndex, entry.favourite(), NotesNamespace::FavouriteRole); + + // Set the display data now. + // Read modification time from agenda entry + QString displayText; + QString dateTimeText; + QString modifiedText; + + // Show the creation time if entry is not modified. + if (entry.dtStamp().isValid()) { + QDateTime creationDateTime = entry.dtStamp(); + + // If created on today,show only creation time otherwise show the + // creation date. + if ((QDate::currentDate()) == creationDateTime.date()) { + dateTimeText = + hbTrId("txt_notes_dblist_note_created_at_time"); + modifiedText = + creationDateTime.time().toString(timeFormatString()); + } else { + dateTimeText = + hbTrId("txt_notes_dblist_note_created_on_date"); + modifiedText = + creationDateTime.date().toString(dateFormatString()); + } + } else { + QDateTime modifiedDateTime = entry.lastModifiedDateTime(); + + // If modified on today,show only modified time otherwise show the + // modified date. + if ((QDate::currentDate()) == modifiedDateTime.date() ) { + dateTimeText = + hbTrId("txt_notes_dblist_note_modified_at_time"); + modifiedText = + modifiedDateTime.time().toString(timeFormatString()); + } else { + dateTimeText = + hbTrId("txt_notes_dblist_note_modified_on_date"); + modifiedText = + modifiedDateTime.date().toString(dateFormatString()); + } + } + displayText = dateTimeText.arg(modifiedText); + + QStringList stringList; + stringList << entry.description().left(100) << displayText; + // Set the data. + mSourceModel->setData( + mdlIndex, stringList, Qt::DisplayRole); + + // Set the favourite icon. + if (entry.favourite()) { + QList iconList; + iconList.append(HbIcon("qtg_small_note")); + iconList.append(HbIcon("qtg_mono_favourites")); + mSourceModel->setData(mdlIndex, iconList, Qt::DecorationRole); + } else { + QList iconList; + iconList.append(HbIcon("qtg_small_note")); + iconList.append(QVariant(QVariant::Invalid)); + mSourceModel->setData(mdlIndex, iconList, Qt::DecorationRole); + } + // Update the notes count. + mNotesCount++; + + index = mdlIndex; + + OstTraceFunctionExit0( DUP1_NOTESMODEL_INSERTNOTETOMODEL_EXIT ); + return true; +} + +/*! + Inserts an incomplete to-do at a position based on the id of the + to-do given. + + \param index This will hold the model index of the newly inserted to-do. + \param id The id of the to-do to be inserted. + \return bool true if the Insertion was successful, false otherwise. + */ +bool NotesModel::insertInCompTodoToModel(QModelIndex &index, ulong id) +{ + OstTraceFunctionEntry0( NOTESMODEL_INSERTINCOMPTODOTOMODEL_ENTRY ); + + bool success = false; + + // Fetch the entry first. + AgendaEntry entry = mAgendaUtil->fetchById(id); + if (entry.isNull()) { + OstTraceFunctionExit0( NOTESMODEL_INSERTINCOMPTODOTOMODEL_EXIT ); + return success; + } + + // First fetch the list of incompleted to-dos. + QList entryIds = mAgendaUtil->entryIds( + (AgendaUtil::FilterFlags) (AgendaUtil::IncludeIncompletedTodos)); + + // Get the index of the added to-do in the above list. + int newTodoIndex = -1; + for (int iter = 0; iter < entryIds.count(); iter++) { + if (id == entryIds[iter]) { + newTodoIndex = iter; + break; + } + } + + // We display the to-dos in the same order that we get from the + // agenda server. This is a new to-do that has been added. Hence we + // have to insert a model index at the same position as we found the + // id in the list of to-dos above. + // Calculate the position. + if (-1 != newTodoIndex) { + mSourceModel->insertRows(mNotesCount + newTodoIndex, 1); + QModelIndex newModelIndex = + mSourceModel->index(mNotesCount + newTodoIndex, 0); + + // We continue only if the index is valid. + if (newModelIndex.isValid()) { + // Things look ok, start adding data to the model index. + // Set the to-do id. + mSourceModel->setData( + newModelIndex, (qulonglong) id, NotesNamespace::IdRole); + // Set the type of the to-do. + mSourceModel->setData( + newModelIndex, entry.type(), NotesNamespace::TypeRole); + // Set the status of the to-do. + mSourceModel->setData( + newModelIndex, (int) entry.status(), + NotesNamespace::StatusRole); + + // Set the display data now. + QStringList stringList; + if (entry.summary().isEmpty()) { + // If empty set unnamed text + stringList<setData( + newModelIndex, stringList, Qt::DisplayRole); + // Set the to-do done/undone icon based on the status. + QList iconList; + iconList.append(HbIcon("qtg_small_todo")); + + if (1 == entry.priority()) { + // Set the High Priority icon if priority is high. + iconList.append(HbIcon("qtg_small_priority_high")); + } else if (!entry.alarm().isNull()) { + // Set the alarm if set. + iconList.append(HbIcon("qtg_mono_alarm")); + } else { + iconList.append(QVariant(QVariant::Invalid)); + } + + // Set the icons. + mSourceModel->setData( + newModelIndex, iconList, Qt::DecorationRole); + + // Update the incompleted to-do count. + mInCompTodoCount++; + + success = true; + index = newModelIndex; + } + } + + OstTraceFunctionExit0( DUP1_NOTESMODEL_INSERTINCOMPTODOTOMODEL_EXIT ); + return success; +} + +/*! + Inserts a complete to-do at a position based on the id of the + to-do given. + + \param index This will hold the model index of the newly inserted to-do. + \param id The id of the to-do to be inserted. + \return bool true if the Insertion was successful, false otherwise. + */ +bool NotesModel::insertCompTodoToModel(QModelIndex &index, ulong id) +{ + OstTraceFunctionEntry0( NOTESMODEL_INSERTCOMPTODOTOMODEL_ENTRY ); + bool success = false; + + // Fetch the entry first. + AgendaEntry entry = mAgendaUtil->fetchById(id); + if (entry.isNull()) { + OstTraceFunctionExit0( NOTESMODEL_INSERTCOMPTODOTOMODEL_EXIT ); + return success; + } + + // Now fetch all the incomplete to-dos again and add them. + QList entryIds = mAgendaUtil->entryIds( + (AgendaUtil::FilterFlags) (AgendaUtil::IncludeCompletedTodos)); + + // Get the index of the added to-do in the above list. + int newTodoIndex = -1; + for (int iter = 0; iter < entryIds.count(); iter++) { + if (id == entryIds[iter]) { + newTodoIndex = iter; + break; + } + } + + // We display the to-dos in the same order that we get from the + // agenda server. This is a new to-do that has been added. Hence we + // have to insert a model index at the same position as we found the + // id in the list of to-dos above. + // Calculate the position. + if (-1 != newTodoIndex) { + mSourceModel->insertRows( + mNotesCount + mInCompTodoCount + newTodoIndex, 1); + QModelIndex newModelIndex = mSourceModel->index( + mNotesCount + mInCompTodoCount + newTodoIndex, 0); + + // We continue only if the index is valid. + if (newModelIndex.isValid()) { + // Things look ok, start adding data to the model index. + AgendaEntry entry = mAgendaUtil->fetchById(id); + + // Set the to-do id. + mSourceModel->setData( + newModelIndex, (qulonglong) id, NotesNamespace::IdRole); + // Set the type of the to-do. + mSourceModel->setData( + newModelIndex, entry.type(), NotesNamespace::TypeRole); + // Set the status of the to-do. + mSourceModel->setData( + newModelIndex, (int) entry.status(), + NotesNamespace::StatusRole); + + // Set the display data now. + QStringList stringList; + if (entry.summary().isEmpty()) { + // If empty set unnamed text + stringList<setData( + newModelIndex, stringList, Qt::DisplayRole); + + // Set the to-do done icon. + QList iconList; + iconList.append(HbIcon("qtg_small_todo_done")); + if (1 == entry.priority()) { + // Set the High Priority icon if priority is high or else not. + iconList.append(HbIcon("qtg_small_priority_high")); + } else { + // To-do is already completed. No need to set alarm. + iconList.append(QVariant(QVariant::Invalid)); + } + + // Set the icons. + mSourceModel->setData( + newModelIndex, iconList, Qt::DecorationRole); + + // Update the completed to-do count. + mCompTodoCount++; + + success = true; + index = newModelIndex; + } + } + + OstTraceFunctionExit0( DUP1_NOTESMODEL_INSERTCOMPTODOTOMODEL_EXIT ); + return success; +} + +/*! + Retruns the dateformat based current locale settings. + Common method can be used by any class. + Can be removed once format strings are defined in hb. + */ +QString NotesModel::dateFormatString() +{ + OstTraceFunctionEntry0( NOTESMODEL_DATEFORMATSTRING_ENTRY ); + HbExtendedLocale locale = HbExtendedLocale::system(); + + QString dateFormat; + switch (locale.dateStyle()) { + case HbExtendedLocale::American: + dateFormat.append("MM"); + dateFormat.append(locale.dateSeparator(1)); + dateFormat.append("dd"); + dateFormat.append(locale.dateSeparator(1)); + dateFormat.append("yyyy"); + break; + + case HbExtendedLocale::European: + dateFormat.append("dd"); + dateFormat.append(locale.dateSeparator(1)); + dateFormat.append("MM"); + dateFormat.append(locale.dateSeparator(1)); + dateFormat.append("yyyy"); + break; + + case HbExtendedLocale::Japanese: + dateFormat.append("yyyy"); + dateFormat.append(locale.dateSeparator(1)); + dateFormat.append("MM"); + dateFormat.append(locale.dateSeparator(1)); + dateFormat.append("dd"); + break; + } + + OstTraceFunctionExit0( NOTESMODEL_DATEFORMATSTRING_EXIT ); + return dateFormat; +} + +/*! + Retruns the timeformat string based on current locale settings + Common method can be used by any class. + Can be removed once format strings are defined in hb. + */ +QString NotesModel::timeFormatString() +{ + OstTraceFunctionEntry0( NOTESMODEL_TIMEFORMATSTRING_ENTRY ); + QString timeFormat; + + HbExtendedLocale locale = HbExtendedLocale::system(); + + if (locale.timeStyle() == HbExtendedLocale::Time12) { + timeFormat.append("h"); + timeFormat.append(locale.timeSeparator(1)); + timeFormat.append("mm"); + timeFormat.append(" ap"); + } else { + timeFormat.append("hh"); + timeFormat.append(locale.timeSeparator(1)); + timeFormat.append("mm"); + } + + OstTraceFunctionExit0( NOTESMODEL_TIMEFORMATSTRING_EXIT ); + return timeFormat; +} + + +// End of file --Don't remove this.