#include #include #include "Evas.h" #include "Ecore.h" #include "Ecore_Evas.h" #include "Elementary.h" #include "msg_sender.h" #include "gui.h" #include "handler.h" int h = 600; int w = 450; int first = 0; int bubble_pos = 100; time_t now; const char* msg_text; char *from, *to, *current_msg, *last_msg; static Evas_Object *win, *bbx; static void on_cancel(void *data, Evas_Object *obj, void *event_info) { /* cleanly exit */ elm_exit(); } static void on_chat(void *data, Evas_Object *obj, void *event_info) { init_window_parts(); init_buttons(obj); init_toolbar(obj); } static void on_map(void *data, Evas_Object *obj, void *event_info) { init_map(); } static void on_options(void *data, Evas_Object *obj, void *event_info) { init_options(); } static void on_message(void *data, Evas_Object *obj, void *event_info) { msg_text = elm_entry_entry_get(obj); elm_entry_context_menu_clear(obj); } static void on_send_message(void *data, Evas_Object *bx3, void *event_info) { printf("on_send_message: %s\n", msg_text); set_txt_msg(msg_text); Evas_Object *bb1, *bb2, *bb3; if (msg_text != NULL) { if (first == 0) { bb1 = elm_bubble_add(bx3); evas_object_resize(bb1, w, h/7); evas_object_move(bb1, 0, 0); evas_object_show(bb1); set_bubble_text(bb1, from, msg_text); first = 1; bubble_pos = bubble_pos + h/6; return; } if (first == 1) { bb2 = elm_bubble_add(bx3); evas_object_resize(bb2, w, h/6); evas_object_move(bb2, 0, bubble_pos); evas_object_show(bb2); set_bubble_text(bb2, from, msg_text); first = 2; bubble_pos = bubble_pos + h/6; return; } // printf("position: %d\n", bubble_pos); if (first == 2) { bb3 = elm_bubble_add(bx3); evas_object_resize(bb3, w, h/6); evas_object_move(bb3, 0, bubble_pos); evas_object_show(bb3); set_bubble_text(bb3, from, msg_text); first = 0; bubble_pos = 100; return; } } } /* if message has been sent, print it in a bubble */ void show_message(char *current_msg) { Evas_Object *bb1, *bb2, *bb3; if (current_msg != NULL) { if (first == 0) { bb1 = elm_bubble_add(bbx); evas_object_resize(bb1, w, h/7); evas_object_move(bb1, 0, 0); evas_object_show(bb1); set_bubble_text(bb1, to, current_msg); first = 1; bubble_pos = bubble_pos + h/6; } if (first == 1); { bb2 = elm_bubble_add(bbx); evas_object_resize(bb2, w, h/6); evas_object_move(bb2, 0, bubble_pos); evas_object_show(bb2); set_bubble_text(bb2, to, current_msg); first = 2; bubble_pos = bubble_pos + h/6; } if (first == 2) { bb3 = elm_bubble_add(bbx); evas_object_resize(bb3, w, h/6); evas_object_move(bb3, 0, bubble_pos); evas_object_show(bb3); set_bubble_text(bb3, to, current_msg); first = 0; bubble_pos = bubble_pos + h/6; } } } /* returns the current system time */ char* get_current_time() { time_t now; time(&now); char *text = ctime(&now); return text; } /* sets the username, time-text and the text in the bubble */ void set_bubble_text(Evas_Object *bb, char *username, char *text) { Evas_Object *cn; /* sets the username */ elm_entry_entry_set(bb, username); /* get time string and set it */ elm_bubble_info_set(bb, get_current_time()); /* create entry */ cn = elm_entry_add(bb); elm_entry_entry_set(cn, text); elm_entry_line_wrap_set(cn, 0); evas_object_size_hint_weight_set(cn, 1.0, 1.0); /* create overlay bubble with message string */ Evas_Object *inner_bb; inner_bb = elm_bubble_add(bb); elm_bubble_info_set(inner_bb, text); evas_object_resize(bb, w, h/6); evas_object_move(bb, 0, bubble_pos); elm_bubble_content_set(bb, cn); evas_object_show(bb); } void init_window_parts() { Evas_Object *bg, *bx, *bx2, *bx3, *sc, *en; /* add a standard bg */ bg = elm_bg_add(win); /* not not allow bg to expand. let's limit dialog size to contents */ elm_win_resize_object_add(win, bg); evas_object_show(bg); /* add a box object - default is vertical. a box holds children in a row, * either horizontally or vertically. nothing more. */ bx = elm_box_add(win); evas_object_resize(bx, w, h*0.85); evas_object_show(bx); /* add horizontal box for buttons */ bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, 1); elm_box_homogenous_set(bx2, 1); elm_frame_content_set(bx, bx2); evas_object_move(bx2, 0, h*0.93); evas_object_resize(bx2, w, h*0.05); //elm_box_pack_end(bx, bx2); evas_object_show(bx2); /* add box for incoming messages */ bx3 = elm_box_add(win); evas_object_resize(bx3, w, h*0.15); evas_object_move(bx3, 0, h*0.78); evas_object_show(bx3); sc = elm_scroller_add(win); evas_object_size_hint_weight_set(sc, 1.0, 1.0); evas_object_size_hint_align_set(sc, -1.0, -1.0); elm_box_pack_end(bx3, sc); en = elm_entry_add(win); //if (text) elm_entry_entry_set(en, text); //else elm_entry_entry_set(en, ""); evas_object_size_hint_weight_set(en, 1.0, 1.0); evas_object_size_hint_align_set(en, 0.0, 0.0); elm_scroller_content_set(sc, en); evas_object_smart_callback_add(en, "changed", on_message, NULL); evas_object_show(en); evas_object_show(sc); /* init buttons */ bbx = bx2; init_buttons(bx2); /* init toolbar */ init_toolbar(win); } void init_toolbar() { Evas_Object *tb, *ic, *bx; /* add box for toolbar */ bx = elm_box_add(win); evas_object_resize(bx, w, h*0.15); evas_object_move(bx, 0, 0); evas_object_show(bx); tb = elm_toolbar_add(win); evas_object_size_hint_weight_set(tb, 1.0, 0.0); evas_object_size_hint_align_set(tb, -1.0, -1.0); ic = elm_icon_add(win); elm_icon_standard_set(ic, "chat"); elm_toolbar_item_add(tb, ic, "Chat", on_chat, NULL); evas_object_show(ic); ic = elm_icon_add(win); elm_icon_standard_set(ic, "edit"); elm_toolbar_item_add(tb, ic, "Options", on_options, NULL); evas_object_show(ic); ic = elm_icon_add(win); elm_icon_standard_set(ic, "clock"); elm_toolbar_item_add(tb, ic, "Map", on_map, NULL); evas_object_show(ic); // evas_object_show(ic); elm_box_pack_end(bx, tb); evas_object_show(tb); } void init_options() { Evas_Object *bg, *bx, *bx2, *bt; /* add a standard bg */ bg = elm_bg_add(win); /* not not allow bg to expand. let's limit dialog size to contents */ elm_win_resize_object_add(win, bg); evas_object_show(bg); /* set toolbar again */ init_toolbar(bg); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, 1.0, 1.0); evas_object_size_hint_align_set(bx, -1.0, -1.0); evas_object_resize(bx, w, h); evas_object_show(bx); bx2 = elm_box_add(win); elm_box_horizontal_set(bx2, 1); evas_object_size_hint_weight_set(bx2, 1.0, 0.0); evas_object_size_hint_align_set(bx2, -1.0, -1.0); elm_box_pack_end(bx, bx2); evas_object_show(bx2); bt = elm_button_add(win); elm_button_label_set(bt, "Stell mich ein"); evas_object_size_hint_weight_set(bt, 1.0, 0.0); evas_object_size_hint_align_set(bt, -1.0, -1.0); elm_box_pack_end(bx2, bt); evas_object_smart_callback_add(bt, "clicked", NULL, NULL); evas_object_show(bt); } void init_map() { Evas_Object *bg, *bx, *bx2, *bx3, *map, *bt1, *bt2; /* add a standard bg */ bg = elm_bg_add(win); /* not not allow bg to expand. let's limit dialog size to contents */ elm_win_resize_object_add(win, bg); evas_object_show(bg); /* set toolbar again */ init_toolbar(bg); bx = elm_box_add(win); evas_object_size_hint_weight_set(bx, 1.0, 1.0); evas_object_size_hint_align_set(bx, -1.0, -1.0); evas_object_resize(bx, w, h); evas_object_show(bx); bx2 = elm_box_add(win); evas_object_size_hint_weight_set(bx2, 1.0, 0.0); evas_object_size_hint_align_set(bx2, -1.0, -1.0); evas_object_resize(bx2, w*1.3, h*0.7); elm_box_pack_end(bx, bx2); evas_object_show(bx2); bx3 = elm_box_add(win); elm_box_horizontal_set(bx2, 1); evas_object_size_hint_weight_set(bx3, 1.0, 0.0); evas_object_size_hint_align_set(bx3, -1.0, 0.0); evas_object_resize(bx3, w*0.9, h*0.2); elm_box_pack_end(bx, bx3); evas_object_show(bx3); map = e_smart_map_add(win, "data/maps/fr_map.eet"); e_smart_map_set_pos(map, 47.996578,7.840171); evas_object_size_hint_min_set(map, w-2*8, h-10*8-40); evas_object_size_hint_max_set(map, w-2*8, h-10*8-40); //evas_object_resize(map, w*0.92, h*0.7); elm_box_pack_end(bx2, map); evas_object_show(map); bt1 = elm_button_add(win); elm_button_label_set(bt1, "Show friends"); evas_object_size_hint_weight_set(bt1, 1.0, 1.0); evas_object_size_hint_align_set(bt1, -1.0, -1.0); elm_box_pack_end(bx3, bt1); evas_object_smart_callback_add(bt1, "clicked", NULL, NULL); evas_object_show(bt1); bt2 = elm_button_add(win); elm_button_label_set(bt2, "Hide friends"); evas_object_size_hint_weight_set(bt2, 1.0, 1.0); evas_object_size_hint_align_set(bt2, -1.0, -1.0); elm_box_pack_end(bx3, bt2); evas_object_smart_callback_add(bt2, "clicked", NULL, NULL); evas_object_show(bt2); } void init_buttons(Evas_Object *box) { Evas_Object *bt; /* add ok button to box - fill and expand */ bt = elm_button_add(win); elm_button_label_set(bt, "Send Message"); evas_object_size_hint_weight_set(bt, 1.0, 1.0); evas_object_size_hint_align_set(bt, -1.0, -1.0); //elm_box_pack_end(box, bt); evas_object_show(bt); /* and when clicked - run "on_ok" */ bbx = box; evas_object_smart_callback_add(bt, "clicked", on_send_message, NULL); /* add cancel button to box - fill and expand */ bt = elm_button_add(win); elm_button_label_set(bt, "Cancel"); evas_object_size_hint_weight_set(bt, 1.0, 1.0); evas_object_size_hint_align_set(bt, -1.0, -1.0); elm_box_pack_end(box, bt); evas_object_show(bt); /* and when clicked - run "on_cancel" */ evas_object_smart_callback_add(bt, "clicked", on_cancel, NULL); } void elm_main () { /* new window - do the usual and give it a name, title and delete handler */ win = elm_win_add(NULL, "Main", ELM_WIN_BASIC); elm_win_title_set(win, "Main"); evas_object_smart_callback_add(win, "delete,request", on_cancel, NULL); /* resize window */ evas_object_resize(win, w, h); /* init window parts */ init_window_parts(); /* show the window */ evas_object_show(win); init_ecore_handler(from, to); /* get going and draw/respond to the user */ // elm_run(); /* standard shutdown */ elm_exit(); } int main (int argc, char **argv) { if (argv[1] == NULL && argv[2] == NULL) { printf("no nick and no receiver set"); from == NULL; to == NULL; } else { from = argv[1]; to = argv[2]; } elm_init(argc, argv); elm_main(); elm_shutdown(); return 0; }