fixed plugin image size problem
[framework/uifw/elementary.git] / src / modules / ctxpopup_copypasteUI / copypaste.c
index ed79473..45a8956 100644 (file)
@@ -30,21 +30,90 @@ struct _Elm_Entry_Context_Menu_Item
 
 static void _ctxpopup_hide(Evas_Object *popup);
 static void _ctxpopup_position(Evas_Object *obj);
+
+static char *
+_remove_tags(const char *str)
+{
+   char *ret;
+   if (!str)
+     return NULL;
+
+   Eina_Strbuf *buf = eina_strbuf_new();
+   if (!buf)
+     return NULL;
+
+   if (!eina_strbuf_append(buf, str))
+     return NULL;
+
+   eina_strbuf_replace_all(buf, "<br>", " ");
+   eina_strbuf_replace_all(buf, "<br/>", " ");
+   eina_strbuf_replace_all(buf, "<ps>", " ");
+   eina_strbuf_replace_all(buf, "<ps/>", " ");
+
+   while (EINA_TRUE)
+     {
+        const char *temp = eina_strbuf_string_get(buf);
+
+        char *startTag = NULL;
+        char *endTag = NULL;
+
+        startTag = strstr(temp, "<");
+        if (startTag)
+          endTag = strstr(startTag, ">");
+        else
+          break;
+        if (!endTag || startTag > endTag)
+          break;
+
+        size_t sindex = startTag - temp;
+        size_t eindex = endTag - temp + 1;
+        if (!eina_strbuf_remove(buf, sindex, eindex))
+          break;
+     }
+   ret = eina_strbuf_string_steal(buf);
+   eina_strbuf_free(buf);
+   return ret;
+}
+
 static void
-_entry_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
+_entry_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   evas_object_del(data);
+}
+
+static void
+_entry_hide_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   evas_object_hide(data);
+}
+
+static void
+_entry_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info __UNUSED__)
 {
    if (evas_pointer_button_down_mask_get(e))
-     _ctxpopup_hide(ext_mod->popup);
+     _ctxpopup_hide(data);
    else
-     _ctxpopup_position(data);
+     {
+        /*update*/
+        elm_entry_extension_module_data_get(obj, ext_mod);
+        _ctxpopup_position(data);
+     }
+}
+
+static void
+_entry_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   _ctxpopup_hide(data);
 }
 
 static void
 _ctxpopup_hide(Evas_Object *popup)
 {
    evas_object_hide(popup);
-   evas_object_event_callback_del(ext_mod->caller, EVAS_CALLBACK_MOVE, _entry_move);
-   ext_mod->caller = NULL;
+   evas_object_event_callback_del(ext_mod->caller, EVAS_CALLBACK_DEL, _entry_del_cb);
+   evas_object_event_callback_del(ext_mod->caller, EVAS_CALLBACK_HIDE, _entry_hide_cb);
+   evas_object_event_callback_del(ext_mod->caller, EVAS_CALLBACK_MOVE, _entry_move_cb);
+   evas_object_event_callback_del(ext_mod->caller, EVAS_CALLBACK_RESIZE, _entry_resize_cb);
 }
 
 static void
@@ -53,6 +122,7 @@ _ctxpopup_position(Evas_Object *obj)
    if(!ext_mod) return;
 
    Evas_Coord cx, cy, cw, ch, x, y, w, h;
+   elm_ctxpopup_direction_priority_set(ext_mod->popup, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
    if (!edje_object_part_text_selection_geometry_get(ext_mod->ent, "elm.text", &x, &y, &w, &h))
      {
         evas_object_geometry_get(ext_mod->ent, &x, &y, NULL, NULL);
@@ -108,6 +178,17 @@ _ctxpopup_position(Evas_Object *obj)
           }
         cx = x + (w / 2);
         cy = y + (h / 2);
+        Elm_Ctxpopup_Direction dir = elm_ctxpopup_direction_get(ext_mod->popup);
+        if (dir != ELM_CTXPOPUP_DIRECTION_UNKNOWN)
+          {
+             if (dir == ELM_CTXPOPUP_DIRECTION_UP)
+               cy = y + (h / 5);
+             else if (dir == ELM_CTXPOPUP_DIRECTION_DOWN)
+               {
+                  elm_ctxpopup_direction_priority_set(ext_mod->popup, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_UP, ELM_CTXPOPUP_DIRECTION_LEFT, ELM_CTXPOPUP_DIRECTION_RIGHT);
+                  cy = y + h;
+               }
+          }
         evas_object_move(ext_mod->popup, cx, cy);
      }
 }
@@ -146,7 +227,7 @@ _cut(void *data, Evas_Object *obj, void *event_info)
 
    ext_mod->cut(data,obj,event_info);
    _ctxpopup_hide(obj);
-   elm_object_scroll_freeze_pop(ext_mod->popup);
+   //elm_object_scroll_freeze_pop(ext_mod->popup);
 }
 
 static void
@@ -156,7 +237,7 @@ _copy(void *data, Evas_Object *obj, void *event_info)
 
    ext_mod->copy(data,obj,event_info);
    _ctxpopup_hide(obj);
-   elm_object_scroll_freeze_pop(ext_mod->popup);
+   //elm_object_scroll_freeze_pop(ext_mod->popup);
 }
 
 static void
@@ -166,7 +247,7 @@ _cancel(void *data, Evas_Object *obj, void *event_info)
 
    ext_mod->cancel(data,obj,event_info);
    _ctxpopup_hide(obj);
-   elm_object_scroll_freeze_pop(ext_mod->popup);
+   //elm_object_scroll_freeze_pop(ext_mod->popup);
 }
 
 static void
@@ -185,9 +266,18 @@ _search_menu(void *data, Evas_Object *obj, void *event_info)
    appsvc_set_operation(b, APPSVC_OPERATION_SEARCH);
    if (ext_mod->selmode)
      {
-        char *selection = elm_entry_selection_get(ext_mod->caller);
+        const char *selection = elm_entry_selection_get(ext_mod->caller);
         if (selection)
-          appsvc_add_data(b, APPSVC_DATA_KEYWORD, selection);
+          {
+             char *str = _remove_tags(selection);
+             if (str)
+               {
+                  appsvc_add_data(b, APPSVC_DATA_KEYWORD, str);
+                  free(str);
+               }
+             else
+               appsvc_add_data(b, APPSVC_DATA_KEYWORD, selection);
+          }
      }
    appsvc_run_service(b, 0, NULL, NULL);
    bundle_free(b);
@@ -227,7 +317,7 @@ _ctxpopup_dismissed_cb(void *data, Evas_Object *o __UNUSED__, void *event_info _
 {
    if (!ext_mod) return;
 
-   elm_object_scroll_freeze_pop(ext_mod->popup);
+   //elm_object_scroll_freeze_pop(ext_mod->popup);
 }
 
 // module api funcs needed
@@ -296,18 +386,19 @@ obj_longpress(Evas_Object *obj)
         if(top)
           {
              ext_mod->popup = elm_ctxpopup_add(top);
-             elm_object_tree_unfocusable_set(ext_mod->popup, EINA_TRUE);
+             elm_object_tree_focus_allow_set(ext_mod->popup, EINA_FALSE);
              evas_object_smart_callback_add(ext_mod->popup, "dismissed", _ctxpopup_dismissed_cb, NULL);
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _entry_del_cb, ext_mod->popup);
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _entry_hide_cb, ext_mod->popup);
           }
         /*currently below theme not used,when guideline comes a new theme can be created if required*/
-        elm_object_style_set(ext_mod->popup,"extended/entry");
+        //elm_object_style_set(ext_mod->popup,"extended/entry");
         context_menu_orientation = edje_object_data_get
            (ext_mod->ent, "context_menu_orientation");
         if ((context_menu_orientation) &&
             (!strcmp(context_menu_orientation, "horizontal")))
           elm_ctxpopup_horizontal_set(ext_mod->popup, EINA_TRUE);
 
-        elm_widget_sub_object_add(obj, ext_mod->popup);
         if (!ext_mod->selmode)
           {
              if (!ext_mod->password)
@@ -340,10 +431,18 @@ obj_longpress(Evas_Object *obj)
                   //elm_ctxpopup_item_append(ext_mod->popup, "More", NULL, _clipboard_menu, obj );
                }
              // end for cbhm
-             icon = elm_icon_add(ext_mod->popup);
-             snprintf(buf, sizeof(buf), "%s/images/copy&paste_icon_search.png", PACKAGE_DATA_DIR);
-             elm_icon_file_set(icon, buf, NULL);
-             added_item = elm_ctxpopup_item_append(ext_mod->popup, NULL, icon, _search_menu, obj);  // Search
+
+             const char *entry_str;
+             char *str;
+             entry_str = edje_object_part_text_get(ext_mod->ent, "elm.text");
+             str = _remove_tags(entry_str);
+             if (strcmp(str, "") != 0)
+               {
+                  icon = elm_icon_add(ext_mod->popup);
+                  snprintf(buf, sizeof(buf), "%s/images/copy&paste_icon_search.png", PACKAGE_DATA_DIR);
+                  elm_icon_file_set(icon, buf, NULL);
+                  added_item = elm_ctxpopup_item_append(ext_mod->popup, NULL, icon, _search_menu, obj);  // Search
+               }
           }
         else
           {
@@ -390,11 +489,19 @@ obj_longpress(Evas_Object *obj)
                        //elm_ctxpopup_item_append(ext_mod->popup, "More", NULL, _clipboard_menu, obj );
                     }
                   // end for cbhm
-                  icon = elm_icon_add(ext_mod->popup);
-                  snprintf(buf, sizeof(buf), "%s/images/copy&paste_icon_search.png", PACKAGE_DATA_DIR);
-                  elm_icon_file_set(icon, buf, NULL);
-                  added_item = elm_ctxpopup_item_append(ext_mod->popup, NULL, icon, _search_menu, obj);  // Search
-               }
+
+                  const char *entry_str;
+                  char *str;
+                  entry_str = edje_object_part_text_get(ext_mod->ent, "elm.text");
+                  str = _remove_tags(entry_str);
+                  if (strcmp(str, "") != 0)
+                    {
+                       icon = elm_icon_add(ext_mod->popup);
+                       snprintf(buf, sizeof(buf), "%s/images/copy&paste_icon_search.png", PACKAGE_DATA_DIR);
+                       elm_icon_file_set(icon, buf, NULL);
+                       added_item = elm_ctxpopup_item_append(ext_mod->popup, NULL, icon, _search_menu, obj);  // Search
+                    }
+              }
           }
         EINA_LIST_FOREACH(ext_mod->items, l, it)
           {
@@ -402,11 +509,13 @@ obj_longpress(Evas_Object *obj)
           }
         if (ext_mod->popup && added_item)
           {
-             elm_object_scroll_freeze_push(ext_mod->popup);
+             //elm_object_scroll_freeze_push(ext_mod->popup);
              _ctxpopup_position(obj);
              evas_object_show(ext_mod->popup);
+             _ctxpopup_position(obj);
              ext_mod->caller = obj;
-             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _entry_move, ext_mod->popup);
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _entry_move_cb, ext_mod->popup);
+             evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _entry_resize_cb, ext_mod->popup);
           }
         else
           ext_mod->caller = NULL;