ipsservices/nmipssettings/src/nmipssettingshelper.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 03 May 2010 12:23:15 +0300
changeset 20 ecc8def7944a
parent 18 578830873419
child 23 2dc6caa42ec3
permissions -rw-r--r--
Revision: 201015 Kit: 201018

/*
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:
*
*/

#include <QVariant>
#include <HbAction>
#include <HbGlobal>
#include <HbMessageBox>
#include <HbProgressDialog>
#include <HbInputDialog>
#include <cpsettingformitemdata.h>
#include <hbdataformmodel.h>
#include <qstringlist.h>
#include <hbextendedlocale.h>
#include <HbValidator>
#include <QIntValidator>
#include <HbStringUtil>
#include <HbDataForm>

#include "nmipssettingshelper.h"
#include "nmipssettingsmanagerbase.h"
#include "nmipssettingscustomitem.h"
#include "nmipsextendedsettingsmanager.h"

// CONSTANTS

// Dynamic receiving schedule group items
const IpsServices::SettingItem NmIpsSettingsReceivingSchedule[] = {
        IpsServices::ReceptionWeekDays,
        IpsServices::ReceptionDayStartTime,
        IpsServices::ReceptionDayEndTime,
        IpsServices::ReceptionRefreshPeriodDayTime};

/*!
    \class NmIpsSettingsHelper
    \brief Helper class to save data into database when user has made changes.

*/

// ======== MEMBER FUNCTIONS ========

/*!
    Constructor of NmIpsSettingsHelper.
    \param settingsManager Reference used by settingshelper to read and store values
*/
NmIpsSettingsHelper::NmIpsSettingsHelper(NmIpsSettingsManagerBase &settingsManager,
    HbDataForm &dataForm, HbDataFormModel &dataFormModel)
: mCurrentLineEditChanged(false),
  mEmitOnline(false),
  mSettingsManager(settingsManager),
  mDataForm(dataForm),
  mDataFormModel(dataFormModel),
  mDynamicItemsVisible(false),
  mRadioButtonPreviousIndex(0)
{
}

/*!
    Destructor of NmIpsSettingsHelper.
*/
NmIpsSettingsHelper::~NmIpsSettingsHelper()
{
    mContentItems.clear();
}

/*!
    Inserts content item pointers into map, which then can be used to access the widgets data.
    \param IpsServices::SettingItem. Key that can be used to access the value from map.
    \param  CpSettingFormItemData *. Pointer to the content item.
*/
void NmIpsSettingsHelper::insertContentItem(IpsServices::SettingItem key,
    HbDataFormModelItem *value)
{
    mContentItems.insert(key, value);
}

/*!

*/
HbDataFormModelItem *NmIpsSettingsHelper::contentItem(IpsServices::SettingItem key) const
{
    return mContentItems.value(key);
}

/*!
    Sets the group item for dynamic receiving schedule items.
    \param item Group item.
*/
void NmIpsSettingsHelper::setReceivingScheduleGroupItem(HbDataFormModelItem *item)
{
    mReceivingScheduleGroupItem = item;
}

/*!
    Creates or updates the setting items under the receiving schedule group item.
*/
void NmIpsSettingsHelper::createOrUpdateReceivingScheduleGroupDynamicItem(
    IpsServices::SettingItem item)
{
    // Create the items if not already created and visible
    if (mReceivingScheduleGroupItem) {
        CpSettingFormItemData *formItemData =
            static_cast<CpSettingFormItemData *>(mContentItems.value(item));

        switch(item) {

            // 3. Receiving weekdays
            case IpsServices::ReceptionWeekDays:
            {
                // If not exist, create one
                if (!formItemData) {
                    formItemData =
                        new CpSettingFormItemData(HbDataFormModelItem::MultiselectionItem,
                            hbTrId("txt_mailips_setlabel_receiving_weekdays"));

                    insertContentItem(IpsServices::ReceptionWeekDays, formItemData);
                    mReceivingScheduleGroupItem->appendChild(formItemData);
                    QStringList weekdayItems;
                    weekdayItems << hbTrId("txt_mailips_setlabel_download_images_val_mon")
                                 << hbTrId("txt_mailips_setlabel_download_images_val_tue")
                                 << hbTrId("txt_mailips_setlabel_download_images_val_wed")
                                 << hbTrId("txt_mailips_setlabel_download_images_val_thu")
                                 << hbTrId("txt_mailips_setlabel_download_images_val_fri")
                                 << hbTrId("txt_mailips_setlabel_download_images_val_sat")
                                 << hbTrId("txt_mailips_setlabel_download_images_val_sun")
                                 << hbTrId("txt_mailips_setlabel_download_images_val_every_day");

                    QList<QVariant> weekdayItemValues;
                    weekdayItemValues << 0x01
                                      << 0x02
                                      << 0x04
                                      << 0x08
                                      << 0x10
                                      << 0x20
                                      << 0x40
                                      << 0x7F;

                    formItemData->setData(HbDataFormModelItem::HbDataFormModelItem::DescriptionRole + 1,
                        weekdayItemValues);
                    formItemData->setContentWidgetData(QString("items"), weekdayItems);
                    formItemData->setEnabled(false);
//                    mDataForm.addConnection(formItemData, SIGNAL(finished(HbAction *)),
//                        this, SLOT(receivingWeekdaysModified(HbAction *)));
                }

                // Update data
                QVariant value;
                mSettingsManager.readSetting(item, value);
                QList<QVariant> selectedDays;
                selectedDays.clear();
                int days(value.toInt());
                if (days == 0x7f) {
                   // Every weekday selected
                   selectedDays.append(7);
                } else {
                   // 0-6 Individual weekdays selected
                   for (int i=0; i<=6; ++i) {
                       if (days & (1 << i)) {
                           selectedDays.append(i);
                       }
                   }
                }
                formItemData->setContentWidgetData(QString("selectedItems"), selectedDays);
                break;
            }

            // 4. Day start time
            case IpsServices::ReceptionDayStartTime:
            {
                // If not exist, create one
                if (!formItemData) {
                    QString format(timeFormat());
                    formItemData = new CpSettingFormItemData(
                        static_cast< HbDataFormModelItem::DataItemType >(NmIpsSettingsCustomItem::TimeEditor),
                            hbTrId("txt_mailips_setlabel_day_start_time"));

                    insertContentItem(IpsServices::ReceptionDayStartTime, formItemData);
                    formItemData->setEnabled(true);
                    formItemData->setContentWidgetData(QString("displayFormat"), format);
                    mReceivingScheduleGroupItem->appendChild(formItemData);
                    mDataForm.addConnection(formItemData, SIGNAL(editingFinished()),
                        this, SLOT(startTimeModified()));

                }

                // Update data
                QVariant startTime;
                mSettingsManager.readSetting(item, startTime);
                QDateTime startDateTime(QDate(2010, 1, 1), QTime(startTime.toInt(),0));
                formItemData->setContentWidgetData("dateTime", startDateTime);
                break;
            }

            // 5. Day end time
            case IpsServices::ReceptionDayEndTime:
            {
                // If not exist, create one
                if (!formItemData) {
                    QString format(timeFormat());
                    formItemData = new CpSettingFormItemData(
                        static_cast<HbDataFormModelItem::DataItemType> (NmIpsSettingsCustomItem::TimeEditor),
                            hbTrId("txt_mailips_setlabel_day_end_time"));

                    insertContentItem(IpsServices::ReceptionDayEndTime, formItemData);
                    formItemData->setEnabled(true);
                    formItemData->setContentWidgetData(QString("displayFormat"), format);
                    mReceivingScheduleGroupItem->appendChild(formItemData);
                }

                // Update data
                QVariant endTime;
                mSettingsManager.readSetting(item, endTime);
                QDateTime endDateTime(QDate(2010, 1, 1), QTime(endTime.toInt(),0));
                formItemData->setContentWidgetData("dateTime", endDateTime);
                mDataForm.addConnection(formItemData, SIGNAL(editingFinished()),
                    this, SLOT(endTimeModified()));
                break;
            }

            // 6. Refresh mail interval
            case IpsServices::ReceptionRefreshPeriodDayTime:
            {
                // If not exist, create one
                if (!formItemData) {
                    formItemData = new CpSettingFormItemData(
                        HbDataFormModelItem::RadioButtonListItem,
                            hbTrId("txt_mailips_setlabel_refresh_mail"));

                    mReceivingScheduleGroupItem->appendChild(formItemData);
                    insertContentItem(IpsServices::ReceptionRefreshPeriodDayTime, formItemData);
                    QStringList refreshMailItems;
                    refreshMailItems << hbTrId("txt_mailips_setlabel_val_keep_uptodate")
                                     << hbTrId("txt_mailips_setlabel_val_every_15_minutes")
                                     << hbTrId("txt_mailips_setlabel_val_every_1_hour")
                                     << hbTrId("txt_mailips_setlabel_val_every_4_hours");
                    formItemData->setContentWidgetData(QString("items"), refreshMailItems);

                    QList<QVariant> refreshMailItemValues;
                    refreshMailItemValues << 5
                                          << 15
                                          << 60
                                          << 240;
                    QVariant value(refreshMailItemValues);
                    formItemData->setData(HbDataFormModelItem::DescriptionRole + 1, value);

                    mDataForm.addConnection(formItemData, SIGNAL(itemSelected(int)),
                        this, SLOT(refreshPeriodModified(int)));
                }

                // Update data
                QVariant interval;
                mSettingsManager.readSetting(item, interval);
                QHash<int,int> refreshPeriod;
                refreshPeriod[5] = 0;
                refreshPeriod[15] = 1;
                refreshPeriod[60] = 2;
                refreshPeriod[240] = 3;
                formItemData->setContentWidgetData(QString("selected"),
                    refreshPeriod.value(interval.toInt()));
                break;
            }
            default:
            {
                // Unknown/unhandled SettingItem.
                break;
            }
        }
    }
}

/*!
    Saves the My Name value into database if user has changed the value.
*/
void NmIpsSettingsHelper::saveMyName()
{
    if (mCurrentLineEditChanged) {
        HbDataFormModelItem *item = mContentItems.value(IpsServices::EmailAlias);
        QVariant data = item->contentWidgetData(QString("text"));
        mSettingsManager.writeSetting(IpsServices::EmailAlias, data);
    }
    mCurrentLineEditChanged = false;
}

/*!
    Sets the edit changed flag to indicate that user has edited the field

    \param text Reference to the text value in the line edit box.
*/
void NmIpsSettingsHelper::myNameTextChange(const QString &text)
{
    Q_UNUSED(text);
    mCurrentLineEditChanged = true;
}

/*!
    Saves the Mailbox name value into database if user has changed the value.
*/
void NmIpsSettingsHelper::saveMailboxName()
{
    if (mCurrentLineEditChanged) {
        HbDataFormModelItem *item = mContentItems.value(IpsServices::MailboxName);
        QVariant data = item->contentWidgetData(QString("text"));
        // Only save mailbox name if it's length is greater than zero. CEmailAccounts does not
        // allow zero-length mailbox names.
        if (data.toString().length() > 0) {
            mSettingsManager.writeSetting(IpsServices::MailboxName, data);
            QVariant property(NmSettings::MailboxName);
            emit mailboxPropertyChanged(mSettingsManager.mailboxId(), property, data);
        }
        else {
            if (mSettingsManager.readSetting(IpsServices::MailboxName, data)) {
                item->setContentWidgetData(QString("text"), data);
            }
        }

    }
    mCurrentLineEditChanged = false;
}

/*!
    Sets the edit changed flag to indicate that user has edited the field

    \param text Reference to the text value in the line edit box.
*/
void NmIpsSettingsHelper::mailboxNameTextChange(const QString &text)
{
    Q_UNUSED(text);
    mCurrentLineEditChanged = true;
}

/*!
    Saves the Mail address value into database if user has changed the value.
*/
void NmIpsSettingsHelper::saveMailAddress()
{
    if (mCurrentLineEditChanged) {
		emit goOffline(mSettingsManager.mailboxId());
		mEmitOnline = true;
		HbDataFormModelItem *item = mContentItems.value(IpsServices::EmailAddress);
        QVariant data = item->contentWidgetData(QString("text"));
        mSettingsManager.writeSetting(IpsServices::EmailAddress, data);
    }
    mCurrentLineEditChanged = false;
}

/*!
    Sets the edit changed flag to indicate that user has edited the field

    \param text Reference to the text value in the line edit box.
*/
void NmIpsSettingsHelper::mailAddressTextChange(const QString &text)
{
    Q_UNUSED(text);
    mCurrentLineEditChanged = true;
}

/*!
    Saves the Username value into database if user has changed the value.
*/
void NmIpsSettingsHelper::saveUserName()
{
    if (mCurrentLineEditChanged) {
		emit goOffline(mSettingsManager.mailboxId());
		mEmitOnline = true;
		HbDataFormModelItem *item = mContentItems.value(IpsServices::IncomingLoginName);
        QVariant data = item->contentWidgetData(QString("text"));
        mSettingsManager.writeSetting(IpsServices::IncomingLoginName, data);
    }
    mCurrentLineEditChanged = false;
}

/*!
    Sets the edit changed flag to indicate that user has edited the field

    \param text Reference to the text value in the line edit box.
*/
void NmIpsSettingsHelper::userNameTextChange(const QString &text)
{
    Q_UNUSED(text);
    mCurrentLineEditChanged = true;
}

/*!
    Saves the Password value into database
*/
void NmIpsSettingsHelper::savePassword()
{
	emit goOffline(mSettingsManager.mailboxId());
	mEmitOnline = true;
	HbDataFormModelItem *item = mContentItems.value(IpsServices::IncomingPassword);
    QVariant data = item->contentWidgetData(QString("text"));
    mSettingsManager.writeSetting(IpsServices::IncomingPassword, data);
}

/*!
    Saves the Reply to value into database if user has changed the value.
*/
void NmIpsSettingsHelper::saveReplyTo()
{
    if (mCurrentLineEditChanged) {
        HbDataFormModelItem *item = mContentItems.value(IpsServices::ReplyAddress);
        QVariant data = item->contentWidgetData(QString("text"));
        mSettingsManager.writeSetting(IpsServices::ReplyAddress, data);
    }
    mCurrentLineEditChanged = false;
}

/*!
    Sets the edit changed flag to indicate that user has edited the field

    \param text Reference to the text value in the line edit box.
*/
void NmIpsSettingsHelper::replyToTextChange(const QString &text)
{
    Q_UNUSED(text);
    mCurrentLineEditChanged = true;
}

/*!
    Deletes mailbox and displays the proper notes.
*/
void NmIpsSettingsHelper::deleteButtonPress()
{
    HbMessageBox confirmationDialog(HbMessageBox::MessageTypeQuestion);
    confirmationDialog.setText(hbTrId("txt_mail_dialog_do_you_want_to_delete_the_mailbox"));
    confirmationDialog.setModal(true);
    confirmationDialog.setTimeout(HbMessageBox::NoTimeout);

    HbAction *action = confirmationDialog.exec();

    if (action != confirmationDialog.primaryAction()) {
        // The user did not confirm the deletion.
        return;
    }

	emit goOffline(mSettingsManager.mailboxId());
	mEmitOnline = false;

    QVariant mailboxName;
    mSettingsManager.readSetting(IpsServices::MailboxName, mailboxName);

    // Display the progress note. Before display the note, remove the cancel
    // button.
    HbProgressDialog progressNote(HbProgressDialog::WaitDialog);
    progressNote.setText(hbTrId("txt_common_info_deleting"));
    action = progressNote.primaryAction();
    progressNote.removeAction(action);
    progressNote.delayedShow();

    if (!mSettingsManager.deleteMailbox()) {
        // The mailbox was deleted successfully. Hide the progress note and
        // display the "mailbox deleted" dialog.
        progressNote.close();

        HbMessageBox infoDialog(HbMessageBox::MessageTypeInformation);
        infoDialog.setText(
            hbTrId("txt_mail_dpophead _1_deleted").arg(mailboxName.toString()));
        infoDialog.setModal(true);
        HbAction *action = infoDialog.exec();

        // Emit the signal to update the UI.
        emit mailboxListChanged(mSettingsManager.mailboxId(),
                                NmSettings::MailboxDeleted);
    } else {
        // Failed to delete the mailbox!
        progressNote.close();
    }
}

/*!
    Saves the selected receiving schedule setting.
    \index Selected receiving schedule.
*/
void NmIpsSettingsHelper::receivingScheduleChange(int index)
{
    mSettingsManager.writeSetting(IpsServices::ReceptionActiveProfile, QVariant(index));

    // Read receiving schedule dynamic group item values and
    // make a decision based on those if item should be visible or not.
    const int dynamicGroupItemsCount(
        sizeof(NmIpsSettingsReceivingSchedule) / sizeof(NmIpsSettingsReceivingSchedule[0]));

    for (int itemIndex(0); itemIndex < dynamicGroupItemsCount; ++itemIndex) {
        QVariant setting;
        // Read setting value from active profile
        IpsServices::SettingItem item(NmIpsSettingsReceivingSchedule[itemIndex]);
        mSettingsManager.readSetting(item, setting);

        // If setting value is not valid (-1=N/A) then remove setting item.
        int value = setting.toInt();
        if (value != -1) {
            createOrUpdateReceivingScheduleGroupDynamicItem(item);
        } else {
            deleteReceivingScheduleGroupDynamicItem(item);
        }
    }

    updateShowMailInMailbox();
}

/*!
    Returns state if online should be emited.
    \return true / false.
*/
bool NmIpsSettingsHelper::isOffline()
{
    return mEmitOnline;
}

/*!
    Updates the show mail in mailbox setting value based on the active profile.
*/
void NmIpsSettingsHelper::updateShowMailInMailbox()
{
    QVariant value;
    mSettingsManager.readSetting(IpsServices::ReceptionInboxSyncWindow, value);
    QHash<int,int> syncWindows;
    syncWindows[50] = 0;
    syncWindows[100] = 1;
    syncWindows[500] = 2;
    syncWindows[0] = 3;

    HbDataFormModelItem *item = mContentItems.value(IpsServices::ReceptionInboxSyncWindow);
    if (item) {
        item->setContentWidgetData(QString("selected"), syncWindows.value(value.toInt()));
    }
}

/*!
    Deletes the dynamic setting items under the receiving schedule group item.
*/
void NmIpsSettingsHelper::deleteReceivingScheduleGroupDynamicItem(IpsServices::SettingItem item)
{
    HbDataFormModelItem *formItem = mContentItems.value(item);
    if (formItem) {
        mDataForm.removeAllConnection(formItem);
        int index(mReceivingScheduleGroupItem->indexOf(formItem));
        if (index >= 0) {
            mReceivingScheduleGroupItem->removeChild(index);
        }
        mContentItems.remove(item);
    }
}

/*!
    Returns locale specific formatting string for hours and minutes.
    \return Time format string.
*/
QString NmIpsSettingsHelper::timeFormat()
{
    // Set the correct time format string based on locale.
    HbExtendedLocale locale = HbExtendedLocale::system();
    QString timeFormat("h:mm ap");
    if (HbExtendedLocale::Time24 == locale.timeStyle()) {
        timeFormat = QString("h:mm");
    }
    // Set the separator between hours and minutes.
    timeFormat.replace(QString(":"), locale.timeSeparator(1));

    return timeFormat;
}
/*!
    Saves the incoming mailserver value into database if user has changed the value.
*/
void NmIpsSettingsHelper::saveIncomingMailServer()
{
    if (mCurrentLineEditChanged) {
        emit goOffline(mSettingsManager.mailboxId());
        mEmitOnline = true;
        HbDataFormModelItem *item = mContentItems.value(IpsServices::IncomingMailServer);
        QVariant data = item->contentWidgetData(QString("text"));
        mSettingsManager.writeSetting(IpsServices::IncomingMailServer, data);
    }
    mCurrentLineEditChanged = false;
}

/*!
    Sets the edit changed flag to indicate that user has edited the field

    \param text Reference to the text value in the line edit box.
*/
void NmIpsSettingsHelper::incomingMailServerTextChange(const QString &text)
{
    Q_UNUSED(text);
    mCurrentLineEditChanged = true;
}
/*!
    Saves the outgoing mailserver value into database if user has changed the value.
*/
void NmIpsSettingsHelper::saveOutgoingMailServer()
{
    if (mCurrentLineEditChanged) {
        emit goOffline(mSettingsManager.mailboxId());
        mEmitOnline = true;
        HbDataFormModelItem *item = mContentItems.value(IpsServices::OutgoingMailServer);
        QVariant data = item->contentWidgetData(QString("text"));
        mSettingsManager.writeSetting(IpsServices::OutgoingMailServer, data);
    }
    mCurrentLineEditChanged = false;
}

/*!
    Sets the edit changed flag to indicate that user has edited the field

    \param text Reference to the text value in the line edit box.
*/
void NmIpsSettingsHelper::outgoingMailServerTextChange(const QString &text)
{
    Q_UNUSED(text);
    mCurrentLineEditChanged = true;
}

/*!
    Saves the incoming port value into database if user has changed the value. If the user wish to
    define the port, a input dialog is shown.
    
    \param index Used to determine if the default value or a user defined value should be written
*/
void NmIpsSettingsHelper::incomingPortChange(int index)
{
    if (mRadioButtonPreviousIndex != index && index == IpsServices::NmIpsSettingsDefault) {
        emit goOffline(mSettingsManager.mailboxId());
        mEmitOnline = true;
        int port = mSettingsManager.determineDefaultIncomingPort();
        mSettingsManager.writeSetting(IpsServices::IncomingPort, port);
    } else if (index == IpsServices::NmIpsSettingsUserDefined) {
        QVariant port; 
        mSettingsManager.readSetting(IpsServices::IncomingPort, port);
        bool changed = false;
        int changedPort = showIncomingPortInputDialog(port.toInt(), changed);       
        if (changed) {
            emit goOffline(mSettingsManager.mailboxId());
            mEmitOnline = true;
            mSettingsManager.writeSetting(IpsServices::IncomingPort, changedPort);
        } else {
            //set selected value back if user canceled.
            HbDataFormModelItem *item = mContentItems.value(IpsServices::IncomingPort);
            item->setContentWidgetData(QString("selected"), mRadioButtonPreviousIndex);
        }
    }
}

/*!
    Used for getting the index to display in the port radio button list 
    
    \return index Used to set the selected value
*/
int NmIpsSettingsHelper::getCorrectPortRadioButtonIndex(int currentPort)
{
    int index = 0;
    int port = mSettingsManager.determineDefaultIncomingPort();
    if (port == currentPort) {
        index = IpsServices::NmIpsSettingsDefault;
    } else {
        index = IpsServices::NmIpsSettingsUserDefined;
    }
    return index;
}

/*!
    Show a input dialog for allowing the user to specify a incoming port 
    \param int The current port stored in the settings  
    \param bool Reference used for marking if the value really changed
    \return int The user defined port
*/
int NmIpsSettingsHelper::showIncomingPortInputDialog(int currentPort, bool &changed)
{    
    QVariant newPort;

    HbInputDialog inputDialog;
    inputDialog.setInputMode(HbInputDialog::IntInput);
    HbValidator *validator = new HbValidator();
    validator->addField(new QIntValidator(0, 65535, 0), 
                        HbStringUtil::convertDigits(QString::number(currentPort)));
    inputDialog.setValidator(validator);
    inputDialog.setPromptText(hbTrId("txt_mailips_setlabel_incoming_port_user_defined"));
    
    HbAction *action = inputDialog.exec();     
    if (action == inputDialog.primaryAction()) {
        newPort = inputDialog.value();
        changed = true;
    }  
    delete validator;   
    
    return newPort.toInt();
}

/*!
    Sets the previous index value to indicate that user has edited the field

    \param text Reference to the item in the radio button list.
*/
void NmIpsSettingsHelper::incomingPortPressed(const QModelIndex &index)
{
    Q_UNUSED(index);
    HbDataFormModelItem *item = mContentItems.value(IpsServices::IncomingPort);
    QVariant data = item->contentWidgetData(QString("selected"));
    mRadioButtonPreviousIndex = data.toInt();
}

/*!
    Saves the incoming secure connection value into database if user has changed the value.
*/
void NmIpsSettingsHelper::incomingSecureConnectionItemChange(int index)
{
    if (mRadioButtonPreviousIndex != index) {
        emit goOffline(mSettingsManager.mailboxId());
        mEmitOnline = true;
        switch (index) {
            case IpsServices::EMailStartTls: // On (Start TLS)
                mSettingsManager.writeSetting(IpsServices::IncomingSecureSockets, ETrue);
                mSettingsManager.writeSetting(IpsServices::IncomingSSLWrapper, EFalse);
                break;

            case IpsServices::EMailSslTls: // On (SSL/TLS)
                mSettingsManager.writeSetting(IpsServices::IncomingSecureSockets, EFalse);
                mSettingsManager.writeSetting(IpsServices::IncomingSSLWrapper, ETrue);
                break;

            case IpsServices::EMailSecurityOff: // Off
                mSettingsManager.writeSetting(IpsServices::IncomingSecureSockets, EFalse);
                mSettingsManager.writeSetting(IpsServices::IncomingSSLWrapper, EFalse);
                break;

        	 default:
                break;
        }
        // Update incoming port value only if default incoming port used
        HbDataFormModelItem *item = mContentItems.value(IpsServices::IncomingPort);
        QVariant data = item->contentWidgetData(QString("selected"));
        // Default incoming port selected
        if (data.toInt() == IpsServices::NmIpsSettingsDefault) {
			int port = mSettingsManager.determineDefaultIncomingPort();
			mSettingsManager.writeSetting(IpsServices::IncomingPort, port);
        }
    }
}

/*!
    Sets the previous index value to indicate that user has edited the field

    \param text Reference to the item in the radio button list.
*/
void NmIpsSettingsHelper::incomingSecureConnectionPressed(const QModelIndex &index)
{
	Q_UNUSED(index);
	HbDataFormModelItem *item = mContentItems.value(IpsServices::IncomingSecureSockets);
    QVariant data = item->contentWidgetData(QString("selected"));
    mRadioButtonPreviousIndex = data.toInt();
}

/*!
    Used for getting the index to display in the secure connection radio button list 
    
    \return index Used to set the selected value
*/
int NmIpsSettingsHelper::getCorrectSecureRadioButtonIndex(QVariant secureSockets, 
                                                          QVariant secureSSLWrapper)
{
    IpsServices::TIpsSetDataSecurityTypes securityType = IpsServices::EMailStartTls;
    // secureSockets == True
    if (secureSockets.toBool()) { 
        securityType = IpsServices::EMailStartTls;
    }
    // secureSockets == False & secureSSLWrapper == True
    else if (secureSSLWrapper.toBool()) {
        securityType = IpsServices::EMailSslTls;
    }
    // secureSockets == False & secureSSLWrapper == False
    else {
        securityType = IpsServices::EMailSecurityOff;
    }
    return securityType;
}

/*!
    Saves the folderpath value into database if user has changed the value.
*/
void NmIpsSettingsHelper::inboxPathChange(int index)
{
    if (mRadioButtonPreviousIndex != index && index == IpsServices::NmIpsSettingsDefault) {
        // Empty string sets the folder path to default.
        mSettingsManager.writeSetting(IpsServices::FolderPath, QString(""));
    } else if (index == IpsServices::NmIpsSettingsUserDefined) {
        bool changed = false;
        HbDataFormModelItem *item = mContentItems.value(IpsServices::FolderPath);
        QString changedPath = showFolderPathInputDialog(changed);       
        if (changed) {
            mSettingsManager.writeSetting(IpsServices::FolderPath, changedPath);
            //set selected index to default if user inputed empty string.
            if (changedPath.isEmpty()) {
                item->setContentWidgetData(QString("selected"), IpsServices::NmIpsSettingsDefault);
            }
        } else {
            //set selected value back if user canceled.
            item->setContentWidgetData(QString("selected"), mRadioButtonPreviousIndex);
        }
    }
}

/*!
    Show a input dialog for allowing the user to specify a folder path 
    \param bool Reference used for marking if the value really changed
    \return QString The user defined folder path
*/
QString NmIpsSettingsHelper::showFolderPathInputDialog(bool &changed)
{    
    QVariant folderPath;
    mSettingsManager.readSetting(IpsServices::FolderPath, folderPath);
    
    HbInputDialog inputDialog;
    inputDialog.setInputMode(HbInputDialog::TextInput);
    inputDialog.setPromptText(hbTrId("txt_mailips_setlabel_inbox_path_user_defined"));
    inputDialog.setValue(folderPath.toString());
    
    HbAction *action = inputDialog.exec();     
    if (action == inputDialog.primaryAction()) { 
        folderPath = inputDialog.value();
        changed = true;
    }

    return folderPath.toString();
}

/*!
    Sets the previous index value to indicate that user has edited the field

    \param text Reference to the item in the radio button list.
*/
void NmIpsSettingsHelper::inboxPathPressed(const QModelIndex &index)
{
    Q_UNUSED(index);
    HbDataFormModelItem *item = mContentItems.value(IpsServices::FolderPath);
    QVariant data = item->contentWidgetData(QString("selected"));
    mRadioButtonPreviousIndex = data.toInt();
}

/*!

*/
void NmIpsSettingsHelper::receivingWeekdaysModified(HbAction *action)
{
    Q_UNUSED(action)
    HbDataFormModelItem *item = mContentItems.value(IpsServices::ReceptionWeekDays);
    QVariant widgetData = item->contentWidgetData(QString("selectedItems"));
    QList< QVariant > selectedItems = widgetData.value< QList< QVariant > >();

    foreach (QVariant selection, selectedItems) {
        int value = selection.toInt();
    }
}

/*!

*/
void NmIpsSettingsHelper::startTimeModified()
{
    HbDataFormModelItem *item = mContentItems.value(IpsServices::ReceptionDayStartTime);
    QVariant data = item->contentWidgetData(QString("dateTime"));
    QDateTime dateTime = data.value< QDateTime >();
    int startHour(dateTime.time().hour());
    handleReceivingScheduleSettingChange(IpsServices::ReceptionDayStartTime, startHour);
}

/*!

*/
void NmIpsSettingsHelper::refreshPeriodModified(int index)
{
    HbDataFormModelItem* item = mContentItems.value(IpsServices::ReceptionRefreshPeriodDayTime);
    QVariant itemData = item->data(HbDataFormModelItem::HbDataFormModelItem::DescriptionRole + 1);
    int selectedValue = itemData.value< QList< QVariant > >().at(index).toInt();
    handleReceivingScheduleSettingChange(IpsServices::ReceptionRefreshPeriodDayTime, selectedValue);
}

/*!

*/
void NmIpsSettingsHelper::endTimeModified()
{
    HbDataFormModelItem *item = mContentItems.value(IpsServices::ReceptionDayEndTime);
    QVariant data = item->contentWidgetData(QString("dateTime"));
    QDateTime dateTime = data.value< QDateTime >();
    int endHour(dateTime.time().hour());
    handleReceivingScheduleSettingChange(IpsServices::ReceptionDayEndTime, endHour);
}

/*!
    Used for getting the index to display in the inbox path radio button list 
    
    \return index Used to set the selected value
*/
int NmIpsSettingsHelper::getCorrectInboxPathRadioButtonIndex(QVariant folderPath)
{
    int index(0);
    if (folderPath.toString().isEmpty()) {
        index = IpsServices::NmIpsSettingsDefault;
    } else {
        index = IpsServices::NmIpsSettingsUserDefined;
    }
    return index;
}

/*!

*/
void NmIpsSettingsHelper::handleReceivingScheduleSettingChange(
    IpsServices::SettingItem settingItem, const QVariant &settingValue)
{
    // Check what was currently active sync mode.
    QVariant setting;
    mSettingsManager.readSetting(IpsServices::ReceptionActiveProfile, setting);
    int activeProfile(setting.toInt());
    if (activeProfile != NmIpsSettingsReceivingScheduleUserDefinedProfile) {
        // Create user defined mode if needed.
        emit createUserDefinedMode();

        // Copy all settings from currently active mode to user defined mode
        copyReceivingScheduleSettingsFromActiveProfile(
            NmIpsSettingsReceivingScheduleUserDefinedProfile);

        // select 'user defined' mode
        mSettingsManager.writeSetting(IpsServices::ReceptionActiveProfile,
            NmIpsSettingsReceivingScheduleUserDefinedProfile);
    }

    // store selected setting
    mSettingsManager.writeSetting(settingItem, settingValue);

    // update selection
    HbDataFormModelItem *syncProfile = contentItem(IpsServices::ReceptionActiveProfile);
    syncProfile->setContentWidgetData(QString("currentIndex"), 3);
}

/*!

*/
void NmIpsSettingsHelper::copyReceivingScheduleSettingsFromActiveProfile(int profileMode)
{
    // Read receiving schedule dynamic group item values and
    // make a decision based on those if item should be visible or not.
    const int dynamicGroupItemsCount(
        sizeof(NmIpsSettingsReceivingSchedule) / sizeof(NmIpsSettingsReceivingSchedule[0]));

    NmIpsExtendedSettingsManager &extendedSettingsManager =
        mSettingsManager.extendedSettingsManager();

    for (int itemIndex(0); itemIndex < dynamicGroupItemsCount; ++itemIndex) {
        QVariant setting;
        // Read setting value from active profile
        IpsServices::SettingItem item(NmIpsSettingsReceivingSchedule[itemIndex]);
        mSettingsManager.readSetting(item, setting);

        // write settings to user defined profile.
        extendedSettingsManager.writeSetting(profileMode, item, setting);
    }
}
/*!
    Saves the outgoing port value into database if user has changed the value. If the user wish to
    define the port, a input dialog is shown.

    \param index Used to determine if the default value or a user defined value should be written
*/
void NmIpsSettingsHelper::outgoingPortChange(int index)
{
    if (mRadioButtonPreviousIndex != index && index == IpsServices::NmIpsSettingsDefault) {
        emit goOffline(mSettingsManager.mailboxId());
        mEmitOnline = true;
        int port = mSettingsManager.determineDefaultOutgoingPort();
        mSettingsManager.writeSetting(IpsServices::OutgoingPort, port);
    } else if (index == IpsServices::NmIpsSettingsUserDefined) {
        QVariant port;
        mSettingsManager.readSetting(IpsServices::OutgoingPort, port);
        bool changed = false;
        int changedPort = showOutgoingPortInputDialog(port.toInt(), changed);
        if (changed) {
            emit goOffline(mSettingsManager.mailboxId());
            mEmitOnline = true;
            mSettingsManager.writeSetting(IpsServices::OutgoingPort, changedPort);
        } else {
            //set selected value back if user canceled.
            HbDataFormModelItem *item = mContentItems.value(IpsServices::OutgoingPort);
            item->setContentWidgetData(QString("selected"), mRadioButtonPreviousIndex);
        }
    }
}

/*!
    Sets the previous index value to indicate that user has edited the field

    \param index Reference to the item in the radio button list.
*/
void NmIpsSettingsHelper::outgoingPortPressed(const QModelIndex &index)
{
    Q_UNUSED(index);
    HbDataFormModelItem *item = mContentItems.value(IpsServices::OutgoingPort);
    QVariant data = item->contentWidgetData(QString("selected"));
    mRadioButtonPreviousIndex = data.toInt();
}

/*!
    Show a input dialog for allowing the user to specify a outgoing port
    \param int The current port stored in the settings
    \param bool Reference used for marking if the value really changed
    \return int The user defined port
*/
int NmIpsSettingsHelper::showOutgoingPortInputDialog(int currentPort, bool &changed)
{
    QVariant newPort;

    HbInputDialog inputDialog;
    inputDialog.setInputMode(HbInputDialog::IntInput);
    HbValidator *validator = new HbValidator();
    validator->addField(new QIntValidator(0, 65535, 0), 
                        HbStringUtil::convertDigits(QString::number(currentPort)));
    inputDialog.setValidator(validator);
    inputDialog.setPromptText(hbTrId("txt_mailips_setlabel_incoming_port_user_defined"));

    HbAction *action = inputDialog.exec();
    if (action == inputDialog.primaryAction()) {
        newPort = inputDialog.value();
        changed = true;
    }
    delete validator;

    return newPort.toInt();
}

/*!
    Used for getting the index to display in the outgoing port radio button list

    \return index Used to set the selected value
*/
int NmIpsSettingsHelper::getCorrectOutgoingPortRadioButtonIndex(int currentPort)
{
    int index = 0;
    int port = mSettingsManager.determineDefaultOutgoingPort();
    if (port == currentPort) {
        index = IpsServices::NmIpsSettingsDefault;
    } else {
        index = IpsServices::NmIpsSettingsUserDefined;
    }
    return index;
}

/*!
    Saves the outgoing secure connection value into database if user has changed the value.
*/
void NmIpsSettingsHelper::outgoingSecureConnectionItemChange(int index)
{
    if (mRadioButtonPreviousIndex != index) {
        emit goOffline(mSettingsManager.mailboxId());
        mEmitOnline = true;
        switch (index) {
            case IpsServices::EMailStartTls: // On (Start TLS)
                mSettingsManager.writeSetting(IpsServices::OutgoingSecureSockets, ETrue);
                mSettingsManager.writeSetting(IpsServices::OutgoingSSLWrapper, EFalse);
                break;

            case IpsServices::EMailSslTls: // On (SSL/TLS)
                mSettingsManager.writeSetting(IpsServices::OutgoingSecureSockets, EFalse);
                mSettingsManager.writeSetting(IpsServices::OutgoingSSLWrapper, ETrue);
                break;

            case IpsServices::EMailSecurityOff: // Off
                mSettingsManager.writeSetting(IpsServices::OutgoingSecureSockets, EFalse);
                mSettingsManager.writeSetting(IpsServices::OutgoingSSLWrapper, EFalse);
                break;

        	 default:
                break;
        }
        // Update outgoing port value only if default outgoing port used
        HbDataFormModelItem *item = mContentItems.value(IpsServices::OutgoingPort);
        QVariant data = item->contentWidgetData(QString("selected"));
        // Default outgoing port selected
        if (data.toInt() == IpsServices::NmIpsSettingsDefault) {
			int port = mSettingsManager.determineDefaultOutgoingPort();
			mSettingsManager.writeSetting(IpsServices::OutgoingPort, port);
        }
    }
}

/*!
    Sets the previous index value to indicate that user has edited the field

    \param text Reference to the item in the radio button list.
*/
void NmIpsSettingsHelper::outgoingSecureConnectionPressed(const QModelIndex &index)
{
	Q_UNUSED(index);
	HbDataFormModelItem *item = mContentItems.value(IpsServices::OutgoingSecureSockets);
    QVariant data = item->contentWidgetData(QString("selected"));
    mRadioButtonPreviousIndex = data.toInt();
}