clock/clockui/clocksettingsview/src/clockregionalsettingsview.cpp
changeset 18 c198609911f9
child 23 fd30d51f876b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clock/clockui/clocksettingsview/src/clockregionalsettingsview.cpp	Fri Apr 16 14:57:40 2010 +0300
@@ -0,0 +1,486 @@
+/*
+* 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 ClockRegionalSettingsView.
+*
+*/
+
+// System includes
+#include <HbView>
+#include <HbAction>
+#include <HbDataForm>
+#include <HbDataFormModel>
+#include <HbDataFormModelItem>
+#include <HbDataFormViewItem>
+#include <HbMainWindow>
+#include <HbInstance>
+#include <HbPushButton>
+#include <HbExtendedLocale>
+#include <HbListWidget>
+#include <HbComboBox>
+#include <HBListWidgetItem>
+#include <HbApplication>
+#include <QTranslator>
+
+// User includes
+#include "clockregionalsettingsview.h"
+#include "clocksettingsdocloader.h"
+#include "clocksettingsdefines.h"
+#include "settingsdatatypes.h"
+#include "settingscustomitem.h"
+
+/*!
+	\class ClockRegionalSettingsView
+
+	The view for regional setting items in clock applications settings.
+ */
+
+/*!
+	Default constructor.
+ */
+ClockRegionalSettingsView::ClockRegionalSettingsView(
+		SettingsUtility &utility, QObject *parent)
+:QObject(parent),
+ mView(0),
+ mBackAction(0),
+ mLoader(0),
+ mSettingsUtility(utility)
+{
+	// Construct the document loader.
+	mLoader = new ClockSettingsDocLoader;
+	
+	// Load the translation file and install the editor specific translator
+    mTranslator = new QTranslator;
+    //QString lang = QLocale::system().name();
+    //QString path = "Z:/resource/qt/translations/";
+    mTranslator->load("clocksettingsview",":/translations");
+    // TODO: Load the appropriate .qm file based on locale
+    //bool loaded = mTranslator->load("caleneditor_" + lang, path);
+    HbApplication::instance()->installTranslator(mTranslator);
+	// Create the custom prototype.
+	mCustomPrototype = new SettingsCustomItem();
+}
+
+/*!
+	Destructor.
+ */
+ClockRegionalSettingsView::~ClockRegionalSettingsView()
+{
+	if (mLoader) {
+		delete mLoader;
+		mLoader = 0;
+	}
+// Remove the translator
+    HbApplication::instance()->removeTranslator(mTranslator);
+    if (mTranslator) {
+        delete mTranslator;
+        mTranslator = 0;
+    }
+}
+
+/*!
+	Shows the regional settings view.
+ */
+void ClockRegionalSettingsView::showView()
+{
+	bool success;
+
+	// Load the application xml.
+	mLoader->load(CLOCK_REG_SETTINGS_VIEW_DOCML, &success);
+	if (!success) {
+		qFatal("Unable to load the docml.");
+	}
+
+	// Find the main view.
+	mView = static_cast<HbView *> (
+			mLoader->findWidget(CLOCK_REG_SETTINGS_VIEW));
+	if (!mView) {
+		qFatal("Unable to find view");
+	}
+
+	// Find the data form.
+	mForm = static_cast<HbDataForm *> (
+			mLoader->findWidget(CLOCK_REG_SETTINGS_DATA_FORM));
+	if (!mForm) {
+		qFatal("Unable to find the form");
+	}
+	connect(
+			mForm, SIGNAL(itemShown(QModelIndex)),
+			this, SLOT(handleItemDisplayed(QModelIndex)));
+	
+
+	QList <HbAbstractViewItem*> prototypes = mForm->itemPrototypes();
+	prototypes.append(mCustomPrototype);
+	mForm->setItemPrototypes(prototypes);
+	mCustomPrototype->setWeekdaysList(weekdayList());
+
+	// Create the form model.
+	createModel();
+
+	// Set the view as the current view.
+	HbMainWindow *window = hbInstance->allMainWindows().first();
+	window->addView(mView);
+	window->setCurrentView(mView);
+
+	// Add the back softkey.
+	mBackAction = new HbAction(Hb::BackAction);
+	mView->setNavigationAction(mBackAction);
+	connect(
+			mBackAction, SIGNAL(triggered()),
+			this, SLOT(handleBackAction()));
+}
+
+/*!
+	The view is removed from main window and a deleteLater is called on `this'.
+ */
+void ClockRegionalSettingsView::handleBackAction()
+{
+	HbExtendedLocale locale = HbExtendedLocale::system();
+	HbExtendedLocale::WeekDay startOfWeekIndex =
+				HbExtendedLocale::system().startOfWeek();
+	// TODO: Save workdays settings.
+	QItemSelectionModel *model = 0;
+	model = mWorkdaysItem->selectionModel();
+	QModelIndexList selectedModelIndex = model->selectedIndexes();
+	int count = selectedModelIndex.count();
+	QModelIndex index;
+	for(int i = 0 ; i < count ; i++){
+		index = selectedModelIndex[i];
+	}
+	
+	QString workdayString("0000000");
+	for (int i = 0; i < workdayString.count(); ++i) {
+		if (model->isSelected(model->model()->index(i, 0))) {
+			workdayString.replace(i, 1, '1');
+		}
+	}
+	
+	QString workdaysSetting = workdayString;
+	int max = workdayString.size() - 1;
+	for (int index = max - startOfWeekIndex, i = 0; i <= max; i++) {
+		QChar ch = workdayString.at(index);
+		workdaysSetting.replace(i, 1, ch);
+		if (index == 0) {
+			index = max;
+		} else {
+			index--;
+		}
+	}
+	locale.setWorkDays(workdaysSetting);
+	
+	HbMainWindow *window = hbInstance->allMainWindows().first();
+	// Cleanup.
+	window->removeView(mView);
+	deleteLater();
+}
+
+/*!
+	Called when each of the form items are displayed. Using this slot, we
+	connect to SIGNALS of the items that have been added to the form.
+
+	\param index QModelIndex of the row that was just displayed.
+ */
+void ClockRegionalSettingsView::handleItemDisplayed(const QModelIndex &index)
+{
+	if (!index.isValid()) {
+		return;
+	}
+
+	HbDataFormViewItem *item =
+			static_cast<HbDataFormViewItem*>(mForm->itemByIndex(index));
+	HbWidget *widget = item->dataItemContentWidget();
+
+	switch (index.row()) {
+		case 0:
+
+			break;
+		case 1:
+
+			break;
+
+		case 2:
+
+			break;
+
+		case 3:
+
+			break;
+
+		case 4:
+			mWorkdaysItem = static_cast<HbListWidget *> (widget);
+		case 5:
+			mStartOfWeekItem = static_cast<HbComboBox *> (widget);
+			break;
+		default:
+			break;
+	}
+}
+
+/*!
+	Called when the time format toggle item is clicked. Here we update the
+	value in the locale.
+ */
+void ClockRegionalSettingsView::handleTimeFormatChange()
+{
+//	mSettingsUtility.setTimeFormat(mTimeFormatItem->text());
+	mSettingsUtility.setTimeFormat(
+			mTimeFormatItem->contentWidgetData("text").toString());
+}
+
+/*!
+	Called when the time separator toggle item is clicked. Here we update the
+	value in the locale.
+ */
+void ClockRegionalSettingsView::handleTimeSeparatorChange()
+{
+//	mSettingsUtility.setTimeSeparator(mTimeSeparatorItem->text());
+	mSettingsUtility.setTimeSeparator(
+			mTimeSeparatorItem->contentWidgetData("text").toString());
+}
+
+/*!
+ */
+void ClockRegionalSettingsView::handleDateFormatChange(QString text)
+{
+	mSettingsUtility.setDateFormat(text);
+}
+
+/*!
+    Called when the date separator item is changed. Here we update the
+    value in the locale.
+ */
+void ClockRegionalSettingsView::handleDateSeparatorChange(QString text)
+{
+	mSettingsUtility.setDateSeparator(text);
+}
+
+/*!
+	This slot is called any item in the data form is changed.
+ */
+void ClockRegionalSettingsView::handleDataChanged(
+		const QModelIndex& topLeft, const QModelIndex& bottomRight)
+{
+	qDebug("clock: ClockRegionalSettingsView::handleDataChanged() -->");
+
+	Q_UNUSED(bottomRight)
+
+
+	switch (topLeft.row()) {
+/*		case 4:
+		{
+		// Weekdays item.
+		HbDataFormModelItem *workdayItem = mFormModel->itemFromIndex(topLeft);
+		QList<QVariant> items = workdayItem
+				->contentWidgetData("selectedItems").toList();
+		int temp = items.count();
+		for (int var = 0; var < temp; ++var) {
+	        int temp1 = items.at(var).toInt();
+        }
+		}
+		break;*/
+		case 5:
+		{
+		// The Start of week item.
+		if (mStartOfWeekItem != 0) {
+			int index = mStartOfWeekItem->currentIndex();
+			mSettingsUtility.setStartOfWeek(index);
+			
+			QStringList weekdays = weekdayList();
+			QString workdays = mCustomPrototype->workdaysSetting();
+			QItemSelectionModel *model = 0;
+			model = mWorkdaysItem->selectionModel();
+			
+			for (int i = 0, index = workdays.size() - 1;
+					i < mWorkdaysItem->count(); ++i, index--) {
+				QString str = weekdays[i];
+				mWorkdaysItem->item(i)->setText(str);
+				
+				QChar ch = workdays.at(index);
+				if ( ch == QChar('0')) {
+					// Not a workday.
+					model->select(
+							model->model()->index(i,0),
+							QItemSelectionModel::Deselect);
+				} else {
+					// Workday.
+					model->select(
+							model->model()->index(i,0),
+							QItemSelectionModel::Select);
+				}
+			}
+		}
+		}
+		break;
+
+		default:
+		break;
+	}
+}
+
+/*!
+	Here we create the form model.
+ */
+void ClockRegionalSettingsView::createModel()
+{
+	if (mForm->model()) {
+		delete mForm->model();
+		mForm->setModel(0);
+	}
+
+	mFormModel = new HbDataFormModel(this);
+	
+	// Populate the form model.
+	populateFormModel();
+	
+	mForm->setModel(mFormModel);
+
+	connect(
+			mFormModel,
+			SIGNAL(dataChanged(const QModelIndex, const QModelIndex)),
+			this,
+			SLOT(handleDataChanged(const QModelIndex, const QModelIndex)));
+}
+
+/*!
+	Function in which we populate the form model.
+ */
+void ClockRegionalSettingsView::populateFormModel()
+{
+	if (!mFormModel) {
+		createModel();
+	}
+
+	// Get the locale.
+	 HbExtendedLocale locale = HbExtendedLocale::system();
+
+	// Time format item.
+	 mTimeFormatItem = mFormModel->appendDataFormItem(
+			HbDataFormModelItem::ToggleValueItem,
+			hbTrId("txt_clock_setlabel_time_format"));
+	int index = mSettingsUtility.timeFormat(mTimeFormatStringList);
+	if (0 == index) {
+		mTimeFormatItem->setContentWidgetData("text", mTimeFormatStringList[0]);
+		mTimeFormatItem->setContentWidgetData("additionalText", mTimeFormatStringList[1]);
+	} else {
+		mTimeFormatItem->setContentWidgetData("text", mTimeFormatStringList[1]);
+		mTimeFormatItem->setContentWidgetData("additionalText", mTimeFormatStringList[0]);
+	}
+	mForm->addConnection(
+			mTimeFormatItem, SIGNAL(clicked()),
+			this, SLOT(handleTimeFormatChange()));
+
+	// Time separator item.
+	mTimeSeparatorItem = mFormModel->appendDataFormItem(
+			HbDataFormModelItem::ToggleValueItem,
+			hbTrId("txt_clock_setlabel_time_separator"));
+	index = mSettingsUtility.timeSeparator(mTimeSeparatorStringList);
+	if (0 == index) {
+		mTimeSeparatorItem->setContentWidgetData("text", mTimeSeparatorStringList[0]);
+		mTimeSeparatorItem->setContentWidgetData(
+				"additionalText", mTimeSeparatorStringList[1]);
+	} else {
+		mTimeSeparatorItem->setContentWidgetData("text", mTimeSeparatorStringList[1]);
+		mTimeSeparatorItem->setContentWidgetData(
+				"additionalText", mTimeSeparatorStringList[0]);
+	}
+	mForm->addConnection(
+			mTimeSeparatorItem, SIGNAL(clicked()),
+			this, SLOT(handleTimeSeparatorChange()));
+
+	// Date format.
+	mDateFormatItem = mFormModel->appendDataFormItem(
+			HbDataFormModelItem::ComboBoxItem,
+			hbTrId("txt_clock_setlabel_date_format"));
+	index = mSettingsUtility.dateFormat(mDateFormatStringList);
+
+	mDateFormatItem->setContentWidgetData("items", mDateFormatStringList);
+	mDateFormatItem->setContentWidgetData("currentIndex",index);
+	mForm->addConnection(
+			mDateFormatItem, SIGNAL(currentIndexChanged(QString)),
+	 		this, SLOT(handleDateFormatChange(QString)));
+
+	// Date separator.
+	mDateSeparatorItem = mFormModel->appendDataFormItem(
+			HbDataFormModelItem::ComboBoxItem,
+			hbTrId("txt_clock_setlabel_date_separator"));
+	index = mSettingsUtility.dateSeparator(mDateSeparatorStringList);
+
+	mDateSeparatorItem->setContentWidgetData("items", mDateSeparatorStringList);
+	mDateSeparatorItem->setContentWidgetData("currentIndex",index);
+	mForm->addConnection(
+			mDateSeparatorItem, SIGNAL(currentIndexChanged(QString)),
+			this, SLOT(handleDateSeparatorChange(QString)));
+
+	// Workdays.
+	HbDataFormModelItem *item = 0;
+	// Create the weekday list based on start of week.
+	QStringList weekdaysList;
+	weekdaysList
+			<< hbTrId("txt_clk_setlabel_val_monday")
+			<< hbTrId("txt_clk_setlabel_val_tuesday")
+			<< hbTrId("txt_clk_setlabel_val_wednesday")
+			<< hbTrId("txt_clk_setlabel_val_thursday")
+			<< hbTrId("txt_clk_setlabel_val_friday")
+			<< hbTrId("txt_clk_setlabel_val_saturday")
+			<< hbTrId("txt_clk_setlabel_val_sunday");
+	
+	HbDataFormModelItem::DataItemType workdaysItemType =
+			static_cast<HbDataFormModelItem::DataItemType>
+			(HbDataFormModelItem::CustomItemBase + 50);
+	item = new HbDataFormModelItem(workdaysItemType,
+			hbTrId("txt_clock_setlabel_workdays"));
+	mFormModel->appendDataFormItem(item);
+
+	// Start of week item.
+	item = 0;
+	item = mFormModel->appendDataFormItem(HbDataFormModelItem::ComboBoxItem,
+		hbTrId("txt_clock_setlabel_week_starts_on"));
+	HbExtendedLocale::WeekDay startOfWeek = locale.startOfWeek();
+	item->setContentWidgetData("items", weekdaysList);
+	item->setContentWidgetData("currentIndex", startOfWeek);
+}
+
+/*!
+	Returns the weekday list ordered based on start of week.
+ */
+
+QStringList ClockRegionalSettingsView::weekdayList()
+{
+	QStringList weekDays;
+	QStringList daysList;
+	daysList
+			<< hbTrId("txt_clk_setlabel_val_monday")
+			<< hbTrId("txt_clk_setlabel_val_tuesday")
+			<< hbTrId("txt_clk_setlabel_val_wednesday")
+			<< hbTrId("txt_clk_setlabel_val_thursday")
+			<< hbTrId("txt_clk_setlabel_val_friday")
+			<< hbTrId("txt_clk_setlabel_val_saturday")
+			<< hbTrId("txt_clk_setlabel_val_sunday");
+	
+	HbExtendedLocale::WeekDay startOfWeekIndex =
+			HbExtendedLocale::system().startOfWeek();
+	
+	for (int i = 0, index = startOfWeekIndex; i < daysList.count(); ++i) {
+		weekDays.append(daysList.at(index));
+		if (6 == index) {
+			index = 0;
+		} else {
+			index++;
+		}
+	}
+	
+	return weekDays;
+}
+
+// End of file	--Don't remove this.