ipsservices/nmipssettings/src/nmipssettingsmultiselectionitem.cpp
changeset 23 2dc6caa42ec3
child 30 759dc5235cdb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ipsservices/nmipssettings/src/nmipssettingsmultiselectionitem.cpp	Fri May 14 15:41:10 2010 +0300
@@ -0,0 +1,225 @@
+/*
+* 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 <QGraphicsLinearLayout>
+#include <QScopedPointer>
+#include <HbPushButton>
+#include <HbSelectionDialog>
+#include <HbLabel>
+#include <HbExtendedLocale>
+
+#include "nmipssettingsmultiselectionitem.h"
+
+/*!
+    \class NmIpsSettingsMultiSelectionItem
+    \brief The class implements a custom HbDataFormViewItem for showing multi selection dialog.
+
+*/
+
+// ======== MEMBER FUNCTIONS ========
+
+/*!
+    Constructor of NmIpsSettingsMultiSelectionItem.
+*/
+
+
+NmIpsSettingsMultiSelectionItem::NmIpsSettingsMultiSelectionItem(
+    QGraphicsItem *parent, Qt::WindowFlags wFlags)
+ : HbWidget(parent, wFlags),
+   mButton(0),
+   mSelectionDialog(0)
+{
+    // Create widget layout.
+    QScopedPointer<QGraphicsLinearLayout> layout(new QGraphicsLinearLayout(Qt::Vertical, this));
+    this->setLayout(layout.data());
+
+    // Create button.
+    mButton = new HbPushButton();
+    layout->addItem(mButton);
+
+    connect(mButton, SIGNAL(clicked()), this, SLOT(launchSelectionDialog()));
+    (void)layout.take();
+}
+
+/*!
+    Destructor of NmIpsSettingsMultiSelectionItem.
+*/
+NmIpsSettingsMultiSelectionItem::~NmIpsSettingsMultiSelectionItem()
+{
+    delete mSelectionDialog;
+}
+
+/*!
+    Returns shown text.
+
+    \return Shown text.
+*/
+QString NmIpsSettingsMultiSelectionItem::text() const
+{
+    return mButton->text();
+}
+
+/*!
+    Sets shown text.
+
+    \param text Shown text.
+*/
+void NmIpsSettingsMultiSelectionItem::setText(QString text)
+{
+    mButton->setText(text);
+}
+
+/*!
+    Returns items which are shown in dialog.
+
+    \return items which are shown in dialog.
+*/
+QStringList NmIpsSettingsMultiSelectionItem::stringItems() const
+{
+    return mItems;
+}
+
+/*!
+    Sets items which are shown in dialog.
+
+    \param items Items which are shown in dialog.
+*/
+void NmIpsSettingsMultiSelectionItem::setStringItems(QStringList items)
+{
+    mItems = items;
+    generateButtonText();
+}
+
+/*!
+    Returns selected items.
+
+    \return selected items.
+*/
+QList<QVariant> NmIpsSettingsMultiSelectionItem::selectedItems()const
+{
+    return mSelectedItems;
+}
+
+/*!
+    Sets selected items.
+
+    \param selectedItems Indexes of items which will be seleceted when dialog is shown.
+*/
+void NmIpsSettingsMultiSelectionItem::setSelectedItems(QList<QVariant> selectedItems)
+{
+    // Store selected items and generate button text.
+    mSelectedItems = selectedItems;
+    generateButtonText();
+}
+
+/*!
+    Returns heading text.
+
+    \return heading text.
+*/
+QString NmIpsSettingsMultiSelectionItem::heading() const
+{
+    return mHeading;
+}
+
+/*!
+    Sets heading text.
+
+    \param heading Shown heading text in dialog.
+*/
+void NmIpsSettingsMultiSelectionItem::setHeading(QString heading)
+{
+    mHeading = heading;
+}
+
+/*!
+    Launches the Selection dialog.
+*/
+void NmIpsSettingsMultiSelectionItem::launchSelectionDialog()
+{
+    if (mSelectionDialog) {
+        delete mSelectionDialog;
+        mSelectionDialog = 0;
+    }
+
+    // Create the dialog.
+    mSelectionDialog = new HbSelectionDialog();
+    mSelectionDialog->setSelectionMode(HbAbstractItemView::MultiSelection);
+    mSelectionDialog->setStringItems(mItems, mItems.count() + 1);
+    mSelectionDialog->setSelectedItems(mSelectedItems);
+
+    // Set the heading for the dialog.
+    HbLabel *headingLabel = new HbLabel(mHeading, mSelectionDialog);
+    mSelectionDialog->setHeadingWidget(headingLabel);
+    mSelectionDialog->open(this, SLOT(selectionDialogClosed(HbAction *)));
+}
+
+/*!
+    Handles the action from selection dialog.
+
+    \param action Dialog closing action.
+*/
+void NmIpsSettingsMultiSelectionItem::selectionDialogClosed(HbAction *action)
+{
+    if (action == mSelectionDialog->primaryAction()) {
+        // Get selected items.
+        mSelectedItems = mSelectionDialog->selectedItems();
+
+        // Generate button text from selected items.
+        generateButtonText();
+
+        QMap<QString, QVariant> properties;
+        properties.insert("selectedItems", mSelectedItems);
+
+        emit propertyChanged(properties);
+
+        // Emit the signal.
+        emit editingFinished();
+    }
+}
+
+/*!
+    Generates shown text from selected items.
+*/
+void NmIpsSettingsMultiSelectionItem::generateButtonText()
+{
+    // Generate button text only if both properties are valid.
+    const int itemCount(mItems.count());
+    if (mItems.count() >= mSelectedItems.count()) {
+        // Construct separator for button text.
+        QChar groupSeparator = HbExtendedLocale::system().groupSeparator();
+        QString separator(" ");
+        separator.insert(0, groupSeparator);
+
+        QString buttonText;
+        QListIterator<QVariant> itemIterator(mSelectedItems);
+        while (itemIterator.hasNext()) {
+            QVariant item(itemIterator.next());
+            bool conversionOk(false);
+            const int selectedIndex(item.toInt(&conversionOk));
+            if (conversionOk && (selectedIndex >= 0) && (selectedIndex < itemCount)) {
+                // Generate button text.
+                buttonText.append(mItems.at(selectedIndex));
+                // Add separator if not last item.
+                if (itemIterator.hasNext()) {
+                    buttonText.append(separator);
+                }
+            }
+        }
+        mButton->setText(buttonText);
+    }
+}