cnp: add types support for windows 63/85463/1
authorThiep Ha <thiep.ha@samsung.com>
Fri, 29 Jul 2016 01:26:54 +0000 (10:26 +0900)
committerThiep Ha <thiep.ha@samsung.com>
Thu, 25 Aug 2016 07:25:01 +0000 (16:25 +0900)
Change-Id: I44708422c49ffa774cf02f739caa48062984316a
Signed-off-by: Thiep Ha <thiep.ha@samsung.com>
src/lib/elm_cnp.c

index b933058..784bd45 100644 (file)
@@ -4880,9 +4880,10 @@ struct _Win32_Cnp_Selection
    void                  *udata;
    Elm_Sel_Format         requestformat;
    Elm_Drop_Cb            datacb;
-   Eina_Bool            (*set)(const Ecore_Win32_Window *window, const void *data, int size);
+   Eina_Bool            (*set)(const Ecore_Win32_Window *window, Ecore_Win32_Selection_Format format, const void *data, int size);
+   //Eina_Bool            (*set)(const Ecore_Win32_Window *window, const void *data, int size);
    Eina_Bool            (*clear)(const Ecore_Win32_Window *window);
-   Eina_Bool            (*get)(const Ecore_Win32_Window *window , void **data, int *size);
+   Eina_Bool            (*get)(const Ecore_Win32_Window *window, Ecore_Win32_Selection_Format format, void **data, int *size);
    Elm_Selection_Loss_Cb  loss_cb;
    void                  *loss_data;
 
@@ -5001,10 +5002,60 @@ _win32_elm_widget_window_get(const Evas_Object *obj)
    return win;
 }
 
+static void
+_win32_elm_cnp_converter_cb(void *udata, Ecore_Win32_Selection_Format format, void **data, int *length)
+{
+   Win32_Cnp_Selection *sel = udata;
+   if (!data)
+     {
+        DBG("returned data is not set");
+        return;
+     }
+
+   DBG("In");
+   if (sel->selbuf)
+     {
+        DBG("Has selbuf: '%s'", sel->selbuf);
+        int len = strlen(sel->selbuf);
+        char *formated_data = NULL;
+        if (format == ECORE_WIN32_SELECTION_FORMAT_TEXT)
+          {
+             char *str = calloc(1, len + 1);
+             strncpy(str, sel->selbuf, len);
+             formated_data = _elm_util_mkup_to_text(str);
+             DBG("Format: text");
+          }
+        else if (format == ECORE_WIN32_SELECTION_FORMAT_UNICODE_TEXT)
+          {
+             formated_data = calloc(1, len + 1);
+             strncpy(formated_data, sel->selbuf, len);
+             DBG("format: unicode text");
+          }
+        else
+          {
+             formated_data = calloc(1, len + 1);
+             strncpy(formated_data, sel->selbuf, len);
+             DBG("Format: other");
+          }
+
+        int flen = strlen(formated_data);
+        *data = calloc(1, flen + 1);
+        strncpy(*data, formated_data, flen);
+        DBG("Set data: '%s'", (char *)formated_data);
+
+        if (length)
+          {
+             *length = flen;
+          }
+        free(formated_data);
+     }
+}
+
 static Eina_Bool
 _win32_elm_cnp_selection_set(Ecore_Win32_Window *win, Evas_Object *obj, Elm_Sel_Type selection, Elm_Sel_Format format, const void *selbuf, size_t buflen)
 {
    Win32_Cnp_Selection *sel;
+   Ecore_Win32_Selection_Format ecore_format;
 
    if (selection != ELM_SEL_TYPE_CLIPBOARD)
      return EINA_FALSE;
@@ -5021,11 +5072,50 @@ _win32_elm_cnp_selection_set(Ecore_Win32_Window *win, Evas_Object *obj, Elm_Sel_
    sel->active = EINA_TRUE;
    sel->widget = obj;
    sel->win = win;
-   if (sel->set) sel->set(win, selbuf, buflen);
+   //if (sel->set) sel->set(win, selbuf, buflen);
+   ecore_format = ECORE_WIN32_SELECTION_FORMAT_TEXT;
+   if (format == ELM_SEL_FORMAT_TARGETS)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_MARKUP;
+        DBG("Set Format: TARGETS: Markup");
+     }
+   else if (format & ELM_SEL_FORMAT_TEXT)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_TEXT;
+        DBG("Set Format: Text");
+     }
+   else if (format & ELM_SEL_FORMAT_MARKUP)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_MARKUP;
+        DBG("Set Format: Markup");
+     }
+   else if (format & ELM_SEL_FORMAT_IMAGE)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_DIB;
+        DBG("Set Format: Dib");
+     }
+   else if (format & ELM_SEL_FORMAT_VCARD)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_VCARD;
+        DBG("Set Format: Vcard");
+     }
+   else if (format & ELM_SEL_FORMAT_HTML)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_HTML;
+        DBG("Set Format: Html");
+     }
+   else
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_TEXT;
+        DBG("Set Format: Other: Text");
+     }
+   if (sel->set) sel->set(win, ecore_format, selbuf, buflen);
    sel->format = format;
    sel->loss_cb = NULL;
    sel->loss_data = NULL;
 
+   ecore_win32_clipboard_converter_add(win, _win32_elm_cnp_converter_cb, sel);
+
    evas_object_event_callback_add
      (sel->widget, EVAS_CALLBACK_DEL, _win32_sel_obj_del, sel);
 
@@ -5110,6 +5200,7 @@ _win32_elm_cnp_selection_get(Ecore_Win32_Window *win,
    Win32_Cnp_Selection *sel;
    void *data;
    int size;
+   Ecore_Win32_Selection_Format ecore_format;
 
    if (selection != ELM_SEL_TYPE_CLIPBOARD)
      return EINA_FALSE;
@@ -5121,17 +5212,55 @@ _win32_elm_cnp_selection_get(Ecore_Win32_Window *win,
    if (sel->requestwidget)
      evas_object_event_callback_del_full(sel->requestwidget, EVAS_CALLBACK_DEL,
                                          _win32_sel_obj_del2, sel);
+
+   ecore_format = ECORE_WIN32_SELECTION_FORMAT_TEXT;
+   if (format == ELM_SEL_FORMAT_TARGETS)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_MARKUP;
+        DBG("Get Format: TARGETS: Markup");
+     }
+   else if (format & ELM_SEL_FORMAT_TEXT)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_TEXT;
+        DBG("Get Format: Text");
+     }
+   else if (format & ELM_SEL_FORMAT_MARKUP)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_MARKUP;
+        DBG("Get Format: Markup");
+     }
+   else if (format & ELM_SEL_FORMAT_IMAGE)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_DIB;
+        DBG("Get Format: Dib");
+     }
+   else if (format & ELM_SEL_FORMAT_VCARD)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_VCARD;
+        DBG("Get Format: Vcard");
+     }
+   else if (format & ELM_SEL_FORMAT_HTML)
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_HTML;
+        DBG("Get Format: Html");
+     }
+   else
+     {
+        ecore_format = ECORE_WIN32_SELECTION_FORMAT_TEXT;
+        DBG("Get Format: Other: Text");
+     }
    sel->requestformat = format;
    sel->requestwidget = (Evas_Object *)obj;
    sel->win = win;
-   sel->get(win, &data, &size);
+   sel->get(win, ecore_format, &data, &size);
    sel->datacb = datacb;
    sel->udata = udata;
 
    if (!data || (size <= 0))
      goto cb_add;
 
-   if ((sel->format & ELM_SEL_FORMAT_MARKUP) ||
+   DBG("Got: %s", (char *)data);
+   /*if ((sel->format & ELM_SEL_FORMAT_MARKUP) ||
        (sel->format & ELM_SEL_FORMAT_HTML))
      {
         char *str;
@@ -5153,7 +5282,7 @@ _win32_elm_cnp_selection_get(Ecore_Win32_Window *win,
              free(data);
              data = NULL;
           }
-     }
+     }*/
 
    if (sel->datacb && data && (size > 0))
      {