#include <Elementary.h>
typedef struct
{
   Evas_Object *win;
   Evas_Object *edit_buffer;
} App_Data;
typedef struct
{
   Evas_Object *inwin;
   Evas_Object *naviframe;
   Evas_Object *grid;
   Evas_Object *settings;
   int size;
   int vsize;
   int width, height;
   const char *emo;
   App_Data *ad;
} App_Inwin_Data;
static void
_edit_buffer_insert(Evas_Object *e, const char *text)
{
}
static void
_it_sel_cb(void *data, Evas_Object *obj, void *event)
{
   App_Inwin_Data *aid = data;
}
static char *
_emo_label_get(void *data, Evas_Object *obj, const char *part)
{
   return strdup(data);
}
static Evas_Object *
_emo_content_get(void *data, Evas_Object *obj, const char *part)
{
   Evas_Object *o;
   if (strcmp(part, "elm.swallow.icon"))
     return NULL;
     {
        fprintf(stderr, "Failed to set layout");
        return NULL;
     }
   return o;
}
static void
_emo_del(void *data, Evas_Object *obj)
{
   free(data);
}
static Evas_Object *
_page_grid_add(Evas_Object *parent, App_Inwin_Data *aid)
{
   Evas_Object *grid;
   char *theme, *emo;
   Eina_List *emos, *it;
   it_class->item_style = "default";
   it_class->func.text_get = _emo_label_get;
   it_class->func.content_get = _emo_content_get;
   it_class->func.del = _emo_del;
   if (!theme) return NULL;
   emos = edje_file_collection_list(theme);
   free(theme);
   if (!emos) return NULL;
   evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL);
   EINA_LIST_FOREACH(emos, it, emo)
     {
        char name[512];
        if (strncmp(emo, "elm/entry/emoticon/", 19))
          continue;
        sscanf(emo, "elm/entry/emoticon/%[^/]/default", name);
     }
   edje_file_collection_list_free(emos);
   return grid;
}
static void
_btn_insert_cb(void *data, Evas_Object *obj, void *event)
{
   App_Inwin_Data *aid = data;
   const char *size[] = {
        "size",
        "absize",
        "relsize"
   };
   const char *vsize[] = {
        "full",
        "ascent"
   };
   char buf[512];
   snprintf(buf, sizeof(buf), "<item %s=%dx%d vsize=%s href=emoticon/%s>"
            "</item>", size[aid->size], aid->width, aid->height,
            vsize[aid->vsize], aid->emo);
   _edit_buffer_insert(aid->ad->edit_buffer, buf);
   evas_object_del(aid->inwin);
}
static void
_width_changed_cb(void *data, Evas_Object *obj, void *event)
{
   App_Inwin_Data *aid = data;
   aid->width = atoi(elm_object_text_get(obj));
}
static void
_height_changed_cb(void *data, Evas_Object *obj, void *event)
{
   App_Inwin_Data *aid = data;
   aid->height = atoi(elm_object_text_get(obj));
}
static Evas_Object *
_page_settings_add(Evas_Object *parent, App_Inwin_Data *aid)
{
   Evas_Object *box, *sizeopts, *box2, *sizebox, *vsizebox,
               *rsize, *rabsize, *rrelsize, *rvfull, *rvascent,
               *fwidth, *ewidth, *fheight, *eheight,
               *binsert;
   char buf[100];
        .rejected = NULL
   };
        .max_byte_count = 0
   };
   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
   elm_object_text_set(sizeopts, "Size");
   evas_object_size_hint_weight_set(sizeopts, EVAS_HINT_EXPAND, 0.0);
   evas_object_size_hint_align_set(sizeopts, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(sizeopts);
   evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
   elm_object_content_set(sizeopts, box2);
   evas_object_show(box2);
   evas_object_size_hint_weight_set(sizebox, EVAS_HINT_EXPAND,
                                    EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(sizebox, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(sizebox);
   elm_object_text_set(rsize, "Scale adjusted (size)");
   evas_object_show(rsize);
   elm_object_text_set(rabsize, "Absolute size (absize)");
   evas_object_show(rabsize);
   elm_object_text_set(rrelsize, "Relative to line (relsize)");
   evas_object_show(rrelsize);
   evas_object_size_hint_weight_set(vsizebox, EVAS_HINT_EXPAND,
                                    EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(vsizebox, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(vsizebox);
   elm_object_text_set(rvfull, "Full height (vsize=full)");
   evas_object_show(rvfull);
   elm_object_text_set(rvascent, "Ascent only (vsize=ascent)");
   evas_object_show(rvascent);
   elm_object_text_set(fwidth, "Width");
   evas_object_size_hint_weight_set(fwidth, EVAS_HINT_EXPAND, 0.0);
   evas_object_size_hint_align_set(fwidth, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(fwidth);
   snprintf(buf, sizeof(buf), "%d", aid->width);
                                  &accept_set);
                                  &limit_size);
   elm_object_text_set(ewidth, buf);
   evas_object_size_hint_weight_set(ewidth, EVAS_HINT_EXPAND, 0.0);
   evas_object_size_hint_align_set(ewidth, EVAS_HINT_FILL, EVAS_HINT_FILL);
   elm_object_content_set(fwidth, ewidth);
   evas_object_show(ewidth);
   evas_object_smart_callback_add(ewidth, "changed", _width_changed_cb, aid);
   elm_object_text_set(fheight, "Height");
   evas_object_size_hint_weight_set(fheight, EVAS_HINT_EXPAND, 0.0);
   evas_object_size_hint_align_set(fheight, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(fheight);
   snprintf(buf, sizeof(buf), "%d", aid->height);
                                  &accept_set);
                                  &limit_size);
   elm_object_text_set(eheight, buf);
   evas_object_size_hint_weight_set(eheight, EVAS_HINT_EXPAND, 0.0);
   evas_object_size_hint_align_set(eheight, EVAS_HINT_FILL, EVAS_HINT_FILL);
   elm_object_content_set(fheight, eheight);
   evas_object_show(eheight);
   evas_object_smart_callback_add(eheight, "changed", _height_changed_cb, aid);
   elm_object_text_set(binsert, "Insert");
   evas_object_show(binsert);
   evas_object_smart_callback_add(binsert, "clicked", _btn_insert_cb, aid);
   return box;
}
static void
_insert_cancel_cb(void *data, Evas_Object *obj, void *event)
{
   App_Inwin_Data *aid = data;
   evas_object_del(aid->inwin);
}
static void
_inwin_del_cb(void *data, Evas *e, Evas_Object *obj, void *event)
{
   free(data);
}
static void
_image_insert_cb(void *data, Evas_Object *obj, void *event)
{
   App_Data *ad = data;
   App_Inwin_Data *aid;
   Evas_Object *inwin, *box, *box2, *naviframe, *o;
   aid = calloc(1, sizeof(App_Inwin_Data));
   if (!aid) return;
   aid->ad = ad;
   aid->size = 1;
   aid->vsize = 1;
   aid->width = 64;
   aid->height = 64;
   evas_object_size_hint_weight_set(inwin, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(inwin, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(inwin);
   evas_object_event_callback_add(inwin, EVAS_CALLBACK_DEL, _inwin_del_cb,
                                  aid);
   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(box);
   evas_object_size_hint_weight_set(naviframe, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(naviframe, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(naviframe);
   o = _page_grid_add(ad->win, aid);
   elm_naviframe_item_simple_push(naviframe, o);
   aid->grid = o;
   o = _page_settings_add(ad->win, aid);
   elm_naviframe_item_simple_push(naviframe, o);
   aid->settings = o;
   evas_object_size_hint_weight_set(box2, EVAS_HINT_EXPAND, 0.0);
   evas_object_size_hint_align_set(box2, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(box2);
   elm_object_text_set(o, "Cancel");
   evas_object_size_hint_weight_set(o, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(o, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(o);
   evas_object_smart_callback_add(o, "clicked", _insert_cancel_cb, aid);
   aid->inwin = inwin;
   aid->naviframe = naviframe;
}
static void
_format_change_cb(void *data, Evas_Object *obj, void *event)
{
   App_Data *ad = data;
   char fmt_open[5], fmt_close[6];
   const char *sel;
   int cursor;
   char *s;
   const char *ptr, *what;
   Eina_Strbuf *buf = NULL;
   sel = elm_object_text_get(obj);
   snprintf(fmt_open, sizeof(fmt_open), "<%s>", sel);
   snprintf(fmt_close, sizeof(fmt_close), "</%s>", sel);
   buf = eina_strbuf_new();
   if (!sel || !sel[0])
     {
        eina_strbuf_append(buf, fmt_open);
        goto all_done;
     }
   what = fmt_open;
   ptr = sel;
   while ((s = strstr(ptr, what)))
     {
        ptr = s + strlen(what);
        if (what == fmt_open) what = fmt_close;
        else what = fmt_open;
     }
   eina_strbuf_append(buf, what);
   if (what == fmt_close)
     {
        if (sel)
          {
             Eina_Strbuf *buf2 = eina_strbuf_new();
             eina_strbuf_append(buf2, sel);
             eina_strbuf_replace_first(buf2, fmt_close, "");
                                    eina_strbuf_string_get(buf2));
             eina_strbuf_free(buf2);
          }
     }
all_done:
   _edit_buffer_insert(ad->edit_buffer, eina_strbuf_string_get(buf));
   eina_strbuf_free(buf);
}
static void
_autosave_change_cb(void *data, Evas_Object *obj, void *event)
{
   App_Data *ad = data;
}
static void
_edit_dblclick_cb(void *data, Evas_Object *obj, void *event)
{
   int current_cursor;
     {
        const char *content;
          break;
        if (content && (content[0] == ' '))
          break;
     }
     return;
     {
        const char *content;
          break;
        if (content && (content[0] == ' '))
          break;
     }
}
static void
_edit_tplclick_cb(void *data, Evas_Object *obj, void *event)
{
}
EAPI_MAIN int
elm_main(int argc, char *argv[])
{
   Evas_Object *win, *box, *tb, *en, *o, *icon;
   App_Data app;
   memset(&app, 0, sizeof(app));
   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_show(box);
   evas_object_size_hint_weight_set(tb, EVAS_HINT_EXPAND, 0.0);
   evas_object_size_hint_weight_set(tb, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(tb);
   elm_object_text_set(o, "Autosave");
   evas_object_show(o);
   evas_object_smart_callback_add(o, "changed", _autosave_change_cb, &app);
   elm_object_text_set(o, "b");
   evas_object_show(o);
   evas_object_smart_callback_add(o, "clicked", _format_change_cb, &app);
   elm_object_text_set(o, "em");
   evas_object_show(o);
   evas_object_smart_callback_add(o, "clicked", _format_change_cb, &app);
   evas_object_show(o);
         icon, "entry", "emoticon/haha", "default"))
     fprintf(stderr, "Failed to set layout");
   evas_object_smart_callback_add(o, "clicked", _image_insert_cb, &app);
   evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
   evas_object_size_hint_align_set(en, EVAS_HINT_FILL, EVAS_HINT_FILL);
   evas_object_show(en);
   app.win = win;
   app.edit_buffer = en;
   evas_object_smart_callback_add(en, "clicked,double", _edit_dblclick_cb,
                                  NULL);
   evas_object_smart_callback_add(en, "clicked,triple", _edit_tplclick_cb,
                                  NULL);
   evas_object_resize(win, 300, 780);
   evas_object_show(win);
   return 0;
}