Add new popup: Ask YesNo with checkbox
authorPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Wed, 12 Dec 2012 09:53:19 +0000 (10:53 +0100)
committerPrzemyslaw Ciezkowski <p.ciezkowski@samsung.com>
Fri, 14 Dec 2012 07:59:23 +0000 (08:59 +0100)
[Issue#] N/A
[Bug] N/A
[Cause] Add new popup with checkbox to get user
option to remember his decision.
[Solution] Added new popup.
[Verification] Run test widget with custom handlers.

Change-Id: I7cc6828714fa0a2eb56f57f632f9f5fc20375eeb

src/wrt-popup/wrt/PopupEnum.h
src/wrt-popup/wrt/popup-bin/CMakeLists.txt
src/wrt-popup/wrt/popup-bin/YesNoCheckPopup.cpp [new file with mode: 0644]
src/wrt-popup/wrt/popup-bin/YesNoCheckPopup.h [new file with mode: 0644]
src/wrt-popup/wrt/popup-bin/YesNoPopup.cpp
src/wrt-popup/wrt/popup-bin/YesNoPopup.h
src/wrt-popup/wrt/popup-bin/wrt-popup.cpp
src/wrt-popup/wrt/popup-runner/PopupInvoker.cpp
src/wrt-popup/wrt/popup-runner/PopupInvoker.h

index 01af28e..3200ef4 100644 (file)
@@ -20,7 +20,8 @@
 namespace Wrt {
 enum PopupType {
     INFO_PROMPT = 1,
-    YES_NO_PROMPT
+    YES_NO_PROMPT,
+    YES_NO_CHECK_PROMPT
 };
 }
 
index 94327dc..d76b34e 100644 (file)
@@ -31,6 +31,7 @@ SET(WRT_POPUP_SRCS
     ${WRT_POPUP_COMMON_SRCS}
     wrt-popup.cpp
     YesNoPopup.cpp
+    YesNoCheckPopup.cpp
     InfoPopup.cpp
     renderer/evas_object.cpp
     renderer/popup_controller.cpp
diff --git a/src/wrt-popup/wrt/popup-bin/YesNoCheckPopup.cpp b/src/wrt-popup/wrt/popup-bin/YesNoCheckPopup.cpp
new file mode 100644 (file)
index 0000000..4a7e597
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * File:   YesNoCheckPopup.cpp
+ * Author: pciezkowski
+ *
+ * Created on December 12, 2012, 9:23 AM
+ */
+
+#include "YesNoCheckPopup.h"
+#include <memory>
+#include <string.h>
+#include "popup_manager.h"
+#include "PopupSerializer.h"
+
+namespace Wrt {
+namespace Popup {
+
+YesNoCheckPopup::~YesNoCheckPopup()
+{
+}
+
+Renderer::CtrlPopupPtr YesNoCheckPopup::createPopup(DPL::BinaryQueueAutoPtr data)
+{
+    std::string title = PopupSerializer::getStringArg(*data);
+    std::string message = PopupSerializer::getStringArg(*data);
+    std::string checkboxLabel = PopupSerializer::getStringArg(*data);
+    Assert(data->Empty());
+    LogDebug("title: " << title << " message: " << message << " checkbox: " <<
+            checkboxLabel);
+    Renderer::CtrlPopupPtr popup =
+        Renderer::PopupControllerSingleton::Instance().CreatePopup();
+
+    popup->SetTitle(title);
+    popup->Append(new Renderer::PopupObject::Label(message));
+    popup->Append(new Renderer::PopupObject::Check(checkboxLabel));
+    popup->Append(new Renderer::PopupObject::Button(YES_LABEL, POPUP_YES_VALUE));
+    popup->Append(new Renderer::PopupObject::Button(NO_LABEL, POPUP_NO_VALUE));
+    return popup;
+}
+
+void YesNoCheckPopup::responseCallback(
+        const Renderer::AnswerCallbackData &answer)
+{
+    bool result = (POPUP_YES_VALUE == answer.buttonAnswer);
+    DPL::BinaryQueue retValue;
+    PopupSerializer::appendArg(result, retValue);
+    LogDebug("Check state: " << answer.chackState);
+    PopupSerializer::appendArg(answer.chackState, retValue);
+    m_parent->response(retValue);
+}
+
+
+} // Popup
+} // Wrt
diff --git a/src/wrt-popup/wrt/popup-bin/YesNoCheckPopup.h b/src/wrt-popup/wrt/popup-bin/YesNoCheckPopup.h
new file mode 100644 (file)
index 0000000..710fc6c
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/**
+ * @file        YesNoCheckPopup.cpp
+ * @author      Przmeyslaw Ciezkowsko (p.ciezkowski@samsung.com)
+ * @version     1.0
+ * @brief       Popup that contains 'Yes' and 'No' buttons and checkbox. Inplementation
+ */
+
+#include "YesNoPopup.h"
+#include "wrt-popup.h"
+
+#ifndef WRT_YES_NO_CHECK_POPUP_H
+#define WRT_YES_NO_CHECK_POPUP_H
+
+namespace Wrt {
+namespace Popup {
+
+class YesNoCheckPopup: public YesNoPopup {
+public:
+    virtual ~YesNoCheckPopup();
+protected:
+    virtual Renderer::CtrlPopupPtr createPopup(DPL::BinaryQueueAutoPtr data);
+    virtual void responseCallback(const Renderer::AnswerCallbackData &answer);
+
+};
+
+} // Popup
+} // Wrt
+
+#endif /* WRT_YES_NO_CHECK_POPUP_H */
+
index 9f7646b..9951954 100644 (file)
 #include "popup_manager.h"
 #include "PopupSerializer.h"
 
-namespace {
-const char YES_LABEL[] = "Yes";
-const char NO_LABEL[] = "No";
-const int POPUP_YES_VALUE = 1;
-const int POPUP_NO_VALUE = 2;
-} //anonymous
-
 namespace Wrt {
 namespace Popup {
 
 void YesNoPopup::show(DPL::BinaryQueueAutoPtr data, WrtPopup* parent)
 {
     LogDebug("Entered");
-    std::string title = PopupSerializer::getStringArg(*data);
-    std::string message = PopupSerializer::getStringArg(*data);
-    Assert(data->Empty());
-    LogDebug("title: " << title << " message: " << message);
-
     m_parent = parent;
-
-    Renderer::CtrlPopupPtr popup =
-        Renderer::PopupControllerSingleton::Instance().CreatePopup();
-
-    popup->SetTitle(title);
-    popup->Append(new Renderer::PopupObject::Label(message));
-
-    popup->Append(new Renderer::PopupObject::Button(YES_LABEL, POPUP_YES_VALUE));
-    popup->Append(new Renderer::PopupObject::Button(NO_LABEL, POPUP_NO_VALUE));
-
+    Renderer::CtrlPopupPtr popup = createPopup(data);
     ListenForAnswer(popup);
 
     Renderer::ShowPopupEventShort event(popup,
@@ -77,5 +56,26 @@ void YesNoPopup::responseCallback(const Renderer::AnswerCallbackData &answer)
     m_parent->response(retValue);
 }
 
+YesNoPopup::~YesNoPopup()
+{
+}
+
+Renderer::CtrlPopupPtr YesNoPopup::createPopup(DPL::BinaryQueueAutoPtr data)
+{
+    std::string title = PopupSerializer::getStringArg(*data);
+    std::string message = PopupSerializer::getStringArg(*data);
+    Assert(data->Empty());
+    LogDebug("title: " << title << " message: " << message);
+    Renderer::CtrlPopupPtr popup =
+        Renderer::PopupControllerSingleton::Instance().CreatePopup();
+
+    popup->SetTitle(title);
+    popup->Append(new Renderer::PopupObject::Label(message));
+
+    popup->Append(new Renderer::PopupObject::Button(YES_LABEL, POPUP_YES_VALUE));
+    popup->Append(new Renderer::PopupObject::Button(NO_LABEL, POPUP_NO_VALUE));
+    return popup;
+}
+
 } // Popup
 } // Wrt
index 8001d93..8b07ba7 100644 (file)
 namespace Wrt {
 namespace Popup {
 
+const char YES_LABEL[] = "Yes";
+const char NO_LABEL[] = "No";
+const int POPUP_YES_VALUE = 1;
+const int POPUP_NO_VALUE = 2;
+
 class YesNoPopup : public IPopup
 {
 public:
     virtual void show(DPL::BinaryQueueAutoPtr data, WrtPopup* parent);
-
-private:
-
-    void responseCallback(const Renderer::AnswerCallbackData &answer);
+    virtual ~YesNoPopup();
+protected:
+    virtual Renderer::CtrlPopupPtr createPopup(DPL::BinaryQueueAutoPtr data);
+    virtual void responseCallback(const Renderer::AnswerCallbackData &answer);
     WrtPopup* m_parent;
 };
 
index 2b369a9..a97d9c3 100644 (file)
@@ -26,6 +26,7 @@
 #include "PopupSerializer.h"
 #include "YesNoPopup.h"
 #include "InfoPopup.h"
+#include "YesNoCheckPopup.h"
 
 namespace Wrt {
 namespace Popup {
@@ -108,6 +109,10 @@ void WrtPopup::readInputData()
         m_popup.reset(new InfoPopup());
         m_popup->show(data, this);
         break;
+    case YES_NO_CHECK_PROMPT:
+        m_popup.reset(new YesNoCheckPopup());
+        m_popup->show(data, this);
+        break;
     default:
         Assert(false);
     }
index 6ed9dc9..9b50a88 100644 (file)
@@ -134,6 +134,58 @@ void PopupInvoker::showInfo(const std::string& title,
     }
 }
 
+PopupResponse PopupInvoker::askYesNoCheckbox(const std::string& title,
+    const std::string& message, const std::string& checkboxLabel)
+{
+    Try
+    {
+        DPL::BinaryQueue data;
+        PopupSerializer::appendArg(YES_NO_CHECK_PROMPT, data);
+        PopupSerializer::appendArg(title, data);
+        PopupSerializer::appendArg(message, data);
+        PopupSerializer::appendArg(checkboxLabel, data);
+        DPL::NamedInputPipe tmp;
+        tmp.Open(m_outputName);
+        m_output.Open(m_outputName);
+        m_input.Open(m_inputName);
+        m_output.Write(data, data.Size());
+
+        executePopup();
+
+        //Result from popup application is available. Read it.
+        DPL::BinaryQueueAutoPtr resultData =
+            m_input.Read(std::numeric_limits<std::size_t>::max());
+        const int result = PopupSerializer::getIntArg(*resultData);
+        const int rememberResult = PopupSerializer::getIntArg(*resultData);
+
+        LogDebug("Popup result is: " << result << " remeber: " << rememberResult);
+
+        Assert(resultData->Empty());
+        tmp.Close();
+        m_input.Close();
+        m_output.Close();
+
+        if (1 == result) {
+            if (rememberResult == 1) {
+                return YES_DO_REMEMBER;
+            } else {
+                return YES_DONT_REMEMBER;
+            }
+        } else {
+            if (rememberResult == 1) {
+                return NO_DO_REMEMBER;
+            } else {
+                return NO_DONT_REMEMBER;
+            }
+        }
+    }
+    Catch(DPL::Exception)
+    {
+        LogError("error occured");
+    }
+    return NO_DONT_REMEMBER;
+}
+
 void PopupInvoker::executePopup()
 {
     pid_t pid = fork();
index 33df799..112028f 100644 (file)
 namespace Wrt {
 namespace Popup {
 
+enum PopupResponse {
+    NO_DO_REMEMBER,
+    NO_DONT_REMEMBER,
+    YES_DONT_REMEMBER,
+    YES_DO_REMEMBER
+};
+
 class PopupInvoker
 {
 public:
@@ -50,6 +57,8 @@ public:
     void showInfo(const std::string &title,
                   const std::string &message,
                   const std::string &buttonLabel = std::string("OK"));
+    PopupResponse askYesNoCheckbox(const std::string& title,
+            const std::string& message, const std::string& checkboxLabel);
 
 private: