Author: juha Date: 2007-11-20 23:04:15 +0000 (Tue, 20 Nov 2007) New Revision: 26382
Modified: xfcalendar/trunk/configure.in.in xfcalendar/trunk/po/fi.po xfcalendar/trunk/src/appointment.c xfcalendar/trunk/src/event-list.c xfcalendar/trunk/src/functions.c xfcalendar/trunk/src/functions.h xfcalendar/trunk/src/ical-code.c xfcalendar/trunk/src/ical-code.h xfcalendar/trunk/src/mainbox.c xfcalendar/trunk/src/mainbox.h xfcalendar/trunk/src/reminder.c Log: Bug 3601: part 2. Add VTODO as bold in the main window and fix the vtodo implementation overall. version bumped to 4.5.11.1 Modified: xfcalendar/trunk/configure.in.in =================================================================== --- xfcalendar/trunk/configure.in.in 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/configure.in.in 2007-11-20 23:04:15 UTC (rev 26382) @@ -9,7 +9,7 @@ dnl dnl Version information -m4_define([orage_version], [4.5.10.3-svn]) +m4_define([orage_version], [4.5.11.1-svn]) m4_define([gtk_minimum_version], [2.6.0]) m4_define([xfce_minimum_version], [4.4.0]) Modified: xfcalendar/trunk/po/fi.po =================================================================== --- xfcalendar/trunk/po/fi.po 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/po/fi.po 2007-11-20 23:04:15 UTC (rev 26382) @@ -2865,11 +2865,11 @@ #: ../src/main.c:284 msgid "--version (-v) \t\tshow version of orage\n" -msgstr "--version (-) \t\tnäytä Oragen versio\n" +msgstr "--version (-v) \t\tnäytä Oragen versio\n" #: ../src/main.c:285 msgid "--help (-h) \t\tprint this text\n" -msgstr "--help (.h) \t\tkirjoita tämä teksti\n" +msgstr "--help (-h) \t\tkirjoita tämä teksti\n" #: ../src/main.c:286 msgid "--preferences (-p) \tshow preferences form\n" Modified: xfcalendar/trunk/src/appointment.c =================================================================== --- xfcalendar/trunk/src/appointment.c 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/appointment.c 2007-11-20 23:04:15 UTC (rev 26382) @@ -734,6 +734,9 @@ { gint result; + /* Journal does not have end time so no need to check */ + if (appt->type == XFICAL_TYPE_JOURNAL) + return(TRUE); if (xfical_compare_times(appt) > 0) { result = xfce_message_dialog(GTK_WINDOW(apptw->Window), _("Warning"), @@ -743,10 +746,10 @@ GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, NULL); - return FALSE; + return(FALSE); } else { - return TRUE; + return(TRUE); } } @@ -835,17 +838,19 @@ /* duration */ appt->use_duration = gtk_toggle_button_get_active( GTK_TOGGLE_BUTTON(apptw->Dur_checkbutton)); - appt->duration = gtk_spin_button_get_value_as_int( - GTK_SPIN_BUTTON(apptw->Dur_spin_dd)) * 24*60*60 - + gtk_spin_button_get_value_as_int( - GTK_SPIN_BUTTON(apptw->Dur_spin_hh)) * 60*60 - + gtk_spin_button_get_value_as_int( - GTK_SPIN_BUTTON(apptw->Dur_spin_mm)) * 60; + if (appt->allDay) + appt->duration = gtk_spin_button_get_value_as_int( + GTK_SPIN_BUTTON(apptw->Dur_spin_dd)) * 24*60*60; + else + appt->duration = gtk_spin_button_get_value_as_int( + GTK_SPIN_BUTTON(apptw->Dur_spin_dd)) * 24*60*60 + + gtk_spin_button_get_value_as_int( + GTK_SPIN_BUTTON(apptw->Dur_spin_hh)) * 60*60 + + gtk_spin_button_get_value_as_int( + GTK_SPIN_BUTTON(apptw->Dur_spin_mm)) * 60; - /* Check that end time is after start time. - * Journal does not have end time so no need to check */ - if (appt->type != XFICAL_TYPE_JOURNAL - && !orage_validate_datetime(apptw, appt)) + /* Check that end time is after start time. */ + if (!orage_validate_datetime(apptw, appt)) return(FALSE); /* completed date and time. @@ -1325,7 +1330,7 @@ , (gdouble)tm_date.tm_hour); gtk_spin_button_set_value( GTK_SPIN_BUTTON(apptw->CompletedTime_spin_mm) - , (gdouble)tm_date.tm_hour); + , (gdouble)tm_date.tm_min); if (appt->completed_tz_loc) { gtk_button_set_label(GTK_BUTTON(apptw->CompletedTimezone_button) , _(appt->completed_tz_loc)); @@ -1801,6 +1806,7 @@ gtk_notebook_append_page(GTK_NOTEBOOK(apptw->Notebook) , apptw->General_notebook_page, apptw->General_tab_label); + /* type */ apptw->Type_label = gtk_label_new(_("Type ")); hbox = gtk_hbox_new(FALSE, 0); apptw->Type_event_rb = gtk_radio_button_new_with_label(NULL, _("Event")); @@ -1825,24 +1831,28 @@ , apptw->Type_label, hbox , row = 0, (GTK_EXPAND | GTK_FILL), (0)); + /* title */ apptw->Title_label = gtk_label_new(_("Title ")); apptw->Title_entry = gtk_entry_new(); orage_table_add_row(apptw->TableGeneral , apptw->Title_label, apptw->Title_entry , ++row, (GTK_EXPAND | GTK_FILL), (0)); + /* location */ apptw->Location_label = gtk_label_new(_("Location")); apptw->Location_entry = gtk_entry_new(); orage_table_add_row(apptw->TableGeneral , apptw->Location_label, apptw->Location_entry , ++row, (GTK_EXPAND | GTK_FILL), (0)); + /* All day */ apptw->AllDay_checkbutton = gtk_check_button_new_with_mnemonic(_("All day event")); orage_table_add_row(apptw->TableGeneral , NULL, apptw->AllDay_checkbutton , ++row, (GTK_EXPAND | GTK_FILL), (0)); + /* start time */ apptw->Start_label = gtk_label_new(_("Start")); apptw->StartDate_button = gtk_button_new(); apptw->StartTime_spin_hh = gtk_spin_button_new_with_range(0, 23, 1); @@ -1861,6 +1871,7 @@ G_CALLBACK(oc_set_height_changed), NULL); */ + /* end time */ apptw->End_label = gtk_label_new(_("End")); apptw->EndDate_button = gtk_button_new(); apptw->EndTime_spin_hh = gtk_spin_button_new_with_range(0, 23, 1); @@ -1875,6 +1886,7 @@ , apptw->End_label, apptw->EndTime_hbox , ++row, (GTK_SHRINK | GTK_FILL), (GTK_SHRINK | GTK_FILL)); + /* duration */ apptw->Dur_hbox = gtk_hbox_new(FALSE, 0); apptw->Dur_checkbutton = gtk_check_button_new_with_mnemonic(_("Duration")); @@ -1896,6 +1908,7 @@ , NULL, apptw->Dur_hbox , ++row, (GTK_FILL), (GTK_FILL)); + /* Availability (only for EVENT) */ apptw->Availability_label = gtk_label_new(_("Availability")); apptw->Availability_cb = gtk_combo_box_new_text(); combo_box_append_array(apptw->Availability_cb @@ -1904,6 +1917,7 @@ , apptw->Availability_label, apptw->Availability_cb , ++row, (GTK_FILL), (GTK_FILL)); + /* completed (only for TODO) */ apptw->Completed_label = gtk_label_new(_("Completed")); apptw->Completed_hbox = gtk_hbox_new(FALSE, 0); apptw->Completed_checkbutton = @@ -1927,6 +1941,7 @@ , apptw->Completed_label, apptw->Completed_hbox , ++row, (GTK_FILL), (GTK_FILL)); + /* note */ apptw->Note = gtk_label_new(_("Note")); apptw->Note_Scrolledwindow = gtk_scrolled_window_new(NULL, NULL); event = gtk_event_box_new(); /* only needed for tooltips */ @@ -2382,6 +2397,7 @@ appt_win *create_appt_win(char *action, char *par, el_win *event_list) { appt_win *apptw; + GdkWindow *window; /* initialisation + main window + base vbox */ apptw = g_new(appt_win, 1); @@ -2423,6 +2439,10 @@ recur_hide_show(apptw); type_hide_show(apptw); gtk_widget_grab_focus(apptw->Title_entry); + window = GTK_WIDGET(apptw->Window)->window; + gdk_x11_window_set_user_time(window, gdk_x11_get_server_time(window)); + gtk_window_present(GTK_WINDOW(apptw->Window)); + } else { /* failed to get data */ app_free_memory(apptw); Modified: xfcalendar/trunk/src/event-list.c =================================================================== --- xfcalendar/trunk/src/event-list.c 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/event-list.c 2007-11-20 23:04:15 UTC (rev 26382) @@ -313,7 +313,7 @@ GtkTreeIter iter1; GtkListStore *list1; gchar *title = NULL; - gchar flags[5]; + gchar flags[6]; gchar *stime; gchar /* *s_sort,*/ *s_sort1; gchar source[5]; @@ -348,8 +348,15 @@ flags[3] = appt->uid[0]; /* file type */ - flags[4] = '\0'; + if (appt->type == XFICAL_TYPE_EVENT) + flags[4] = 'E'; + else if (appt->type == XFICAL_TYPE_TODO) + flags[4] = 'T'; + else + flags[4] = 'J'; + flags[5] = '\0'; + if (appt->title != NULL) title = g_strdup(appt->title); else if (appt->note != NULL) { @@ -1265,7 +1272,7 @@ gtk_tree_view_append_column(GTK_TREE_VIEW(el->TreeView), col); gtk_tree_view_column_set_visible(col, FALSE); - gtk_tooltips_set_tip(el->Tooltips, el->TreeView, _("Double click line to edit it.\n\nFlags in order:\n\t 1. Alarm: n=no alarm\n\t\t A=visual Alarm S=also Sound alarm\n\t 2. Recurrence: n=no recurrence\n\t\t D=Daily W=Weekly M=Monthly Y=Yearly\n\t 3. Type: f=free B=Busy\n\t 4. Located in file: O=Orage\n\t\t A=Archive F=Foreign"), NULL); + gtk_tooltips_set_tip(el->Tooltips, el->TreeView, _("Double click line to edit it.\n\nFlags in order:\n\t 1. Alarm: n=no alarm\n\t\t A=visual Alarm S=also Sound alarm\n\t 2. Recurrence: n=no recurrence\n\t\t D=Daily W=Weekly M=Monthly Y=Yearly\n\t 3. Type: f=free B=Busy\n\t 4. Located in file:\n\t\tO=Orage A=Archive F=Foreign\n\t 5. Appointment type:\n\t\tE=Event T=Todo J=Journal"), NULL); g_signal_connect(el->TreeView, "row-activated", G_CALLBACK(editEvent), el); Modified: xfcalendar/trunk/src/functions.c =================================================================== --- xfcalendar/trunk/src/functions.c 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/functions.c 2007-11-20 23:04:15 UTC (rev 26382) @@ -46,17 +46,14 @@ gboolean orage_date_button_clicked(GtkWidget *button, GtkWidget *win) { - GtkWidget *selDate_Window_dialog; - GtkWidget *selDate_Calendar_calendar; + GtkWidget *selDate_dialog; + GtkWidget *selDate_calendar; gint result; - char *date_to_display=NULL; - /* - struct tm *t; - */ + char *new_date=NULL, *cur_date; struct tm cur_t; - gboolean changed; + gboolean changed, allocated=FALSE; - selDate_Window_dialog = gtk_dialog_new_with_buttons( + selDate_dialog = gtk_dialog_new_with_buttons( _("Pick the date"), GTK_WINDOW(win), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("Today"), @@ -65,49 +62,42 @@ GTK_RESPONSE_ACCEPT, NULL); - selDate_Calendar_calendar = gtk_calendar_new(); - gtk_container_add(GTK_CONTAINER(GTK_DIALOG(selDate_Window_dialog)->vbox) - , selDate_Calendar_calendar); + selDate_calendar = gtk_calendar_new(); + gtk_container_add(GTK_CONTAINER(GTK_DIALOG(selDate_dialog)->vbox) + , selDate_calendar); - cur_t = orage_i18_date_to_tm_date(gtk_button_get_label( - GTK_BUTTON(button))); - orage_select_date(GTK_CALENDAR(selDate_Calendar_calendar) + cur_date = (char *)gtk_button_get_label(GTK_BUTTON(button)); + if (cur_date) + cur_t = orage_i18_date_to_tm_date(cur_date); + else /* something was wrong. let's return some valid value */ + cur_t = orage_i18_date_to_tm_date(orage_localdate_i18()); + + orage_select_date(GTK_CALENDAR(selDate_calendar) , cur_t.tm_year+1900, cur_t.tm_mon, cur_t.tm_mday); - gtk_widget_show_all(selDate_Window_dialog); + gtk_widget_show_all(selDate_dialog); - result = gtk_dialog_run(GTK_DIALOG(selDate_Window_dialog)); + result = gtk_dialog_run(GTK_DIALOG(selDate_dialog)); switch(result){ case GTK_RESPONSE_ACCEPT: - /* - gtk_calendar_get_date(GTK_CALENDAR(selDate_Calendar_calendar) - , (guint *)&cur_t.tm_year, (guint *)&cur_t.tm_mon - , (guint *)&cur_t.tm_mday); - cur_t.tm_year -= 1900; - date_to_display = orage_tm_date_to_i18_date(&cur_t); - */ - date_to_display = orage_cal_to_i18_date( - GTK_CALENDAR(selDate_Calendar_calendar)); + new_date = orage_cal_to_i18_date(GTK_CALENDAR(selDate_calendar)); break; case 1: - /* - t = orage_localtime(); - date_to_display = orage_tm_date_to_i18_date(t); - */ - date_to_display = orage_localdate_i18(); + new_date = orage_localdate_i18(); break; case GTK_RESPONSE_DELETE_EVENT: default: - date_to_display = (gchar *)gtk_button_get_label( - GTK_BUTTON(button)); + new_date = g_strdup(cur_date); + allocated = TRUE; break; } - if (g_ascii_strcasecmp((gchar *)date_to_display - , (gchar *)gtk_button_get_label(GTK_BUTTON(button))) != 0) + if (g_ascii_strcasecmp(new_date, cur_date) != 0) changed = TRUE; else changed = FALSE; - gtk_button_set_label(GTK_BUTTON(button), (const gchar *)date_to_display); - gtk_widget_destroy(selDate_Window_dialog); + gtk_button_set_label(GTK_BUTTON(button), (const gchar *)new_date); + if (allocated) + g_free(new_date); + gtk_widget_destroy(selDate_dialog); return(changed); } @@ -152,90 +142,6 @@ return(success); } -struct tm orage_i18_date_to_tm_date(const char *i18_date) -{ - char *ret; - struct tm tm_date = {0,0,0,0,0,0,0,0,0}; - - ret = (char *)strptime(i18_date, "%x", &tm_date); - if (ret == NULL) - g_error("Orage: orage_i18_date_to_tm_date wrong format (%s)", i18_date); - else if (ret[0] != '\0') - g_error("Orage: orage_i18_date_to_tm_date too long format (%s-%s)" - , i18_date, ret); - return(tm_date); -} - -char *orage_tm_date_to_i18_date(struct tm *tm_date) -{ - static char i18_date[32]; - - if (strftime(i18_date, 32, "%x", tm_date) == 0) - g_error("Orage: orage_tm_date_to_i18_date too long string in strftime"); - return(i18_date); -} - -char *orage_cal_to_i18_date(GtkCalendar *cal) -{ - struct tm tm_date = {0,0,0,0,0,0,0,0,0}; - - gtk_calendar_get_date(cal - , (unsigned int *)&tm_date.tm_year - , (unsigned int *)&tm_date.tm_mon - , (unsigned int *)&tm_date.tm_mday); - tm_date.tm_year -= 1900; - return(orage_tm_date_to_i18_date(&tm_date)); -} - -struct tm orage_icaltime_to_tm_time(const char *icaltime, gboolean real_tm) -{ - int i; - struct tm t = {0,0,0,0,0,0,0,0,0}; - - i = sscanf(icaltime, XFICAL_APPT_TIME_FORMAT - , &t.tm_year, &t.tm_mon, &t.tm_mday - , &t.tm_hour, &t.tm_min, &t.tm_sec); - switch (i) { - case 3: /* date */ - t.tm_hour = -1; - t.tm_min = -1; - t.tm_sec = -1; - break; - case 6: /* time */ - break; - default: /* error */ - g_error("orage: orage_icaltime_to_tm_time error %s %d", icaltime, i); - break; - } - if (real_tm) { /* normalise to standard tm format */ - t.tm_year -= 1900; - t.tm_mon -= 1; - } - return(t); -} - -char *orage_tm_time_to_icaltime(struct tm *t) -{ - static char icaltime[XFICAL_APPT_TIME_FORMAT_LEN]; - - g_sprintf(icaltime, XFICAL_APPT_TIME_FORMAT - , t->tm_year + 1900, t->tm_mon + 1, t->tm_mday - , t->tm_hour, t->tm_min, t->tm_sec); - - return(icaltime); -} - -char *orage_i18_date_to_icaltime(const char *i18_date) -{ - struct tm t; - char *ct; - - t = orage_i18_date_to_tm_date(i18_date); - ct = orage_tm_time_to_icaltime(&t); - ct[8] = '\0'; /* we know it is date */ - return(ct); -} - void orage_message(const char *format, ...) { va_list args; @@ -343,6 +249,112 @@ return menu_item; } +struct tm orage_i18_date_to_tm_date(const char *i18_date) +{ + char *ret; + struct tm tm_date = {0,0,0,0,0,0,0,0,0}; + + ret = (char *)strptime(i18_date, "%x", &tm_date); + if (ret == NULL) + g_error("Orage: orage_i18_date_to_tm_date wrong format (%s)", i18_date); + else if (ret[0] != '\0') + g_error("Orage: orage_i18_date_to_tm_date too long format (%s-%s)" + , i18_date, ret); + return(tm_date); +} + +char *orage_tm_time_to_i18_time(struct tm *tm_time) +{ + static char i18_time[40]; + + if (strftime(i18_time, 40, "%x %R", tm_time) == 0) + g_error("Orage: orage_tm_time_to_i18_time too long string in strftime"); + return(i18_time); +} + +char *orage_tm_date_to_i18_date(struct tm *tm_date) +{ + static char i18_date[32]; + + if (strftime(i18_date, 32, "%x", tm_date) == 0) + g_error("Orage: orage_tm_date_to_i18_date too long string in strftime"); + return(i18_date); +} + +char *orage_cal_to_i18_date(GtkCalendar *cal) +{ + struct tm tm_date = {0,0,0,0,0,0,0,0,0}; + + gtk_calendar_get_date(cal + , (unsigned int *)&tm_date.tm_year + , (unsigned int *)&tm_date.tm_mon + , (unsigned int *)&tm_date.tm_mday); + tm_date.tm_year -= 1900; + return(orage_tm_date_to_i18_date(&tm_date)); +} + +struct tm orage_icaltime_to_tm_time(const char *icaltime, gboolean real_tm) +{ + int i; + struct tm t = {0,0,0,0,0,0,0,0,0}; + + i = sscanf(icaltime, XFICAL_APPT_TIME_FORMAT + , &t.tm_year, &t.tm_mon, &t.tm_mday + , &t.tm_hour, &t.tm_min, &t.tm_sec); + switch (i) { + case 3: /* date */ + t.tm_hour = -1; + t.tm_min = -1; + t.tm_sec = -1; + break; + case 6: /* time */ + break; + default: /* error */ + g_error("orage: orage_icaltime_to_tm_time error %s %d", icaltime, i); + break; + } + if (real_tm) { /* normalise to standard tm format */ + t.tm_year -= 1900; + t.tm_mon -= 1; + } + return(t); +} + +char *orage_tm_time_to_icaltime(struct tm *t) +{ + static char icaltime[XFICAL_APPT_TIME_FORMAT_LEN]; + + g_sprintf(icaltime, XFICAL_APPT_TIME_FORMAT + , t->tm_year + 1900, t->tm_mon + 1, t->tm_mday + , t->tm_hour, t->tm_min, t->tm_sec); + + return(icaltime); +} + +char *orage_icaltime_to_i18_time(const char *icaltime) +{ /* timezone is not converted */ + struct tm t; + char *ct; + + t = orage_icaltime_to_tm_time(icaltime, TRUE); + if (t.tm_hour == -1) + ct = orage_tm_date_to_i18_date(&t); + else + ct = orage_tm_time_to_i18_time(&t); + return(ct); +} + +char *orage_i18_date_to_icaltime(const char *i18_date) +{ + struct tm t; + char *ct; + + t = orage_i18_date_to_tm_date(i18_date); + ct = orage_tm_time_to_icaltime(&t); + ct[8] = '\0'; /* we know it is date */ + return(ct); +} + struct tm *orage_localtime() { time_t tt; Modified: xfcalendar/trunk/src/functions.h =================================================================== --- xfcalendar/trunk/src/functions.h 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/functions.h 2007-11-20 23:04:15 UTC (rev 26382) @@ -68,12 +68,16 @@ struct tm orage_i18_date_to_tm_date(const char *display); +char *orage_tm_time_to_i18_time(struct tm *tm_date); + char *orage_tm_date_to_i18_date(struct tm *tm_date); struct tm orage_icaltime_to_tm_time(const char *i18_date, gboolean real_tm); char *orage_tm_time_to_icaltime(struct tm *t); +char *orage_icaltime_to_i18_time(const char *icaltime); + char *orage_i18_date_to_icaltime(const char *i18_date); char *orage_cal_to_i18_date(GtkCalendar *cal); Modified: xfcalendar/trunk/src/ical-code.c =================================================================== --- xfcalendar/trunk/src/ical-code.c 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/ical-code.c 2007-11-20 23:04:15 UTC (rev 26382) @@ -944,13 +944,12 @@ per.stime = convert_to_local_timezone(per.stime, p); } else { - g_warning(P_N "start time not found (%s)", icalcomponent_get_uid(c)); per.stime = icaltime_null_time(); } /* Either endtime/duetime or duration may be there. * But neither is required. - * VTODO may also have completed time + * VTODO may also have completed time but it does not have dtstart always */ per.ikind = icalcomponent_isa(c); if (per.ikind == ICAL_VEVENT_COMPONENT) @@ -1143,6 +1142,10 @@ #ifdef ORAGE_DEBUG g_print(P_N "\n"); #endif + if (appt->allDay) { /* cut the string after Date: yyyymmdd */ + appt->starttime[8] = '\0'; + appt->endtime[8] = '\0'; + } if (appt->use_duration) { if (! ORAGE_STR_EXISTS(appt->starttime)) { g_warning(P_N "null start time"); @@ -1173,7 +1176,7 @@ duration = icaltime_subtract(etime, stime); appt->duration = icaldurationtype_as_int(duration); - return (icaltime_compare(stime, etime)); + return(icaltime_compare(stime, etime)); } else { g_warning(P_N "null time %s %s" @@ -1666,8 +1669,11 @@ } if (appt->type != XFICAL_TYPE_JOURNAL) { - /* journal has no duration nor enddate or due */ - if (appt->use_duration) { /* both event and todo can have duration */ + /* journal has no duration nor enddate or due + * journal also has no priority or transparent setting + * journal also has not alarms or repeat settings */ + if (appt->use_duration) { + /* both event and todo can have duration */ duration = icaldurationtype_from_int(appt->duration); icalcomponent_add_property(icmp , icalproperty_new_duration(duration)); @@ -1710,6 +1716,7 @@ , icalproperty_new_due(wtime)); } } + if (appt->priority != 0) icalcomponent_add_property(icmp , icalproperty_new_priority(appt->priority)); @@ -3039,7 +3046,7 @@ , gchar *file_type) { #undef P_N -#define P_N "xfical_appt_get_next_on_day: " +#define P_N "xfical_appt_get_next_on_day_internal: " struct icaltimetype asdate, aedate /* period to check */ , nsdate, nedate; /* repeating event occurrency start and end */ xfical_period per; /* event start and end times with duration */ @@ -3090,11 +3097,10 @@ , icaltime_as_ical_string(per.ctime)); */ if (type == XFICAL_TYPE_TODO) { - if (icaltime_is_null_time(per.ctime)) + if (icaltime_is_null_time(per.ctime) + || local_compare(per.ctime, per.stime) <= 0) /* VTODO is never completed */ - date_found = TRUE; - else if (local_compare(per.ctime, per.stime) <= 0) - /* this is VTODO and it has completed before start, so + /* or it has completed before start, so * this one is not done and needs to be counted */ date_found = TRUE; } @@ -3108,25 +3114,12 @@ , ICAL_RRULE_PROPERTY)) != 0) { /* check recurring */ nsdate = icaltime_null_time(); rrule = icalproperty_get_rrule(p); - /* FIXME: - * for soem VTODOs you do not want to start over regularly - * from the starttime, but actually from the latest completed - * time. This kind of VTODOs do not have startdate! */ - /* - if (type == XFICAL_TYPE_TODO) { - if (!icaltime_is_null_time(per.ctime)) - ri = icalrecur_iterator_new(rrule, per.ctime); - else - ri = icalrecur_iterator_new(rrule, per.stime); - } - else - */ - ri = icalrecur_iterator_new(rrule, per.stime); + ri = icalrecur_iterator_new(rrule, per.stime); for (nsdate = icalrecur_iterator_next(ri), nedate = icaltime_add(nsdate, per.duration); !icaltime_is_null_time(nsdate) && ((type == XFICAL_TYPE_TODO - && local_compare(nsdate, per.ctime) < 0) + && local_compare(nsdate, per.ctime) <= 0) || (type != XFICAL_TYPE_TODO && local_compare_date_only(nedate, asdate) < 0)); nsdate = icalrecur_iterator_next(ri), @@ -3253,12 +3246,42 @@ } +static gboolean xfical_mark_calendar_days(GtkCalendar *gtkcal + , int cur_year, int cur_month + , int s_year, int s_month, int s_day + , int e_year, int e_month, int e_day) +{ + gint start_day, day_cnt, end_day; + gboolean marked = FALSE; + + /* + g_print("\t***xfical_mark_calendar_days: marked=%d cur year=%d, cur mon=%d \n\t\tstart year=%d start mon=%d start day=%d end year=%d, end mon=%d, end day=%d\n", marked, cur_year,cur_month, s_year,s_month,s_day, e_year,e_month,e_day); + */ + if ((s_year*12+s_month) <= (cur_year*12+cur_month) + && (cur_year*12+cur_month) <= (e_year*12+e_month)) { + /* event is in our year+month = visible in calendar */ + if (s_year == cur_year && s_month == cur_month) + start_day = s_day; + else + start_day = 1; + if (e_year == cur_year && e_month == cur_month) + end_day = e_day; + else + end_day = 31; + for (day_cnt = start_day; day_cnt <= end_day; day_cnt++) { + gtk_calendar_mark_day(gtkcal, day_cnt); + marked = TRUE; + } + } + return(marked); +} + /* Mark days with appointments into calendar * year: Year to be searched * month: Month to be searched */ -void xfical_mark_calendar_internal(GtkCalendar *gtkcal, icalcomponent *base - , int year, int month) +static void xfical_mark_calendar_internal(GtkCalendar *gtkcal + , icalcomponent *base, int year, int month) { #undef P_N #define P_N "xfical_mark_calendar_internal: " @@ -3269,32 +3292,21 @@ icalrecur_iterator* ri; icalproperty *p = NULL; gint start_day, day_cnt, end_day; + gboolean marked; #ifdef ORAGE_DEBUG g_print(P_N "\n"); #endif + /* for (c = icalcomponent_get_first_component(base, ICAL_VEVENT_COMPONENT); c != 0; c = icalcomponent_get_next_component(base, ICAL_VEVENT_COMPONENT)) { per = get_period(c); - if ((per.stime.year*12+per.stime.month) <= (year*12+month) - && (year*12+month) <= (per.etime.year*12+per.etime.month)) { - /* event is in our year+month = visible in calendar */ - if (per.stime.year == year && per.stime.month == month) - start_day = per.stime.day; - else - start_day = 1; - if (per.etime.year == year && per.etime.month == month) - end_day = per.etime.day; - else - end_day = 31; - for (day_cnt = start_day; day_cnt <= end_day; day_cnt++) - { - gtk_calendar_mark_day(gtkcal, day_cnt); - } - } + xfical_mark_calendar_days(gtkcal, year, month + , per.stime.year, per.stime.month, per.stime.day + , per.etime.year, per.etime.month, per.etime.day); if ((p = icalcomponent_get_first_property(c - , ICAL_RRULE_PROPERTY)) != 0) { /* check recurring EVENTs */ + , ICAL_RRULE_PROPERTY)) != 0) { nsdate = icaltime_null_time(); rrule = icalproperty_get_rrule(p); ri = icalrecur_iterator_new(rrule, per.stime); @@ -3304,41 +3316,94 @@ && (nsdate.year*12+nsdate.month) <= (year*12+month); nsdate = icalrecur_iterator_next(ri), nedate = icaltime_add(nsdate, per.duration)) { - if ((nsdate.year*12+nsdate.month) <= (year*12+month) - && (year*12+month) <= (nedate.year*12+nedate.month)) { - /* event is in our year+month = visible in calendar */ - if (nsdate.year == year && nsdate.month == month) - start_day = nsdate.day; - else - start_day = 1; - if (nedate.year == year && nedate.month == month) - end_day = nedate.day; - else - end_day = 31; - for (day_cnt = start_day; day_cnt <= end_day; day_cnt++) - { - gtk_calendar_mark_day(gtkcal, day_cnt); - } - } + xfical_mark_calendar_days(gtkcal, year, month + , nsdate.year, nsdate.month, nsdate.day + , nedate.year, nedate.month, nedate.day); } icalrecur_iterator_free(ri); } } + */ + /* Note that all VEVENTS are marked, but only the first VTODO + * end date is marked */ + for (c = icalcomponent_get_first_component(base, ICAL_ANY_COMPONENT); + c != 0; + c = icalcomponent_get_next_component(base, ICAL_ANY_COMPONENT)) { + per = get_period(c); + if (per.ikind == ICAL_VEVENT_COMPONENT && 0 == 1) { + xfical_mark_calendar_days(gtkcal, year, month + , per.stime.year, per.stime.month, per.stime.day + , per.etime.year, per.etime.month, per.etime.day); + if ((p = icalcomponent_get_first_property(c + , ICAL_RRULE_PROPERTY)) != 0) { /* check recurring EVENTs */ + nsdate = icaltime_null_time(); + rrule = icalproperty_get_rrule(p); + ri = icalrecur_iterator_new(rrule, per.stime); + for (nsdate = icalrecur_iterator_next(ri), + nedate = icaltime_add(nsdate, per.duration); + !icaltime_is_null_time(nsdate) + && (nsdate.year*12+nsdate.month) <= (year*12+month); + nsdate = icalrecur_iterator_next(ri), + nedate = icaltime_add(nsdate, per.duration)) { + xfical_mark_calendar_days(gtkcal, year, month + , nsdate.year, nsdate.month, nsdate.day + , nedate.year, nedate.month, nedate.day); + } + icalrecur_iterator_free(ri); + } + } /* ICAL_VEVENT_COMPONENT */ + else if (per.ikind == ICAL_VTODO_COMPONENT) { + marked = FALSE; + if (icaltime_is_null_time(per.ctime) + || (local_compare(per.ctime, per.stime) <= 0)) { + /* VTODO needs to be checked either if it never completed + * or it has completed before start */ + marked = xfical_mark_calendar_days(gtkcal, year, month + , per.etime.year, per.etime.month, per.etime.day + , per.etime.year, per.etime.month, per.etime.day); + } + if (!marked && (p = icalcomponent_get_first_property(c + , ICAL_RRULE_PROPERTY)) != 0) { + /* check recurring TODOs */ + nsdate = icaltime_null_time(); + rrule = icalproperty_get_rrule(p); + ri = icalrecur_iterator_new(rrule, per.stime); + for (nsdate = icalrecur_iterator_next(ri), + nedate = icaltime_add(nsdate, per.duration); + !icaltime_is_null_time(nsdate) + && (nsdate.year*12+nsdate.month) <= (year*12+month) + && (local_compare(nsdate, per.ctime) < 0); + nsdate = icalrecur_iterator_next(ri), + nedate = icaltime_add(nsdate, per.duration)) { + /* find the active one like in + * xfical_appt_get_next_on_day_internal */ + } + icalrecur_iterator_free(ri); + if (!icaltime_is_null_time(nsdate)) { + marked = xfical_mark_calendar_days(gtkcal, year, month + , nedate.year, nedate.month, nedate.day + , nedate.year, nedate.month, nedate.day); + } + } + } /* ICAL_VTODO_COMPONENT */ + } } -void xfical_mark_calendar(GtkCalendar *gtkcal, int year, int month) +void xfical_mark_calendar(GtkCalendar *gtkcal) { #undef P_N #define P_N "xfical_mark_calendar: " gint i; + guint year, month, day; #ifdef ORAGE_DEBUG g_print(P_N "\n"); #endif + gtk_calendar_get_date(gtkcal, &year, &month, &day); gtk_calendar_clear_marks(gtkcal); - xfical_mark_calendar_internal(gtkcal, ical, year, month); + xfical_mark_calendar_internal(gtkcal, ical, year, month+1); for (i = 0; i < g_par.foreign_count; i++) { - xfical_mark_calendar_internal(gtkcal, f_ical[i].ical, year, month); + xfical_mark_calendar_internal(gtkcal, f_ical[i].ical, year, month+1); } } @@ -3591,7 +3656,7 @@ if (per.ikind == ICAL_VTODO_COMPONENT && ((per.ctime.year*12 + per.ctime.month) < (per.stime.year*12 + per.stime.month))) { - /* VTODO not com,pleted, do not archive */ + /* VTODO not completed, do not archive */ orage_message(_("\tVTODO not complete; not archived")); } else { Modified: xfcalendar/trunk/src/ical-code.h =================================================================== --- xfcalendar/trunk/src/ical-code.h 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/ical-code.h 2007-11-20 23:04:15 UTC (rev 26382) @@ -134,7 +134,7 @@ xfical_appt *xfical_appt_get_next_with_string(char *str, gboolean first , gchar *file_type); -void xfical_mark_calendar(GtkCalendar *gtkcal, int year, int month); +void xfical_mark_calendar(GtkCalendar *gtkcal); void xfical_alarm_build_list(gboolean first_list_today); gboolean xfical_alarm_passed(char *alarm_stime); Modified: xfcalendar/trunk/src/mainbox.c =================================================================== --- xfcalendar/trunk/src/mainbox.c 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/mainbox.c 2007-11-20 23:04:15 UTC (rev 26382) @@ -51,14 +51,9 @@ gboolean orage_mark_appointments() { - guint year, month, day; - if (!xfical_file_open(TRUE)) return(FALSE); - gtk_calendar_get_date(GTK_CALENDAR(g_par.xfcal->mCalendar) - , &year, &month, &day); - xfical_mark_calendar(GTK_CALENDAR(g_par.xfcal->mCalendar) - , year, month+1); + xfical_mark_calendar(GTK_CALENDAR(g_par.xfcal->mCalendar)); xfical_file_close(TRUE); return(TRUE); } @@ -301,15 +296,38 @@ GtkWidget *ev, *label; CalWin *cal = g_par.xfcal; gchar *tip; + struct tm *t; + char *l_time, *s_time, *e_time, *c_time, *na; + gint len; + ev = gtk_event_box_new(); label = gtk_label_new(appt->title); gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END); + t = orage_localtime(); + l_time = orage_tm_time_to_icaltime(t); + if (appt->starttimecur[8] == 'T') /* date+time */ + len = 15; + else /* date only */ + len = 8; + if (strncmp(appt->endtimecur, l_time, len) < 0) /* gone */ + gtk_widget_modify_fg(label, GTK_STATE_NORMAL, &cal->mRed); + else if (strncmp(appt->starttimecur, l_time, len) <= 0 + && 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); - tip = g_strdup_printf("%s\n%s-%s\n%s", appt->title, appt->starttimecur - , appt->endtimecur ,appt->note); + 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)); + c_time = g_strdup(appt->completed + ? orage_icaltime_to_i18_time(appt->completedtime) : na); + tip = g_strdup_printf(_("Title: %s\n Start:\t%s\n Due:\t%s\n Done:\t%s\nNote:\n%s") + , appt->title, s_time, e_time, c_time, appt->note); gtk_tooltips_set_tip(cal->Tooltips, ev, tip, NULL); + g_free(s_time); + g_free(e_time); + g_free(c_time); g_free(tip); g_object_set_data_full(G_OBJECT(ev), "UID", g_strdup(appt->uid), g_free); g_signal_connect((gpointer)ev, "button-press-event" @@ -317,7 +335,8 @@ } -static void info_rows(char *a_day, xfical_type ical_type, gchar *file_type) +static void insert_rows(GList **todo_list, char *a_day, xfical_type ical_type + , gchar *file_type) { xfical_appt *appt; @@ -326,11 +345,29 @@ appt; appt = xfical_appt_get_next_on_day(a_day, FALSE, 0 , ical_type , file_type)) { - add_info_row(appt); - xfical_appt_free(appt); + *todo_list = g_list_append(*todo_list, appt); } } +static gint todo_order(gconstpointer a, gconstpointer b) +{ + xfical_appt *appt1, *appt2; + + appt1 = (xfical_appt *)a; + appt2 = (xfical_appt *)b; + + return(strcmp(appt1->starttimecur, appt2->starttimecur)); +} + +static void todo_process(gpointer a, gpointer dummy) +{ + xfical_appt *appt; + + appt = (xfical_appt *)a; + add_info_row(appt); + xfical_appt_free(appt); +} + void build_mainbox_info(void) { CalWin *cal = g_par.xfcal; @@ -340,8 +377,8 @@ xfical_type ical_type; gchar file_type[8]; gint i; + GList *todo_list=NULL; - gtk_widget_destroy(cal->mInfo_scrolledWin); cal->mInfo_scrolledWin = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(cal->mInfo_scrolledWin) @@ -362,13 +399,19 @@ if (!xfical_file_open(TRUE)) return; strcpy(file_type, "O00."); - info_rows(a_day, ical_type, file_type); + 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); - info_rows(a_day, ical_type, file_type); + insert_rows(&todo_list, a_day, ical_type, file_type); } xfical_file_close(TRUE); + if (todo_list) { + 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); } @@ -377,7 +420,14 @@ { GdkPixbuf *orage_logo; CalWin *cal = g_par.xfcal; + GdkColormap *pic1_cmap; + pic1_cmap = gdk_colormap_get_system(); + gdk_color_parse("red", &cal->mRed); + gdk_colormap_alloc_color(pic1_cmap, &cal->mRed, FALSE, TRUE); + gdk_color_parse("blue", &cal->mBlue); + gdk_colormap_alloc_color(pic1_cmap, &cal->mBlue, FALSE, TRUE); + /* using static icon here since this dynamic icon is not updated * when date changes. Could be added, but not worth it. * Dynamic icon is used in systray and about windows */ Modified: xfcalendar/trunk/src/mainbox.h =================================================================== --- xfcalendar/trunk/src/mainbox.h 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/mainbox.h 2007-11-20 23:04:15 UTC (rev 26382) @@ -52,6 +52,8 @@ GtkWidget *mInfo_scrolledWin; GtkWidget *mInfo_vbox; + + GdkColor mRed, mBlue; } CalWin; void build_mainWin(); Modified: xfcalendar/trunk/src/reminder.c =================================================================== --- xfcalendar/trunk/src/reminder.c 2007-11-19 14:44:28 UTC (rev 26381) +++ xfcalendar/trunk/src/reminder.c 2007-11-20 23:04:15 UTC (rev 26382) @@ -114,6 +114,7 @@ create_notify_reminder(alarm); } #endif + alarm->audio = FALSE; alarm_free_memory(alarm); status = FALSE; /* no more alarms, end timeouts */ } @@ -150,7 +151,16 @@ { alarm_struct *alarm = (alarm_struct *)par; + /* This causes core if notify is the last alarm, because libnotify + * closes the notification and hence raises notify_closed, which + * frees the memory. If we want to keep notification visible, we + * need to handle this somehow. For example let notify_closed know + * that there will be new notification and memory must not be freed. + * Or by allocating memory here again, which must not be done if there + * are more alarms active. Fro now just remove the line and let notify + * window go away like libnotify wants. create_notify_reminder(alarm); + */ create_appt_win("UPDATE", alarm->uid->str, NULL); } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits