#include <Elementary.h>
#include "elm_priv.h"
+#include <langinfo.h>
/**
* @defgroup Datefield Datefield
};
#define YEAR_MAX_LENGTH 4
-#define MONTH_MAX_LENGTH 3
#define DAY_MAX_LENGTH 2
#define TIME_MAX_LENGTH 2
#define HOUR_12H_MAXIMUM 12
#define MIN_MAXIMUM 59
-static char month_label[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
-
struct _Widget_Data
{
Evas_Object *base;
int date_format;
Eina_Bool pm:1;
Eina_Bool time_mode:1;
+ Eina_Bool format_exists:1;
Eina_Bool editing:1;
void (*func)(void *data, Evas_Object *obj, int value);
static Eina_Bool _focus_idler_cb(void *obj);
static void _entry_focus_move(Evas_Object *obj, Evas_Object *focus_obj);
static Eina_Bool _check_input_done(Evas_Object *obj, Evas_Object *focus_obj, int strlen);
+static char* _get_i18n_string(Evas_Object *obj, nl_item item);
static int _maximum_day_get(int year, int month);
static int _check_date_boundary(Evas_Object *obj, int num, int flag);
_theme_hook(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
+ char sig[32] = {0,};
int i;
+
if (!wd || !wd->base) return;
if (wd->layout == ELM_DATEFIELD_LAYOUT_DATEANDTIME)
edje_object_scale_set(wd->base, elm_widget_scale_get(obj) * _elm_config->scale);
+ //set date format
+ if (wd->format_exists)
+ sprintf(sig, "elm,state,format,%s", elm_datefield_date_format_get(obj));
+ else
+ {
+ char *str = _get_i18n_string(obj, D_FMT);
+ if (str)
+ {
+ if (!strcmp(str, "yymmdd")) wd->date_format = DATE_FORMAT_YYMMDD;
+ else if (!strcmp(str, "yyddmm")) wd->date_format = DATE_FORMAT_YYDDMM;
+ else if (!strcmp(str, "mmyydd")) wd->date_format = DATE_FORMAT_MMYYDD;
+ else if (!strcmp(str, "mmddyy")) wd->date_format = DATE_FORMAT_MMDDYY;
+ else if (!strcmp(str, "ddyymm")) wd->date_format = DATE_FORMAT_DDYYMM;
+ else if (!strcmp(str, "ddmmyy")) wd->date_format = DATE_FORMAT_DDMMYY;
+ sprintf(sig, "elm,state,format,%s",str);
+ free(str);
+ }
+ }
+ edje_object_signal_emit(wd->base, sig, "elm");
+
_date_update(obj);
_sizing_eval(obj);
}
-static void
+ static void
_sizing_eval(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
evas_object_size_hint_max_set(obj, -1, -1);
}
-static void
+ static void
_signal_ampm_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source)
{
Widget_Data *wd = elm_widget_data_get(data);
_signal_ampm_clicked(void *data, Evas_Object *obj, const char *emission, const char *source)
{
Widget_Data *wd = elm_widget_data_get(data);
- if (!wd || !wd->base) return ;
+ char *str;
- wd->pm = !wd->pm;
+ if (!wd || !wd->base) return ;
+ wd->pm = !wd->pm;
if (wd->pm)
{
- edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
+ str = _get_i18n_string(data, PM_STR);
+ if (str)
+ {
+ edje_object_part_text_set(wd->base, "elm.text.ampm", str);
+ free(str);
+ }
wd->hour += HOUR_12H_MAXIMUM;
}
else
{
- edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
+ str = _get_i18n_string(data, AM_STR);
+ if (str)
+ {
+ edje_object_part_text_set(wd->base, "elm.text.ampm", str);
+ free(str);
+ }
wd->hour -= HOUR_12H_MAXIMUM;
}
evas_object_smart_callback_call(data, "changed", NULL);
{
Widget_Data *wd = elm_widget_data_get(data);
char str[YEAR_MAX_LENGTH+1] = {0,};
+ char *i18n_str;
int num = 0;
if (!wd || !wd->base) return;
if (wd->month != (num = _check_date_boundary(data, wd->month, DATE_MON)))
{
wd->month = num;
- elm_entry_entry_set(wd->date[DATE_MON], month_label[wd->month-1]);
+ i18n_str = _get_i18n_string(obj, ABMON_1+wd->month-1);
+ if (i18n_str)
+ {
+ elm_entry_entry_set(wd->date[DATE_MON], i18n_str);
+ free(i18n_str);
+ }
}
//check day boundary
if (wd->day != (num = _check_date_boundary(data, wd->day, DATE_DAY)))
if (wd->month != (num = _check_date_boundary(data, wd->month, DATE_MON)))
{
wd->month = num;
- elm_entry_entry_set(wd->date[DATE_MON], month_label[wd->month-1]);
+ i18n_str = _get_i18n_string(obj, ABMON_1+wd->month-1);
+ if (i18n_str)
+ {
+ elm_entry_entry_set(wd->date[DATE_MON], i18n_str);
+ free(i18n_str);
+ }
}
//check day boundary
if (wd->day != (num = _check_date_boundary(data, wd->day, DATE_DAY)))
}
wd->hour = (wd->pm == EINA_TRUE)? num + HOUR_12H_MAXIMUM : num;
if ((wd->hour % 12) == 0) wd->hour -= HOUR_12H_MAXIMUM;
- if (wd->pm) edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
- else edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
+ if (wd->pm)
+ {
+ i18n_str = _get_i18n_string(data, PM_STR);
+ if (i18n_str)
+ {
+ edje_object_part_text_set(wd->base, "elm.text.ampm", i18n_str);
+ free(i18n_str);
+ }
+ }
+ else
+ {
+ i18n_str = _get_i18n_string(data, AM_STR);
+ if (i18n_str)
+ {
+ edje_object_part_text_set(wd->base, "elm.text.ampm", i18n_str);
+ free(i18n_str);
+ }
+ }
}
sprintf(str, "%02d", num);
elm_entry_entry_set(wd->time[TIME_HOUR], str);
return num;
}
+static char*
+_get_i18n_string(Evas_Object *obj, nl_item item)
+{
+ Widget_Data *wd = elm_widget_data_get(obj);
+ const char *fmt;
+ char *str = NULL;
+ int i = 0, j = 0;
+
+ if (!wd) return NULL;
+
+ fmt = nl_langinfo(item);
+ if (!fmt) return NULL;
+
+ switch (item)
+ {
+ case D_FMT:
+ str = calloc(7, sizeof(char));
+ while (fmt[i])
+ {
+ if (fmt[i] == '%' && fmt[i+1])
+ {
+ i++;
+ switch (fmt[i])
+ {
+ case 'Y': case 'M': case 'D': case 'y': case 'm': case 'd':
+ str[j++] = tolower(fmt[i]);
+ str[j++] = tolower(fmt[i]);
+ break;
+ }
+ }
+ i++;
+ }
+ return str;
+ case AM_STR:
+ case PM_STR:
+ if (strlen(fmt) > 0)
+ {
+ str = calloc(strlen(fmt)+1, sizeof(char));
+ strcpy(str, fmt);
+ }
+ else
+ {
+ str = calloc(3, sizeof(char));
+ if (item == AM_STR) strcpy(str, "AM");
+ else if (item == PM_STR) strcpy(str, "PM");
+ }
+ return str;
+ case ABMON_1: case ABMON_2: case ABMON_3: case ABMON_4: case ABMON_5: case ABMON_6:
+ case ABMON_7: case ABMON_8: case ABMON_9: case ABMON_10: case ABMON_11: case ABMON_12:
+ str = calloc(strlen(fmt)+1, sizeof(char));
+ while (fmt[i])
+ {
+ str[j++] = fmt[i];
+ if (fmt[i] >= '1' && fmt[i] <= '9')
+ {
+ if (fmt[i+1] >= '1' && fmt[i+1] <= '9')
+ str[j] = fmt[i+1];
+ break;
+ }
+ i++;
+ }
+ return str;
+ }
+ return NULL;
+}
+
static int
_maximum_day_get(int year, int month)
{
if (focus_obj == wd->date[DATE_YEAR] && strlen == YEAR_MAX_LENGTH)
wd->editing = EINA_FALSE;
- else if (focus_obj == wd->date[DATE_MON] && strlen == MONTH_MAX_LENGTH)
+ else if (focus_obj == wd->date[DATE_MON])
wd->editing = EINA_FALSE;
else if (focus_obj == wd->date[DATE_DAY])
{
}
if (focus_obj == wd->date[DATE_MON])
{
+ char *i18n_str;
wd->month = atoi(ev->str);
- strcpy(str, month_label[wd->month-1]);
+ i18n_str = _get_i18n_string(data, ABMON_1+wd->month-1);
+ if (i18n_str)
+ {
+ elm_entry_entry_set(focus_obj, i18n_str);
+ //strncpy(str, i18n_str, 15);
+ free(i18n_str);
+ }
}
else
{
strcpy(str, elm_entry_entry_get(focus_obj));
str[strlen(str)] = ev->str[0];
+ elm_entry_entry_set(focus_obj, str);
}
- elm_entry_entry_set(focus_obj, str);
+ //elm_entry_entry_set(focus_obj, str);
if (_check_input_done(data, focus_obj, strlen(str)))
_entry_focus_move(data, focus_obj);
_date_update(Evas_Object *obj)
{
Widget_Data *wd = elm_widget_data_get(obj);
- char str[YEAR_MAX_LENGTH+1];
+ char str[YEAR_MAX_LENGTH+1] = {0,};
+ char *i18n_str;
if (!wd || !wd->base) return;
sprintf(str, "%d", wd->year);
elm_entry_entry_set(wd->date[DATE_YEAR], str);
- sprintf(str, "%s", month_label[wd->month-1]);
- elm_entry_entry_set(wd->date[DATE_MON], str);
+ i18n_str = _get_i18n_string(obj, ABMON_1+wd->month-1);
+ if (i18n_str)
+ {
+ elm_entry_entry_set(wd->date[DATE_MON], i18n_str);
+ free(i18n_str);
+ }
sprintf(str, "%d", wd->day);
elm_entry_entry_set(wd->date[DATE_DAY], str);
if (wd->hour >= HOUR_12H_MAXIMUM)
{
wd->pm = EINA_TRUE;
- edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
+ i18n_str = _get_i18n_string(obj, PM_STR);
+ if (i18n_str)
+ {
+ edje_object_part_text_set(wd->base, "elm.text.ampm", i18n_str);
+ free(i18n_str);
+ }
}
else
{
wd->pm = EINA_FALSE;
- edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
+ i18n_str = _get_i18n_string(obj, AM_STR);
+ if (i18n_str)
+ {
+ edje_object_part_text_set(wd->base, "elm.text.ampm", i18n_str);
+ free(i18n_str);
+ }
}
if (wd->hour > HOUR_12H_MAXIMUM)
elm_widget_sub_object_add(obj, wd->date[i]);
}
elm_entry_maximum_bytes_set(wd->date[DATE_YEAR], YEAR_MAX_LENGTH);
- elm_entry_maximum_bytes_set(wd->date[DATE_MON], MONTH_MAX_LENGTH);
elm_entry_maximum_bytes_set(wd->date[DATE_DAY], DAY_MAX_LENGTH);
}
/**
* Add a new datefield object
+ * The date format and strings are based on current locale
*
* @param parent The parent object
* @return The new object or NULL if it cannot be created
wd->layout = ELM_DATEFIELD_LAYOUT_DATEANDTIME;
wd->time_mode = EINA_TRUE;
- wd->date_format = DATE_FORMAT_MMDDYY;
_theme_hook(obj);
if (wd->time_mode != mode)
{
- char str[YEAR_MAX_LENGTH+1];
+ char str[YEAR_MAX_LENGTH+1];
- wd->time_mode = mode;
- if (!wd->time_mode) edje_object_signal_emit(wd->base, "elm,state,mode,24h", "elm");
- else edje_object_signal_emit(wd->base, "elm,state,mode,12h", "elm");
-
- if (!wd->time_mode) //24 mode
- sprintf(str, "%d", wd->hour);
- else
- {
- if (wd->hour >= HOUR_12H_MAXIMUM)
- {
- wd->pm = EINA_TRUE;
- edje_object_part_text_set(wd->base, "elm.text.ampm", "PM");
- }
- else
- {
- wd->pm = EINA_FALSE;
- edje_object_part_text_set(wd->base, "elm.text.ampm", "AM");
- }
+ wd->time_mode = mode;
+ if (!wd->time_mode) edje_object_signal_emit(wd->base, "elm,state,mode,24h", "elm");
+ else edje_object_signal_emit(wd->base, "elm,state,mode,12h", "elm");
- if (wd->hour > HOUR_12H_MAXIMUM)
- sprintf(str, "%d", wd->hour - HOUR_12H_MAXIMUM);
- else if (wd->hour == 0)
- sprintf(str, "%d", HOUR_12H_MAXIMUM);
- else
- sprintf(str, "%d", wd->hour);
- }
- elm_entry_entry_set(wd->time[TIME_HOUR], str);
- }
+ _date_update(obj);
+ }
}
/**
{
sig[j++] = tolower(fmt[i++]);
}
-
+ sig[j] = '\0';
edje_object_signal_emit(wd->base, sig, "elm");
if (strstr(sig, "yymmdd")) wd->date_format = DATE_FORMAT_YYMMDD;
else if (strstr(sig, "mmddyy")) wd->date_format = DATE_FORMAT_MMDDYY;
else if (strstr(sig, "ddyymm")) wd->date_format = DATE_FORMAT_DDYYMM;
else if (strstr(sig, "ddmmyy")) wd->date_format = DATE_FORMAT_DDMMYY;
+ wd->format_exists = EINA_TRUE;
}
/**