phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp
changeset 30 ebdbd102c78a
parent 27 2f8f8080a020
child 51 f39ed5e045e0
--- a/phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp	Mon May 03 12:31:11 2010 +0300
+++ b/phonesettings/cpphonesettingsplugins/divertplugin/src/cpdivertplugingroup.cpp	Fri May 14 15:51:57 2010 +0300
@@ -15,6 +15,7 @@
  *
  */
 
+#include <QEventLoop>
 #include <hbdataformmodel.h>
 #include <hbdataformmodelitem.h>
 #include <hblineedit.h>
@@ -27,9 +28,6 @@
 #include <hblistwidget.h>
 #include <hblistwidgetitem.h>
 #include <hblabel.h>
-#include <QApplication>
-#include <QLocale>
-#include <QTranslator>
 #include <cpitemdatahelper.h>
 #include "cpdivertselectionitem.h"
 #include "cpdivertplugingroup.h"
@@ -42,6 +40,11 @@
 Q_DECLARE_METATYPE(PsCallDivertingCondition)
 Q_DECLARE_METATYPE(PsServiceGroup)
 
+// CONSTANTS 
+const QString KVoiceMail("voiceMail");
+const QString KVideoMail("voiceMail");
+const QString KOtherNumber("otherNumber");
+
 /*!
   CpDivertPluginGroup::CpDivertPluginGroup.
  */
@@ -61,7 +64,8 @@
        m_activeNoteId(0),
        m_activeProgressNoteId(0),
        m_divertToVoiceMailBox(false),
-       m_helper(helper)
+       m_helper(helper),
+       m_divertTimeout(0)
 {
     DPRINT << ": IN";
     
@@ -73,18 +77,6 @@
     qRegisterMetaType<PsServiceGroup>(
         "PsServiceGroup");
     
-    // Localization file loading
-    QTranslator translator; 
-    QString lang = QLocale::system().name();
-    QString path = "z:/resource/qt/translations/";
-    DPRINT << ": loading translation: " << QString(path + "telephone_cp_" + lang);
-    bool translatorLoaded = translator.load(path + "telephone_cp_" + lang);
-    DPRINT << ": translator loaded: " << translatorLoaded; 
-    if (translatorLoaded) {
-        qApp->installTranslator(&translator);
-        DPRINT << ": translator installed"; 
-    }
-    
     m_pSetWrapper = new PSetWrapper; 
     DPRINT << ": PSetWrapper created";
     
@@ -124,6 +116,9 @@
     // Create grouped setting items
     createVoiceCallItems(this);
     createVideoCallItems(this);
+    
+    m_eventLoop = new QEventLoop(this); 
+    
     DPRINT << ": OUT";
 }
 
@@ -289,8 +284,9 @@
 {
     DPRINT << ": IN";
     DPRINT << "item:" << item;
+    
     HbDataFormModelItem* modelItem = 
-            qobject_cast<HbDataFormModel*>(model())->itemFromIndex(item);
+            qobject_cast<const HbDataFormModel*>(item.model())->itemFromIndex(item);
     
     if (!modelItem->contentWidgetData("number").isValid() &&
         (static_cast<HbDataFormModelItem::DataItemType>
@@ -712,107 +708,168 @@
         const QString& heading, QString& result, PsServiceGroup serviceGroup)
 {
     DPRINT << ": IN";
-    const QString KVoiceMail("voiceMail");
-    const QString KVideoMail("voiceMail");
-    const QString KOtherNumber("otherNumber");
     
     bool requestOK(false);
-    m_divertToVoiceMailBox = false;
-    QStringList defNumbers;
-    HbDialog *dialog = createDialog(heading);
-    HbListWidget *list = new HbListWidget(dialog);
-    if (serviceGroup == ServiceGroupVoice) {
-        addItemToListWidget(
-            list, hbTrId("txt_phone_setlabel_voice_mbx"), KVoiceMail );
-    } else if(serviceGroup == ServiceGroupData) {
-        // TODO: Implement video voicemail
-    }
 
-    // Add "old" divert number to list
-    m_callDivertingWrapper->getDefaultNumbers(defNumbers);
-    int count(defNumbers.count());
-    for (int i = 0; i < count; i++) {
-        addItemToListWidget(list, defNumbers[i], defNumbers[i]);
+    if (!m_eventLoop->isRunning()){
+        m_divertNumber = ""; 
+        m_divertToVoiceMailBox = false;
+        QStringList defNumbers;
+        HbDialog *dialog = createDialog(heading);
+        m_voiceNumberList = new HbListWidget(dialog);
+        if (serviceGroup == ServiceGroupVoice) {
+            addItemToListWidget(
+                    m_voiceNumberList, hbTrId("txt_phone_setlabel_voice_mbx"), KVoiceMail );
+        } else if(serviceGroup == ServiceGroupData) {
+            // TODO: Implement video voicemail
+        }
+    
+        // Add "old" divert number to list
+        m_callDivertingWrapper->getDefaultNumbers(defNumbers);
+        int count(defNumbers.count());
+        for (int i = 0; i < count; i++) {
+            addItemToListWidget(m_voiceNumberList, defNumbers[i], defNumbers[i]);
+        }
+        addItemToListWidget(m_voiceNumberList, hbTrId("txt_phone_list_enter_number_manually"), KOtherNumber );
+        dialog->setContentWidget(m_voiceNumberList);
+        
+        // Connect list item activation signal to close the popup
+        QObject::connect(m_voiceNumberList, 
+                SIGNAL(activated(HbListWidgetItem*)), 
+                dialog, 
+                SLOT(close()), 
+                Qt::UniqueConnection);
+        
+        // Sets the "Cancel"-action/button
+        HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
+        dialog->addAction(cancelAction);
+        QObject::connect(cancelAction, 
+                SIGNAL(triggered(bool)), 
+                dialog, 
+                SLOT(close()));
+        
+        dialog->open(this, SLOT(voiceNumberListQueryClosed(HbAction *))); 
+        
+        QPointer<QObject> guard = this;
+        m_eventLoop->exec(); 
+        if (guard.isNull()) {
+            requestOK = false;
+        } else if (!m_divertNumber.isEmpty()) {
+            result = m_divertNumber;
+            requestOK = true;
+        }    
     }
-    addItemToListWidget(list, hbTrId("txt_phone_list_enter_number_manually"), KOtherNumber );
-    // Connect list item activation signal to close the popup
-    connect(
-        list, SIGNAL(activated(HbListWidgetItem*)), 
-        dialog, SLOT(close()));
-    // Sets the "Cancel"-action/button
-    HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
-    dialog->setPrimaryAction(cancelAction);
-    dialog->setContentWidget(list);
-    // Launch popup and handle the response
-    if (dialog->exec() != cancelAction) {
-        // Update the view with selected text
-        QString data = list->currentItem()->data().toString();
-        if (data == KVoiceMail) {
-            m_callDivertingWrapper->getVoiceMailBoxNumber(result);
-            if (result.size()) {
-                // voicemailboxnumber found
-                m_divertToVoiceMailBox = true;
-                requestOK = true;
-            }
-        } else if (data == KOtherNumber) {
-            requestOK = popUpNumberEditor(hbTrId("txt_phone_info_number"), result);
-        } else {
-            //TODO if matched contact name not work
-            result = data;
-            requestOK = true;
-        }
-    }
-    else {
-        DPRINT << ": Cancel";
-    }
-    disconnect(
-        list, SIGNAL(activated(HbListWidgetItem*)), 
-        dialog, SLOT(close()));
-    delete dialog;
     
+    DPRINT << ": OUT : result:" << result;
     DPRINT << ": OUT : requestOK :" << requestOK;
     return requestOK;
 }
 
 /*!
+    CpDivertPluginGroup::voiceNumberListQueryClosed()
+*/
+void CpDivertPluginGroup::voiceNumberListQueryClosed(HbAction* action)
+{
+    DPRINT << ": IN";
+    
+    bool exitLoop(true); 
+    
+    // Enter if cancel wasn't selected 
+    if (!action) {  
+        // Update the view with selected text
+        QString data = m_voiceNumberList->currentItem()->data().toString();
+        DPRINT << ": data: " << data; 
+        
+        if (data == KVoiceMail) {
+            m_callDivertingWrapper->getVoiceMailBoxNumber(m_divertNumber);
+            if (!m_divertNumber.isEmpty()) {
+                DPRINT << ": voicemailboxnumber found";
+            }
+            
+            m_eventLoop->quit();
+            
+        } else if (data == KOtherNumber) {
+                // Event loop is terminated by popUpNumberEditorClosed
+                exitLoop = false;
+                
+                DPRINT << ": open popUpNumberEditor";                
+                popUpNumberEditor(hbTrId("txt_phone_info_number"), m_divertNumber);
+        } else {
+            //TODO if matched contact name not work
+            DPRINT << ": else";
+            m_divertNumber = data;
+        }        
+        
+    }
+    
+    if (exitLoop) {
+        DPRINT << ": quit eventloop";
+        m_eventLoop->quit();
+    }
+    
+    DPRINT << ": OUT";
+}
+
+/*!
   CpDivertPluginGroup::popUpNumberEditor.
  */
-bool CpDivertPluginGroup::popUpNumberEditor(
+void CpDivertPluginGroup::popUpNumberEditor(
         const QString& heading, QString& result)
 {
     DPRINT << ": IN";
 
-    bool requestOK(false);
+    Q_UNUSED(result); 
+    
     HbDialog *dialog = createDialog(heading);
-    HbLineEdit *editor = new HbLineEdit(dialog);
-    HbEditorInterface editorInterface(editor);
-    editorInterface.setUpAsPhoneNumberEditor();
-    dialog->setContentWidget(editor);
+
+    m_voiceNumberEditor = new HbLineEdit(dialog);
+    m_voiceNumberEditor->setInputMethodHints(Qt::ImhDialableCharactersOnly);    
+    dialog->setContentWidget(m_voiceNumberEditor);
+    
     HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok"));
     dialog->addAction(okAction);
+    
     HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
-    dialog->setSecondaryAction(cancelAction);
+    dialog->addAction(cancelAction);
+    
+    dialog->open(this, SLOT(popUpNumberEditorClosed(HbAction*)));
     
-    HbAction *resultAction = dialog->exec();
-    if (resultAction == cancelAction) {
-        DPRINT << ": canceled";
+    DPRINT << ": OUT";
+}
+
+/*!
+  CpDivertPluginGroup::popUpNumberEditorClosed.
+ */
+void CpDivertPluginGroup::popUpNumberEditorClosed(HbAction* action)
+{
+    DPRINT << ": IN";
+    
+    bool cancelled(true); 
+    if (action) {
+        if (action->text() == hbTrId("txt_common_button_ok")) 
+            {
+            cancelled = false;  
+            DPRINT << ": ok selected";
+            }
     }
-    else {
-        result = editor->text();
-        DPRINT << ": number "
-            << result;
-        if (result.count()) {
-            requestOK = true;
-        }
-        else {
-            CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, 
-                hbTrId("txt_phone_info_invalid_phone_number"), HbMessageBox::MessageTypeWarning);
-        }
+    
+    if (!cancelled) {
+        m_divertNumber = m_voiceNumberEditor->text();
+            DPRINT << ": m_divertNumber "
+                << m_divertNumber;
+            if (m_divertNumber.isEmpty()) {
+                CpPhoneNotes::instance()->showGlobalNote(m_activeNoteId, 
+                    hbTrId("txt_phone_info_invalid_phone_number"), HbMessageBox::MessageTypeWarning);
+            }
     }
-    delete dialog;
     
-    DPRINT << ": OUT : requestOK :" << requestOK;
-    return requestOK;
+    if (m_voiceNumberEditor) {
+        delete m_voiceNumberEditor;
+        m_voiceNumberEditor = NULL; 
+    } 
+    
+    m_eventLoop->quit();
+    DPRINT << ": OUT";
 }
 
 /*!
@@ -845,50 +902,80 @@
 /*!
   CpDivertPluginGroup::popUpTimerQuery.
  */
-bool CpDivertPluginGroup::popUpTimerQuery(int &timeout) const
+bool CpDivertPluginGroup::popUpTimerQuery(int &timeout) 
 {
     DPRINT << ": IN";
+    Q_UNUSED(timeout); 
     
     bool requestOK(false);
-    HbDialog *dialog = createDialog(hbTrId("Time out"));
-    HbListWidget *list = new HbListWidget(dialog);
-    addItemToListWidget(list, hbTrId("5 second"), 5 );
-    addItemToListWidget(list, hbTrId("10 second"), 10);
-    addItemToListWidget(list, hbTrId("15 second"), 15);
-    addItemToListWidget(list, hbTrId("20 second"), 20);
-    addItemToListWidget(list, hbTrId("25 second"), 25);
-    addItemToListWidget(list, hbTrId("30 second"), 30);
-    // Connect list item activation signal to close the popup
-    connect(
-        list, SIGNAL(activated(HbListWidgetItem*)), 
-        dialog, SLOT(close()));
-    // Sets the "Cancel"-action/button
-    HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
-    dialog->setPrimaryAction(cancelAction);
-    dialog->setContentWidget(list);
-    // Launch popup and handle the response
-    if (dialog->exec() != cancelAction) {
-        // Update the view with selected text
-        if (list->currentItem()) {
-            timeout = list->currentItem()->data().toInt();
+    m_divertTimeout = 0; 
+    
+    if (!m_eventLoop->isRunning()) {
+        HbDialog *dialog = createDialog(hbTrId("txt_phone_title_delay"));
+        
+        if (m_popupTimerList) {
+            m_popupTimerList = new HbListWidget(dialog);
+            
+            addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_5_seconds"), 5 );
+            addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_10_seconds"), 10);
+            addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_15_seconds"), 15);
+            addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_20_seconds"), 20);
+            addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_25_seconds"), 25);
+            addItemToListWidget(m_popupTimerList, hbTrId("txt_phone_list_30_seconds"), 30);
+            
+            // Connect list item activation signal to close the popup
+            QObject::connect(
+                    m_popupTimerList, SIGNAL(activated(HbListWidgetItem*)), 
+                    dialog, SLOT(close()), 
+                    Qt::UniqueConnection);
         }
-        requestOK = true;
-    }
-    else {
-        DPRINT << ": Cancel";
+        
+        // Sets the "Cancel"-action/button
+        HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_cancel"));
+        dialog->addAction(cancelAction);
+        dialog->setContentWidget(m_popupTimerList);
+    
+        dialog->open(this, SLOT(popUpTimerQueryClosed(HbAction *))); 
+        
+        QPointer<QObject> guard = this;
+        m_eventLoop->exec(); 
+        if (guard.isNull()) {
+            requestOK = false;
+        } else if (m_divertTimeout > 0) {
+            requestOK = true;
+        }
     }
-
-    disconnect(
-        list, SIGNAL(activated(HbListWidgetItem*)), 
-        dialog, SLOT(close()));
-    delete dialog;
     
     DPRINT << ": OUT : requestOK :" << requestOK;
     return requestOK;
 }
 
 /*!
-  CpDivertPluginGroup::setbscParam.
+  CpDivertPluginGroup::popUpTimerQueryClosed.
+ */
+void CpDivertPluginGroup::popUpTimerQueryClosed(HbAction* action)
+{
+    // If not cancel action selected 
+    if (!action) {
+        // Update the view with selected text
+        if (m_popupTimerList->currentItem()) {
+            m_divertTimeout = 
+                    m_popupTimerList->currentItem()->data().toInt();
+        }
+    }
+    else {
+        DPRINT << ": Cancel";
+    }
+
+    DPRINT << ": quit eventloop";
+    m_eventLoop->quit();
+
+    DPRINT << ": OUT: timeout: " << m_divertTimeout;
+}
+
+
+/*!
+  CpDivertPluginGroup::bscParam.
  */
 int CpDivertPluginGroup::bscParam(PsServiceGroup serviceGroup)
 {