cmmanager/cpdestinationplugin/src/cpadddestinationentryitemdata.cpp
changeset 20 9c97ad6591ae
child 23 7ec726f93df1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmmanager/cpdestinationplugin/src/cpadddestinationentryitemdata.cpp	Mon May 03 12:53:07 2010 +0300
@@ -0,0 +1,213 @@
+/*
+ * 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(itemDataHelper),
+    mParent(parent),
+    mDialog(0)
+{
+    OstTraceFunctionEntry0(CPADDDESTINATIONENTRYITEMDATA_CPADDDESTINATIONENTRYITEMDATA_ENTRY);
+    // Fix connections
+    itemDataHelper.removeConnection(this,SIGNAL(pressed()),this,SLOT(onLaunchView()));
+    itemDataHelper.addConnection(this,SIGNAL(clicked()),this,SLOT(onLaunchView()));
+    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(DestinationNameMaxLength);
+    mDialog->clearActions();
+    mDialog->setPromptText(hbTrId("txt_occ_dialog_destination_name"));
+    mDialog->setInputMode(HbInputDialog::TextInput);
+    mOkAction = new HbAction(hbTrId("txt_common_button_ok"));
+    bool connected = connect(mOkAction, 
+                             SIGNAL(triggered()), 
+                             this, 
+                             SLOT(setNewDestinationName()));
+    Q_ASSERT(connected);
+    HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
+    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 destinationNameInvalid = true;
+    CmManagerShim *cmm = NULL;
+    CmDestinationShim *destination = NULL;
+    
+    try {
+        cmm = new CmManagerShim();
+        if (isDestinationNameValid(destinationName, cmm)) {
+            // Destination name OK. Create new destination.
+            destination = cmm->createDestination(destinationName);
+            destinationNameInvalid = false;
+        }
+    } catch (const std::exception&) {
+        OstTrace0( TRACE_NORMAL, DUP2_CPADDDESTINATIONENTRYITEMDATA_SETNEWDESTINATIONNAME, "CpAddDestinationEntryItemData::setNewDestinationName: exception caught" );
+        return;
+    }
+
+    if (!destinationNameInvalid) {
+        // Update view
+        if (mParent != 0) {
+            mParent->addDestination(destinationName, destination->id());
+        }                
+    } else {
+        showErrorNote();
+    }
+    delete destination;
+    delete cmm;
+    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 ++) {
+            CmDestinationShim *destination = cmm->destination(destinationList[i]);
+            if (0 == dest.compare(destination->name())) {
+                retVal = false;
+                break;
+            }
+            delete destination;
+        }
+    } 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"));
+    bool connected = connect(
+        errorOk,
+        SIGNAL(triggered()),
+        this,
+        SLOT(onLaunchView()));
+    Q_ASSERT(connected);                        
+    note->addAction(errorOk);
+    note->show();
+    OstTraceFunctionExit0(CPADDDESTINATIONENTRYITEMDATA_SHOWERRORNOTE_EXIT);
+}