diff -r 96907930389d -r 12af337248b1 clock/clockui/clockcityselectionlist/src/clockcityselectionlist_p.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clock/clockui/clockcityselectionlist/src/clockcityselectionlist_p.cpp Tue Aug 31 15:13:43 2010 +0300 @@ -0,0 +1,633 @@ + /* +* 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 ClockCitySelectionListPrivate. +* +*/ + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// User includes +#include "clockcityselectionlist_p.h" +#include "clockcityselectionlist.h" +#include "clockcitylistproxymodel.h" +#include "clockcityselectionlistcommon.h" + +#include "timezoneclient.h" +#include "clockdatatypes.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "clockcityselectionlist_pTraces.h" +#endif + + +/*! + \class ClockCitySelectionListPrivate + + This is the private implementation class for ClockCitySelectionList class. + */ + +/*! + Default constructor. + + \param client The pointer to an object of TimezoneClient. + \param parent of type QObject. + */ +ClockCitySelectionListPrivate::ClockCitySelectionListPrivate( + TimezoneClient *client, QObject *parent) +:QObject(parent), + mLoader(0), + mOwnsClient(false) +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_CLOCKCITYSELECTIONLISTPRIVATE_ENTRY ); + // First get the q-pointer. + q_ptr = static_cast (parent); + + mClient = client; + if (!mClient) { + mClient = TimezoneClient::getInstance(); + mOwnsClient = true; + } + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_CLOCKCITYSELECTIONLISTPRIVATE_EXIT ); +} + +/*! + Destructor. + */ +ClockCitySelectionListPrivate::~ClockCitySelectionListPrivate() +{ + OstTraceFunctionEntry0( DUP1_CLOCKCITYSELECTIONLISTPRIVATE_CLOCKCITYSELECTIONLISTPRIVATE_ENTRY ); + if (mOwnsClient) { + mClient->deleteInstance(); + } + if (mLoader) { + mLoader->reset(); + delete mLoader; + mLoader = 0; + } + if (mListModel) { + delete mListModel; + } + if (mTimeZoneOffsetList.count()) { + mTimeZoneOffsetList.clear(); + } + if(mCountryList.count()) { + mCountryList.clear(); + } + if (mVirtualKeyboard) { + delete mVirtualKeyboard; + } + + OstTraceFunctionExit0( DUP1_CLOCKCITYSELECTIONLISTPRIVATE_CLOCKCITYSELECTIONLISTPRIVATE_EXIT ); +} + +/*! + Populates the list model by getting the data from timezone client. + */ +void ClockCitySelectionListPrivate::populateListModel() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_POPULATELISTMODEL_ENTRY ); + // First get the data from the timezone client. + QList &infoList = mClient->getLocations(); + + // Sanity check. + if (!mListModel) { + mListModel = new QStandardItemModel(0, 1, this); + } + // Clear the model before starting population. + mListModel->removeRows(0,infoList.count()-1); + mListModel->insertRows(0, infoList.count()); + mListModel->setColumnCount(1); + + for (int iter = 0; iter < infoList.count(); iter++) { + QModelIndex index = mListModel->index(iter, 0); + + // Get the location info and add it to the model. + LocationInfo info = infoList.at(iter); + QString displayString; + displayString += info.cityName; + displayString += ", "; + displayString += info.countryName; + mListModel->setData(index, displayString, Qt::DisplayRole); + mListModel->setData(index, displayString, Qt::UserRole + 100); + + // Now save the timezone and city group ids. + mListModel->setData( + index, QVariant(info.timezoneId), Qt::UserRole + 101); + mListModel->setData( + index, QVariant(info.cityGroupId), Qt::UserRole + 102); + mListModel->setData( + index, info.cityName, Qt::UserRole + 103); + mListModel->setData( + index, info.countryName, Qt::UserRole + 104); + } + + // Cleanup. + infoList.clear(); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_POPULATELISTMODEL_EXIT ); +} + +/*! + Slot to handle the case when a list item is activated. Here we return the + city selected by the user. We emit a signal notifying this event and close + the editor. + */ +void ClockCitySelectionListPrivate::handleItemActivated( + const QModelIndex &index) +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLEITEMACTIVATED_ENTRY ); + LocationInfo selectedInfo; + selectedInfo.timezoneId = index.data(Qt::UserRole + 101).value(); + selectedInfo.cityGroupId = index.data(Qt::UserRole + 102).value(); + selectedInfo.cityName = index.data(Qt::UserRole + 103).value(); + selectedInfo.countryName = index.data(Qt::UserRole + 104).value(); + selectedInfo.zoneOffset = + mClient->getStandardOffset(selectedInfo.timezoneId); + selectedInfo.dstOn = mClient->isDSTOnL(selectedInfo.timezoneId); + + // We have the information. Now emit a signal to notify clients if any. + emit q_ptr->citySelected(selectedInfo); + + // Close the list. + closeCityList(); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLEITEMACTIVATED_EXIT ); +} + +/*! + Slot to handle back action is pressed. + */ +void ClockCitySelectionListPrivate::handleBackAction() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLEBACKACTION_ENTRY ); + LocationInfo info; + info.timezoneId = -1; + + // Test code... + int rowCount = mListModel->rowCount(); + QStandardItem *item = mListModel->item(0); + QString text = item->data(Qt::DisplayRole).value(); + int tz = item->data(Qt::UserRole + 100).value(); + int cg = item->data(Qt::UserRole + 101).value(); + QString ci = item->data(Qt::UserRole + 102).value(); + QString co = item->data(Qt::UserRole + 103).value(); + + // Emit the signal to notify the closure. + emit q_ptr->citySelected(info); + + // Close the list. + closeCityList(); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLEBACKACTION_EXIT ); +} + +/*! + closes the city selection list. + */ +void ClockCitySelectionListPrivate::closeCityList() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_CLOSECITYLIST_ENTRY ); + // We are done, lets remove the view off the main window. + HbMainWindow *window = hbInstance->allMainWindows().at(0); + window->removeView(mView); + + if (mLoader) { + mLoader->reset(); + delete mLoader; + mLoader = 0; + } + + if (mListModel) { + delete mListModel; + } + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_CLOSECITYLIST_EXIT ); +} + +/*! + Updates the search criteria with the proxy model. + + \param criteria The string entered by the user. + */ +void ClockCitySelectionListPrivate::updateSearchCriteria( + const QString &criteria) +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_UPDATESEARCHCRITERIA_ENTRY ); + int originalMask = mListView->enabledAnimations(); + mListView->setEnabledAnimations(HbAbstractItemView::TouchDown); + + // Create the reg ex so that search is performed for match immediately + // after word boundary. + QString searchPattern("\\b"); + searchPattern.append(criteria); + + QRegExp searchExp; + searchExp.setPattern(searchPattern); + + mProxyModel->setFilterRegExp(searchExp); + mProxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_UPDATESEARCHCRITERIA_EXIT ); +} + +/*! + Handles add own city menu action + */ +void ClockCitySelectionListPrivate::handleAddOwnCityAction() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLEADDOWNCITYACTION_ENTRY ); + if (mAddOwnCityDialog) { + delete mAddOwnCityDialog; + } + + HbMainWindow *window = hbInstance->allMainWindows().first(); + + connect( + window, SIGNAL(orientationChanged(Qt::Orientation)), + this, SLOT(loadSection(Qt::Orientation))); + + mAddCityDocloader = new HbDocumentLoader(); + bool success = false; + mAddCityDocloader->load(":/xml/clockaddcitydialog.docml", &success); + if (!success) { + qFatal("Unable to load the document."); + } + + // Get the dialog. + mAddOwnCityDialog = static_cast (mAddCityDocloader->findWidget("dialog")); + if (!mAddOwnCityDialog) { + qFatal("Unable to get the selection view."); + } + mAddOwnCityDialog->setTimeout(HbDialog::NoTimeout); + mAddOwnCityDialog->setDismissPolicy(HbDialog::NoDismiss); + mAddOwnCityDialog->setAttribute(Qt::WA_DeleteOnClose, true); + + // Find the elements from the docml. + mCityNameEdit = static_cast (mAddCityDocloader->findWidget("cityNameLineEdit")); + + mTimeZoneComboBox = static_cast (mAddCityDocloader->findWidget("timezoneCombobox")); + if (mTimeZoneComboBox) { + addTimeZoneField(); + } + + mCountryComboBox = static_cast (mAddCityDocloader->findWidget("counrtyCombobox")); + addCountryListField(); + + mOkAction = static_cast (mAddCityDocloader->findObject("okAction")); + + mAddOwnCityDialog->open(this, SLOT(selectedAction(HbAction*))); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLEADDOWNCITYACTION_EXIT ); +} + +/*! + Hanldes Ok action of add own city dialog + */ +void ClockCitySelectionListPrivate::handleOkAction() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLEOKACTION_ENTRY ); + QString cityName = mCityNameEdit->text(); + + // Add the city if city name is not empty + if (!cityName.isEmpty()) { + int selectedTZOffset = + mTimeZoneOffsetList.at(mTimeZoneComboBox->currentIndex()); + + QString selectedCountry = mCountryComboBox->currentText(); + int selectedCityGroupId(-1); + int selectedTimeZoneId(-1); + for (int index=0;indexaddCity(selectedTimeZoneId,cityName,selectedCityGroupId); + + if (!addedCity.cityName.compare(cityName)) { + // Refresh the city list. + populateListModel(); + } + } + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLEOKACTION_EXIT ); +} + +/*! + Handles the selection of time zone offset. + Populates the country list. + */ +void ClockCitySelectionListPrivate::handleTimeZoneSelection(int index) +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLETIMEZONESELECTION_ENTRY ); + // Get the selected time zone offset. + int selectedTimeZoneOffset = mTimeZoneOffsetList.at(index); + + if(mCountryList.count()) { + mCountryList.clear(); + } + + // Get country list for the offset selected + mCountryList = mClient->getCountriesForUTCOffset(selectedTimeZoneOffset); + int countryListCount = mCountryList.count(); + QStringList countries; + for(int index=0;indexsetItems(countries); + } + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_HANDLETIMEZONESELECTION_EXIT ); +} + +/*! + Slot to handle the selected action + */ +void ClockCitySelectionListPrivate::selectedAction(HbAction *action) +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_SELECTEDACTION_ENTRY ); + if (action==mOkAction) { + handleOkAction(); + } + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_SELECTEDACTION_EXIT ); +} + +/*! + Slot to handle the orientation change. + */ +void ClockCitySelectionListPrivate::loadSection(Qt::Orientation orientation) +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_LOADSECTION_ENTRY ); + bool loadSuccess; + if (mAddOwnCityDialog) { + if (Qt::Horizontal == orientation) { + mAddCityDocloader->load(":/xml/clockaddcitydialog.docml", + "landscape", &loadSuccess); + } else if (Qt::Vertical == orientation) { + mAddCityDocloader->load(":/xml/clockaddcitydialog.docml", + "portrait", &loadSuccess); + } + } + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_LOADSECTION_EXIT ); +} + +/*! + Slot to handle close action of search panel. + This slot cancels the search and dismisses the vkb. + */ +void ClockCitySelectionListPrivate::cancelSearch() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_CANCELSEARCH_ENTRY ); + // Clear the search criteria. + mSearchBox->setCriteria(QString("")); + + // Hide the virtual keyborad. + QInputContext *ic = qApp->inputContext(); + if (ic) { + QEvent *event = new QEvent(QEvent::CloseSoftwareInputPanel); + ic->filterEvent(event); + delete event; + } + + // Set focus to the first city in the list. + mListView->scrollTo(mProxyModel->index(0, 0)); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_CANCELSEARCH_EXIT ); +} + +/*! + Focuses the line edit when the city selection list is opened. + */ +void ClockCitySelectionListPrivate::focusLineEdit() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_FOCUSLINEEDIT_ENTRY ); + if (mSearchBox) { + // mView->scene()->setFocusItem(mSearchBox); + HbLineEdit *searchBoxEditor = 0; + searchBoxEditor = static_cast( + mSearchBox->primitive("lineedit")); + + if (searchBoxEditor) { + searchBoxEditor->setInputMethodHints(Qt::ImhNoPredictiveText); +/* HbMainWindow *window = hbInstance->allMainWindows().at(0); + window->scene()->setFocusItem(searchBoxEditor);*/ + + // searchBoxEditor->setCursorPosition(0); + searchBoxEditor->setFocus(); + } + + QInputContext *ic = qApp->inputContext(); + if (ic) { + QEvent *event = new QEvent(QEvent::RequestSoftwareInputPanel); + ic->filterEvent(event); + delete event; + } + } + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_FOCUSLINEEDIT_EXIT ); +} + +/*! + Displays the city selection list. + */ +void ClockCitySelectionListPrivate::showCityList() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_SHOWCITYLIST_ENTRY ); + // Construct the document loader. + bool success = false; + mLoader = new HbDocumentLoader; + mLoader->load(":/xml/clockcityselectionlist.docml", &success); + if (!success) { + qFatal("Unable to load the document."); + } + + // Get the selection view. + mView = static_cast (mLoader->findWidget(CITYSELECTIONLISTVIEW)); + if (!mView) { + qFatal("Unable to get the selection view."); + } + // Set the shrinking vkb host to prevent pushing of the list. + mVirtualKeyboard = new HbShrinkingVkbHost(mView); + + // Get the list view. + mListView = static_cast (mLoader->findWidget(CITYLISTVIEW)); + if (!mListView) { + qFatal("Unable to get the list view."); + } + + // Get the searchPanel. + mSearchBox = static_cast (mLoader->findWidget("lineEdit")); + if (!mSearchBox) { + qFatal("Unable to get the searchpanel."); + } + mSearchBox->setProgressive(true); + mSearchBox->setSearchOptionsEnabled(false); + + connect( + mSearchBox, SIGNAL(criteriaChanged(QString)), + this, SLOT(updateSearchCriteria(QString))); + connect(mSearchBox, SIGNAL(exitClicked()), + this, SLOT(cancelSearch())); + + // Construct the source model. + if (!mListModel) { + mListModel = new QStandardItemModel(0, 1, this); + } + // Construct the proxy model. + mProxyModel = new ClockCityListProxyModel(this); + mProxyModel->setDynamicSortFilter(true); + mProxyModel->setSourceModel(mListModel); + mProxyModel->setFilterRole(Qt::UserRole + 100); + + // Construct the model for the list. + QTimer::singleShot(1, this, SLOT(populateListModel())); + + // Set the model to the list. + mListView->setModel(mProxyModel); + + // Listen for list item activated signal. + connect( + mListView, SIGNAL(activated(QModelIndex)), + this, SLOT(handleItemActivated(QModelIndex))); + + // Read the actions for menu + mAddOwnCityAction = static_cast( + mLoader->findObject(ADDOWNCITYACTION)); + + // Listen for menu triggered signal + connect( + mAddOwnCityAction, SIGNAL(triggered()), + this, SLOT(handleAddOwnCityAction())); + + // Add the view to the main window and show it. + HbMainWindow *window = hbInstance->allMainWindows().at(0); + mBackAction = new HbAction(Hb::BackNaviAction, this); + mView->setNavigationAction(mBackAction); + connect( + mBackAction, SIGNAL(triggered()), + this, SLOT(handleBackAction())); + + window->addView(mView); + window->setCurrentView(mView); + + // Focus the search box. + focusLineEdit(); + + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_SHOWCITYLIST_EXIT ); +} + +/*! + Get all the time zone offset texts. + */ +QStringList ClockCitySelectionListPrivate::getOffsetTexts() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_GETOFFSETTEXTS_ENTRY ); + int offsetCount(mTimeZoneOffsetList.count()); + + // Get all the time zone offsets + if (!offsetCount) { + mTimeZoneOffsetList = mClient->getAllTimeZoneOffsets(); + offsetCount = mTimeZoneOffsetList.count(); + } + + QStringList offsetTextList; + int offsetvalue; + QString offsetText; + int hours; + int minutes; + HbExtendedLocale locale = HbExtendedLocale::system(); + for(int index=0;index0) { + offsetText += "+"; + } else if (hours<0) { + offsetText += "-"; + } + + offsetText += locale.format( + QTime(qAbs(hours),qAbs(minutes),0,0), + r_qtn_time_durat_short_with_zero); + + offsetTextList.append(offsetText); + offsetText.clear(); + } + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_GETOFFSETTEXTS_EXIT ); + return offsetTextList; +} + +/*! + Add city name edit field to add own city popup. + */ +void ClockCitySelectionListPrivate::addCityNameField() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_ADDCITYNAMEFIELD_ENTRY ); + mCityNameEdit = new HbLineEdit(); + mCityNameEdit->setFocus(Qt::MouseFocusReason); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_ADDCITYNAMEFIELD_EXIT ); +} + +/*! + Add timezone field to add own city popup. + */ +void ClockCitySelectionListPrivate::addTimeZoneField() +{ +OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_ADDTIMEZONEFIELD_ENTRY ); +// mTimeZoneComboBox = new HbComboBox(); + + QStringList texts = getOffsetTexts(); + mTimeZoneComboBox->addItems(texts); + + // Get the home city information. + LocationInfo homeCityInfo = mClient->getCurrentZoneInfoL(); + mCurrentTZOffsetIndex = mTimeZoneOffsetList.indexOf( + homeCityInfo.zoneOffset); + mTimeZoneComboBox->setCurrentIndex(mCurrentTZOffsetIndex); + + connect( + mTimeZoneComboBox, SIGNAL(currentIndexChanged(int)), + this, SLOT(handleTimeZoneSelection(int))); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_ADDTIMEZONEFIELD_EXIT ); +} + +/*! + Add country list field to add own city popup. + */ +void ClockCitySelectionListPrivate::addCountryListField() +{ + OstTraceFunctionEntry0( CLOCKCITYSELECTIONLISTPRIVATE_ADDCOUNTRYLISTFIELD_ENTRY ); + // Populate the country list based on the current TZ offset selected. + handleTimeZoneSelection(mCurrentTZOffsetIndex); + OstTraceFunctionExit0( CLOCKCITYSELECTIONLISTPRIVATE_ADDCOUNTRYLISTFIELD_EXIT ); +} + +// End of file --Don't remove this.