hermet pushed a commit to branch master.

commit 633cb4e0193f6b5abe4deed8377b4c6b10ce882a
Author: ChunEon Park <[email protected]>
Date:   Tue Apr 23 16:49:49 2013 +0900

    elementary/widget - added elm_object_part_text_translatble_set()
---
 ChangeLog            |   4 +
 NEWS                 |   1 +
 src/lib/elm_layout.c |   1 +
 src/lib/elm_main.c   |   7 ++
 src/lib/elm_object.h |  29 +++++++
 src/lib/elm_widget.c | 230 ++++++++++++++++++++++++++++++++++++++-------------
 src/lib/elm_widget.h |  32 +++++++
 7 files changed, 248 insertions(+), 56 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8c00e7f..68abc32 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1272,3 +1272,7 @@
 2013-04-22  Shinwoo Kim
 
         * Make access object unfocusable when Aaccessibility is disabled.
+
+2013-04-23  ChunEon Park
+
+        * Added elm_object_domain_part_text_translatable_set().
diff --git a/NEWS b/NEWS
index 54a9f05..d76c982 100644
--- a/NEWS
+++ b/NEWS
@@ -62,6 +62,7 @@ Additions:
    * Add the API elm_scroller_single_direction_set/get.
    * Add the feature for key events.
    * Add elm_access_action(), elm_access_action_cb_set()
+       * Add elm_object_domain_part_text_translatable_set()
 
 Improvements:
 
diff --git a/src/lib/elm_layout.c b/src/lib/elm_layout.c
index b033a8b..ffe91db 100644
--- a/src/lib/elm_layout.c
+++ b/src/lib/elm_layout.c
@@ -1571,6 +1571,7 @@ elm_layout_text_set(Evas_Object *obj,
 {
    ELM_LAYOUT_CHECK(obj) EINA_FALSE;
    Eina_Bool ret = EINA_FALSE;
+   text = elm_widget_part_text_translate(obj, part, text);
    eo_do(obj, elm_obj_layout_text_set(part, text, &ret));
    return ret;
 }
diff --git a/src/lib/elm_main.c b/src/lib/elm_main.c
index a83a72a..a055f28 100644
--- a/src/lib/elm_main.c
+++ b/src/lib/elm_main.c
@@ -1100,6 +1100,13 @@ elm_object_translatable_part_text_get(const Evas_Object 
*obj, const char *part)
    return elm_widget_translatable_part_text_get(obj, part);
 }
 
+EAPI void
+elm_object_domain_part_text_translatable_set(Evas_Object *obj, const char 
*part, const char *domain, Eina_Bool translatable)
+{
+   EINA_SAFETY_ON_NULL_RETURN(obj);
+   elm_widget_domain_part_text_translatable_set(obj, part, domain, 
translatable);
+}
+
 EINA_DEPRECATED EAPI void
 elm_object_domain_translatable_text_part_set(Evas_Object *obj, const char 
*part, const char *domain, const char *text)
 {
diff --git a/src/lib/elm_object.h b/src/lib/elm_object.h
index e9824e1..bc9c886 100644
--- a/src/lib/elm_object.h
+++ b/src/lib/elm_object.h
@@ -84,6 +84,35 @@ EAPI const char *elm_object_translatable_part_text_get(const 
Evas_Object *obj, c
 #define elm_object_translatable_text_get(obj) 
elm_object_translatable_part_text_get((obj), NULL)
 
 /**
+ * Mark the part text to be transltable or not.
+ *
+ * Once you mark the part text to be translatable, the text will be translated
+ * internally regardless of elm_object_part_text_set() and
+ * elm_object_domain_translatable_part_text_set(). In other case, if you set 
the
+ * Elementary policy that all text will be translatable in default, you can set
+ * the part text to not be translated by calling this API.
+ *
+ * @param obj The object containing the text part
+ * @param part The part name of the translatable text
+ * @param domain The translation domain to use
+ * @param translatable @c EINA_TRUE, the part text will be translated
+ *        internally. @c EINA_FALSE, otherwise.
+ *
+ * @see elm_object_domain_part_text_translatable_set()
+ * @see elm_object_part_text_set()
+ * @see elm_policy()
+ *
+ * @since 1.8
+ *
+ * @ingroup General
+ */
+EAPI void elm_object_domain_part_text_translatable_set(Evas_Object *obj, const 
char *part, const char *domain, Eina_Bool translatable);
+
+#define elm_object_part_text_translatable_set(obj, part, translatable) 
elm_object_domain_part_text_translatable_set((obj), (part), NULL, 
(translatable))
+
+#define elm_object_domain_text_translatable_set(obj, domain, translatable) 
elm_object_domain_part_text_translatable_set((obj), NULL, (domain), 
(translatable))
+
+/**
  * Set the content on part of a given container widget
  *
  * @param obj The Elementary container widget
diff --git a/src/lib/elm_widget.c b/src/lib/elm_widget.c
index 5fb9ace..02220d6 100644
--- a/src/lib/elm_widget.c
+++ b/src/lib/elm_widget.c
@@ -38,6 +38,7 @@ struct _Elm_Translate_String_Data
    Eina_Stringshare *id;
    Eina_Stringshare *domain;
    Eina_Stringshare *string;
+   Eina_Bool   preset : 1;
 };
 
 /* local subsystem globals */
@@ -3760,53 +3761,64 @@ 
elm_widget_domain_translatable_part_text_set(Evas_Object *obj,
    eo_do(obj, elm_wdg_domain_translatable_part_text_set(part, domain, label));
 }
 
-static Eina_Bool
-_translatable_part_text_set(Eina_List **translate_strings, const char *part, 
const char *domain, const char *label)
+static Elm_Translate_String_Data *
+_translate_string_data_get(Eina_List *translate_strings, const char *part)
 {
-   const char *str;
-   Eina_List *t, *l;
-   Elm_Translate_String_Data *ts = NULL;
+   Elm_Translate_String_Data *ts;
+   Eina_Stringshare *str;
+   Eina_List *l;
+
+   if (eina_list_count(translate_strings) == 0) return NULL;
 
-   t = *translate_strings;
    str = eina_stringshare_add(part);
-   EINA_LIST_FOREACH(t, l, ts)
+   EINA_LIST_FOREACH(translate_strings, l, ts)
      {
         if (ts->id == str) break;
         else ts = NULL;
      }
+   eina_stringshare_del(str);
 
-   if (!ts && !label)
-     eina_stringshare_del(str);
-   else if (!ts)
-     {
-        ts = malloc(sizeof(Elm_Translate_String_Data));
-        if (!ts) return EINA_FALSE;
+   return ts;
+}
 
-        ts->id = str;
-        ts->domain = eina_stringshare_add(domain);
-        ts->string = eina_stringshare_add(label);
-        t = eina_list_append(t, ts);
-     }
-   else
+static Elm_Translate_String_Data *
+_part_text_translatable_set(Eina_List **translate_strings, const char *part, 
Eina_Bool translatable, Eina_Bool preset)
+{
+   Eina_List *t;
+   Elm_Translate_String_Data *ts;
+   t = *translate_strings;
+   ts = _translate_string_data_get(t, part);
+
+   if (translatable)
      {
-        if (label)
+        if (!ts)
           {
-             eina_stringshare_replace(&ts->domain, domain);
-             eina_stringshare_replace(&ts->string, label);
+             ts = ELM_NEW(Elm_Translate_String_Data);
+             if (!ts) return NULL;
+
+             ts->id = eina_stringshare_add(part);
+             t = eina_list_append(t, ts);
           }
-        else
+        if (preset) ts->preset = EINA_TRUE;
+     }
+   //Delete this exist one if this part has been not preset.
+   //see elm_widget_part_text_translatable_set()
+   else if ((preset) || (!ts->preset))
+     {
+        if (ts)
           {
-             t = eina_list_remove_list(t, l);
+             t = eina_list_remove(t, ts);
              eina_stringshare_del(ts->id);
              eina_stringshare_del(ts->domain);
              eina_stringshare_del(ts->string);
              free(ts);
+             ts = NULL;
           }
-        eina_stringshare_del(str);
      }
 
    *translate_strings = t;
-   return EINA_TRUE;
+
+   return ts;
 }
 
 static void
@@ -3817,14 +3829,30 @@ _elm_widget_domain_translatable_part_text_set(Eo *obj, 
void *_pd, va_list *list)
    const char *label = va_arg(*list, const char *);
 
    Elm_Widget_Smart_Data *sd = _pd;
+   Elm_Translate_String_Data *ts;
 
-   if (!_translatable_part_text_set(&sd->translate_strings, part, domain,
-                                    label)) return;
+   if (!label)
+     {
+        _part_text_translatable_set(&sd->translate_strings, part, EINA_FALSE,
+                                    EINA_FALSE);
+     }
+   else
+     {
+        ts = _part_text_translatable_set(&sd->translate_strings, part,
+                                         EINA_TRUE, EINA_FALSE);
+        if (!ts) return;
+        if (!ts->string) ts->string = eina_stringshare_add(label);
+        else eina_stringshare_replace(&ts->string, label);
+        if (!ts->domain) ts->domain = eina_stringshare_add(domain);
+        else eina_stringshare_replace(&ts->domain, domain);
 #ifdef HAVE_GETTEXT
-   if (label && label[0])
-     label = dgettext(domain, label);
+        if (label[0]) label = dgettext(domain, label);
 #endif
-   elm_widget_part_text_set(obj, part, label);
+     }
+
+   sd->on_translate = EINA_TRUE;
+   eo_do(obj, elm_wdg_part_text_set(part, label));
+   sd->on_translate = EINA_FALSE;
 }
 
 EAPI const char *
@@ -3837,33 +3865,57 @@ elm_widget_translatable_part_text_get(const Evas_Object 
*obj,
    return ret;
 }
 
-static const char *
-_translatable_part_text_get(Eina_List *translate_strings, const char *part)
+static void
+_elm_widget_translatable_part_text_get(Eo *obj EINA_UNUSED, void *_pd, va_list 
*list)
 {
+   const char *part = va_arg(*list, const char *);
+   const char **ret = va_arg(*list, const char **);
+
+   Elm_Widget_Smart_Data *sd = _pd;
    Elm_Translate_String_Data *ts;
-   const char*ret = NULL, *str;
-   Eina_List *l;
 
-   str = eina_stringshare_add(part);
-   EINA_LIST_FOREACH(translate_strings, l, ts)
-     if (ts->id == str)
-       {
-          ret = ts->string;
-          break;
-       }
-   eina_stringshare_del(str);
+   ts = _translate_string_data_get(sd->translate_strings, part);
+   if (ts) *ret = ts->string;
+   else *ret = NULL;
+}
 
-   return ret;
+EAPI void
+elm_widget_domain_part_text_translatable_set(Evas_Object *obj, const char 
*part, const char *domain, Eina_Bool translatable)
+{
+   ELM_WIDGET_CHECK(obj);
+   eo_do(obj,
+         elm_wdg_domain_part_text_translatable_set(part, domain, 
translatable));
 }
 
 static void
-_elm_widget_translatable_part_text_get(Eo *obj EINA_UNUSED, void *_pd, va_list 
*list)
+_elm_widget_domain_part_text_translatable_set(Eo *obj, void *_pd, va_list 
*list)
 {
    const char *part = va_arg(*list, const char *);
-   const char **ret = va_arg(*list, const char **);
+   const char *domain = va_arg(*list, const char *);
+   Eina_Bool translatable = va_arg(*list, int);
 
    Elm_Widget_Smart_Data *sd = _pd;
-   *ret = _translatable_part_text_get(sd->translate_strings, part);
+   Elm_Translate_String_Data *ts;
+   const char *text;
+
+   ts = _part_text_translatable_set(&sd->translate_strings, part,
+                                    translatable, EINA_TRUE);
+   if (!ts) return;
+   if (!ts->domain) ts->domain = eina_stringshare_add(domain);
+   else eina_stringshare_replace(&ts->domain, domain);
+
+   eo_do(obj, elm_wdg_part_text_get(part, &text));
+   if (!text || !text[0]) return;
+
+   if (!ts->string) ts->string = eina_stringshare_add(text);
+
+//Try to translate text since we don't know the text is already translated.
+#ifdef HAVE_GETTEXT
+   text = dgettext(domain, text);
+#endif
+   sd->on_translate = EINA_TRUE;
+   eo_do(obj, elm_wdg_part_text_set(part, text));
+   sd->on_translate = EINA_FALSE;
 }
 
 EAPI void
@@ -3873,24 +3925,70 @@ elm_widget_translate(Evas_Object *obj)
    eo_do(obj, elm_wdg_translate(NULL));
 }
 
+static const char*
+_part_text_translate(Eina_List *translate_strings,
+                     const char *part,
+                     const char *text)
+{
+   Elm_Translate_String_Data *ts;
+   ts = _translate_string_data_get(translate_strings, part);
+   if (!ts) return text;
+
+   if (!ts->string) ts->string = eina_stringshare_add(text);
+   else eina_stringshare_replace(&ts->string, text);
+#ifdef HAVE_GETTEXT
+   if (text && text[0])
+     text = dgettext(ts->domain, text);
+#endif
+   return text;
+}
+
+EAPI const char *
+elm_widget_part_text_translate(Evas_Object *obj, const char *part, const char 
*text)
+{
+  ELM_WIDGET_CHECK(obj) NULL;
+  const char *ret;
+  eo_do(obj, elm_wdg_part_text_translate(part, text, &ret));
+  return ret;
+}
+
+static void
+_elm_widget_part_text_translate(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   const char *part = va_arg(*list, const char *);
+   const char *text = va_arg(*list, const char *);
+   const char **ret = va_arg(*list, const char **);
+
+   Elm_Widget_Smart_Data *sd = _pd;
+
+   if (!sd->translate_strings || sd->on_translate)
+     {
+        *ret = text;
+        return;
+     }
+   *ret = _part_text_translate(sd->translate_strings, part, text);
+}
+
 static void
 _elm_widget_translate(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list 
*list EINA_UNUSED)
 {
    const Eina_List *l;
    Evas_Object *child;
-#ifdef HAVE_GETTEXT
-   Elm_Translate_String_Data *ts;
-#endif
    API_ENTRY return;
 
    EINA_LIST_FOREACH(sd->subobjs, l, child)
      elm_widget_translate(child);
    if (sd->hover_obj) elm_widget_translate(sd->hover_obj);
+
 #ifdef HAVE_GETTEXT
+   Elm_Translate_String_Data *ts;
    EINA_LIST_FOREACH(sd->translate_strings, l, ts)
      {
+        if (!ts->string) continue;
         const char *s = dgettext(ts->domain, ts->string);
-        elm_widget_part_text_set(obj, ts->id, s);
+        sd->on_translate = EINA_TRUE;
+        eo_do(obj, elm_wdg_part_text_set(ts->id, s));
+        sd->on_translate = EINA_FALSE;
      }
 #endif
 }
@@ -5003,14 +5101,29 @@ 
_elm_widget_item_domain_translatable_part_text_set(Elm_Widget_Item *item,
                                                    const char *label)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item);
+   Elm_Translate_String_Data *ts;
 
-   if (!_translatable_part_text_set(&item->translate_strings, part, domain,
-                                    label)) return;
+   if (!label)
+     {
+        _part_text_translatable_set(&item->translate_strings, part, EINA_FALSE,
+                                    EINA_FALSE);
+     }
+   else
+     {
+        ts = _part_text_translatable_set(&item->translate_strings, part,
+                                         EINA_TRUE, EINA_FALSE);
+        if (!ts) return;
+        if (!ts->string) ts->string = eina_stringshare_add(label);
+        else eina_stringshare_replace(&ts->string, label);
+        if (!ts->domain) ts->domain = eina_stringshare_add(domain);
+        else eina_stringshare_replace(&ts->domain, domain);
 #ifdef HAVE_GETTEXT
-   if (label && label[0])
-     label = dgettext(domain, label);
+        if (label[0]) label = dgettext(domain, label);
 #endif
+     }
+   item->on_translate = EINA_TRUE;
    _elm_widget_item_part_text_set(item, part, label);
+   item->on_translate = EINA_FALSE;
 }
 
 EAPI const char *
@@ -5018,7 +5131,10 @@ _elm_widget_item_translatable_part_text_get(const 
Elm_Widget_Item *item,
                                             const char *part)
 {
    ELM_WIDGET_ITEM_CHECK_OR_RETURN(item, NULL);
-   return _translatable_part_text_get(item->translate_strings, part);
+   Elm_Translate_String_Data *ts;
+   ts = _translate_string_data_get(item->translate_strings, part);
+   if (ts) return ts->string;
+   return NULL;
 }
 
 typedef struct _Elm_Widget_Item_Tooltip Elm_Widget_Item_Tooltip;
@@ -5853,6 +5969,8 @@ _class_constructor(Eo_Class *klass)
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_TEXT_PART_GET), 
_elm_widget_part_text_get),
         
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_DOMAIN_TRANSLATABLE_PART_TEXT_SET), 
_elm_widget_domain_translatable_part_text_set),
         
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_TRANSLATABLE_PART_TEXT_GET), 
_elm_widget_translatable_part_text_get),
+        
EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_DOMAIN_PART_TEXT_TRANSLATABLE_SET), 
_elm_widget_domain_part_text_translatable_set),
+        EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_PART_TEXT_TRANSLATE), 
_elm_widget_part_text_translate),
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_ACCESS_INFO_SET), 
_elm_widget_access_info_set),
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_ACCESS_INFO_GET), 
_elm_widget_access_info_get),
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_THEME_SET), 
_elm_widget_theme_set),
diff --git a/src/lib/elm_widget.h b/src/lib/elm_widget.h
index dc35d2b..86f7435 100644
--- a/src/lib/elm_widget.h
+++ b/src/lib/elm_widget.h
@@ -435,6 +435,7 @@ typedef struct _Elm_Widget_Smart_Data
    Eina_Bool                     can_access : 1;
    Eina_Bool                     highlighted : 1;
    Eina_Bool                     highlight_root : 1;
+   Eina_Bool                     on_translate : 1;
 } Elm_Widget_Smart_Data;
 
 /**
@@ -575,6 +576,7 @@ struct _Elm_Widget_Item
    Eina_List                     *signals;
 
    Eina_Bool                      disabled : 1;
+   Eina_Bool                      on_translate : 1;
 };
 
 struct _Elm_Object_Item
@@ -706,6 +708,9 @@ EAPI void             elm_widget_part_text_set(Evas_Object 
*obj, const char *par
 EAPI const char      *elm_widget_part_text_get(const Evas_Object *obj, const 
char *part);
 EAPI void             elm_widget_domain_translatable_part_text_set(Evas_Object 
*obj, const char *part, const char *domain, const char *text);
 EAPI const char      *elm_widget_translatable_part_text_get(const Evas_Object 
*obj, const char *part);
+EAPI void             elm_widget_domain_part_text_translatable_set(Evas_Object 
*obj, const char *part, const char *domain, Eina_Bool translatable);
+EAPI const char *     elm_widget_part_text_translate(Evas_Object *obj, const 
char *part, const char *text);
+EAPI const char *     elm_widget_part_text_translate(Evas_Object *obj, const 
char *part, const char *text);
 EAPI void             elm_widget_content_part_set(Evas_Object *obj, const char 
*part, Evas_Object *content);
 EAPI Evas_Object     *elm_widget_content_part_get(const Evas_Object *obj, 
const char *part);
 EAPI Evas_Object     *elm_widget_content_part_unset(Evas_Object *obj, const 
char *part);
@@ -1096,6 +1101,8 @@ enum
    ELM_WIDGET_SUB_ID_TEXT_PART_GET,
    ELM_WIDGET_SUB_ID_DOMAIN_TRANSLATABLE_PART_TEXT_SET,
    ELM_WIDGET_SUB_ID_TRANSLATABLE_PART_TEXT_GET,
+   ELM_WIDGET_SUB_ID_DOMAIN_PART_TEXT_TRANSLATABLE_SET,
+   ELM_WIDGET_SUB_ID_PART_TEXT_TRANSLATE,
    ELM_WIDGET_SUB_ID_ACCESS_INFO_SET,
    ELM_WIDGET_SUB_ID_ACCESS_INFO_GET,
 
@@ -1843,6 +1850,31 @@ typedef void * (*list_data_get_func_type)(const 
Eina_List * l);
  */
 #define elm_wdg_translatable_part_text_get(part, ret) 
ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_TRANSLATABLE_PART_TEXT_GET), EO_TYPECHECK(const 
char *, part), EO_TYPECHECK(const char **, ret)
 
+/**
+ * @def elm_wdg_domain_part_text_translatable_set
+ * @since 1.8
+ *
+ * No description supplied by the EAPI.
+ *
+ * @param[in] part
+ * @param[in] domain
+ * @param[in] translatable
+ *
+ */
+#define elm_wdg_domain_part_text_translatable_set(part, domain, translatable) 
ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_DOMAIN_PART_TEXT_TRANSLATABLE_SET), 
EO_TYPECHECK(const char *, part), EO_TYPECHECK(const char *, domain), 
EO_TYPECHECK(Eina_Bool, translatable)
+
+/**
+ * @def elm_wdg_part_text_translate
+ * @since 1.8
+ *
+ * No description supplied by the EAPI.
+ *
+ * @param[in] part
+ * @param[in] text
+ * @param[out] ret
+ *
+ */
+#define elm_wdg_part_text_translate(part, text, ret) 
ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_PART_TEXT_TRANSLATE), EO_TYPECHECK(const char 
*, part), EO_TYPECHECK(const char *, text), EO_TYPECHECK(const char **, ret)
 
 /**
  * @def elm_wdg_access_info_set

-- 

------------------------------------------------------------------------------
Try New Relic Now & We'll Send You this Cool Shirt
New Relic is the only SaaS-based application performance monitoring service 
that delivers powerful full stack analytics. Optimize and monitor your
browser, app, & servers with just a few lines of code. Try New Relic
and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_apr

Reply via email to