Index: src/mainbox.h =================================================================== --- src/mainbox.h (revision 26656) +++ 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; @@ -60,5 +68,6 @@ gboolean orage_mark_appointments(); void build_mainbox_info(); void mCalendar_month_changed_cb(GtkCalendar *calendar, gpointer user_data); +void orage_show_events_for_selected_date(void); #endif /* !__MAINBOX_H__ */ Index: src/parameters.c =================================================================== --- src/parameters.c (revision 26656) +++ src/parameters.c (working copy) @@ -82,6 +82,8 @@ GtkWidget *show_taskbar_checkbutton; GtkWidget *show_pager_checkbutton; GtkWidget *show_systray_checkbutton; + GtkWidget *show_todos_checkbutton; + GtkWidget *show_events_checkbutton; /* Start visibity show or hide */ GtkWidget *visibility_frame; GSList *visibility_radiobutton_group; @@ -265,6 +267,22 @@ set_systray(); } +static void todos_changed(GtkWidget *dialog, gpointer user_data) +{ + Itf *itf = (Itf *)user_data; + + g_par.show_todos = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( + itf->show_todos_checkbutton)); +} + +static void events_changed(GtkWidget *dialog, gpointer user_data) +{ + Itf *itf = (Itf *)user_data; + + g_par.show_events = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON( + itf->show_events_checkbutton)); +} + static void start_changed(GtkWidget *dialog, gpointer user_data) { Itf *itf = (Itf *)user_data; @@ -540,12 +558,30 @@ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( dialog->show_systray_checkbutton), g_par.show_systray); + dialog->show_todos_checkbutton = gtk_check_button_new_with_mnemonic( + _("Show Todo items")); + gtk_box_pack_start(GTK_BOX(vbox) + , dialog->show_todos_checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + dialog->show_todos_checkbutton), g_par.show_todos); + + dialog->show_events_checkbutton = gtk_check_button_new_with_mnemonic( + _("Show events for selected day")); + gtk_box_pack_start(GTK_BOX(vbox) + , dialog->show_events_checkbutton, FALSE, FALSE, 0); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON( + dialog->show_events_checkbutton), g_par.show_events); + g_signal_connect(G_OBJECT(dialog->show_taskbar_checkbutton), "toggled" , G_CALLBACK(taskbar_changed), dialog); g_signal_connect(G_OBJECT(dialog->show_pager_checkbutton), "toggled" , G_CALLBACK(pager_changed), dialog); g_signal_connect(G_OBJECT(dialog->show_systray_checkbutton), "toggled" , G_CALLBACK(systray_changed), dialog); + g_signal_connect(G_OBJECT(dialog->show_todos_checkbutton), "toggled" + , G_CALLBACK(todos_changed), dialog); + g_signal_connect(G_OBJECT(dialog->show_events_checkbutton), "toggled" + , G_CALLBACK(events_changed), dialog); /* how to show when started (show/hide/minimize) */ dialog->visibility_radiobutton_group = NULL; @@ -808,6 +844,8 @@ xfce_rc_write_bool_entry(rc, "Show in pager", g_par.show_pager); xfce_rc_write_bool_entry(rc, "Show in systray", g_par.show_systray); xfce_rc_write_bool_entry(rc, "Show in taskbar", g_par.show_taskbar); + xfce_rc_write_bool_entry(rc, "Show Todo items", g_par.show_todos); + xfce_rc_write_bool_entry(rc, "Show events for selected day", g_par.show_events); xfce_rc_write_bool_entry(rc, "Start visible", g_par.start_visible); xfce_rc_write_bool_entry(rc, "Start minimized", g_par.start_minimized); xfce_rc_write_bool_entry(rc, "Set sticked", g_par.set_stick); @@ -882,6 +920,8 @@ g_par.show_borders = xfce_rc_read_bool_entry(rc, "Show borders", TRUE); g_par.show_pager = xfce_rc_read_bool_entry(rc, "Show in pager", TRUE); g_par.show_systray = xfce_rc_read_bool_entry(rc, "Show in systray", TRUE); + g_par.show_todos = xfce_rc_read_bool_entry(rc, "Show Todo items", TRUE); + g_par.show_events = xfce_rc_read_bool_entry(rc, "Show events for selected day", TRUE); g_par.show_taskbar = xfce_rc_read_bool_entry(rc, "Show in taskbar", TRUE); g_par.start_visible = xfce_rc_read_bool_entry(rc, "Start visible", TRUE); g_par.start_minimized = Index: src/parameters.h =================================================================== --- src/parameters.h (revision 26656) +++ src/parameters.h (working copy) @@ -48,6 +48,9 @@ gboolean set_stick; gboolean set_ontop; + gboolean show_todos; + gboolean show_events; + /* ical week start day (0 = Monday, 1 = Tuesday,... 6 = Sunday) */ gint ical_weekstartday; Index: src/main.c =================================================================== --- src/main.c (revision 26656) +++ src/main.c (working copy) @@ -122,6 +122,8 @@ window = GTK_WIDGET(g_par.xfcal->mWindow)->window; gdk_x11_window_set_user_time(window, gdk_x11_get_server_time(window)); gtk_window_present(GTK_WINDOW(g_par.xfcal->mWindow)); + + orage_show_events_for_selected_date(); } static gboolean client_message_received(GtkWidget *widget Index: src/mainbox.c =================================================================== --- src/mainbox.c (revision 26656) +++ 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,34 @@ create_el_win(NULL); } +void orage_show_events_for_selected_date(void) +{ + struct tm t; + CalWin *cal = g_par.xfcal; + gtk_calendar_get_date(GTK_CALENDAR(cal->mCalendar), + &(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 void mCalendar_day_selected_cb(GtkCalendar *calendar + , gpointer user_data) +{ +#undef P_N +#define P_N "mCalendar_day_selected_cb: " +#ifdef ORAGE_DEBUG + orage_message(-100, P_N); +#endif + orage_show_events_for_selected_date(); +} + static gboolean upd_calendar(GtkCalendar *calendar) { #undef P_N @@ -349,7 +379,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 +389,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 +411,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 +464,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,70 +487,180 @@ #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'; - ical_type = XFICAL_TYPE_TODO; - /* 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(&todo_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(&todo_list, a_day, ical_type, file_type); + if (g_par.show_todos) { + ical_type = XFICAL_TYPE_TODO; + /* 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(&todo_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(&todo_list, a_day, ical_type, file_type); + } + /* caller takes care of this + xfical_file_close(TRUE); + */ } - /* 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); + if (g_par.show_events) { + 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); + } + /* caller takes care of this + xfical_file_close(TRUE); + */ } - else { - gtk_widget_hide_all(cal->mInfo_scrolledWin); + 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 +713,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 +722,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);