Implement flexible popup depend on text length
authorJihoon Chung <jihoon.chung@samsaung.com>
Sat, 28 Sep 2013 05:19:01 +0000 (14:19 +0900)
committerHoseon LEE <hoseon46.lee@samsung.com>
Mon, 14 Oct 2013 11:19:09 +0000 (20:19 +0900)
[Issue#]   P130927-03499
[Problem]  Layout of permission popup is broken
[Cause]    Current WRT doesn't set padding area to popup layout.
           Before it is working fine with default padding supported by elementary,
           the latest version has no padding area is supported.
[Solution] Change popup layout to use padding area.
           - Add padding(SPACER type) between contents and four sides of a popup.
           - Contents area(body text) removes minimum size. (Automatically set by elementary)
           Add scroller if text is overflown screen height.
           - Register "resize" callback to popup.
           - When callback is called, calculate screen height and popup height.
           - In case of popup height is over screen height, add scroller to popup.

[SCMRequest] N/A

Change-Id: Ic07a3209ebeebad0ac35bbab92aea1d5250b31f4

data/Wrt.edc
src/view/common/view_logic_certificate_support.cpp
src/view/common/view_logic_security_origin_support.cpp

index 280223a..f5e8244 100644 (file)
@@ -63,45 +63,114 @@ collections {
         name: "popupWithCheck";
         parts {
             part {
-                name: "bg";
-                type: RECT;
-                scale : 1;
+                name: "pad_t";
+                type: SPACER;
+                scale: 1;
                 description {
                     state: "default" 0.0;
+                    align: 0.5 0.0;
+                    min: 0 32;
+                    fixed: 0 1;
+                    rel1 { relative: 1.0 0.0;to_x: "pad_l"; }
+                    rel2 { relative: 0.0 0.0;to_x: "pad_r"; }
+                }
+            }
+            part {
+                name: "pad_l";
+                type: SPACER;
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    min: 26 0;
+                    max: 26 0;
+                    fixed: 1 0;
+                    rel1 { relative: 0.0 0.0; }
+                    rel2 { relative: 0.0 1.0; }
                     align: 0.0 0.0;
-                    min:  0 230;
-                    visible: 0;
+                }
+            }
+            part {
+                name: "pad_r";
+                type: SPACER;
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    min: 26 0;
+                    max: 26 0;
+                    fixed: 1 0;
+                    rel1 { relative: 1.0 0.0; }
+                    rel2 { relative: 1.0 1.0; }
+                    align: 1.0 0.0;
+                }
+            }
+            part {
+                name:"elm.swallow.label";
+                type: SWALLOW;
+                scale : 1;
+                description {
+                    state: "default" 0.0;
+                    fixed: 1 0;
                     rel1 {
-                        relative: 0.0 0.0;
+                        relative: 1.0 1.0;
+                        to_x: "pad_l";
+                        to_y: "pad_t";
                     }
                     rel2 {
-                        relative: 1.0 1.0;
+                        relative: 0.0 0.0;
+                        to_x: "pad_r";
+                        to_y: "pad_b";
                     }
                 }
             }
-            part{
-                name:"elm.swallow.label";
-                type: SWALLOW;
-                scale : 1;
+            part {
+                name: "bottom_pad";
+                type: SPACER;
+                scale: 1;
                 description {
                     state: "default" 0.0;
-                    align: 0.0 0.0;
-                    fixed: 1 1;
-                    rel1 { relative: 0.05 0.05; to: "bg"; }
-                    rel2 { relative: 0.95 0.8; to: "bg"; }
+                    align: 0.0 1.0;
+                    min: 0 32;
+                    fixed: 0 1;
+                    rel1 { relative: 1.0 1.0; to_x: "pad_l"; }
+                    rel2 { relative: 0.0 1.0; to_x: "pad_r"; }
                 }
             }
-            part{
-                name:"elm.swallow.checkbox";
+            part {
+                name: "pad_b";
+                type: SPACER;
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    align: 0.0 1.0;
+                    min: 0 84;
+                    fixed: 0 1;
+                    rel1 { relative: 0.0 0.0; to: "bottom_pad"; }
+                    rel2 { relative: 1.0 0.0; to: "bottom_pad"; }
+                }
+            }
+            part {
+                name: "end_field";
+                type: SPACER;
+                scale: 1;
+                description {
+                    state: "default" 0.0;
+                    align: 0.0 1.0;
+                    min: 0 63;
+                    fixed: 0 1;
+                    rel1 { relative: 0.0 1.0; to: "pad_b"; }
+                    rel2 { relative: 0.0 1.0; to: "pad_b"; }
+                }
+            }
+            part {
+                name: "elm.swallow.checkbox";
                 type: SWALLOW;
-                scale : 1;
+                scale: 1;
                 description {
                     state: "default" 0.0;
-                    visible: 1;
-                    align: 0.0 0.0;
                     fixed: 1 1;
-                    rel1 { relative: 0.1 0.8; to: "bg"; }
-                    rel2 { relative: 0.1 0.8; to: "bg"; }
+                    align: 0.0 0.5;
+                    rel1.to: "end_field";
+                    rel2.to: "end_field";
                 }
             }
         } //end of parts
index 96a8a09..a375f19 100644 (file)
@@ -26,6 +26,8 @@
 #include <Evas.h>
 #include <Elementary.h>
 #include <dpl/log/log.h>
+#include <dpl/log/secure_log.h>
+#include <dpl/unused.h>
 #include <dpl/assert.h>
 #include <dpl/wrt-dao-ro/common_dao_types.h>
 #include <wrt-commons/certificate-dao/certificate_dao.h>
 #include <common/view_logic_get_parent_window_util.h>
 
 namespace ViewModule {
+namespace {
+const double MAX_POPUP_HEIGHT = 0.80;
+const double MAX_SCROLLER_HEIGHT = 0.5;
+
+struct CallbackData {
+    Evas_Smart_Cb eaKeyCallback;
+};
+
+static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo);
+static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo);
+
+static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo)
+{
+    _D("called");
+
+    DPL_UNUSED_PARAM(data);
+    DPL_UNUSED_PARAM(e);
+    DPL_UNUSED_PARAM(eventInfo);
+
+    Assert(obj);
+    evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, resizeCallback);
+}
+static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo)
+{
+    _D("called");
+
+    DPL_UNUSED_PARAM(data);
+    DPL_UNUSED_PARAM(e);
+    DPL_UNUSED_PARAM(eventInfo);
+
+    Assert(obj);
+    Evas_Object* popup = obj;
+    int popupH;
+    evas_object_geometry_get(popup, 0, 0, 0, &popupH);
+
+    Evas_Object* parent = PopupUtil::getParentWindow(popup);
+    int parentW, parentH;
+    evas_object_geometry_get(parent, 0, 0, &parentW, &parentH);
+
+    // compare current popup height with screen height.
+    // To avoid popup is filled full screen, used magic number to be filled 80% of screen height.
+    // TODO: Automatically add scroller feature should implement in the elementary
+    double threshold = parentH * MAX_POPUP_HEIGHT;
+    double currentH = popupH;
+    if (threshold < currentH) {
+        _D("text is overflow popup height. add scroller");
+        Evas_Object* layout = elm_object_content_get(obj);
+        Evas_Object* label = elm_object_part_content_get(layout, "elm.swallow.label");
+
+        Evas_Object* scroller = elm_scroller_add(layout);
+        elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO);
+        evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+        evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
+        elm_scroller_content_min_limit(scroller, EINA_TRUE, EINA_TRUE);
+        int scrollerHeight = parentW > parentH ? parentH : parentW;
+        evas_object_size_hint_max_set(scroller, -1, scrollerHeight * MAX_SCROLLER_HEIGHT);
+
+        elm_object_part_content_unset(layout, "elm.swallow.label");
+        elm_object_content_set(scroller, label);
+        elm_object_part_content_set(layout, "elm.swallow.label", scroller);
+        evas_object_show(layout);
+    }
+}
+}
 
 class CertificateSupportImplementation
 {
@@ -96,34 +162,30 @@ Evas_Object* CertificateSupportUtil::createPopup(
 
     Evas_Object* parentWindow = PopupUtil::getParentWindow(window);
     Evas_Object* popup = elm_popup_add(parentWindow);
+
+    evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deleteCallback, NULL);
+    evas_object_event_callback_add(popup, EVAS_CALLBACK_RESIZE, resizeCallback, NULL);
+
     elm_object_style_set(popup, "popup/default");
-    evas_object_size_hint_weight_set(popup,
-                                     EVAS_HINT_EXPAND,
-                                     EVAS_HINT_EXPAND);
+    evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
     Evas_Object* layout = elm_layout_add(popup);
     elm_layout_file_set(layout, WRT_EDJ_PATH, "popupWithCheck");
-    evas_object_size_hint_weight_set(layout,
-                                     EVAS_HINT_EXPAND,
-                                     EVAS_HINT_EXPAND);
-
-    Evas_Object* scroller = elm_scroller_add(layout);
-    elm_scroller_policy_set(scroller,
-                            ELM_SCROLLER_POLICY_OFF,
-                            ELM_SCROLLER_POLICY_AUTO);
+    evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
-    Evas_Object* label = elm_label_add(scroller);
+    Evas_Object* label = elm_label_add(popup);
     elm_label_line_wrap_set(label, ELM_WRAP_WORD);
     elm_object_text_set(label, bodyText);
+    evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
-    Evas_Object* check = elm_check_add(scroller);
+    Evas_Object* check = elm_check_add(layout);
     elm_object_text_set(check, checkText);
-    evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
-    evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-    elm_object_part_content_set(layout, "elm.swallow.checkbox", check);
 
-    elm_object_content_set(scroller, label);
-    elm_object_part_content_set(layout, "elm.swallow.label", scroller);
+    elm_object_part_content_set(layout, "elm.swallow.label", label);
+    elm_object_part_content_set(layout, "elm.swallow.checkbox", check);
     elm_object_content_set(popup, layout);
 
     Evas_Object* btn1 = elm_button_add(popup);
index db7e90a..dcebefc 100644 (file)
 
 namespace ViewModule {
 namespace {
+const double MAX_POPUP_HEIGHT = 0.80;
+const double MAX_SCROLLER_HEIGHT = 0.5;
+
 struct CallbackData {
     Evas_Smart_Cb eaKeyCallback;
 };
 
 static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo);
+static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo);
+
 static void deleteCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo)
 {
+    _D("called");
+
     DPL_UNUSED_PARAM(e);
     DPL_UNUSED_PARAM(eventInfo);
 
-    Assert(data);
     CallbackData* callbackData = static_cast<CallbackData*>(data);
     Assert(obj);
-    ea_object_event_callback_del(obj, EA_CALLBACK_BACK, callbackData->eaKeyCallback);
-    delete callbackData;
+    if (callbackData) {
+        ea_object_event_callback_del(obj, EA_CALLBACK_BACK, callbackData->eaKeyCallback);
+        delete callbackData;
+    }
+    evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, resizeCallback);
+}
+static void resizeCallback(void* data, Evas* e, Evas_Object* obj, void* eventInfo)
+{
+    _D("called");
+
+    DPL_UNUSED_PARAM(data);
+    DPL_UNUSED_PARAM(e);
+    DPL_UNUSED_PARAM(eventInfo);
+
+    Assert(obj);
+    Evas_Object* popup = obj;
+    int popupH;
+    evas_object_geometry_get(popup, 0, 0, 0, &popupH);
+
+    Evas_Object* parent = PopupUtil::getParentWindow(popup);
+    int parentW, parentH;
+    evas_object_geometry_get(parent, 0, 0, &parentW, &parentH);
+
+    // compare current popup height with screen height.
+    // To avoid popup is filled full screen, used magic number to be filled 80% of screen height.
+    // TODO: Automatically add scroller feature should implement in the elementary
+    double threshold = parentH * MAX_POPUP_HEIGHT;
+    double currentH = popupH;
+    if (threshold < currentH) {
+        _D("text is overflow popup height. add scroller");
+        Evas_Object* layout = elm_object_content_get(obj);
+        Evas_Object* label = elm_object_part_content_get(layout, "elm.swallow.label");
+
+        Evas_Object* scroller = elm_scroller_add(layout);
+        elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_ON, ELM_SCROLLER_POLICY_AUTO);
+        evas_object_size_hint_weight_set(scroller, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+        evas_object_size_hint_align_set(scroller, EVAS_HINT_FILL, EVAS_HINT_FILL);
+        elm_scroller_content_min_limit(scroller, EINA_TRUE, EINA_TRUE);
+        int scrollerHeight = parentW > parentH ? parentH : parentW;
+        evas_object_size_hint_max_set(scroller, -1, scrollerHeight * MAX_SCROLLER_HEIGHT);
+
+        elm_object_part_content_unset(layout, "elm.swallow.label");
+        elm_object_content_set(scroller, label);
+        elm_object_part_content_set(layout, "elm.swallow.label", scroller);
+        evas_object_show(layout);
+    }
 }
 }
 
@@ -117,42 +167,35 @@ Evas_Object* SecurityOriginSupportUtil::createPopup(
     Evas_Object* parentWindow = PopupUtil::getParentWindow(window);
     Evas_Object* popup = elm_popup_add(parentWindow);
 
+    CallbackData* callbackData = NULL;
     if (keyCallback) {
         CallbackData* callbackData = new CallbackData;
         callbackData->eaKeyCallback = keyCallback;
-
         ea_object_event_callback_add(popup, EA_CALLBACK_BACK, keyCallback, data);
-        evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deleteCallback, static_cast<void*>(callbackData));
     }
+    evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, deleteCallback, static_cast<void*>(callbackData));
+    evas_object_event_callback_add(popup, EVAS_CALLBACK_RESIZE, resizeCallback, NULL);
 
     elm_object_style_set(popup, "popup/default");
-    evas_object_size_hint_weight_set(popup,
-                                     EVAS_HINT_EXPAND,
-                                     EVAS_HINT_EXPAND);
+    evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
     Evas_Object* layout = elm_layout_add(popup);
     elm_layout_file_set(layout, WRT_EDJ_PATH, "popupWithCheck");
-    evas_object_size_hint_weight_set(layout,
-                                     EVAS_HINT_EXPAND,
-                                     EVAS_HINT_EXPAND);
-
-    Evas_Object* scroller = elm_scroller_add(layout);
-    elm_scroller_policy_set(scroller,
-                            ELM_SCROLLER_POLICY_OFF,
-                            ELM_SCROLLER_POLICY_AUTO);
+    evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
-    Evas_Object* label = elm_label_add(scroller);
+    Evas_Object* label = elm_label_add(popup);
     elm_label_line_wrap_set(label, ELM_WRAP_WORD);
     elm_object_text_set(label, bodyText);
+    evas_object_size_hint_weight_set(label, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+    evas_object_size_hint_align_set(label, EVAS_HINT_FILL, EVAS_HINT_FILL);
 
-    Evas_Object* check = elm_check_add(scroller);
+    Evas_Object* check = elm_check_add(layout);
     elm_object_text_set(check, checkText);
-    evas_object_size_hint_align_set(check, EVAS_HINT_FILL, EVAS_HINT_FILL);
-    evas_object_size_hint_weight_set(check, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-    elm_object_part_content_set(layout, "elm.swallow.checkbox", check);
 
-    elm_object_content_set(scroller, label);
-    elm_object_part_content_set(layout, "elm.swallow.label", scroller);
+    elm_object_part_content_set(layout, "elm.swallow.label", label);
+    elm_object_part_content_set(layout, "elm.swallow.checkbox", check);
     elm_object_content_set(popup, layout);
 
     Evas_Object* btn1 = elm_button_add(popup);