renatofilho@20: #include <string.h>
renatofilho@20: #include <stdlib.h>
renatofilho@20: #include <gtk/gtk.h>
renatofilho@20: #include <gdk/gdkkeysyms.h>
renatofilho@20: #include <time.h>
renatofilho@20: 
renatofilho@20: #include "mmyth_epg_grid_view.h"
renatofilho@20: #include "mmyth_epg_grid_widget.h"
renatofilho@20: 
renatofilho@754: /*
renatofilho@754:  * Service genre 
renatofilho@754:  */
renatofilho@20: #define GENRE_MIN               0
renatofilho@20: #define GENRE_MAX               10
renatofilho@20: #define GENRE_UNDEFINED         0
renatofilho@20: #define GENRE_MOVIE             1
renatofilho@20: #define GENRE_NEWS              2
renatofilho@20: #define GENRE_SHOW              3
renatofilho@20: #define GENRE_SPORTS            4
renatofilho@20: #define GENRE_CHILDREN          5
renatofilho@20: #define GENRE_MUSIC             6
renatofilho@20: #define GENRE_CULTURE           7
renatofilho@20: #define GENRE_SOCIAL            8
renatofilho@20: #define GENRE_EDUCATION         9
renatofilho@20: #define GENRE_LEISURE           10
renatofilho@20: 
renatofilho@20: #define NRO_HOURS 3
renatofilho@20: 
renatofilho@754: /*
renatofilho@754:  * Function prototypes
renatofilho@754:  */
renatofilho@754: static void     update_service_details(MMythEpgGridWidget * object,
renatofilho@754:                                        gpointer arg1, gpointer user_data);
renatofilho@754: static gboolean key_press_epg_grid_view(GtkWidget * widget,
renatofilho@754:                                         GdkEventKey * event,
renatofilho@20:                                         gpointer user_data);
renatofilho@20: 
renatofilho@20: static GtkWidget *mmyth_epg_grid_widget = NULL;
renatofilho@20: 
renatofilho@754: /*
renatofilho@754:  * is a GtkEventBox 
renatofilho@754:  */
renatofilho@20: static GtkWidget *program_details_area = NULL;
renatofilho@20: static GtkWidget *details_main_hbox = NULL;
renatofilho@20: static GtkWidget *details_vbox = NULL;
renatofilho@20: static GtkWidget *details_logo_vbox = NULL;
renatofilho@20: 
renatofilho@754: /*
renatofilho@754:  * update signal callback from MMythEpgGridWidget 
renatofilho@754:  */
renatofilho@20: static void
renatofilho@754: update_service_details(MMythEpgGridWidget * object, gpointer arg1,
renatofilho@754:                        gpointer user_data)
renatofilho@20: {
renatofilho@754:     g_return_if_fail(arg1 != NULL);
renatofilho@20: 
renatofilho@754:     EpgGridItem    *epg_grid_item = (EpgGridItem *) arg1;
renatofilho@20: 
renatofilho@754:     gchar           sel_prog_desc[100] = "<big><b>";
renatofilho@754:     gchar           time_buffer[50];
renatofilho@20: 
renatofilho@754:     /*
renatofilho@754:      * FIXME: get first content from content_list
renatofilho@754:      */
renatofilho@754:     GMythProgramInfo *proginfo =
renatofilho@754:         (GMythProgramInfo *) epg_grid_item->proginfo;
renatofilho@754: 
renatofilho@754:     if (proginfo) {
renatofilho@754:         GString        *prog_name = proginfo->title;
renatofilho@754:         GString        *service_name = proginfo->chanid;
renatofilho@754: 
renatofilho@754:         if (details_vbox != NULL)
renatofilho@754:             gtk_container_remove(GTK_CONTAINER(details_main_hbox),
renatofilho@754:                                  details_vbox);
renatofilho@754: 
renatofilho@754:         /*
renatofilho@754:          * update service description 
renatofilho@754:          */
renatofilho@20:         strcat(sel_prog_desc, service_name->str);
renatofilho@20:         strcat(sel_prog_desc, "</b></big>");
renatofilho@20: 
renatofilho@754:         GtkWidget      *fst_line_lbl = gtk_label_new(NULL);
renatofilho@754:         gtk_misc_set_alignment(GTK_MISC(fst_line_lbl), 0.0, 0.0);
renatofilho@754:         gtk_label_set_markup(GTK_LABEL(fst_line_lbl), sel_prog_desc);
renatofilho@754: 
renatofilho@754:         /*
renatofilho@754:          * freeing char[] 
renatofilho@754:          */
renatofilho@20:         sel_prog_desc[0] = 0;
renatofilho@20:         strcat(sel_prog_desc, "\t");
renatofilho@754:         strcat(sel_prog_desc, prog_name->str);
renatofilho@754: 
renatofilho@754:         struct tm       loctime_start,
renatofilho@754:                         loctime_end;
renatofilho@754: 
renatofilho@20:         // Convert it to local time representation. 
renatofilho@754:         /*
renatofilho@754:          * FIXME: conversion from time to localtime is different in
renatofilho@754:          * different machines 
renatofilho@754:          */
renatofilho@754:         long int        schedule_start_time = proginfo->startts->tv_sec;
renatofilho@754:         long int        schedule_end_time = proginfo->endts->tv_sec;
renatofilho@754: 
renatofilho@20:         if (localtime_r(&schedule_start_time, &loctime_start) == NULL) {
renatofilho@754:             g_warning("localtime_r error in mmyth_epg_grid_view!\n");
renatofilho@20:         }
renatofilho@754: #if 0
renatofilho@754:         fprintf(stderr, asctime(loctime_start));
renatofilho@754: #endif
renatofilho@754: 
renatofilho@754:         strftime(time_buffer, 100, "  %H:%M - ", &loctime_start);
renatofilho@754:         strcat(sel_prog_desc, time_buffer);
renatofilho@754: 
renatofilho@20:         if (localtime_r(&schedule_end_time, &loctime_end) == NULL) {
renatofilho@754:             g_warning("localtime_r error in mmyth_epg_grid_view!\n");
renatofilho@20:         }
renatofilho@754: #if 0
renatofilho@754:         fprintf(stderr, asctime(loctime_end));
renatofilho@754: #endif
renatofilho@20: 
renatofilho@754:         strftime(time_buffer, 100, "%H:%M\n", &loctime_end);
renatofilho@754:         strcat(sel_prog_desc, time_buffer);
renatofilho@754: 
renatofilho@754:         GtkWidget      *snd_line_lbl = gtk_label_new(NULL);
renatofilho@754:         gtk_misc_set_alignment(GTK_MISC(snd_line_lbl), 0.0, 0.0);
renatofilho@754:         gtk_label_set_markup(GTK_LABEL(snd_line_lbl), sel_prog_desc);
renatofilho@754: 
renatofilho@20:         // add the current selected program description to the label
renatofilho@20:         details_vbox = gtk_vbox_new(FALSE, 0);
renatofilho@754:         GtkWidget      *fst_line_hbox = gtk_hbox_new(FALSE, 0);
renatofilho@754: 
renatofilho@754:         gtk_box_pack_start(GTK_BOX(fst_line_hbox),
renatofilho@754:                            fst_line_lbl, FALSE, FALSE, 6);
renatofilho@754:         gtk_box_pack_start(GTK_BOX(details_vbox),
renatofilho@754:                            fst_line_hbox, FALSE, FALSE, 0);
renatofilho@754:         gtk_box_pack_start(GTK_BOX(details_vbox),
renatofilho@754:                            snd_line_lbl, FALSE, FALSE, 0);
renatofilho@754:         gtk_box_pack_start(GTK_BOX(details_main_hbox),
renatofilho@754:                            details_vbox, FALSE, FALSE, 0);
renatofilho@754: 
renatofilho@20:         gtk_widget_show_all(details_main_hbox);
renatofilho@754:     }
renatofilho@20: }
renatofilho@20: 
renatofilho@754: /*
renatofilho@754:  * Callback for hardware keys 
renatofilho@754:  */
renatofilho@754: static          gboolean
renatofilho@754: key_press_epg_grid_view(GtkWidget * widget,
renatofilho@20:                         GdkEventKey * event, gpointer user_data)
renatofilho@20: {
renatofilho@754:     MMythEpgGridWidget *mmyth_epg_grid_widget =
renatofilho@754:         (MMythEpgGridWidget *) user_data;
renatofilho@20: 
renatofilho@754:     return mmyth_epg_grid_widget_key_press(mmyth_epg_grid_widget, widget,
renatofilho@754:                                            event);
renatofilho@20: }
renatofilho@20: 
renatofilho@754: GtkWidget      *
renatofilho@754: epg_grid_view_new(MMythUi * mmyth_ui)
renatofilho@20: {
renatofilho@754:     GtkWidget      *scrolled_window;
renatofilho@754:     scrolled_window = gtk_scrolled_window_new(NULL, NULL);
renatofilho@754:     gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
renatofilho@754:                                    GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
renatofilho@20: 
renatofilho@754:     gtk_widget_modify_bg(scrolled_window, GTK_STATE_NORMAL,
renatofilho@754:                          &main_bg_color);
renatofilho@20: 
renatofilho@754:     GtkWidget      *main_vbox = gtk_vbox_new(FALSE, 0);
renatofilho@754:     // gtk_container_set_border_width(main_vbox, 4); 
renatofilho@20: 
renatofilho@754:     GtkWidget      *details_event_box = gtk_event_box_new();
renatofilho@754:     gtk_widget_modify_bg(details_event_box, GTK_STATE_NORMAL,
renatofilho@754:                          &main_bg_color);
renatofilho@754: 
renatofilho@754:     program_details_area = gtk_vbox_new(FALSE, 0);
renatofilho@754:     gtk_container_add(GTK_CONTAINER(details_event_box),
renatofilho@754:                       program_details_area);
renatofilho@754:     gtk_container_set_border_width(GTK_CONTAINER(program_details_area), 4);
renatofilho@754: 
renatofilho@754:     details_main_hbox = gtk_hbox_new(FALSE, 10);
renatofilho@754: 
renatofilho@754:     gtk_box_pack_start(GTK_BOX(program_details_area),
renatofilho@754:                        details_main_hbox, FALSE, FALSE, 0);
renatofilho@754: 
renatofilho@754:     details_logo_vbox = gtk_vbox_new(FALSE, 0);
renatofilho@754: 
renatofilho@754:     GtkWidget      *details_desc_vbox = gtk_vbox_new(FALSE, 0);
renatofilho@754: 
renatofilho@754:     gtk_box_pack_start(GTK_BOX(details_main_hbox),
renatofilho@754:                        details_desc_vbox, FALSE, FALSE, 0);
renatofilho@754:     gtk_box_pack_start(GTK_BOX(details_main_hbox),
renatofilho@754:                        details_logo_vbox, FALSE, FALSE, 0);
renatofilho@754: 
renatofilho@754:     gtk_widget_set_size_request(program_details_area, -1, 120);
renatofilho@754: 
renatofilho@20:     mmyth_epg_grid_widget = mmyth_epg_grid_widget_new();
renatofilho@754:     g_signal_connect(mmyth_epg_grid_widget, "selection_updated",
renatofilho@754:                      G_CALLBACK(update_service_details), NULL);
renatofilho@20: 
renatofilho@754:     /*
renatofilho@754:      * select by default the first service 
renatofilho@754:      */
renatofilho@754:     /*
renatofilho@754:      * depends on mount services 
renatofilho@754:      */
renatofilho@20:     if (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model) {
renatofilho@754:         GList          *fst_service = (GList *)
renatofilho@754:             MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)->epg_view_model->
renatofilho@754:             data;
renatofilho@754:         mmyth_epg_grid_widget_update_service(MMYTH_EPG_GRID_WIDGET
renatofilho@754:                                              (mmyth_epg_grid_widget),
renatofilho@754:                                              fst_service);
renatofilho@20:     }
renatofilho@20: 
renatofilho@754:     gtk_box_pack_start(GTK_BOX(main_vbox),
renatofilho@754:                        details_event_box, FALSE, FALSE, 0);
renatofilho@754:     gtk_box_pack_start(GTK_BOX(main_vbox),
renatofilho@754:                        gtk_hseparator_new(), FALSE, FALSE, 0);
renatofilho@754:     gtk_box_pack_start(GTK_BOX(main_vbox),
renatofilho@754:                        mmyth_epg_grid_widget, FALSE, FALSE, 0);
renatofilho@20: 
renatofilho@754:     gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW
renatofilho@754:                                           (scrolled_window), main_vbox);
renatofilho@754: 
renatofilho@754:     /*
renatofilho@754:      * Add hardware button listener to application 
renatofilho@754:      */
renatofilho@754:     g_signal_connect(mmyth_ui->main_window, "key_press_event",
renatofilho@754:                      G_CALLBACK(key_press_epg_grid_view),
renatofilho@754:                      mmyth_epg_grid_widget);
renatofilho@754: 
renatofilho@754:     gtk_widget_show_all(scrolled_window);
renatofilho@754: 
renatofilho@20:     return scrolled_window;
renatofilho@20: }
renatofilho@20: 
renatofilho@20: /*
renatofilho@754:  * DVBHScheduleEvent * mmyth_epg_grid_view_get_selected_schedule() {
renatofilho@754:  * return mmyth_epg_grid_get_selected_schedule
renatofilho@754:  * (MMYTH_EPG_GRID_WIDGET(mmyth_epg_grid_widget)); } 
renatofilho@754:  */