notes/notesui/notesmodel/src/notesmodel.cpp
branchRCL_3
changeset 65 12af337248b1
--- /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 <QAbstractItemModel>
+#include <QStandardItemModel>
+#include <QTimer>
+#include <QDateTime>
+#include <HbIcon>
+#include <HbExtendedLocale>
+
+// User includes
+#include "notesmodel.h"
+#include <agendautil.h>
+#include <agendaentry.h>
+#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<ulong>)),
+			this, SLOT(populateSourceModel(QList<ulong>)));
+
+	// 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<AgendaEntry> 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<qulonglong>();
+			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<qulonglong>();
+			if (id == noteId) {
+				break;
+			}
+		}
+
+		// Get the status of the to-do.
+		AgendaEntry::Status entryStatus = (AgendaEntry::Status) foundIndex.data(
+				NotesNamespace::StatusRole).value<int>();
+
+		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<ulong> 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<qulonglong>();
+		AgendaEntry::Type entryType = (AgendaEntry::Type) mdlIndex.data(
+				NotesNamespace::TypeRole).value<int>();
+		AgendaEntry::Status entryStatus = (AgendaEntry::Status) mdlIndex.data(
+				NotesNamespace::StatusRole).value<int>();
+
+		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<QVariant> iconList;
+			iconList.append(HbIcon("qtg_small_note"));
+			iconList.append(HbIcon("qtg_mono_favourites"));
+			mSourceModel->setData(modelIndex, iconList, Qt::DecorationRole);
+		} else {
+			QList<QVariant> 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<<hbTrId("txt_notes_dblist_unnamed");
+		} else {
+			stringList << entry.summary();
+		}
+		if (AgendaEntry::TodoNeedsAction == entry.status()) {
+			// Read due date from agenda entry
+			QString displayText;
+			QString timeText(hbTrId("txt_notes_dblist_val_due_on_1"));
+			QString dueDateText =
+					entry.startTime().toString(dateFormatString());
+			displayText = timeText.arg(dueDateText);
+			stringList << displayText;
+		}
+		// Set the data.
+		mSourceModel->setData(
+				modelIndex, stringList, Qt::DisplayRole);
+
+		// Set the to-do done/undone icon based on the status.
+		QList<QVariant> 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<AgendaEntry> &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<QVariant> iconList;
+			iconList.append(HbIcon("qtg_small_note"));
+			iconList.append(HbIcon("qtg_mono_favourites"));
+			mSourceModel->setData(mdlIndex, iconList, Qt::DecorationRole);
+		} else {
+			QList<QVariant> 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<AgendaEntry> &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<<hbTrId("txt_notes_dblist_unnamed");
+		} else {
+			stringList << entry.summary();
+		}
+
+		if (AgendaEntry::TodoNeedsAction == entry.status()) {
+			// Read due date from agenda entry
+			QString displayText;
+			QString timeText(hbTrId("txt_notes_dblist_val_due_on_1"));
+			QString dueDateText =
+					entry.startTime().toString(dateFormatString());
+			displayText = timeText.arg(dueDateText);
+			stringList << displayText;
+		}
+		// Set the data.
+		mSourceModel->setData(mdlIndex, stringList, Qt::DisplayRole);
+		// Set the to-do done/undone icon based on the status.
+		QList<QVariant> 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<AgendaEntry> &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<<hbTrId("txt_notes_dblist_unnamed");
+		} else {
+			stringList << entry.summary();
+		}
+		if (AgendaEntry::TodoCompleted == entry.status()) {
+			// Read completed date from agenda entry
+			QString displayText;
+			QString timeText(hbTrId("txt_notes_dblist_val_completed_on_1"));
+			QString completedTimeText =
+					entry.completedDateTime().toString(dateFormatString());
+			displayText = timeText.arg(completedTimeText);
+			stringList << displayText;
+		}
+		// Set the data.
+		mSourceModel->setData(mdlIndex, stringList, Qt::DisplayRole);
+
+		// Set the to-do done icon.
+		QList<QVariant> 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<QVariant> iconList;
+		iconList.append(HbIcon("qtg_small_note"));
+		iconList.append(HbIcon("qtg_mono_favourites"));
+		mSourceModel->setData(mdlIndex, iconList, Qt::DecorationRole);
+	} else {
+		QList<QVariant> 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<ulong> 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<<hbTrId("txt_notes_dblist_unnamed");
+			} else {
+				stringList << entry.summary();
+			}
+			if (AgendaEntry::TodoNeedsAction == entry.status()) {
+				// Read due date from agenda entry
+				QString displayText;
+				QString timeText(hbTrId("txt_notes_dblist_val_due_on_1"));
+				QString dueDateText =
+						entry.startTime().toString(dateFormatString());
+				displayText = timeText.arg(dueDateText);
+				stringList << displayText;
+			}
+			// Set the data.
+			mSourceModel->setData(
+					newModelIndex, stringList, Qt::DisplayRole);
+			// Set the to-do done/undone icon based on the status.
+			QList<QVariant> 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<ulong> 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<<hbTrId("txt_notes_dblist_unnamed");
+			} else {
+				stringList << entry.summary();
+			}
+			if (AgendaEntry::TodoCompleted == entry.status()) {
+				// Read completed date from agenda entry
+				QString displayText;
+				QString timeText(hbTrId("txt_notes_dblist_val_completed_on_1"));
+				QString completedTimeText =
+						entry.completedDateTime().toString(dateFormatString());
+				displayText = timeText.arg(completedTimeText);
+				stringList << displayText;
+			}
+			// Set the data.
+			mSourceModel->setData(
+					newModelIndex, stringList, Qt::DisplayRole);
+
+			// Set the to-do done icon.
+			QList<QVariant> 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.