ami pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=b0d2e987f3a37291cd1e1090ba0812c3b4a0ed67

commit b0d2e987f3a37291cd1e1090ba0812c3b4a0ed67
Author: Amitesh Singh <[email protected]>
Date:   Thu Nov 3 11:59:31 2016 +0530

    Efl.Ui.Clock: Add elm module & theme
    
    Summary: depends on D3938
    
    Reviewers: yashu21985, bu5hm4n, woohyun, Hermet, raster, jpeg
    
    Subscribers: gohwoon.jeong, cedric, seoz, jpeg
    
    Differential Revision: https://phab.enlightenment.org/D3939
---
 data/elementary/themes/default.edc                 |   1 +
 data/elementary/themes/edc/elm/uiclock.edc         | 207 +++++++++++
 src/Makefile_Elementary.am                         |  28 ++
 .../clock_input_ctxpopup/clock_input_ctxpopup.c    | 399 +++++++++++++++++++++
 4 files changed, 635 insertions(+)

diff --git a/data/elementary/themes/default.edc 
b/data/elementary/themes/default.edc
index a157329..701aba0 100644
--- a/data/elementary/themes/default.edc
+++ b/data/elementary/themes/default.edc
@@ -37,6 +37,7 @@ collections {
 #include "edc/elm/photo.edc"
 #include "edc/elm/focus.edc"
 #include "edc/elm/datetime.edc"
+#include "edc/elm/uiclock.edc"
 #include "edc/elm/player.edc"
 #include "edc/elm/thumb.edc"
 #include "edc/elm/pointer.edc"
diff --git a/data/elementary/themes/edc/elm/uiclock.edc 
b/data/elementary/themes/edc/elm/uiclock.edc
new file mode 100644
index 0000000..348c2f2
--- /dev/null
+++ b/data/elementary/themes/edc/elm/uiclock.edc
@@ -0,0 +1,207 @@
+#define DATETIME_FIELD(_pos) \
+   part { \
+      name: "field"#_pos; type: SWALLOW; \
+      scale: 1; \
+      clip_to: "clip"; \
+      description { state: "default" 0.0; \
+         visible: 0; \
+         min: 0 0; \
+         align: 0.0 0.5; \
+         fixed: 1 1; \
+         rel1.relative: 1.0 0.0; \
+         rel1.to: "separator"#_pos; \
+         rel2.relative: 1.0 1.0; \
+         rel2.to: "separator"#_pos; \
+      } \
+      description { state: "enable" 0.0; \
+         inherit: "default" 0.0; \
+         visible: 1; \
+         min: 8 10; \
+      } \
+   } \
+   programs{ \
+      program { name: "field_"#_pos"enabled"; \
+         signal: "field"#_pos",enable"; source: "elm"; \
+         action: STATE_SET "enable" 0.0; \
+         target: "field"#_pos; \
+      } \
+      program { name: "field_"#_pos"disabled"; \
+         signal: "field"#_pos",disable"; source: "elm"; \
+         action: STATE_SET "default" 0.0; \
+         target: "field"#_pos; \
+      } \
+    }
+#define DATETIME_SEPARATOR(_pos, _after) \
+   part { \
+      name: "separator"#_pos; type: TEXT; \
+      scale: 1; \
+      effect: SHADOW BOTTOM; \
+      clip_to: "disclip"; \
+      description { state: "default" 0.0; \
+         visible: 0; \
+         min: 0 0; \
+         align: 0.0 0.5; \
+         fixed: 1 0; \
+         rel1 { \
+            relative: 1.0 0.0; \
+            to: "field"#_after; \
+         } \
+         rel2 { \
+            relative: 1.0 1.0; \
+            to: "field"#_after; \
+         } \
+         color_class: "datetime_separator_text"; \
+         text { \
+            font: "Sans"; size: 10; \
+            min: 1 0; \
+            ellipsis: -1; \
+            align: 0.5 0.5; \
+            text_class: "datetime_separator_text"; \
+         } \
+      } \
+      description { state: "enable" 0.0; \
+         inherit: "default" 0.0; \
+         visible: 1; \
+         min: 8 10; \
+      } \
+   } \
+   part { \
+      name: "separator"#_pos"d"; type: TEXT; \
+      scale: 1; \
+      effect: SHADOW BOTTOM; \
+      clip_to: "disclip2"; \
+      description { state: "default" 0.0; \
+         visible: 0; \
+         rel1.to: "separator"#_pos; \
+         rel2.to: "separator"#_pos; \
+         color_class: "datetime_separator_text_disabled"; \
+         text { \
+            text_source: "separator"#_pos; \
+            font: "Sans"; size: 10; \
+            text_class: "datetime_separator_text_disabled"; \
+         } \
+      } \
+      description { state: "enable" 0.0; \
+         inherit: "default" 0.0; \
+         visible: 1; \
+      } \
+   } \
+   programs { \
+      program { \
+         signal: "field"#_after",enable"; source: "elm"; \
+         action: STATE_SET "enable" 0.0; \
+         target: "separator"#_pos; \
+         target: "separator"#_pos"d"; \
+      } \
+      program { \
+         signal: "field"#_after",disable"; source: "elm"; \
+         action: STATE_SET "default" 0.0; \
+         target: "separator"#_pos; \
+         target: "separator"#_pos"d"; \
+      } \
+   }
+group { name: "elm/uiclock/base/default";
+   parts {
+      part { name: "bg"; type: RECT;
+         description { state: "default" 0.0;
+            color_class: "datetime_bg";
+         }
+      }
+      part { name: "clip"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "separator0";
+            rel2.to: "separator7";
+         }
+      }
+      part { name: "disclip"; type: RECT;
+         clip_to: "clip";
+         description { state: "default" 0.0;
+            rel1.to: "separator0";
+            rel2.to: "separator7";
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+         }
+      }
+      part { name: "disclip2"; type: RECT;
+         clip_to: "clip";
+         description { state: "default" 0.0;
+            rel1.to: "separator0";
+            rel2.to: "separator7";
+            visible: 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "separator0"; type: SPACER;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 8 10;
+            align: 0.0 0.5;
+            fixed: 1 0;
+            rel2.relative: 0.0 1.0;
+         }
+      }
+      DATETIME_FIELD(0)
+      DATETIME_SEPARATOR(1,0)
+      DATETIME_FIELD(1)
+      DATETIME_SEPARATOR(2,1)
+      DATETIME_FIELD(2)
+      DATETIME_SEPARATOR(3,2)
+      DATETIME_FIELD(3)
+      DATETIME_SEPARATOR(4,3)
+      DATETIME_FIELD(4)
+      DATETIME_SEPARATOR(5,4)
+      DATETIME_FIELD(5)
+      DATETIME_SEPARATOR(6,5)
+      DATETIME_FIELD(6)
+      DATETIME_SEPARATOR(7,6)
+      DATETIME_FIELD(7)
+      DATETIME_SEPARATOR(8,7)
+      part { name: "separator9"; type: SPACER;
+         description { state: "default" 0.0;
+            rel1.to: "separator7";
+            rel1.relative: 1.0 0.0;
+            min: 8 10;
+         }
+      }
+      part { name: "discover"; type: RECT;
+         description { state: "default" 0.0;
+            rel1.to: "separator0";
+            rel2.to: "separator7";
+            visible: 0;
+            color: 0 0 0 0;
+         }
+         description { state: "disabled" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+         }
+      }
+      part { name: "elm.access"; type: RECT; repeat_events: 1;
+         description { state: "default" 0.0;
+            color: 0 0 0 0;
+         }
+      }
+   }
+   programs {
+      program {
+         signal: "elm,state,disabled"; source: "elm";
+         action: STATE_SET "disabled" 0.0;
+         target: "disclip";
+         target: "disclip2";
+         target: "discover";
+      }
+      program {
+         signal: "elm,state,enabled"; source: "elm";
+         action: STATE_SET "default" 0.0;
+         target: "disclip";
+         target: "disclip2";
+         target: "discover";
+      }
+   }
+}
+#undef DATETIME_SEPARATOR
+#undef DATETIME_FIELD
diff --git a/src/Makefile_Elementary.am b/src/Makefile_Elementary.am
index fec21c2..dd78134 100644
--- a/src/Makefile_Elementary.am
+++ b/src/Makefile_Elementary.am
@@ -992,6 +992,34 @@ 
modules_elementary_datetime_input_ctxpopup_module_la_DEPENDENCIES = @USE_ELEMENT
 modules_elementary_datetime_input_ctxpopup_module_la_LDFLAGS = -module 
@EFL_LTMODULE_FLAGS@
 modules_elementary_datetime_input_ctxpopup_module_la_LIBTOOLFLAGS = 
--tag=disable-static
 
+## clock_input_ctxpopup
+
+moduleclock_input_ctxpopuppkgdir = 
$(libdir)/elementary/modules/clock_input_ctxpopup/$(MODULE_ARCH)
+moduleclock_input_ctxpopuppkg_LTLIBRARIES = 
modules/elementary/clock_input_ctxpopup/module.la
+
+# Workaround for broken parallel install support in automake (relink issue)
+# http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7328
+install_moduleclock_input_ctxpopuppkgLTLIBRARIES = 
install-moduleclock_input_ctxpopuppkgLTLIBRARIES
+$(install_moduleclock_input_ctxpopuppkgLTLIBRARIES): install-libLTLIBRARIES
+
+modules_elementary_clock_input_ctxpopup_module_la_SOURCES = \
+modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c
+modules_elementary_clock_input_ctxpopup_module_la_CPPFLAGS = \
+-DELM_INTERNAL_API_ARGESFSDFEFC=1 \
+-I. \
+-I$(top_builddir) \
+-I$(top_srcdir) \
+-I$(top_srcdir)/src/lib/elementary \
+-I$(top_builddir)/src/lib/elementary \
+-DPACKAGE_DATA_DIR=\"$(pkgdatadir)\" \
+-DPACKAGE_LIB_DIR=\"$(libdir)\" \
+-DELEMENTARY_BUILD \
+@ELEMENTARY_CFLAGS@
+modules_elementary_clock_input_ctxpopup_module_la_LIBADD = 
@USE_ELEMENTARY_LIBS@
+modules_elementary_clock_input_ctxpopup_module_la_DEPENDENCIES = 
@USE_ELEMENTARY_INTERNAL_LIBS@
+modules_elementary_clock_input_ctxpopup_module_la_LDFLAGS = -module 
@EFL_LTMODULE_FLAGS@
+modules_elementary_clock_input_ctxpopup_module_la_LIBTOOLFLAGS = 
--tag=disable-static
+
 ## prefs
 
 moduleprefspkgdir = $(libdir)/elementary/modules/prefs/$(MODULE_ARCH)
diff --git a/src/modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c 
b/src/modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c
new file mode 100644
index 0000000..95f1232
--- /dev/null
+++ b/src/modules/elementary/clock_input_ctxpopup/clock_input_ctxpopup.c
@@ -0,0 +1,399 @@
+#ifdef HAVE_CONFIG_H
+#include "elementary_config.h"
+#endif
+
+#include <Elementary.h>
+#include "elm_widget.h"
+#include "efl_ui_clock_private.h"
+
+#define CLOCK_FIELD_COUNT       8
+#define FIELD_FORMAT_LEN        3
+#define DISKSELECTOR_MIN_ITEMS  4
+#define BUFF_SIZE               1024
+
+typedef struct _Ctxpopup_Module_Data Ctxpopup_Module_Data;
+typedef struct _DiskItem_Data DiskItem_Data;
+
+struct _Ctxpopup_Module_Data
+{
+   Efl_Ui_Clock_Module_Data mod_data;
+   Evas_Object *ctxpopup;
+};
+
+struct _DiskItem_Data
+{
+   Ctxpopup_Module_Data *ctx_mod;
+   Efl_Ui_Clock_Type  sel_field_type;
+   unsigned int sel_field_value;
+};
+
+static void
+_diskselector_item_free_cb(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   free(data);
+}
+
+static void
+_ctxpopup_dismissed_cb(void *data, const Efl_Event *event)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+   ctx_mod = (Ctxpopup_Module_Data *)data;
+   evas_object_del(event->object);
+   ctx_mod->ctxpopup = NULL;
+}
+
+static void
+_clock_resize_cb(void *data, Evas *e EINA_UNUSED,Evas_Object *obj EINA_UNUSED,
+                    void *event_info EINA_UNUSED)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+
+   ctx_mod = (Ctxpopup_Module_Data *)data;
+   if (!ctx_mod || !ctx_mod->ctxpopup) return;
+
+   evas_object_hide(ctx_mod->ctxpopup);
+}
+
+static void
+_clock_move_cb(void *data, Evas *e EINA_UNUSED,Evas_Object *obj EINA_UNUSED,
+                  void *event_info EINA_UNUSED)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+
+   ctx_mod = (Ctxpopup_Module_Data *)data;
+   if (!ctx_mod || !ctx_mod->ctxpopup) return;
+
+   evas_object_hide(ctx_mod->ctxpopup);
+}
+
+static void
+_field_value_set(struct tm *tim, Efl_Ui_Clock_Type  field_type, int val)
+{
+   if (field_type >= (CLOCK_FIELD_COUNT - 1)) return;
+
+   int *timearr[]= { &tim->tm_year, &tim->tm_mon, &tim->tm_mday, &tim->tm_hour,
+                     &tim->tm_min, &tim->tm_sec, &tim->tm_wday };
+   *timearr[field_type] = val;
+}
+
+static int
+_field_value_get(struct tm *tim, Efl_Ui_Clock_Type  field_type)
+{
+   if (field_type >= (CLOCK_FIELD_COUNT - 1)) return -1;
+
+   int *timearr[]= { &tim->tm_year, &tim->tm_mon, &tim->tm_mday, &tim->tm_hour,
+                     &tim->tm_min, &tim->tm_sec, &tim->tm_wday };
+   return (*timearr[field_type]);
+}
+
+static void
+_diskselector_cb(void *data EINA_UNUSED, const Efl_Event *event)
+{
+   DiskItem_Data *disk_data;
+   struct tm curr_time;
+   const char *fmt;
+
+   disk_data = (DiskItem_Data *)elm_object_item_data_get(event->info);
+   if (!disk_data || !(disk_data->ctx_mod)) return;
+
+   efl_ui_clock_value_get(disk_data->ctx_mod->mod_data.base, &curr_time);
+   fmt = 
disk_data->ctx_mod->mod_data.field_format_get(disk_data->ctx_mod->mod_data.base,
 disk_data->sel_field_type);
+   if ((disk_data->sel_field_type == EFL_UI_CLOCK_TYPE_HOUR) && 
((!strncmp(fmt, "%I", FIELD_FORMAT_LEN)) ||
+        (!strncmp(fmt, "%l", FIELD_FORMAT_LEN))) && (curr_time.tm_hour >= 12))
+     disk_data->sel_field_value += 12;
+   _field_value_set(&curr_time, disk_data->sel_field_type, 
disk_data->sel_field_value);
+   efl_ui_clock_value_set(disk_data->ctx_mod->mod_data.base, &curr_time);
+   evas_object_hide(disk_data->ctx_mod->ctxpopup);
+}
+
+static void
+_ampm_clicked_cb(void *data, const Efl_Event *event EINA_UNUSED)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+   struct tm curr_time;
+
+   ctx_mod = (Ctxpopup_Module_Data *)data;
+   if (!ctx_mod) return;
+
+   efl_ui_clock_value_get(ctx_mod->mod_data.base, &curr_time);
+   if (curr_time.tm_hour >= 12) curr_time.tm_hour -= 12;
+   else curr_time.tm_hour += 12;
+   efl_ui_clock_value_set(ctx_mod->mod_data.base, &curr_time);
+}
+
+static void
+_field_clicked_cb(void *data, const Efl_Event *event)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+   Evas_Object *diskselector;
+   Elm_Object_Item *item;
+   DiskItem_Data *disk_data;
+   Efl_Ui_Clock_Type  field_type;
+   time_t t;
+   struct tm time1;
+   char buf[BUFF_SIZE], label[BUFF_SIZE];
+   const char *fmt;
+   int idx, min, max, val;
+   unsigned int display_item_num, text_len = 0;
+   Evas_Coord x = 0, y = 0, w = 0, h = 0, width;
+
+   ctx_mod = (Ctxpopup_Module_Data *)data;
+   if (!ctx_mod) return;
+
+   if (!efl_ui_clock_edit_mode_get(ctx_mod->mod_data.base))
+     return;
+
+   snprintf(buf, sizeof(buf), "datetime/%s", 
elm_object_style_get(event->object));
+
+   if (ctx_mod->ctxpopup)
+     evas_object_del(ctx_mod->ctxpopup);
+   ctx_mod->ctxpopup = elm_ctxpopup_add(event->object);
+   elm_object_style_set(ctx_mod->ctxpopup, buf);
+   elm_ctxpopup_horizontal_set(ctx_mod->ctxpopup, EINA_TRUE);
+   evas_object_size_hint_weight_set(ctx_mod->ctxpopup, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(ctx_mod->ctxpopup, EVAS_HINT_FILL, 0.5);
+   efl_event_callback_add
+      (ctx_mod->ctxpopup, ELM_CTXPOPUP_EVENT_DISMISSED, 
_ctxpopup_dismissed_cb, ctx_mod);
+   elm_ctxpopup_hover_parent_set(ctx_mod->ctxpopup, 
elm_widget_top_get(event->object));
+
+   diskselector = 
elm_diskselector_add(elm_widget_top_get(ctx_mod->mod_data.base));
+   efl_event_callback_add
+      (diskselector, EFL_UI_EVENT_CLICKED, _diskselector_cb, NULL);
+   elm_object_style_set(diskselector, buf);
+   elm_object_content_set(ctx_mod->ctxpopup, diskselector);
+
+   t = time(NULL);
+   localtime_r(&t, &time1);
+
+   field_type = (Efl_Ui_Clock_Type )evas_object_data_get(event->object, 
"_field_type");
+   fmt = ctx_mod->mod_data.field_format_get(ctx_mod->mod_data.base, 
field_type);
+   efl_ui_clock_value_get(ctx_mod->mod_data.base, &time1);
+   val = _field_value_get(&time1, field_type);
+   ctx_mod->mod_data.field_limit_get(ctx_mod->mod_data.base, field_type, &min, 
&max);
+
+   time1.tm_mday = 1;   // To avoid month wrapping, set the first day of the 
month to start with.
+
+   if ((field_type == EFL_UI_CLOCK_TYPE_HOUR) && ((!strncmp(fmt, "%I", 
FIELD_FORMAT_LEN)) ||
+        (!strncmp(fmt, "%l", FIELD_FORMAT_LEN))))
+     {
+        if (max >= 12) max -= 12;
+        if (val >= 12) val -= 12;
+        if (min >= 12) min -= 12;
+     }
+   for (idx = min; idx <= max; idx++)
+     {
+        _field_value_set(&time1, field_type, idx);
+        strftime(label, BUFF_SIZE, fmt, &time1);
+        if (strlen(label) > text_len) text_len = strlen(label);
+        if (idx == val)
+          {
+             item = elm_diskselector_item_append(diskselector, label, NULL, 
NULL, NULL);
+             elm_diskselector_item_selected_set(item, EINA_TRUE);
+          }
+        else
+          {
+             disk_data = (DiskItem_Data *) malloc (sizeof(DiskItem_Data));
+             disk_data->ctx_mod = ctx_mod;
+             disk_data->sel_field_type = field_type;
+             disk_data->sel_field_value = idx;
+             item = elm_diskselector_item_append(diskselector, label, NULL, 
NULL, disk_data);
+             elm_object_item_del_cb_set(item, _diskselector_item_free_cb);
+          }
+     }
+   elm_diskselector_side_text_max_length_set(diskselector, text_len);
+
+   evas_object_geometry_get(event->object, &x, &y, &w, &h);
+   evas_object_geometry_get(elm_widget_top_get(ctx_mod->mod_data.base), NULL, 
NULL, &width, NULL);
+   evas_object_size_hint_min_set(ctx_mod->ctxpopup, width, -1);
+   display_item_num = width / (w + elm_config_finger_size_get());
+   // always display even number of items to avoid autoselection
+   if (display_item_num % 2) display_item_num -= 1;
+   if (display_item_num < DISKSELECTOR_MIN_ITEMS)
+     display_item_num = DISKSELECTOR_MIN_ITEMS;
+   elm_diskselector_display_item_num_set(diskselector, display_item_num);
+   elm_diskselector_round_enabled_set(diskselector, EINA_TRUE);
+
+   elm_ctxpopup_direction_priority_set(ctx_mod->ctxpopup, 
ELM_CTXPOPUP_DIRECTION_DOWN,
+                                       ELM_CTXPOPUP_DIRECTION_UP, -1, -1);
+   evas_object_move(ctx_mod->ctxpopup, (x+w/2), (y+h));
+
+   // if the direction of Ctxpopup is upwards, move it to the top of datetime
+   if (elm_ctxpopup_direction_get(ctx_mod->ctxpopup) == 
ELM_CTXPOPUP_DIRECTION_UP)
+     {
+        elm_ctxpopup_direction_priority_set(ctx_mod->ctxpopup, 
ELM_CTXPOPUP_DIRECTION_UP,
+                                            ELM_CTXPOPUP_DIRECTION_DOWN, -1, 
-1);
+        evas_object_move(ctx_mod->ctxpopup, (x + w / 2), y);
+     }
+   evas_object_show(ctx_mod->ctxpopup);
+}
+
+static void
+_access_set(Evas_Object *obj, Efl_Ui_Clock_Type field_type)
+{
+   const char* type = NULL;
+
+   switch (field_type)
+     {
+      case EFL_UI_CLOCK_TYPE_YEAR:
+         type = "datetime field, year";
+         break;
+
+      case EFL_UI_CLOCK_TYPE_MONTH:
+         type = "datetime field, month";
+         break;
+
+      case EFL_UI_CLOCK_TYPE_DATE:
+         type = "datetime field, date";
+         break;
+
+      case EFL_UI_CLOCK_TYPE_HOUR:
+         type = "datetime field, hour";
+         break;
+
+      case EFL_UI_CLOCK_TYPE_MINUTE:
+         type = "datetime field, minute";
+         break;
+
+      case EFL_UI_CLOCK_TYPE_AMPM:
+         type = "datetime field, AM PM";
+         break;
+
+      default:
+         break;
+     }
+
+   _elm_access_text_set
+     (_elm_access_info_get(obj), ELM_ACCESS_TYPE, type);
+   _elm_access_callback_set
+     (_elm_access_info_get(obj), ELM_ACCESS_STATE, NULL, NULL);
+}
+
+// module funcs for the specific module type
+EAPI void
+field_value_display(Efl_Ui_Clock_Module_Data *module_data, Evas_Object *obj)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+   Efl_Ui_Clock_Type  field_type;
+   struct tm tim;
+   char buf[BUFF_SIZE];
+   const char *fmt;
+
+   ctx_mod = (Ctxpopup_Module_Data *)module_data;
+   if (!ctx_mod || !obj) return;
+
+   efl_ui_clock_value_get(ctx_mod->mod_data.base, &tim);
+   field_type = (Efl_Ui_Clock_Type )evas_object_data_get(obj, "_field_type");
+   fmt = ctx_mod->mod_data.field_format_get(ctx_mod->mod_data.base, 
field_type);
+   buf[0] = 0;
+   strftime(buf, sizeof(buf), fmt, &tim);
+   if ((!buf[0]) && ((!strcmp(fmt, "%p")) || (!strcmp(fmt, "%P"))))
+     {
+        // yes BUFF_SIZE is more than 2 bytes!
+        if (tim.tm_hour < 12) strcpy(buf, "AM");
+        else strcpy(buf, "PM");
+     }
+   elm_object_text_set(obj, buf);
+}
+
+EAPI Evas_Object *
+field_create(Efl_Ui_Clock_Module_Data *module_data, Efl_Ui_Clock_Type  
field_type)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+   Evas_Object *field_obj;
+
+   ctx_mod = (Ctxpopup_Module_Data *)module_data;
+   if (!ctx_mod) return NULL;
+
+   if (field_type == EFL_UI_CLOCK_TYPE_AMPM)
+     {
+        field_obj = elm_button_add(ctx_mod->mod_data.base);
+        efl_event_callback_add
+           (field_obj, EFL_UI_EVENT_CLICKED, _ampm_clicked_cb, ctx_mod);
+     }
+   else
+     {
+        field_obj = elm_entry_add(ctx_mod->mod_data.base);
+        elm_entry_single_line_set(field_obj, EINA_TRUE);
+        elm_entry_editable_set(field_obj, EINA_FALSE);
+        elm_entry_input_panel_enabled_set(field_obj, EINA_FALSE);
+        elm_entry_context_menu_disabled_set(field_obj, EINA_TRUE);
+        efl_event_callback_add
+           (field_obj, EFL_UI_EVENT_CLICKED, _field_clicked_cb, ctx_mod);
+     }
+   evas_object_data_set(field_obj, "_field_type", (void *)field_type);
+
+   // ACCESS
+   _access_set(field_obj, field_type);
+
+   return field_obj;
+}
+
+EAPI Efl_Ui_Clock_Module_Data *
+obj_hook(Evas_Object *obj)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+   ctx_mod = calloc(1, sizeof(Ctxpopup_Module_Data));
+   if (!ctx_mod) return NULL;
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE,
+                                  _clock_resize_cb, ctx_mod);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
+                                  _clock_move_cb, ctx_mod);
+
+   return ((Efl_Ui_Clock_Module_Data*)ctx_mod);
+}
+
+EAPI void
+obj_unhook(Efl_Ui_Clock_Module_Data *module_data)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+
+   ctx_mod = (Ctxpopup_Module_Data *)module_data;
+   if (!ctx_mod) return;
+
+   if (ctx_mod->ctxpopup)
+     evas_object_del(ctx_mod->ctxpopup);
+
+   free(ctx_mod);
+   ctx_mod = NULL;
+}
+
+EAPI void
+obj_hide(Efl_Ui_Clock_Module_Data *module_data)
+{
+   Ctxpopup_Module_Data *ctx_mod;
+
+   ctx_mod = (Ctxpopup_Module_Data *)module_data;
+   if (!ctx_mod) return;
+
+   if (ctx_mod->ctxpopup)
+     evas_object_hide(ctx_mod->ctxpopup);
+}
+
+// module api funcs needed
+EAPI int
+elm_modapi_init(void *m EINA_UNUSED)
+{
+   return 1; // succeed always
+}
+
+EAPI int
+elm_modapi_shutdown(void *m EINA_UNUSED)
+{
+   return 1; // succeed always
+}
+
+static Eina_Bool
+_module_init(void)
+{
+   return EINA_TRUE;
+}
+
+static void
+_module_shutdown(void)
+{
+}
+
+EINA_MODULE_INIT(_module_init);
+EINA_MODULE_SHUTDOWN(_module_shutdown);

-- 


Reply via email to