Index: src/mainbox.h =================================================================== --- src/mainbox.h (revision 26654) +++ src/mainbox.h (working copy) @@ -50,9 +50,17 @@ GtkWidget *mCalendar; - GtkWidget *mInfo_scrolledWin; - GtkWidget *mInfo_vbox; + GtkWidget *mInfo_hbox; + GtkWidget *mInfo_container_Vbox; + GtkWidget *mTodo_label; + GtkWidget *mTodo_scrolledWin; + GtkWidget *mTodo_vbox; + + GtkWidget *mEvent_label; + GtkWidget *mEvent_scrolledWin; + GtkWidget *mEvent_vbox; + GdkColor mRed, mBlue; } CalWin; Index: src/mainbox.c =================================================================== --- src/mainbox.c (revision 26654) +++ src/mainbox.c (working copy) @@ -55,6 +55,8 @@ #define ORAGE_DEBUG 1 */ +static void show_mainbox_info (gboolean todos, gboolean events); +static void build_mainbox_info_for_date(struct tm *t); gboolean orage_mark_appointments() { @@ -210,6 +212,29 @@ create_el_win(NULL); } +static void mCalendar_day_selected_cb(GtkCalendar *calendar + , gpointer user_data) +{ +#undef P_N +#define P_N "mCalendar_day_selected_cb: " + struct tm t; + +#ifdef ORAGE_DEBUG + orage_message(-100, P_N); +#endif + gtk_calendar_get_date(calendar, + &(t.tm_year), + &(t.tm_mon), + &(t.tm_mday)); + t.tm_year -= 1900; + + /* rebuild the info for the selected date */ + if (!xfical_file_open(TRUE)) + return; + build_mainbox_info_for_date(&t); + xfical_file_close(TRUE); +} + static gboolean upd_calendar(GtkCalendar *calendar) { #undef P_N @@ -349,7 +374,7 @@ } } -static void add_info_row(xfical_appt *appt) +static void add_info_row(xfical_appt *appt, GtkBox *parentBox) { #undef P_N #define P_N "add_info_row: " @@ -359,13 +384,16 @@ struct tm *t; char *l_time, *s_time, *e_time, *c_time, *na; gint len; - + gchar *tmp; #ifdef ORAGE_DEBUG orage_message(-100, P_N); #endif ev = gtk_event_box_new(); - label = gtk_label_new(appt->title); + tmp = g_strdup_printf(" %s", appt->title); + label = gtk_label_new(tmp); + g_free(tmp); gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END); + gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5); t = orage_localtime(); l_time = orage_tm_time_to_icaltime(t); if (appt->starttimecur[8] == 'T') /* date+time */ @@ -378,7 +406,7 @@ && strncmp(appt->endtimecur, l_time, len) >= 0) gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &cal->mBlue); gtk_container_add(GTK_CONTAINER(ev), label); - gtk_box_pack_start(GTK_BOX(cal->mInfo_vbox), ev, FALSE, FALSE, 0); + gtk_box_pack_start(parentBox, ev, FALSE, FALSE, 0); na = _("Not defined"); s_time = g_strdup(orage_icaltime_to_i18_time(appt->starttimecur)); e_time = g_strdup(orage_icaltime_to_i18_time(appt->endtimecur)); @@ -431,21 +459,21 @@ return(strcmp(appt1->starttimecur, appt2->starttimecur)); } -static void todo_process(gpointer a, gpointer dummy) +static void todo_process(gpointer a, gpointer parentBox) { #undef P_N #define P_N "todo_process: " xfical_appt *appt; - + GtkBox *box = GTK_BOX(parentBox); #ifdef ORAGE_DEBUG orage_message(-100, P_N); #endif appt = (xfical_appt *)a; - add_info_row(appt); + add_info_row(appt, box); xfical_appt_free(appt); } -void create_mainbox_info(void) +void create_mainbox_info(gboolean first_create) { #undef P_N #define P_N "create_mainbox_info: " @@ -454,34 +482,109 @@ #ifdef ORAGE_DEBUG orage_message(-100, P_N); #endif - cal->mInfo_scrolledWin = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cal->mInfo_scrolledWin) + + /* destroy existing if necessary - this is the easiest way + * to relayout + */ + if (!first_create) { + gtk_widget_destroy(cal->mInfo_hbox); + } + +/* global part */ + cal->mInfo_hbox = gtk_hbox_new(FALSE, 0); + cal->mInfo_container_Vbox = gtk_vbox_new(FALSE, 0); + + gtk_box_pack_start(GTK_BOX(cal->mVbox), cal->mInfo_hbox + , TRUE, TRUE, 2); + gtk_box_pack_start(GTK_BOX(cal->mInfo_hbox), cal->mInfo_container_Vbox + , TRUE, TRUE, 4); + +/* todo part */ + cal->mTodo_label = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(cal->mTodo_label), _("To do:")); + + gtk_box_pack_start(GTK_BOX(cal->mInfo_container_Vbox), cal->mTodo_label + , TRUE, TRUE, 0); + gtk_misc_set_alignment(GTK_MISC(cal->mTodo_label), 0, 0.5); + cal->mTodo_scrolledWin = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cal->mTodo_scrolledWin) , GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - gtk_box_pack_start(GTK_BOX(cal->mVbox), cal->mInfo_scrolledWin + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(cal->mTodo_scrolledWin) + , GTK_SHADOW_NONE); + gtk_box_pack_start(GTK_BOX(cal->mInfo_container_Vbox), cal->mTodo_scrolledWin , FALSE, FALSE, 0); - cal->mInfo_vbox = gtk_vbox_new(FALSE, 0); + cal->mTodo_vbox = gtk_vbox_new(FALSE, 0); gtk_scrolled_window_add_with_viewport( - GTK_SCROLLED_WINDOW(cal->mInfo_scrolledWin), cal->mInfo_vbox); + GTK_SCROLLED_WINDOW(cal->mTodo_scrolledWin), cal->mTodo_vbox); + +/* events part */ + cal->mEvent_label = gtk_label_new(NULL); + gtk_label_set_markup(GTK_LABEL(cal->mEvent_label), _("Events for:")); + + gtk_box_pack_start(GTK_BOX(cal->mInfo_container_Vbox), cal->mEvent_label + , TRUE, TRUE, 0); + gtk_misc_set_alignment(GTK_MISC(cal->mEvent_label), 0, 0.5); + cal->mEvent_scrolledWin = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cal->mEvent_scrolledWin) + , GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(cal->mEvent_scrolledWin) + , GTK_SHADOW_NONE); + gtk_box_pack_start(GTK_BOX(cal->mInfo_container_Vbox), cal->mEvent_scrolledWin + , FALSE, FALSE, 0); + cal->mEvent_vbox = gtk_vbox_new(FALSE, 0); + gtk_scrolled_window_add_with_viewport( + GTK_SCROLLED_WINDOW(cal->mEvent_scrolledWin), cal->mEvent_vbox); } -void build_mainbox_info(void) +static void show_mainbox_info (gboolean todos, gboolean events) { #undef P_N +#define P_N "show_mainbox_info: " + CalWin *cal = g_par.xfcal; + +#ifdef ORAGE_DEBUG + orage_message(-100, P_N); +#endif + if (todos || events) { + /* first show everything, then hide parts if necessary */ + gtk_widget_show_all(cal->mInfo_hbox); + if (!todos) { + gtk_widget_hide_all(cal->mTodo_label); + gtk_widget_hide_all(cal->mTodo_scrolledWin); + } + if (!events) { + gtk_widget_hide_all(cal->mEvent_label); + gtk_widget_hide_all(cal->mEvent_scrolledWin); + } else { + gchar *tmp = g_strdup_printf( + _("Events for %s:"), + orage_cal_to_i18_date( + GTK_CALENDAR(cal->mCalendar))); + gtk_label_set_markup(GTK_LABEL(cal->mEvent_label), tmp); + g_free(tmp); + } + } else { + gtk_widget_hide_all(cal->mInfo_hbox); + } +} + +static void build_mainbox_info_for_date(struct tm *t) +{ +#undef P_N #define P_N "build_mainbox_info: " CalWin *cal = g_par.xfcal; char *s_time; char a_day[9]; /* yyyymmdd */ - struct tm *t; xfical_type ical_type; gchar file_type[8]; gint i; GList *todo_list=NULL; + GList *event_list = NULL; #ifdef ORAGE_DEBUG orage_message(-100, P_N); #endif - t = orage_localtime(); s_time = orage_tm_time_to_icaltime(t); strncpy(a_day, s_time, 8); a_day[8] = '\0'; @@ -504,20 +607,53 @@ /* caller takes care of this xfical_file_close(TRUE); */ - if (todo_list) { - gtk_widget_destroy(cal->mInfo_scrolledWin); - create_mainbox_info(); - todo_list = g_list_sort(todo_list, todo_order); - g_list_foreach(todo_list, (GFunc)todo_process, NULL); - g_list_free(todo_list); - todo_list = NULL; - gtk_widget_show_all(cal->mInfo_scrolledWin); + + ical_type = XFICAL_TYPE_EVENT; + /* first search base orage file */ + /* this routine is called always from libical build alarm list internal + * and ical files are already open at that time */ + /* + if (!xfical_file_open(TRUE)) + return; + */ + strcpy(file_type, "O00."); + insert_rows(&event_list, a_day, ical_type, file_type); + /* then process all foreign files */ + for (i = 0; i < g_par.foreign_count; i++) { + g_sprintf(file_type, "F%02d.", i); + insert_rows(&event_list, a_day, ical_type, file_type); } - else { - gtk_widget_hide_all(cal->mInfo_scrolledWin); + /* caller takes care of this + xfical_file_close(TRUE); + */ + + if (todo_list || event_list) { + create_mainbox_info(FALSE); + if (todo_list) { + todo_list = g_list_sort(todo_list, todo_order); + g_list_foreach(todo_list, (GFunc)todo_process, cal->mTodo_vbox); + } + if (event_list) { + event_list = g_list_sort(event_list, todo_order); + g_list_foreach(event_list, (GFunc)todo_process, cal->mEvent_vbox); + } + show_mainbox_info((todo_list != NULL), (event_list != NULL)); + g_list_free(todo_list); + todo_list = NULL; + g_list_free(event_list); + event_list = NULL; + } else { + show_mainbox_info(FALSE, FALSE); } } +void build_mainbox_info (void) +{ + struct tm *t; + t = orage_localtime(); + build_mainbox_info_for_date(t); +} + void build_mainWin() { #undef P_N @@ -570,10 +706,8 @@ gtk_widget_show(cal->mCalendar); /* Build the Info box */ - create_mainbox_info(); - /* - gtk_widget_show_all(cal->mInfo_scrolledWin); - */ + create_mainbox_info(TRUE); + show_mainbox_info(FALSE, FALSE); /* Signals */ @@ -581,6 +715,10 @@ , G_CALLBACK(mCalendar_day_selected_double_click_cb) , (gpointer) cal); + g_signal_connect((gpointer) cal->mCalendar, "day_selected" + , G_CALLBACK(mCalendar_day_selected_cb) + , (gpointer) cal); + g_signal_connect((gpointer) cal->mCalendar, "month-changed" , G_CALLBACK(mCalendar_month_changed_cb), (gpointer) cal);