/* gcc -o combo combo.c `ewl-config --cflags --libs` */

#include <Ewl.h>
#include <stdio.h>
   
static void cb_delete_window(Ewl_Widget *w, void *ev, void *data);
static void cb_combo_changed(Ewl_Widget *w, void *ev, void *data);

static int cb_count_get(void *data);
static void *cb_fetch(void *data, unsigned int row, unsigned int column);

static Ewl_Widget *cb_constructor(void);
static void cb_assign(Ewl_Widget *w, void *data);

static void combo_test_icon_set(Ewl_Icon *icon, const char *data);

int
main(int argc, char ** argv)
{
    Ewl_Widget *win, *box, *combo, *icon;
    Ewl_Model *model;
    Ewl_View *view;
    Ecore_List *data;
    int i;

    char *items[] = {
        EWL_ICON_DOCUMENT_OPEN,
        EWL_ICON_DOCUMENT_SAVE,
        EWL_ICON_EDIT_UNDO,
        EWL_ICON_EDIT_REDO,
        NULL
    };

    if (!ewl_init(&argc, argv))
    {
        fprintf(stderr, "Error initializing Ewl.\n");
        return 1;
    }

    data = ecore_list_new();
    for (i = 0; items[i] != NULL; i++)
        ecore_list_append(data, items[i]);

    win = ewl_window_new();
    ewl_window_title_set(EWL_WINDOW(win), "Combo Example");
    ewl_window_class_set(EWL_WINDOW(win), "combo_example");
    ewl_window_name_set(EWL_WINDOW(win), "combo_example");
    ewl_callback_append(win, EWL_CALLBACK_DELETE_WINDOW,
                                cb_delete_window, NULL);
    ewl_object_size_request(EWL_OBJECT(win), 145, 145);
    ewl_widget_show(win);

    box = ewl_vbox_new();
    ewl_container_child_append(EWL_CONTAINER(win), box);
    ewl_widget_show(box);

    icon = ewl_icon_simple_new();
    combo_test_icon_set(EWL_ICON(icon), items[0]);
    ewl_container_child_append(EWL_CONTAINER(box), icon);
    ewl_widget_show(icon);

    model = ewl_model_ecore_list_get();

    view = ewl_view_new();
    ewl_view_constructor_set(view, cb_constructor);
    ewl_view_assign_set(view, EWL_VIEW_ASSIGN(cb_assign));

    combo = ewl_combo_new();
    ewl_mvc_model_set(EWL_MVC(combo), model);
    ewl_mvc_view_set(EWL_MVC(combo), view);
    ewl_mvc_data_set(EWL_MVC(combo), data);
    ewl_mvc_selected_set(EWL_MVC(combo), 0, 0);
    ewl_container_child_append(EWL_CONTAINER(box), combo);
    ewl_callback_append(combo, EWL_CALLBACK_VALUE_CHANGED, 
                                    cb_combo_changed, icon);
    ewl_widget_show(combo);

    icon = ewl_icon_simple_new();
    ewl_container_child_append(EWL_CONTAINER(box), icon);
    ewl_icon_part_hide(EWL_ICON(icon), EWL_ICON_PART_LABEL);
    ewl_widget_show(icon);

    model = ewl_model_new();
    ewl_model_count_set(model, cb_count_get);
    ewl_model_fetch_set(model, cb_fetch);

    view = ewl_label_view_get();

    combo = ewl_combo_new();
    ewl_mvc_model_set(EWL_MVC(combo), model);
    ewl_mvc_view_set(EWL_MVC(combo), view);
    ewl_mvc_data_set(EWL_MVC(combo), items);
    ewl_container_child_append(EWL_CONTAINER(box), combo);
    ewl_callback_append(combo, EWL_CALLBACK_VALUE_CHANGED,
                                    cb_combo_changed, icon);
    ewl_widget_show(combo);

    ewl_main();
    return 0;
}

static void
cb_delete_window(Ewl_Widget *w, void *ev, void *data)
{
    ewl_main_quit();
}

static void
cb_combo_changed(Ewl_Widget *w, void *ev, void *data)
{
    Ewl_Model *model;
    Ewl_Icon *icon;
    Ewl_Combo *combo;
    Ewl_Selection_Idx *idx;
    void *d;
    char *val;

    icon = data;

    d = ewl_mvc_data_get(EWL_MVC(w));
    model = ewl_mvc_model_get(EWL_MVC(w));
    idx = ewl_mvc_selected_get(EWL_MVC(w));

    val = model->fetch(d, idx->row, idx->column);

    combo_test_icon_set(icon, val);
}

static int
cb_count_get(void *data)
{
    int i = 0;
    char **d;

    d = data;
    while (d[i] != NULL) i++;
    return i;
}

static void *
cb_fetch(void *data, unsigned int row, unsigned int column)
{
    char **d;
    d = data;
    return d[row];
}

static Ewl_Widget *
cb_constructor(void)
{
    Ewl_Widget *o;
    o = ewl_icon_simple_new();
    ewl_box_orientation_set(EWL_BOX(o), EWL_ORIENTATION_HORIZONTAL);
    return o;
}

static void
cb_assign(Ewl_Widget *w, void *data)
{
    combo_test_icon_set(EWL_ICON(w), data);
}

static void
combo_test_icon_set(Ewl_Icon *icon, const char *data)
{
    const char *path;

    ewl_icon_label_set(icon, data);

    path = ewl_icon_theme_icon_path_get(data, EWL_ICON_SIZE_MEDIUM);
    if (path) ewl_icon_image_set(icon, path, data);
}

