cmmanager/cpdestinationplugin/src/cpadddestinationentryitemdata.cpp
branchRCL_3
changeset 24 05bc53fe583b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmmanager/cpdestinationplugin/src/cpadddestinationentryitemdata.cpp	Tue Aug 31 15:35:44 2010 +0300
@@ -0,0 +1,235 @@
+/*
+* 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:  
+* Data item for representing "Add Destination" button in UI.
+*/
+
+// System includes
+
+#include <HbInputDialog>
+#include <HbAction>
+#include <HbMessageBox>
+#include <HbPopup>
+
+#include <cpitemdatahelper.h>
+#include <cmdestination_shim.h>
+#include <cmmanager_shim.h>
+
+// User includes
+
+#include "cpadddestinationentryitemdata.h"
+#include "cpdestinationgroup.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cpadddestinationentryitemdataTraces.h"
+#endif
+
+/*!
+    \class  CpAddDestinationEntryItemData
+    \brief  This class is a dummy destination. It does not contain 
+            access points but clicking it starts new destination 
+            creation process.
+*/
+
+// External function prototypes
+
+// Local constants
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+
+/*!
+    Constructor.
+    
+    @param[in] itemDataHelper Helper from Control Panel for making connections.
+    @param[in] parent Parent object.
+ */
+CpAddDestinationEntryItemData::CpAddDestinationEntryItemData(
+    CpItemDataHelper &itemDataHelper,
+    CpDestinationGroup *parent) :
+    CpSettingFormEntryItemData(CpSettingFormEntryItemData::ButtonEntryItem, itemDataHelper),
+    mParent(parent),
+    mDialog(0),
+    mOkAction(NULL)
+{
+    OstTraceFunctionEntry0(CPADDDESTINATIONENTRYITEMDATA_CPADDDESTINATIONENTRYITEMDATA_ENTRY);
+    OstTraceFunctionExit0(CPADDDESTINATIONENTRYITEMDATA_CPADDDESTINATIONENTRYITEMDATA_EXIT);
+}
+
+/*!
+    Destructor.
+ */
+CpAddDestinationEntryItemData::~CpAddDestinationEntryItemData()
+{
+    OstTraceFunctionEntry0(DUP1_CPADDDESTINATIONENTRYITEMDATA_CPADDDESTINATIONENTRYITEMDATA_ENTRY);
+    OstTraceFunctionExit0(DUP1_CPADDDESTINATIONENTRYITEMDATA_CPADDDESTINATIONENTRYITEMDATA_EXIT);
+}
+
+/*!
+    Inherited member from CpSettingFormEntryItemData. When this item is clicked
+    new dialog is started for creating new destination.
+ */
+void CpAddDestinationEntryItemData::onLaunchView()
+{
+    OstTraceFunctionEntry0(CPADDDESTINATIONENTRYITEMDATA_ONLAUNCHVIEW_ENTRY);
+    
+    mDialog = new HbInputDialog();
+    mDialog->setAttribute(Qt::WA_DeleteOnClose);
+    mDialog->lineEdit()->setMaxLength(CMManagerShim::CmNameLength);
+    mDialog->clearActions();
+    mDialog->setPromptText(hbTrId("txt_occ_dialog_destination_name"));
+    mDialog->setInputMode(HbInputDialog::TextInput);
+    mOkAction = new HbAction(
+        hbTrId("txt_common_button_ok"),
+        mDialog);
+    bool connected = connect(
+        mOkAction, 
+        SIGNAL(triggered()), 
+        this, 
+        SLOT(setNewDestinationName()));
+    Q_ASSERT(connected);
+    HbAction *cancelAction = new HbAction(
+        hbTrId("txt_common_button_cancel"),
+        mDialog);
+    mDialog->addAction(mOkAction);
+    mDialog->addAction(cancelAction);
+    mDialog->show();
+    
+    OstTraceFunctionExit0(CPADDDESTINATIONENTRYITEMDATA_ONLAUNCHVIEW_EXIT);
+}
+
+/*!
+    This function is called when user selects OK from destination
+    name query popup. The given name is valited and if the name is
+    valid, new destination is created in commsdat with given name.
+    If validation fails user is promted again for destination name.
+ */
+void CpAddDestinationEntryItemData::setNewDestinationName()
+{
+    OstTraceFunctionEntry0(CPADDDESTINATIONENTRYITEMDATA_SETNEWDESTINATIONNAME_ENTRY);
+    
+    QString destinationName = mDialog->value().toString();
+    bool destinationNameValid = false;
+    QSharedPointer<CmManagerShim> cmm;
+    QSharedPointer<CmDestinationShim> destination;
+    
+    try {
+        cmm = QSharedPointer<CmManagerShim>(new CmManagerShim());
+        if (isDestinationNameValid(destinationName, cmm.data())) {
+            // Destination name OK. Create new destination.
+            destination = QSharedPointer<CmDestinationShim>(
+                cmm->createDestination(destinationName));
+            destinationNameValid = true;
+        }
+    } catch (const std::exception&) {
+        OstTrace0(
+            TRACE_NORMAL,
+            DUP2_CPADDDESTINATIONENTRYITEMDATA_SETNEWDESTINATIONNAME,
+            "CpAddDestinationEntryItemData::setNewDestinationName: exception caught");
+        return;
+    }
+
+    if (destinationNameValid) {
+        // Update view
+        if (mParent != 0) {
+            mParent->addDestination(destinationName, destination);
+        }                
+    } else {
+        showErrorNote();
+    }
+    
+    OstTraceFunctionExit0(CPADDDESTINATIONENTRYITEMDATA_SETNEWDESTINATIONNAME_EXIT);
+}
+
+/*!
+    Inherited member from CpSettingFormEntryItemData. This item does not
+    create new view because it does not need one.
+    
+    \return NULL
+ */
+CpBaseSettingView *CpAddDestinationEntryItemData::createSettingView() const
+{
+	OstTraceFunctionEntry0(CPADDDESTINATIONENTRYITEMDATA_CREATESETTINGVIEW_ENTRY);
+	OstTraceFunctionExit0(CPADDDESTINATIONENTRYITEMDATA_CREATESETTINGVIEW_EXIT);
+	return NULL;
+}
+
+/*!
+    Function for checking if the given destination name is valid. Duplicate and
+    and empty names are rejected.
+    
+    @param[in] dest Name which user has entered to be the name of the new destination.
+    @param[in] cmm Pointer to CmManagerShim for accessing data in commsdat.
+    \return true if name is valid.
+ */
+bool CpAddDestinationEntryItemData::isDestinationNameValid(
+    const QString dest,
+    CmManagerShim *cmm) const
+{
+    OstTraceFunctionEntry0(CPADDDESTINATIONENTRYITEMDATA_ISDESTINATIONNAMEVALID_ENTRY);
+    
+    bool retVal = true;
+    
+    if (dest.length() > 0) {
+        QList<uint> destinationList;
+        cmm->allDestinations(destinationList);
+    
+        for (int i = 0; i < destinationList.count(); i ++) {
+            QScopedPointer<CmDestinationShim> destination(
+                cmm->destination(destinationList[i]));
+            if (0 == dest.compare(destination->name())) {
+                retVal = false;
+                break;
+            }
+        }
+    } else {
+        retVal = false;
+    }
+    
+    OstTraceFunctionExit0(CPADDDESTINATIONENTRYITEMDATA_ISDESTINATIONNAMEVALID_EXIT);
+    return retVal;
+}
+
+/*!
+ * Helper function for showing error note when user inputs
+ * invalid destination name.
+ */
+void CpAddDestinationEntryItemData::showErrorNote()
+{
+    OstTraceFunctionEntry0(CPADDDESTINATIONENTRYITEMDATA_SHOWERRORNOTE_ENTRY);
+    
+    // Destination name NOK. Inform user and ask again.
+    HbMessageBox *note = new HbMessageBox(HbMessageBox::MessageTypeInformation);
+    note->clearActions();
+    note->setAttribute(Qt::WA_DeleteOnClose);
+    QString info = hbTrId("txt_occ_info_invalid_name");
+    note->setText(info);
+    note->setTimeout(HbPopup::NoTimeout);
+    HbAction *errorOk = new HbAction(
+        hbTrId("txt_common_button_ok"),
+        note);
+    bool connected = connect(
+        errorOk,
+        SIGNAL(triggered()),
+        this,
+        SLOT(onLaunchView()));
+    Q_ASSERT(connected);                        
+    note->addAction(errorOk);
+    note->show();
+    
+    OstTraceFunctionExit0(CPADDDESTINATIONENTRYITEMDATA_SHOWERRORNOTE_EXIT);
+}