clock/clockui/clocksettingsview/src/settingscustomitem.cpp
branchRCL_3
changeset 65 12af337248b1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/clock/clockui/clocksettingsview/src/settingscustomitem.cpp	Tue Aug 31 15:13:43 2010 +0300
@@ -0,0 +1,487 @@
+/*
+* 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 ClockSettingsView.
+*
+*/
+
+// System includes
+#include <QGraphicsLinearLayout>
+#include <QItemSelectionModel>
+#include <HbDataFormModelItem>
+#include <HbDataFormModel>
+#include <HbPushButton>
+#include <HbLabel>
+#include <HbDateTimePicker>
+#include <HbAction>
+#include <HbListWidget>
+#include <HbExtendedLocale>
+#include <HbListWidgetItem>
+#include <HbStyleLoader>
+
+// User includes
+#include "settingscustomitem.h"
+#include "settingsdatatypes.h"
+#include "settingsutility.h"
+#include "clockcityselectionlist.h"
+#include "timezoneclient.h"
+#include "clockregionalsettingsview.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "settingscustomitemTraces.h"
+#endif
+
+
+/*!
+	\class SettingsCustomItem
+
+	This class is responsible for creating custom items for clock settings.
+ */
+
+/*!
+	Default Constructor.
+
+	\param parent The parent.
+ */
+
+SettingsCustomItem::SettingsCustomItem(QGraphicsItem *parent, bool launchedByClock)
+:HbDataFormViewItem(parent), mLaunchedByClock(launchedByClock)
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_SETTINGSCUSTOMITEM_ENTRY );
+	// Construct the settignsutility.
+	mSettingsUtility = new SettingsUtility();
+	// Construct the timezone client.
+	mTimezoneClient = TimezoneClient::getInstance();
+	// Register for the css.
+	HbStyleLoader::registerFilePath(":/style/settingscustomitem.css");
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_SETTINGSCUSTOMITEM_EXIT );
+}
+
+/*!
+	Destructor.
+ */
+SettingsCustomItem::~SettingsCustomItem()
+{
+	OstTraceFunctionEntry0( DUP1_SETTINGSCUSTOMITEM_SETTINGSCUSTOMITEM_ENTRY );
+	// Unregister the css.
+	HbStyleLoader::unregisterFilePath(":/style/settingscustomitem.css");
+	OstTraceFunctionExit0( DUP1_SETTINGSCUSTOMITEM_SETTINGSCUSTOMITEM_EXIT );
+}
+
+/*!
+	\reimp
+	Creates SettingsCustomItem.
+ */
+HbAbstractViewItem* SettingsCustomItem::createItem()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_CREATEITEM_ENTRY );
+	return new SettingsCustomItem(*this);
+}
+
+/*!
+
+	\sa
+ */
+bool SettingsCustomItem::canSetModelIndex(const QModelIndex &index) const
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_CANSETMODELINDEX_ENTRY );
+	HbDataFormModelItem::DataItemType itemType =
+			static_cast<HbDataFormModelItem::DataItemType>(
+			index.data(HbDataFormModelItem::ItemTypeRole).toInt());
+
+	if(itemType >= HbDataFormModelItem::CustomItemBase &&
+			itemType <= (HbDataFormModelItem::CustomItemBase + 50)) {
+		OstTraceFunctionExit0( SETTINGSCUSTOMITEM_CANSETMODELINDEX_EXIT );
+		return true;
+	} else {
+		OstTraceFunctionExit0( DUP1_SETTINGSCUSTOMITEM_CANSETMODELINDEX_EXIT );
+		return false;
+	}
+
+}
+
+void SettingsCustomItem::restore()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_RESTORE_ENTRY );
+	HbDataFormModelItem::DataItemType itemType =
+			static_cast<HbDataFormModelItem::DataItemType>(
+			modelIndex().data(HbDataFormModelItem::ItemTypeRole).toInt());
+
+	HbDataFormModel* model =
+			static_cast<HbDataFormModel*>(
+			static_cast<HbAbstractViewItem*>(this)->itemView()->model());
+	HbDataFormModelItem* modlItem = model->itemFromIndex(modelIndex());
+
+	switch (itemType) {
+		case (TimeItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			mTimeWidget->setProperty(
+					"text", modlItem->contentWidgetData("text"));
+			mTimeWidget->setProperty(
+					"objectName", modlItem->contentWidgetData("objectName"));
+			break;
+		}
+		case (DateItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			mDateWidget->setProperty(
+					"text", modlItem->contentWidgetData("text"));
+			mDateWidget->setProperty(
+					"objectName", modlItem->contentWidgetData("objectName"));
+			break;
+		}
+		case (PlaceItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			mPlaceWidget->setProperty(
+					"text", modlItem->contentWidgetData("text"));
+			mPlaceWidget->setProperty(
+					"objectName", modlItem->contentWidgetData("objectName"));
+			break;
+		}
+		case (RegionalItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			mRegSettingsWidget->setProperty(
+					"text", modlItem->contentWidgetData("text"));
+			mRegSettingsWidget->setProperty(
+					"objectName", modlItem->contentWidgetData("objectName"));
+			break;
+		}
+		case (50 + HbDataFormModelItem::CustomItemBase):
+		{
+			mWorkdaysWidget->setProperty(
+					"objectName", modlItem->contentWidgetData("objectName"));
+			break;
+		}
+		default:
+		break;
+	}
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_RESTORE_EXIT );
+}
+
+void SettingsCustomItem::setWeekdaysList(QStringList list)
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_SETWEEKDAYSLIST_ENTRY );
+	mWeekdaysList = list;
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_SETWEEKDAYSLIST_EXIT );
+}
+
+/*!
+	\reimp
+	Creates custom data form item.
+ */
+HbWidget* SettingsCustomItem::createCustomWidget()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_CREATECUSTOMWIDGET_ENTRY );
+	HbDataFormModelItem::DataItemType itemType =
+		static_cast<HbDataFormModelItem::DataItemType>(modelIndex()
+		.data(HbDataFormModelItem::ItemTypeRole).toInt());
+
+	switch (itemType) {
+		case (TimeItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			setProperty("expandItem", false);
+			mTimeWidget = new HbPushButton(this);
+			connect(
+					mTimeWidget, SIGNAL(clicked()),
+					this, SLOT(launchTimePicker()));
+			OstTraceFunctionExit0( SETTINGSCUSTOMITEM_CREATECUSTOMWIDGET_EXIT );
+			return mTimeWidget;
+		}
+
+		case (DateItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			setProperty("expandItem", false);
+			mDateWidget = new HbPushButton(this);
+			connect(
+					mDateWidget, SIGNAL(clicked()),
+					this, SLOT(launchDatePicker()));
+			OstTraceFunctionExit0( DUP1_SETTINGSCUSTOMITEM_CREATECUSTOMWIDGET_EXIT );
+			return mDateWidget;
+		}
+
+		case (PlaceItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			setProperty("expandItem", false);
+			mPlaceWidget = new HbPushButton(this);
+			connect(
+					mPlaceWidget, SIGNAL(clicked()),
+					this, SLOT(launchCitySelectionList()));
+			OstTraceFunctionExit0( DUP2_SETTINGSCUSTOMITEM_CREATECUSTOMWIDGET_EXIT );
+			return mPlaceWidget;
+		}
+
+		case (RegionalItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			setProperty("expandItem", false);
+			mRegSettingsWidget = new HbPushButton(this);
+			connect(
+					mRegSettingsWidget, SIGNAL(clicked()),
+					this, SLOT(launchRegSettingsView()));
+			OstTraceFunctionExit0( DUP3_SETTINGSCUSTOMITEM_CREATECUSTOMWIDGET_EXIT );
+			return mRegSettingsWidget;
+		}
+
+		case (WorkdaysItemOffset + HbDataFormModelItem::CustomItemBase):
+		{
+			// Set the property so that the custom item layout 
+			// will be the same for both portrait and landscape 
+			setProperty("expandItem", true);
+			mWorkdaysWidget = new HbListWidget(this);
+			mWorkdaysWidget->setSelectionMode(HbAbstractItemView::MultiSelection);
+			mWorkdaysWidget->setScrollDirections(0);
+			mWorkdaysWidget->ungrabGesture(Qt::PanGesture);
+			
+			QItemSelectionModel *model = 0;
+			model = mWorkdaysWidget->selectionModel();
+			for (int index = 0; index < mWeekdaysList.count(); ++index) {
+				mWorkdaysWidget->addItem(mWeekdaysList.at(index));
+			}
+
+			QString workdaysString = workdaysSetting();
+			for (int i = 0, index = workdaysString.size() - 1;
+					index >= 0; ++i, index--) {
+				if (workdaysString.at(index) == 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);
+				}
+			}
+
+			OstTraceFunctionExit0( DUP4_SETTINGSCUSTOMITEM_CREATECUSTOMWIDGET_EXIT );
+			return mWorkdaysWidget;
+		}
+
+		default:
+			return 0;
+	}
+}
+
+/*!
+	Launches the time picker dialog.
+ */
+void SettingsCustomItem::launchTimePicker()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_LAUNCHTIMEPICKER_ENTRY );
+	if (mTimePickerDialog) {
+		delete mTimePickerDialog;
+	}
+
+	// Create the dialog.
+	mTimePickerDialog = new HbDialog;
+	mTimePickerDialog->setTimeout(HbDialog::NoTimeout);
+	mTimePickerDialog->setDismissPolicy(HbDialog::NoDismiss);
+	mTimePickerDialog->setAttribute(Qt::WA_DeleteOnClose, true );
+
+	// Set the heading for the dialog.
+	HbLabel * timeLabel =
+		new HbLabel(hbTrId("txt_clock_setlabel_time"), mTimePickerDialog);
+	mTimePickerDialog->setHeadingWidget(timeLabel);
+
+	QStringList timeSeparator;
+	int index = mSettingsUtility->timeFormat(timeSeparator);
+	QString tumblerDisplayFormat = mSettingsUtility->timeFormatString()
+			.replace(timeSeparator.at(index), QString("."));
+
+	// Create the tumbler.
+	HbDateTimePicker *timePicker = new HbDateTimePicker(mTimePickerDialog);
+	timePicker->setDisplayFormat(tumblerDisplayFormat);
+	// Set the tumbler as the content widget.
+	mTimePickerDialog->setContentWidget(timePicker);
+	timePicker->setTime(QTime::currentTime());
+
+	mOkAction = new HbAction(
+			QString(hbTrId("txt_common_button_ok")), mTimePickerDialog);
+	mCancelAction = new HbAction(
+			QString(hbTrId("txt_common_button_cancel")), mTimePickerDialog);
+
+	mTimePickerDialog->addAction(mOkAction);
+	mTimePickerDialog->addAction(mCancelAction);
+
+	mTimePickerDialog->open(this, SLOT(selectedAction(HbAction*)));
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_LAUNCHTIMEPICKER_EXIT );
+}
+
+/*!
+	Handles the ok action of time/date picker dialog.
+ */
+void SettingsCustomItem::handleOkAction()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_HANDLEOKACTION_ENTRY );
+	if (mTimePickerDialog) {
+		// Get the time from the time picker.
+		QTime newTime = static_cast<HbDateTimePicker *> (
+				mTimePickerDialog->contentWidget())->time();
+
+		QString timeFormatString = mSettingsUtility->timeFormatString();
+
+		// If time returned by the picker is valid, then only update.
+		if (newTime.isValid()) {
+			// Update the display text on form item.
+			mTimeWidget->setText(newTime.toString(timeFormatString));
+			// Update the system time.
+			mTimezoneClient->setDateTime(
+					QDateTime(QDate::currentDate(), newTime));
+		}
+	} else if(mDatePickerDialog) {
+		// Get the time from the time picker.
+		QDate newDate = static_cast<HbDateTimePicker *> (
+				mDatePickerDialog->contentWidget())->date();
+
+		QString dateFormatString = mSettingsUtility->dateFormatString();
+
+		// If date returned by the picker is valid, then only update.
+		if (newDate.isValid()) {
+			// Update the display text on form item.
+			mDateWidget->setText(newDate.toString(dateFormatString));
+			// Update the system date.
+			mTimezoneClient->setDateTime(
+					QDateTime(newDate, QTime::currentTime()));
+		}
+	}
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_HANDLEOKACTION_EXIT );
+}
+
+/*!
+	Launches the date picker dialog.
+ */
+void SettingsCustomItem::launchDatePicker()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_LAUNCHDATEPICKER_ENTRY );
+	if (mDatePickerDialog) {
+		delete mDatePickerDialog;
+	}
+
+	// Create the dialog.
+	mDatePickerDialog = new HbDialog;
+	mDatePickerDialog->setTimeout(HbDialog::NoTimeout);
+	mDatePickerDialog->setDismissPolicy(HbDialog::NoDismiss);
+	mDatePickerDialog->setAttribute(Qt::WA_DeleteOnClose, true );
+
+	// Set the heading for the dialog.
+	HbLabel * timeLabel =
+		new HbLabel(hbTrId("txt_clock_setlabel_date"), mDatePickerDialog);
+	mDatePickerDialog->setHeadingWidget(timeLabel);
+
+	// Create the tumbler.
+	HbDateTimePicker *datePicker = new HbDateTimePicker(mDatePickerDialog);
+	datePicker->setDisplayFormat(mSettingsUtility->dateFormatString());
+	datePicker->setMinimumDate(QDate(2010, 01, 01));
+	// Set the tumbler as the content widget.
+	mDatePickerDialog->setContentWidget(datePicker);
+	datePicker->setDate(QDate::currentDate());
+
+	mOkAction = new HbAction(
+			QString(hbTrId("txt_common_button_ok")), mDatePickerDialog);
+
+	mCancelAction = new HbAction(
+			QString(hbTrId("txt_common_button_cancel")),mDatePickerDialog);
+
+	mDatePickerDialog->addAction(mOkAction);
+	mDatePickerDialog->addAction(mCancelAction);
+
+	mDatePickerDialog->open(this, SLOT(selectedAction(HbAction*)));
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_LAUNCHDATEPICKER_EXIT );
+}
+
+/*!
+	Launches cityselectionlist for timezone selection.
+ */
+void SettingsCustomItem::launchCitySelectionList()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_LAUNCHCITYSELECTIONLIST_ENTRY );
+	mCitySelectionList = new ClockCitySelectionList(mTimezoneClient, this);
+	connect(
+			mCitySelectionList, SIGNAL(citySelected(LocationInfo)),
+			this, SLOT(updatePlaceItem(LocationInfo)));
+
+	mCitySelectionList->showCityList();
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_LAUNCHCITYSELECTIONLIST_EXIT );
+}
+
+/*!
+	Launches cityselectionlist for timezone selection.
+
+	\param info Will contain the location info selected by the user.
+ */
+void SettingsCustomItem::updatePlaceItem(LocationInfo info)
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_UPDATEPLACEITEM_ENTRY );
+	if (-1 != info.timezoneId) {
+		mTimezoneClient->setAsCurrentLocationL(info);
+	}
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_UPDATEPLACEITEM_EXIT );
+}
+
+/*!
+	Launches the regional settings view.
+ */
+void SettingsCustomItem::launchRegSettingsView()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_LAUNCHREGSETTINGSVIEW_ENTRY );
+	ClockRegionalSettingsView *view =
+			new ClockRegionalSettingsView(0, mLaunchedByClock);
+
+	connect(mTimezoneClient, SIGNAL(timechanged()),
+          view, SLOT(updateWeekStartOn()));
+	view->showView();
+	
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_LAUNCHREGSETTINGSVIEW_EXIT );
+}
+
+/*!
+	Slot to handle the selected action.
+ */
+void SettingsCustomItem::selectedAction(HbAction *action)
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_SELECTEDACTION_ENTRY );
+	if (action==mOkAction) {
+		handleOkAction();
+	}
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_SELECTEDACTION_EXIT );
+}
+
+/*!
+	Returns the workdays setting string based on start of week setting.
+ */
+QString SettingsCustomItem::workdaysSetting()
+{
+	OstTraceFunctionEntry0( SETTINGSCUSTOMITEM_WORKDAYSSETTING_ENTRY );
+	HbExtendedLocale locale = HbExtendedLocale::system();
+	// 0(Sun)0(sat)1(Fri)1(Thu)1(Wed)1(Tue)1(Mon)
+	QString workdaysString = locale.workDays();
+	QString workdays = workdaysString;
+	HbExtendedLocale::WeekDay startOfWeekIndex =
+				HbExtendedLocale::system().startOfWeek();
+	int max = workdaysString.size() - 1;
+	for (int index = max - startOfWeekIndex, i = max; i >= 0; i--) {
+		QChar ch = workdaysString.at(index);
+		workdays.replace(i, 1, ch);
+	    if (index == 0) {
+	        index = max;
+        } else {
+        	index--;
+        }
+    }
+//	workdays.append('\0');
+
+	OstTraceFunctionExit0( SETTINGSCUSTOMITEM_WORKDAYSSETTING_EXIT );
+	return workdays;
+}
+
+// End of file	--Don't remove this.