diff -r a5692c68d772 -r 593f946f4fec controlpanelplugins/langandregplugin/src/cplanguageview.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/controlpanelplugins/langandregplugin/src/cplanguageview.cpp Wed Sep 29 10:09:58 2010 +0800 @@ -0,0 +1,558 @@ +/* + * 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: Language plugin view class + * + */ + +#include "cplanguageview.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "cplanguageplugin.h" +#include "cplanguagepluginlog.h" + +static int PRIMARY_INPUT_ITEM_INDEX = 0; +static int SECONDARY_INPUT_ITEM_INDEX = 1; +static int REGION_ITEM_INDEX = 2; + +/* + * Constructor + */ +CpLanguageView::CpLanguageView(QGraphicsItem *parent) : + CpBaseSettingView(0,parent), + mModel(0), + mCurrentLanguagePage(0), + mCurrentRegionItem(0), + mCurrentPrimaryInputLanguageItem(0), + mCurrentSecondaryInputLanguageItem(0), + mClockPluginLoader(0) +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::CpLanguageView") + + mChineseVariant = CpLanguagePluginUtil::isChineseVariant(); + if (mChineseVariant) { + PRIMARY_INPUT_ITEM_INDEX = 0; + SECONDARY_INPUT_ITEM_INDEX = -1; // no secondary writing language in Chinese variant + REGION_ITEM_INDEX = 1; + } + + HbDataForm *form = qobject_cast(widget()); + if (form) { + mModel = new HbDataFormModel; + + form->setHeading(hbTrId("txt_cp_subhead_display_language")); + form->setDescription(hbTrId("txt_cp_info_after_changign_deivce_language_device")); + + mLanguageRegionMapping = ExtendedLocaleUtil::localeMappings(true); + + mSupportedLanguages = HbLocaleUtil::supportedLanguages(); + QStringList localizedLanguages = CpLanguagePluginUtil::localizedLanguageNames(mSupportedLanguages); + + mSupportedRegions = HbLocaleUtil::supportedRegions(); + QStringList localizedRegions = CpLanguagePluginUtil::localizedRegionNames(mSupportedRegions); + + CPLANG_LOG ( QString("map count:%1").arg(mLanguageRegionMapping.count()) ); + CPLANG_LOG ( QString("support language count:%1").arg(mSupportedLanguages.count()) ); + CPLANG_LOG ( QString("support region count:%1").arg(mSupportedRegions.count()) ); + + HbInputUtils::listSupportedInputLanguages(mPrimaryInputLanguages); + QStringList localizedInputLanguages = CpLanguagePluginUtil::localizedInputLanguageNames(mPrimaryInputLanguages); + + QString currentLanguage = HbLocaleUtil::currentLanguage(); + + //prvious setting + mPreviousSetting.languageId = currentLanguage; + mPreviousSetting.regionId = HbLocaleUtil::currentRegion(); + mPreviousSetting.primaryWritingLan = HbInputSettingProxy::instance()->globalInputLanguage(); + mPreviousSetting.secondaryWritingLan = HbInputSettingProxy::instance()->globalSecondaryInputLanguage(); + + mCurrentSetting = mPreviousSetting; + + //update with current setting + if (LanguageRegionMapping *setting = languageRegionMapping(currentLanguage)) { + *setting = mCurrentSetting; + } + + for (int index = 0; index < mLanguageRegionMapping.count();index++) { + const LanguageRegionMapping &setting = mLanguageRegionMapping.at(index); + HbDataFormModelItem *languageAndRegionPage = mModel->appendDataFormPage( HbLocaleUtil::localisedLanguageName(setting.languageId) ); + mLanguagePages.append(languageAndRegionPage); + + /* + * Create primary writing language item. + */ + HbDataFormModelItem *primaryInputLanguageItem = new HbDataFormModelItem(HbDataFormModelItem::ComboBoxItem, + hbTrId("txt_cp_setlabel_primary_writing_language")); + + + int primaryInputLanguageIndex = mPrimaryInputLanguages.indexOf(setting.primaryWritingLan); + + CPLANG_LOG(QLatin1String("Primary input Language:") + setting.primaryWritingLan.asString()); + CPLANG_LOG(QString("Index of primary input language: %1").arg(primaryInputLanguageIndex)); + + fillDataFormComboBoxItem(primaryInputLanguageItem,localizedInputLanguages,primaryInputLanguageIndex); + + form->addConnection(primaryInputLanguageItem, SIGNAL(currentIndexChanged (int)), + this,SLOT(onPrimaryInputLanguageChanged(int))); + languageAndRegionPage->appendChild(primaryInputLanguageItem); + + /* + * Create secondary writing language item. + * (No secondary writing language for Chinese variant) + */ + if (!mChineseVariant) { + HbDataFormModelItem *secondaryInputLanguageItem = new HbDataFormModelItem(HbDataFormModelItem::ComboBoxItem, + hbTrId("txt_cp_setlabel_secondary_writing_language")); + + form->addConnection(secondaryInputLanguageItem, SIGNAL(currentIndexChanged (int)), + this,SLOT(onSecondaryInputLanguageChanged(int))); + languageAndRegionPage->appendChild(secondaryInputLanguageItem); + } + + /* + * Create region item. + */ + HbDataFormModelItem *regionItem = new HbDataFormModelItem(HbDataFormModelItem::ComboBoxItem, + hbTrId("Region")); + + int regionIndex = mSupportedRegions.indexOf(setting.regionId); + + CPLANG_LOG(QLatin1String("Current region:") + setting.regionId); + CPLANG_LOG(QString("Index of current region: %1").arg(regionIndex)); + + fillDataFormComboBoxItem(regionItem,localizedRegions,regionIndex); + + form->addConnection(regionItem, SIGNAL(currentIndexChanged (int)), + this,SLOT(onRegionChanged(int))); + languageAndRegionPage->appendChild(regionItem); + + if (mSupportedLanguages.at(index) == currentLanguage) { + mCurrentLanguagePage = languageAndRegionPage; + mCurrentRegionItem = mCurrentLanguagePage->childAt(REGION_ITEM_INDEX); + mCurrentPrimaryInputLanguageItem = mCurrentLanguagePage->childAt(PRIMARY_INPUT_ITEM_INDEX); + mCurrentSecondaryInputLanguageItem = mCurrentLanguagePage->childAt(SECONDARY_INPUT_ITEM_INDEX); + } + } + + // update secondary input language item according to primary input language + updateSecondaryInputLanguageItem(); + + /* + * Create region settings item. + */ + HbDataFormModelItem *regionalSettingsItem = new HbDataFormModelItem( + static_cast(CpSettingFormEntryItemData::ButtonEntryItem)); + regionalSettingsItem->setContentWidgetData("text",hbTrId("txt_cp_button_regional_settings")); + regionalSettingsItem->setContentWidgetData("textAlignment", + QVariant(Qt::AlignHCenter | Qt::AlignVCenter)); + form->addConnection(regionalSettingsItem,SIGNAL(clicked()), + this,SLOT(launchRegionalSettingsView())); + + mModel->appendDataFormItem(regionalSettingsItem); + + form->setModel(mModel); + // active current language page + form->setExpanded(mModel->indexFromItem(mCurrentLanguagePage),true); + + + /* + * observe input language changed event + */ + connect(HbInputSettingProxy::instance(), + SIGNAL(globalInputLanguageChanged(HbInputLanguage)), + this, + SLOT(onPrimaryInputLanguageChanged(HbInputLanguage))); + + connect(HbInputSettingProxy::instance(), + SIGNAL(globalSecondaryInputLanguageChanged(HbInputLanguage)), + this, + SLOT(onSecondaryInputLanguageChanged(HbInputLanguage))); + + connect(form, + SIGNAL(activated(QModelIndex)), + this, + SLOT(onDataFormItemActivated(QModelIndex))); + + } +} + +/* + * Destructor + */ +CpLanguageView::~CpLanguageView() +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::~CpLanguageView") + // Unload RegionalSettingsView plugin + if (mClockPluginLoader) { + mClockPluginLoader->unload(); + delete mClockPluginLoader; + } + delete mModel; +} + +/*! + * Handle region changed + */ +void CpLanguageView::onRegionChanged(int index) +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::onRegionChanged") + + CPLANG_LOG(QLatin1String("Before change region:") + HbLocaleUtil::currentRegion()); + + if (index >= 0 && index < mSupportedRegions.count()) { + HbLocaleUtil::changeRegion( mSupportedRegions.at(index) ); + mCurrentSetting.regionId = mSupportedRegions.at(index); + if (LanguageRegionMapping *setting = languageRegionMapping(mCurrentSetting.languageId)) { + setting->regionId = mCurrentSetting.regionId; + } + + CPLANG_LOG(QLatin1String("After change region:") + HbLocaleUtil::currentRegion()); + } +} + + +/* + * prompt user to restart device. + */ +bool CpLanguageView::promptRestart() +{ + HbDeviceMessageBox messageBox( + hbTrId("txt_cp_text_edit_device_will_be_restarted_to_chang"), + HbMessageBox::MessageTypeQuestion, this); + + QString okText = hbTrId("txt_cp_button_restart"); + QString cancelText = hbTrId("txt_cp_button_discard_changes"); + messageBox.setAction(new QAction(okText,&messageBox), + HbDeviceMessageBox::AcceptButtonRole); + messageBox.setAction(new QAction(cancelText,&messageBox), + HbDeviceMessageBox::RejectButtonRole); + messageBox.setIconVisible(false); + + return (messageBox.exec() + == messageBox.action(HbDeviceMessageBox::AcceptButtonRole) ); +} + +/*! + * Handle primary language changed. + */ +void CpLanguageView::onPrimaryInputLanguageChanged(int index) +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::onPrimaryInputLanguageChanged(int index)") + + CPLANG_LOG(QLatin1String("Before change primary input language:") + HbInputSettingProxy::instance()->globalInputLanguage().asString()); + + if (index >= 0 && index < mPrimaryInputLanguages.count()) { + HbInputLanguage inputLanguage = mPrimaryInputLanguages.at(index); + if (inputLanguage != HbInputSettingProxy::instance()->globalInputLanguage()) { + HbInputSettingProxy::instance()->setGlobalInputLanguage(inputLanguage); + mCurrentSetting.primaryWritingLan = inputLanguage; + if (LanguageRegionMapping *setting = languageRegionMapping(mCurrentSetting.languageId)) { + setting->primaryWritingLan = mCurrentSetting.primaryWritingLan; + } + + updateSecondaryInputLanguageItem(); + CPLANG_LOG(QLatin1String("After change primary input language:") + HbInputSettingProxy::instance()->globalInputLanguage().asString()); + } + } +} + +/*! + * Handle secondary language changed. + */ +void CpLanguageView::onSecondaryInputLanguageChanged(int index) +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::onSecondaryInputLanguageChanged(int index)") + + CPLANG_LOG(QLatin1String("Before change secondary input language:") + HbInputSettingProxy::instance()->globalSecondaryInputLanguage().asString()); + + if (index >= 0 && index < mSecondaryInputLanguages.count()) { + HbInputLanguage inputLanguage = mSecondaryInputLanguages.at(index); + if (inputLanguage != HbInputSettingProxy::instance()->globalSecondaryInputLanguage() ) { + HbInputSettingProxy::instance()->setGlobalSecondaryInputLanguage(inputLanguage); + mCurrentSetting.secondaryWritingLan = inputLanguage; + if (LanguageRegionMapping *setting = languageRegionMapping(mCurrentSetting.languageId)) { + setting->secondaryWritingLan = mCurrentSetting.secondaryWritingLan; + } + + CPLANG_LOG(QLatin1String("After change secondary input language:") + HbInputSettingProxy::instance()->globalSecondaryInputLanguage().asString()); + } + } +} + +/*! + * Observe primary input language changed event and update the ui, if it is being changed from outside of this plugin + */ +void CpLanguageView::onPrimaryInputLanguageChanged(const HbInputLanguage &inputLanguage) +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::onPrimaryInputLanguageChanged(const HbInputLanguage &inputLanguage)") + if (mCurrentPrimaryInputLanguageItem) { + int index = mPrimaryInputLanguages.indexOf(inputLanguage); + if (index != mCurrentPrimaryInputLanguageItem->contentWidgetData("currentIndex").toInt() ) { + CPLANG_LOG( QString("New Index: %1").arg(index) ) + + mCurrentSetting.primaryWritingLan = inputLanguage; + mCurrentPrimaryInputLanguageItem->setContentWidgetData("currentIndex",index); + updateSecondaryInputLanguageItem(); + } + } +} + +/*! + * Observe secondary input language changed event and update the ui, if it is being changed from outside of this plugin + */ +void CpLanguageView::onSecondaryInputLanguageChanged(const HbInputLanguage &inputLanguage) +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::onSecondaryInputLanguageChanged(const HbInputLanguage &inputLanguage)") + + if (mCurrentSecondaryInputLanguageItem) { + int index = mSecondaryInputLanguages.indexOf(inputLanguage); + if (index != mCurrentSecondaryInputLanguageItem->contentWidgetData("currentIndex").toInt()) { + CPLANG_LOG( QString("New Index: %1").arg(index) ) + mCurrentSetting.secondaryWritingLan = inputLanguage; + mCurrentSecondaryInputLanguageItem->setContentWidgetData("currentIndex",index); + } + } +} + + +/*! + * Fill contents in the data form model items. + * \param comboBoxItem a data form model item whose type is HbDataFormModelItem::ComboBoxItem + * \param items items showing in the combobox + * \param currentIndex index of the selected item + */ +void CpLanguageView::fillDataFormComboBoxItem(HbDataFormModelItem *comboBoxItem, + const QStringList &items, + int currentIndex /*= -1*/) +{ + Q_ASSERT(comboBoxItem); + Q_ASSERT(comboBoxItem->type() == HbDataFormModelItem::ComboBoxItem); + + comboBoxItem->setContentWidgetData("items", items); + comboBoxItem->setContentWidgetData("currentIndex",currentIndex); +} + +/*! + * Update secondary input language item according to primary input language + */ +void CpLanguageView::updateSecondaryInputLanguageItem() +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::updateSecondaryInputLanguageItem") + + // no secondary writing language in Chinese variant. + if (mChineseVariant) { + return; + } + + HbInputLanguage primaryInputLanguage = HbInputSettingProxy::instance()->globalInputLanguage(); + + mSecondaryInputLanguages.clear(); + // append a "none set" item + mSecondaryInputLanguages.append(HbInputLanguage()); + + // Chinese input doesn't have secondary input language + if (primaryInputLanguage.language() == QLocale::Chinese) { + HbInputSettingProxy::instance()->setGlobalSecondaryInputLanguage(HbInputLanguage()); + CPLANG_LOG("Primary input language: Chinese"); + } + else { + foreach(const HbInputLanguage &inputLanguage,mPrimaryInputLanguages) { + if ( inputLanguage != primaryInputLanguage // Secondary input language can't be set the same as primary input language + && inputLanguage.language() != QLocale::Chinese) { // Chinese input can't be set as secondary input language + mSecondaryInputLanguages.append(inputLanguage); + } + } + } + + QStringList localisedNames = CpLanguagePluginUtil::localizedInputLanguageNames(mSecondaryInputLanguages); + + // if the secondary input language is the same as primary input language, set it as "none set" + HbInputLanguage secondaryInputLanguage = HbInputSettingProxy::instance()->globalSecondaryInputLanguage(); + + if (secondaryInputLanguage == primaryInputLanguage) { + secondaryInputLanguage = HbInputLanguage(); + HbInputSettingProxy::instance()->setGlobalSecondaryInputLanguage(HbInputLanguage()); + + CPLANG_LOG("secondary == primary, set secondary input as \"None\""); + } + + mCurrentSetting.secondaryWritingLan = secondaryInputLanguage; + if (LanguageRegionMapping *setting = languageRegionMapping(mCurrentSetting.languageId)) { + setting->secondaryWritingLan = mCurrentSetting.secondaryWritingLan; + } + + fillDataFormComboBoxItem(mCurrentSecondaryInputLanguageItem,localisedNames,mSecondaryInputLanguages.indexOf(secondaryInputLanguage)); +} + +/*! + * Restart the device. + */ +int CpLanguageView::restartDevice() +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::restartDevice") +#ifdef Q_OS_SYMBIAN + RStarterSession session; + TInt error = session.Connect(); + + if (error == KErrNone) { + session.Reset( RStarterSession::ELanguageSwitchReset ); + session.Close(); + } + + return error; +#else + return 0; +#endif +} + +/*! + Launch the regional settings view. + */ +void CpLanguageView::launchRegionalSettingsView() +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::launchRegionalSettingsView") + + //Load the clock settings view plugin if it is not loaded + if (!mClockPluginLoader) { + QDir dir(CLOCK_SETTINGSVIEW_PLUGIN_PATH); + QString pluginName = dir.absoluteFilePath(CLOCK_SETTINGSVIEW_PLUGIN_NAME); + mClockPluginLoader = new QPluginLoader(pluginName); + mClockPluginLoader->load(); + } + + //Launch the settings view + ClockSettingsViewInterface *clockSettingsViewInterface + = qobject_cast(mClockPluginLoader->instance()); + if (clockSettingsViewInterface) { + clockSettingsViewInterface->launchRegionalSettingsView(); + } + else { + CPLANG_LOG("Load clocksettingsviewplugin failed."); + } +} + +/*! + * handle data form page changed event + */ +void CpLanguageView::onDataFormItemActivated(const QModelIndex &modelIndex) +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::onDataFormItemActivated") + + mCurrentLanguagePage = mModel->itemFromIndex(modelIndex); + + mCurrentRegionItem = mCurrentLanguagePage->childAt(REGION_ITEM_INDEX); + mCurrentPrimaryInputLanguageItem = mCurrentLanguagePage->childAt(PRIMARY_INPUT_ITEM_INDEX); + mCurrentSecondaryInputLanguageItem = mCurrentLanguagePage->childAt(SECONDARY_INPUT_ITEM_INDEX); + + int index = mLanguagePages.indexOf(mCurrentLanguagePage); + + if (index >= 0) { + QString newLanguage = mSupportedLanguages.at(index); + LanguageRegionMapping *setting = languageRegionMapping(newLanguage); + if (setting) { + setting->secondaryWritingLan = HbInputSettingProxy::instance()->globalSecondaryInputLanguage(); + mCurrentSetting = *setting; + + HbLocaleUtil::changeRegion(mCurrentSetting.regionId); + HbInputSettingProxy::instance()->setGlobalInputLanguage(mCurrentSetting.primaryWritingLan); + + //update combobox + mCurrentPrimaryInputLanguageItem->setContentWidgetData("currentIndex",mPrimaryInputLanguages.indexOf(mCurrentSetting.primaryWritingLan)); + mCurrentRegionItem->setContentWidgetData("currentIndex",mSupportedRegions.indexOf(mCurrentSetting.regionId)); + + CPLANG_LOG(QString("Primary writing:") + HbInputSettingProxy::instance()->globalInputLanguage().asString()); + CPLANG_LOG(QString("Secondary writing:") + HbInputSettingProxy::instance()->globalSecondaryInputLanguage().asString()); + + updateSecondaryInputLanguageItem(); + } + } + +} + +/*! + * From CpBaseSettingView, prompt user to restart device before exiting the view + */ +void CpLanguageView::close() +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::close()") + + CPLANG_LOG( QString("mCurrentSetting.languageId :") + mCurrentSetting.languageId ) + CPLANG_LOG( QString("HbLocaleUtil::currentLanguage():") + HbLocaleUtil::currentLanguage() ) + + if (mCurrentSetting.languageId != HbLocaleUtil::currentLanguage()) { + // apply new settings + if (promptRestart()) { + HbLocaleUtil::changeLocale(mCurrentSetting.languageId); + + /* + * change other settings. + */ + if (mSupportedRegions.contains(mCurrentSetting.regionId,Qt::CaseInsensitive)) { + HbLocaleUtil::changeRegion(mCurrentSetting.regionId); + } + CpLanguagePlugin::updateEntryItem(); + HbInputSettingProxy::instance()->setGlobalInputLanguage(mCurrentSetting.primaryWritingLan); + HbInputSettingProxy::instance()->setGlobalSecondaryInputLanguage(mCurrentSetting.secondaryWritingLan); + + restartDevice(); + } + // restore previous values + else { + if (mCurrentSetting.regionId != mPreviousSetting.regionId) { + HbLocaleUtil::changeRegion(mPreviousSetting.regionId); + } + if (mCurrentSetting.primaryWritingLan != mPreviousSetting.primaryWritingLan) { + HbInputSettingProxy::instance()->setGlobalInputLanguage(mPreviousSetting.primaryWritingLan); + } + if (mCurrentSetting.secondaryWritingLan != mPreviousSetting.secondaryWritingLan) { + HbInputSettingProxy::instance()->setGlobalSecondaryInputLanguage(mPreviousSetting.secondaryWritingLan); + } + } + } + + CpBaseSettingView::close(); +} + +/*! + * get the language-region mapping table + */ +LanguageRegionMapping *CpLanguageView::languageRegionMapping(const QString &language) +{ + CPLANG_LOG_FUNC_ENTRY("CpLanguageView::languageRegionMapping(const QString &language)") + + foreach(const LanguageRegionMapping &setting,mLanguageRegionMapping) { + if (setting.languageId.compare(language,Qt::CaseInsensitive) == 0) { + return const_cast(&setting); + } + } + + CPLANG_LOG("Not found.") + + return 0; +} + +//End of File