X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=webcit%2Fcalendar_view.c;h=4796713174648eb902be7ac40616ca46f5a92efb;hb=2362c3d4de86f20822ab81015222a196137fd20e;hp=10e3542a39a17e2a4acd8faaca4cc959d4c47bb9;hpb=2d6dd17ae56461dc55752222bf96df3a548e7368;p=citadel.git diff --git a/webcit/calendar_view.c b/webcit/calendar_view.c index 10e3542a3..479671317 100644 --- a/webcit/calendar_view.c +++ b/webcit/calendar_view.c @@ -1,18 +1,12 @@ - /* +/* * $Id$ + * + * Handles the HTML display of calendar items. */ -/** - * \defgroup CalHtmlHandles Handles the HTML display of calendar items. - * \ingroup Calendaring - */ -/*@{*/ + #include "webcit.h" #include "webserver.h" -#ifdef WEBCIT_WITH_CALENDAR_SERVICE - -/****************************************************************************/ - void embeddable_mini_calendar(int year, int month, char *urlformat) { @@ -25,8 +19,7 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) time_t colheader_time; struct tm colheader_tm; char colheader_label[32]; - int weekstart = 0; - char weekstart_buf[16]; + long weekstart = 0; char url[256]; char div_id[256]; char escaped_urlformat[256]; @@ -34,13 +27,12 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) snprintf(div_id, sizeof div_id, "mini_calendar_%d", rand() ); /* Determine what day to start. - */ - get_preference("weekstart", weekstart_buf, sizeof weekstart_buf); - weekstart = atoi(weekstart_buf); + */ + get_pref_long("weekstart", &weekstart, 17); /* - * Now back up to the 1st of the month... - */ + * Now back up to the 1st of the month... + */ memset(&starting_tm, 0, sizeof(struct tm)); starting_tm.tm_year = year - 1900; @@ -146,11 +138,13 @@ void embeddable_mini_calendar(int year, int month, char *urlformat) "\n" , escaped_urlformat, div_id - ); + ); } -/* ajax embedder for the above mini calendar */ +/** + * \brief ajax embedder for the above mini calendar + */ void ajax_mini_calendar(void) { char urlformat[256]; int i, len; @@ -163,7 +157,7 @@ void ajax_mini_calendar(void) { urlformat[i+1] = 0; } - embeddable_mini_calendar( atoi(bstr("year")), atoi(bstr("month")), urlformat ); + embeddable_mini_calendar( ibstr("year"), ibstr("month"), urlformat ); } @@ -173,7 +167,11 @@ void ajax_mini_calendar(void) { */ void calendar_month_view_display_events(int year, int month, int day) { - int i; + long hklen; + char *HashKey; + void *vCal; + HashPos *Pos; + disp_cal *Cal; icalproperty *p = NULL; icalproperty *q = NULL; struct icaltimetype t; @@ -186,15 +184,15 @@ void calendar_month_view_display_events(int year, int month, int day) int show_event = 0; char buf[256]; struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ - struct disp_cal *Cal; time_t tt; - if (WCC->num_cal == 0) { + if (GetCount(WCC->disp_cal_items) == 0) { wprintf("


\n"); return; } - /* Create an imaginary event which spans the 24 hours of today. Any events which + /** + * Create an imaginary event which spans the 24 hours of today. Any events which * overlap with this one take place at least partially in this day. We have to * convert it from a struct tm in order to make it UTC. */ @@ -216,10 +214,12 @@ void calendar_month_view_display_events(int year, int month, int day) today_end_t = icaltime_from_timet_with_zone(mktime(&ending_tm), 0, icaltimezone_get_utc_timezone()); today_end_t.is_utc = 1; - /* Now loop through our list of events to see which ones occur today. + /** + * Now loop through our list of events to see which ones occur today. */ - for (i=0; i<(WCC->num_cal); ++i) { - Cal = &WCC->disp_cal[i]; + Pos = GetNewHashPos(); + while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { + Cal = (disp_cal*)vCal; all_day_event = 0; q = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY); if (q != NULL) { @@ -246,7 +246,8 @@ void calendar_month_view_display_events(int year, int month, int day) show_event = ical_ctdl_is_overlap(t, end_t, today_start_t, today_end_t); } - /* If we determined that this event occurs today, then display it. + /** + * If we determined that this event occurs today, then display it. */ if (show_event) { p = icalcomponent_get_first_property(Cal->cal, ICAL_SUMMARY_PROPERTY); @@ -259,28 +260,27 @@ void calendar_month_view_display_events(int year, int month, int day) } wprintf("" - "disp_cal[i].cal_msgnum, - bstr("calview"), - bstr("year"), - bstr("month"), - bstr("day") + (Cal->unread)?"_unread":"_read", + Cal->cal_msgnum, + year, month, day ); - wprintf("%s ", _("Summary:")); + wprintf("%s: %s
", _("From"), Cal->from); + wprintf("%s ", _("Summary:")); escputs((char *)icalproperty_get_comment(p)); wprintf("
"); q = icalcomponent_get_first_property( - WC->disp_cal[i].cal, + Cal->cal, ICAL_LOCATION_PROPERTY); if (q) { wprintf("%s ", _("Location:")); escputs((char *)icalproperty_get_comment(q)); wprintf("
"); - } + } /** * Only show start/end times if we're actually looking at the VEVENT @@ -305,18 +305,19 @@ void calendar_month_view_display_events(int year, int month, int day) } else { tt = icaltime_as_timet(t); - fmt_date(buf, tt, 1); + webcit_fmt_date(buf, tt, 1); wprintf("%s %s
", _("Starting date/time:"), buf); - /* Embed the 'show end date/time' loop inside here so it + /** + * Embed the 'show end date/time' loop inside here so it * only executes if this is NOT an all day event. */ q = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY); if (q != NULL) { t = icalproperty_get_dtend(q); tt = icaltime_as_timet(t); - fmt_date(buf, tt, 1); + webcit_fmt_date(buf, tt, 1); wprintf("%s %s
", _("Ending date/time:"), buf); } @@ -347,6 +348,7 @@ void calendar_month_view_display_events(int year, int month, int day) } + DeleteHashPos(&Pos); } @@ -355,16 +357,21 @@ void calendar_month_view_display_events(int year, int month, int day) * \param thetime the month we want to see */ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) { - int i; + long hklen; + char *HashKey; + void *vCal; + HashPos *Pos; time_t event_tt; time_t event_tts; time_t event_tte; + struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ struct tm event_tms; struct tm event_tme; struct tm today_tm; icalproperty *p; icalproperty *e; struct icaltimetype t; + disp_cal *Cal; int month, day, year; int all_day_event = 0; char *timeformat; @@ -380,9 +387,10 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) { day = today_tm.tm_mday; year = today_tm.tm_year + 1900; - for (i=0; i<(WC->num_cal); ++i) { - p = icalcomponent_get_first_property(WC->disp_cal[i].cal, - ICAL_DTSTART_PROPERTY); + Pos = GetNewHashPos(); + while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { + Cal = (disp_cal*)vCal; + p = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY); if (p != NULL) { t = icalproperty_get_dtstart(p); event_tt = icaltime_as_timet(t); @@ -396,71 +404,68 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) { else { localtime_r(&event_tts, &event_tms); } - /** \todo epoch &! daymask */ + /* \todo epoch &! daymask */ if ((event_tms.tm_year == today_tm.tm_year) - && (event_tms.tm_mon == today_tm.tm_mon) - && (event_tms.tm_mday == today_tm.tm_mday)) { + && (event_tms.tm_mon == today_tm.tm_mon) + && (event_tms.tm_mday == today_tm.tm_mday)) { + + + char sbuf[255]; + char ebuf[255]; + + p = icalcomponent_get_first_property( + Cal->cal, + ICAL_SUMMARY_PROPERTY); + e = icalcomponent_get_first_property( + Cal->cal, + ICAL_DTEND_PROPERTY); + if ((p != NULL) && (e != NULL)) { + time_t difftime; + int hours, minutes; + t = icalproperty_get_dtend(e); + event_tte = icaltime_as_timet(t); + localtime_r(&event_tte, &event_tme); + difftime=(event_tte-event_tts)/60; + hours=(int)(difftime / 60); + minutes=difftime % 60; + wprintf("%i:%2i" + "" + "
", + daycolor, + hours, minutes, + (Cal->unread)?"_unread":"_read", + daycolor, + Cal->cal_msgnum, + bstr("year"), + bstr("month"), + bstr("day") + ); + escputs((char *) + icalproperty_get_comment(p)); + /* \todo: allso ammitime format */ + wc_strftime(&sbuf[0], sizeof(sbuf), timeformat, &event_tms); + wc_strftime(&ebuf[0], sizeof(sbuf), timeformat, &event_tme); - char sbuf[255]; - char ebuf[255]; - - p = icalcomponent_get_first_property( - WC->disp_cal[i].cal, - ICAL_SUMMARY_PROPERTY); - e = icalcomponent_get_first_property( - WC->disp_cal[i].cal, - ICAL_DTEND_PROPERTY); - if ((p != NULL) && (e != NULL)) { - time_t difftime; - int hours, minutes; - t = icalproperty_get_dtend(e); - event_tte = icaltime_as_timet(t); - localtime_r(&event_tte, &event_tme); - difftime=(event_tte-event_tts)/60; - hours=(int)(difftime / 60); - minutes=difftime % 60; - wprintf("%i:%2i" - "" - "", - daycolor, - hours, minutes, - daycolor, - WC->disp_cal[i].cal_msgnum, - bstr("calview"), - bstr("year"), - bstr("month"), - bstr("day") - ); - - escputs((char *) - icalproperty_get_comment(p)); - /** \todo: allso ammitime format */ - wc_strftime(&sbuf[0], sizeof(sbuf), timeformat, &event_tms); - wc_strftime(&ebuf[0], sizeof(sbuf), timeformat, &event_tme); - - wprintf("" - "%s%s", - daycolor, - sbuf, - daycolor, - ebuf); - + wprintf("" + "%s%s", + daycolor, + sbuf, + daycolor, + ebuf); } - + } } } + DeleteHashPos(&Pos); } -/** - * \brief view one month. pretty view - * \param year the year - * \param month the month - * \param day the actual day we want to see +/* + * view one month. pretty view */ void calendar_month_view(int year, int month, int day) { struct tm starting_tm; @@ -473,13 +478,12 @@ void calendar_month_view(int year, int month, int day) { struct tm colheader_tm; char colheader_label[32]; int chg_month = 0; - int weekstart = 0; - char weekstart_buf[16]; + long weekstart = 0; - /* Determine what day to start. + /* + * Determine what day to start */ - get_preference("weekstart", weekstart_buf, sizeof weekstart_buf); - weekstart = atoi(weekstart_buf); + get_pref_long("weekstart", &weekstart, 17); /* * Now back up to the 1st of the month... @@ -497,18 +501,18 @@ void calendar_month_view(int year, int month, int day) { localtime_r(&thetime, &tm); } - /** Determine previous and next months ... for links */ + /* Determine previous and next months ... for links */ previous_month = thetime - (time_t)864000L; /* back 10 days */ next_month = thetime + (time_t)(31L * 86400L); /* ahead 31 days */ - /** Now back up until we're on the user's preferred start day */ + /* Now back up until we're on the user's preferred start day */ localtime_r(&thetime, &tm); while (tm.tm_wday != weekstart) { thetime = thetime - (time_t)86400; /* go back 24 hours */ localtime_r(&thetime, &tm); } - /** Outer table (to get the background color) */ + /* Outer table (to get the background color) */ wprintf("
" " \n
"); @@ -535,7 +539,7 @@ void calendar_month_view(int year, int month, int day) { wprintf("
\n"); - /** Inner table (the real one) */ + /* Inner table (the real one) */ wprintf(""); colheader_time = thetime; @@ -543,14 +547,14 @@ void calendar_month_view(int year, int month, int day) { colheader_time = thetime + (i * 86400) ; localtime_r(&colheader_time, &colheader_tm); wc_strftime(colheader_label, sizeof colheader_label, "%A", &colheader_tm); - wprintf("", colheader_label); } wprintf("\n"); - /** Now do 35 or 42 days */ + /* Now do 35 or 42 days */ for (i = 0; i < 42; ++i) { localtime_r(&thetime, &tm); @@ -563,16 +567,16 @@ void calendar_month_view(int year, int month, int day) { chg_month = 0; } - /** Before displaying Sunday, start a new row */ + /* Before displaying the first day of the week, start a new row */ if ((i % 7) == 0) { wprintf(""); } wprintf(""); - /** After displaying Saturday, end the row */ + /* After displaying the last day of the week, end the row */ if ((i % 7) == 6) { wprintf("\n"); } } - thetime += (time_t)86400; /** ahead 24 hours */ + thetime += (time_t)86400; /* ahead 24 hours */ } - wprintf("
" + wprintf("" "%s
", ((tm.tm_mon != month-1) ? "out" : - ((tm.tm_wday==0 || tm.tm_wday==6) ? "weekend" : - "day")) - ); + ((tm.tm_wday==0 || tm.tm_wday==6) ? "weekend" : + "day")) + ); if ((i==0) || (tm.tm_mday == 1)) { wc_strftime(colheader_label, sizeof colheader_label, "%B", &tm); wprintf("%s ", colheader_label); @@ -589,25 +593,25 @@ void calendar_month_view(int year, int month, int day) { tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday - ); + ); wprintf("
" /** end of inner table */ - "" /** end of outer table */ + wprintf("" /* end of inner table */ + "" /* end of outer table */ "
\n"); - /** + /* * Initialize the bubble tooltips. * * Yes, this is as stupid as it looks. Instead of just making the call @@ -624,11 +628,8 @@ void calendar_month_view(int year, int month, int day) { ); } -/** - * \brief view one month. brief view - * \param year the year - * \param month the month - * \param day the actual day we want to see +/* + * view one month. brief view */ void calendar_brief_month_view(int year, int month, int day) { struct tm starting_tm; @@ -639,7 +640,7 @@ void calendar_brief_month_view(int year, int month, int day) { time_t next_month; char month_label[32]; - /** Determine what day to start. + /* Determine what day to start. * First, back up to the 1st of the month... */ memset(&starting_tm, 0, sizeof(struct tm)); @@ -654,18 +655,18 @@ void calendar_brief_month_view(int year, int month, int day) { localtime_r(&thetime, &tm); } - /** Determine previous and next months ... for links */ + /* Determine previous and next months ... for links */ previous_month = thetime - (time_t)864000L; /* back 10 days */ next_month = thetime + (time_t)(31L * 86400L); /* ahead 31 days */ - /** Now back up until we're on a Sunday */ + /* Now back up until we're on a Sunday */ localtime_r(&thetime, &tm); while (tm.tm_wday != 0) { thetime = thetime - (time_t)86400; /* go back 24 hours */ localtime_r(&thetime, &tm); } - /** Outer table (to get the background color) */ + /* Outer table (to get the background color) */ wprintf("
" "
\n"); @@ -693,13 +694,13 @@ void calendar_brief_month_view(int year, int month, int day) { wprintf("
\n"); - /** Inner table (the real one) */ + /* Inner table (the real one) */ wprintf(""); wprintf("\n"); - wprintf("
\n"); + wprintf("
\n"); - /** Now do 35 days */ + /* Now do 35 days */ for (i = 0; i < 35; ++i) { char weeknumber[255]; char weekday_name[32]; @@ -707,37 +708,37 @@ void calendar_brief_month_view(int year, int month, int day) { localtime_r(&thetime, &tm); - /** Before displaying Sunday, start a new CELL */ + /* Before displaying Sunday, start a new CELL */ if ((i % 7) == 0) { wc_strftime(&weeknumber[0], sizeof(weeknumber), "%U", &tm); - wprintf("" - " \n", - _("Week"), - weeknumber, - _("Hours"), - _("Subject"), - _("Start"), - _("End") - ); + wprintf("
%s %s
%s%s%s%s
" + " \n", + _("Week"), + weeknumber, + _("Hours"), + _("Subject"), + _("Start"), + _("End") + ); } daycolor=((tm.tm_mon != month-1) ? "DDDDDD" : - ((tm.tm_wday==0 || tm.tm_wday==6) ? "EEEECC" : - "FFFFFF")); + ((tm.tm_wday==0 || tm.tm_wday==6) ? "EEEECC" : + "FFFFFF")); - /** Day Header */ + /* Day Header */ wc_strftime(weekday_name, sizeof weekday_name, "%A", &tm); wprintf("\n", - daycolor, - weekday_name,tm.tm_mday, - daycolor); + "\n", + daycolor, + weekday_name,tm.tm_mday, + daycolor); - /** put the data of one day here, stupid */ + /* put the data of one day here, stupid */ calendar_month_view_brief_events(thetime, daycolor); - /** After displaying Saturday, end the row */ + /* After displaying Saturday, end the row */ if ((i % 7) == 6) { wprintf("
%s %s
%s%s%s%s
%s,%i." - "

\n"); } @@ -750,38 +751,35 @@ void calendar_brief_month_view(int year, int month, int day) { "\n"); } -/** - * \brief view one week - * this should view just one week, but it's not here yet. - * \todo ny implemented - * \param year the year - * \param month the month - * \param day the day which we want to see the week around +/* + * Calendar week view -- not implemented yet, this is a stub function */ void calendar_week_view(int year, int month, int day) { wprintf("
week view FIXME

\n"); } -/** - * \brief display one day +/* + * display one day * Display events for a particular hour of a particular day. * (Specify hour < 0 to show "all day" events) - * \param year the year - * \param month the month - * \param day the day - * \param hour the hour we want to start displaying - * \param dstart daystart - * \param dend dayend + * + * dstart and dend indicate which hours our "daytime" begins and end */ -void calendar_day_view_display_events(time_t thetime, int year, int month, - int day, int hour, - int dstart, int dend) { - int i; +void calendar_day_view_display_events(time_t thetime, + int year, + int month, + int day, + int notime_events, + int dstart, + int dend) +{ + long hklen; + char *HashKey; + void *vCal; + HashPos *Pos; icalproperty *p = NULL; icalproperty *q = NULL; - time_t event_start; - time_t event_end; time_t event_tt; time_t event_tte; struct tm event_te; @@ -790,7 +788,7 @@ void calendar_day_view_display_events(time_t thetime, int year, int month, int all_day_event = 0; int ongoing_event = 0; struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ - struct disp_cal *Cal; + disp_cal *Cal; struct icaltimetype t; struct icaltimetype end_t; struct icaltimetype today_start_t; @@ -798,29 +796,29 @@ void calendar_day_view_display_events(time_t thetime, int year, int month, struct tm starting_tm; struct tm ending_tm; int top = 0; - int height = 0; - int gap = 0; + int bottom = 0; + int gap = 1; int startmin = 0; int diffmin = 0; int endmin = 0; - if (WCC->num_cal == 0) { - // \todo FIXME wprintf("


\n"); + char buf[256]; + struct tm d_tm; + char d_str[32]; + + if (GetCount(WCC->disp_cal_items) == 0) { + /* nothing to display */ return; } - event_start = thetime + 60 * 60 * hour; - event_end = thetime + 60 * 60 * (hour + 1); - - - /* Create an imaginary event which spans the current hour. Any events which + /* Create an imaginary event which spans the current day. Any events which * overlap with this one take place at least partially in this day. */ memset(&starting_tm, 0, sizeof(struct tm)); starting_tm.tm_year = year - 1900; starting_tm.tm_mon = month - 1; starting_tm.tm_mday = day; - starting_tm.tm_hour = hour; + starting_tm.tm_hour = 0; starting_tm.tm_min = 0; today_start_t = icaltime_from_timet_with_zone(mktime(&starting_tm), 0, icaltimezone_get_utc_timezone()); today_start_t.is_utc = 1; @@ -829,15 +827,16 @@ void calendar_day_view_display_events(time_t thetime, int year, int month, ending_tm.tm_year = year - 1900; ending_tm.tm_mon = month - 1; ending_tm.tm_mday = day; - ending_tm.tm_hour = hour; + ending_tm.tm_hour = 23; ending_tm.tm_min = 59; today_end_t = icaltime_from_timet_with_zone(mktime(&ending_tm), 0, icaltimezone_get_utc_timezone()); today_end_t.is_utc = 1; /* Now loop through our list of events to see which ones occur today. */ - for (i=0; i<(WCC->num_cal); ++i) { - Cal = &WCC->disp_cal[i]; + Pos = GetNewHashPos(); + while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { + Cal = (disp_cal*)vCal; all_day_event = 0; ongoing_event=0; @@ -864,139 +863,206 @@ void calendar_day_view_display_events(time_t thetime, int year, int month, if (all_day_event) { - show_event = ((t.year == year) && (t.month == month) && (t.day == day) && (hour == -1)); + show_event = ((t.year == year) && (t.month == month) && (t.day == day) && (notime_events)); } else { show_event = ical_ctdl_is_overlap(t, end_t, today_start_t, today_end_t); } - /* If we determined that this event occurs today, then display it. */ p = icalcomponent_get_first_property(Cal->cal,ICAL_SUMMARY_PROPERTY); + if ((show_event) && (p != NULL)) { - if ((event_te.tm_mday != today_start_t.day) && (event_tm.tm_mday != today_start_t.day)) ongoing_event = 1; + if ((event_te.tm_mday != day) || (event_tm.tm_mday != day)) ongoing_event = 1; - if (all_day_event) + if (all_day_event && notime_events) { - wprintf("
  • " - "", - Cal->cal_msgnum, year, month, day, hour); - escputs((char *) icalproperty_get_comment(p)); - wprintf(" ("); - wprintf(_("All day event")); - wprintf(")
  • \n"); + wprintf("
  • " + "unread)?"_unread":"_read", + Cal->cal_msgnum, year, month, day); + wprintf("%s
    ", _("All day event")); + wprintf("%s: %s
    ", _("From"), Cal->from); + wprintf("%s ", _("Summary:")); + escputs((char *) icalproperty_get_comment(p)); + wprintf("
    "); + q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY); + if (q) { + wprintf("%s ", _("Location:")); + escputs((char *)icalproperty_get_comment(q)); + wprintf("
    "); + } + memset(&d_tm, 0, sizeof d_tm); + d_tm.tm_year = t.year - 1900; + d_tm.tm_mon = t.month - 1; + d_tm.tm_mday = t.day; + wc_strftime(d_str, sizeof d_str, "%x", &d_tm); + wprintf("%s %s
    ",_("Date:"), d_str); + q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY); + if (q) { + wprintf("%s ", _("Notes:")); + escputs((char *)icalproperty_get_comment(q)); + wprintf("
    "); + } + wprintf("\">"); + escputs((char *) icalproperty_get_comment(p)); + wprintf("
    ("); + wprintf(_("All day event")); + wprintf(")
  • \n"); } - else if (ongoing_event && (hour == -1)) + else if (ongoing_event && notime_events) { - wprintf("
  • " - "", - Cal->cal_msgnum, year, month, day, hour); + wprintf("
  • " + "unread)?"_unread":"_read", + Cal->cal_msgnum, year, month, day); + wprintf("%s
    ", _("Ongoing event")); + wprintf("%s: %s
    ", _("From"), Cal->from); + wprintf("%s ", _("Summary:")); + escputs((char *) icalproperty_get_comment(p)); + wprintf("
    "); + q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY); + if (q) { + wprintf("%s ", _("Location:")); + escputs((char *)icalproperty_get_comment(q)); + wprintf("
    "); + } + webcit_fmt_date(buf, event_tt, 1); + wprintf("%s %s
    ", _("Starting date/time:"), buf); + webcit_fmt_date(buf, event_tte, 1); + wprintf("%s %s
    ", _("Ending date/time:"), buf); + q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY); + if (q) { + wprintf("%s ", _("Notes:")); + escputs((char *)icalproperty_get_comment(q)); + wprintf("
    "); + } + wprintf("\">"); escputs((char *) icalproperty_get_comment(p)); wprintf("
    ("); wprintf(_("Ongoing event")); wprintf(")
  • \n"); } - else + else if (!all_day_event && !notime_events) { gap++; - if ((hour == event_te.tm_hour) && ! ongoing_event ) { - if (event_te.tm_mday != today_start_t.day) event_te.tm_hour = 0; - if (event_tm.tm_mday != today_start_t.day) event_tm.tm_hour = 24; + if (event_te.tm_mday != day) event_te.tm_hour = 0; + if (event_tm.tm_mday != day) event_tm.tm_hour = 24; - if ((event_te.tm_hour < dstart) && (event_tm.tm_hour <= dstart)) { - startmin = diffmin = event_te.tm_min / 6; - endmin = ((event_tm.tm_hour == hour) ? (event_tm.tm_min / 2) : (event_tm.tm_min / 6)) ; - top = (event_te.tm_hour * 11) + startmin -1; - height= ((event_tm.tm_hour - event_te.tm_hour) * 11) + endmin - diffmin ; - } - if ((event_te.tm_hour < dstart) && (event_tm.tm_hour >= dstart)) { - startmin = diffmin = event_te.tm_min / 6; - endmin = event_tm.tm_min / 2; - top = (event_te.tm_hour * 11) + startmin - 1; - height = ((dstart - event_te.tm_hour) * 11) + ((event_tm.tm_hour - dstart) * 31) + endmin - (diffmin * 3); - } - if ((event_te.tm_hour <= dstart) && (event_tm.tm_hour > dend)) { - startmin = diffmin = ((event_te.tm_hour == hour) ? (event_te.tm_min / 2) : (event_te.tm_min / 6)) ; - endmin = event_tm.tm_min / 6; - top = (event_te.tm_hour * 11) + startmin - 1; - height = ((dstart - event_te.tm_hour) * 11) + ((dend - dstart + 1) * 31) + ((event_tm.tm_hour - dend - 1) * 10) + endmin - diffmin; - } - if ((event_te.tm_hour >= dstart) && (event_tm.tm_hour <= dend)) { - startmin = diffmin = (event_te.tm_min / 2); - endmin = event_tm.tm_min / 2; - top = (dstart * 11) + ((event_te.tm_hour - dstart) * 31) + startmin - 1; - height = ((event_tm.tm_hour - event_te.tm_hour) * 31) + endmin - diffmin; - } - if ((event_te.tm_hour >= dstart) && (event_te.tm_hour <= dend) && (event_tm.tm_hour > dend)) { - startmin = diffmin = (event_te.tm_min / 2); - endmin = event_tm.tm_min / 6; - top = (dstart * 11) + ((event_te.tm_hour - dstart) * 31) + diffmin - 1; - height = (((dend - event_te.tm_hour + 1) * 31) + ((event_tm.tm_hour - dend - 1) * 11)) + endmin - diffmin; - } - if ((event_te.tm_hour > dend) && (event_tm.tm_hour > dend)) { - startmin = diffmin = event_te.tm_min / 6; - endmin = event_tm.tm_min / 6; - top = (dstart * 11) + ((dend - dstart + 1) * 31) + ((event_tm.tm_hour - event_te.tm_hour) * 11) + startmin - 1; - height = ((event_tm.tm_hour - event_te.tm_hour) * 11) + endmin - diffmin; - } - wprintf("
    = dstart) && (event_te.tm_hour <= dend)) { + startmin = diffmin = (event_te.tm_min / 2); + top = (dstart * 10) + ((event_te.tm_hour - dstart) * 30) + startmin; + } + else if (event_te.tm_hour >dend) { + startmin = diffmin = event_te.tm_min / 6; + top = (dstart * 10) + ((dend - dstart - 1) * 30) + ((event_tm.tm_hour - dend + 1) * 10) + startmin ; + } + else { + /* should never get here */ + } + + /* Calculate the location of the bottom of the box */ + if (event_tm.tm_hour < dstart) { + endmin = diffmin = event_tm.tm_min / 6; + bottom = (event_tm.tm_hour * 10) + endmin; + } + else if ((event_tm.tm_hour >= dstart) && (event_tm.tm_hour <= dend)) { + endmin = diffmin = (event_tm.tm_min / 2); + bottom = (dstart * 10) + ((event_tm.tm_hour - dstart) * 30) + endmin ; + } + else if (event_tm.tm_hour >dend) { + endmin = diffmin = event_tm.tm_min / 6; + bottom = (dstart * 10) + ((dend - dstart + 1) * 30) + ((event_tm.tm_hour - dend - 1) * 10) + endmin; + } + else { + /* should never get here */ + } + + wprintf("
    ", - top, (gap * 40), height + (Cal->unread)?"_unread":"_read", + top, (gap * 40), (bottom-top) ); wprintf("", - Cal->cal_msgnum, year, month, day, t.hour, hour); + "msgnum=%ld&calview=day&year=%d&month=%d&day=%d&hour=%d\" " + "class=\"event_title\" " + "btt_tooltext=\"", + Cal->cal_msgnum, year, month, day, t.hour); + wprintf("%s: %s
    ", _("From"), Cal->from); + wprintf("%s ", _("Summary:")); + escputs((char *) icalproperty_get_comment(p)); + wprintf("
    "); + q = icalcomponent_get_first_property(Cal->cal,ICAL_LOCATION_PROPERTY); + if (q) { + wprintf("%s ", _("Location:")); + escputs((char *)icalproperty_get_comment(q)); + wprintf("
    "); + } + webcit_fmt_date(buf, event_tt, 1); + wprintf("%s %s
    ", _("Starting date/time:"), buf); + webcit_fmt_date(buf, event_tte, 1); + wprintf("%s %s
    ", _("Ending date/time:"), buf); + q = icalcomponent_get_first_property(Cal->cal,ICAL_DESCRIPTION_PROPERTY); + if (q) { + wprintf("%s ", _("Notes:")); + escputs((char *)icalproperty_get_comment(q)); + wprintf("
    "); + } + wprintf("\">"); + escputs((char *) icalproperty_get_comment(p)); wprintf("
    \n"); - } - } } } + DeleteHashPos(&Pos); } -/** - * \brief view one day - * \param year the year - * \param month the month - * \param day the day we want to display +/* + * view one day */ void calendar_day_view(int year, int month, int day) { int hour; struct icaltimetype today, yesterday, tomorrow; - int daystart = 8; - int dayend = 17; - char daystart_str[16], dayend_str[16]; + long daystart; + long dayend; struct tm d_tm; char d_str[128]; int time_format; time_t today_t; + int timeline = 30; + int extratimeline = 0; + int gap = 0; time_format = get_time_format_cached (); - get_preference("daystart", daystart_str, sizeof daystart_str); - if (!IsEmptyStr(daystart_str)) daystart = atoi(daystart_str); - get_preference("dayend", dayend_str, sizeof dayend_str); - if (!IsEmptyStr(dayend_str)) dayend = atoi(dayend_str); + get_pref_long("daystart", &daystart, 8); + get_pref_long("dayend", &dayend, 17); - /** Today's date */ + /* Today's date */ memset(&d_tm, 0, sizeof d_tm); d_tm.tm_year = year - 1900; d_tm.tm_mon = month - 1; d_tm.tm_mday = day; today_t = mktime(&d_tm); - /** Figure out the dates for "yesterday" and "tomorrow" links */ + /* Figure out the dates for "yesterday" and "tomorrow" links */ memset(&today, 0, sizeof(struct icaltimetype)); today.year = year; @@ -1014,19 +1080,29 @@ void calendar_day_view(int year, int month, int day) { wprintf("
    "); - /** Inner table (the real one) */ + /* Inner table (the real one) */ wprintf(" \n"); - /** Innermost cell (contains hours etc.) */ + /* Innermost cell (contains hours etc.) */ wprintf(""); /* end of innermost table */ - /** Extra events on the middle */ + /* Display extra events (start/end times not present or not today) in the middle column */ wprintf("
    "); wprintf("
    "); - /** Now the middle of the day... */ - for (hour = 0; hour < 24; ++hour) { /* could do HEIGHT=xx */ - wprintf("
    ", - (hour < daystart ? "before" : (hour > dayend ? "after" : "")), + + /* Now the middle of the day... */ + + extratimeline = timeline / 3; + + for (hour = 0; hour < daystart; ++hour) { /* could do HEIGHT=xx */ + wprintf("
    " + "", + (hour * extratimeline ), extratimeline, year, month, day, hour - ); + ); if (time_format == WC_TIMEFORMAT_24) { wprintf("%2d:00 ", hour); @@ -1035,27 +1111,81 @@ void calendar_day_view(int year, int month, int day) { wprintf("%d:00%s ", (hour <= 12 ? hour : hour-12), (hour < 12 ? "am" : "pm") - ); + ); } wprintf("
    "); - + } - /* put the data here, stupid */ - calendar_day_view_display_events(today_t, year, month, day, hour, daystart, dayend); + gap = daystart * extratimeline; + + for (hour = daystart; hour <= dayend; ++hour) { /* could do HEIGHT=xx */ + wprintf("
    " + "", + gap + ((hour - daystart) * timeline ), timeline, + year, month, day, hour + ); - } + if (time_format == WC_TIMEFORMAT_24) { + wprintf("%2d:00 ", hour); + } + else { + wprintf("%d:00%s ", + (hour <= 12 ? hour : hour-12), + (hour < 12 ? "am" : "pm") + ); + } + + wprintf("
    "); + } + + gap = gap + ((dayend - daystart + 1) * timeline); + + for (hour = (dayend + 1); hour < 24; ++hour) { /* could do HEIGHT=xx */ + wprintf("
    " + "", + gap + ((hour - dayend - 1) * extratimeline ), extratimeline, + year, month, day, hour + ); + + if (time_format == WC_TIMEFORMAT_24) { + wprintf("%2d:00 ", hour); + } + else { + wprintf("%d:00%s ", + (hour <= 12 ? hour : hour-12), + (hour < 12 ? "am" : "pm") + ); + } + + wprintf("
    "); + } + + /* Display events with start and end times on this day */ + calendar_day_view_display_events(today_t, year, month, day, 0, daystart, dayend); wprintf("
    "); wprintf("
    "); wprintf("
      "); - /** Display all-day events) */ - calendar_day_view_display_events(today_t, year, month, day, -1, daystart, dayend); + /* Display all-day events */ + calendar_day_view_display_events(today_t, year, month, day, 1, daystart, dayend); wprintf("
    "); @@ -1063,12 +1193,12 @@ void calendar_day_view(int year, int month, int day) { wprintf("
    "); /** begin stuff-on-the-right */ - /** Begin todays-date-with-left-and-right-arrows */ + /* Begin todays-date-with-left-and-right-arrows */ wprintf("\n"); wprintf(""); - /** Left arrow */ + /* Left arrow */ wprintf("", &d_tm - ); + ); wprintf("%s", d_str); - /** Right arrow */ + /* Right arrow */ wprintf(""); wprintf("
    "); wprintf("", yesterday.year, yesterday.month, yesterday.day); @@ -1082,10 +1212,10 @@ void calendar_day_view(int year, int month, int day) { "%Y
    " "
    "); wprintf("", tomorrow.year, tomorrow.month, tomorrow.day); @@ -1094,9 +1224,9 @@ void calendar_day_view(int year, int month, int day) { wprintf("
    \n"); - /** End todays-date-with-left-and-right-arrows */ + /* End todays-date-with-left-and-right-arrows */ - /** Embed a mini month calendar in this space */ + /* Embed a mini month calendar in this space */ wprintf("
    \n"); embeddable_mini_calendar(year, month, "readfwd?calview=day&year=%d&month=%d&day=%d"); @@ -1114,11 +1244,15 @@ void calendar_day_view(int year, int month, int day) { } -/** - * \brief Display today's events. +/* + * Display today's events. */ void calendar_summary_view(void) { - int i; + long hklen; + char *HashKey; + void *vCal; + HashPos *Pos; + disp_cal *Cal; icalproperty *p; struct icaltimetype t; time_t event_tt; @@ -1127,16 +1261,19 @@ void calendar_summary_view(void) { time_t now; int all_day_event = 0; char timestring[SIZ]; + struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ - if (WC->num_cal == 0) { + if (GetCount(WC->disp_cal_items) == 0) { return; } now = time(NULL); localtime_r(&now, &today_tm); - for (i=0; i<(WC->num_cal); ++i) { - p = icalcomponent_get_first_property(WC->disp_cal[i].cal, + Pos = GetNewHashPos(); + while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { + Cal = (disp_cal*)vCal; + p = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY); if (p != NULL) { t = icalproperty_get_dtstart(p); @@ -1157,44 +1294,29 @@ void calendar_summary_view(void) { } if ( (event_tm.tm_year == today_tm.tm_year) - && (event_tm.tm_mon == today_tm.tm_mon) - && (event_tm.tm_mday == today_tm.tm_mday) - ) { - - - p = icalcomponent_get_first_property( - WC->disp_cal[i].cal, - ICAL_SUMMARY_PROPERTY); - if (p != NULL) { - escputs((char *) - icalproperty_get_comment(p)); - wprintf(" (%s)
    \n", timestring); - } - } - } - } - free_calendar_buffer(); -} + && (event_tm.tm_mon == today_tm.tm_mon) + && (event_tm.tm_mday == today_tm.tm_mday) + ) { -/** - * \brief clean up ical memory - * \todo this could get troubel with future ical versions - */ -void free_calendar_buffer(void) { - int i; - if (WC->num_cal) for (i=0; i<(WC->num_cal); ++i) { - icalcomponent_free(WC->disp_cal[i].cal); + p = icalcomponent_get_first_property( + Cal->cal, + ICAL_SUMMARY_PROPERTY); + if (p != NULL) { + escputs((char *) + icalproperty_get_comment(p)); + wprintf(" (%s)
    \n", timestring); + } + } + } } - WC->num_cal = 0; - free(WC->disp_cal); - WC->disp_cal = NULL; + DeleteHashPos(&Pos); + DeleteHash(&WC->disp_cal_items); } - -/** - * \brief do the whole calendar page +/* + * do the whole calendar page * view any part of the calender. decide which way, etc. */ void do_calendar_view(void) { @@ -1203,27 +1325,27 @@ void do_calendar_view(void) { int year, month, day; char calview[SIZ]; - /** In case no date was specified, go with today */ + /* In case no date was specified, go with today */ now = time(NULL); localtime_r(&now, &tm); year = tm.tm_year + 1900; month = tm.tm_mon + 1; day = tm.tm_mday; - /** Now see if a date was specified */ - if (!IsEmptyStr(bstr("year"))) year = atoi(bstr("year")); - if (!IsEmptyStr(bstr("month"))) month = atoi(bstr("month")); - if (!IsEmptyStr(bstr("day"))) day = atoi(bstr("day")); + /* Now see if a date was specified */ + if (havebstr("year")) year = ibstr("year"); + if (havebstr("month")) month = ibstr("month"); + if (havebstr("day")) day = ibstr("day"); - /** How would you like that cooked? */ - if (!IsEmptyStr(bstr("calview"))) { + /* How would you like that cooked? */ + if (havebstr("calview")) { strcpy(calview, bstr("calview")); } else { strcpy(calview, "month"); } - /** Display the selected view */ + /* Display the selected view */ if (!strcasecmp(calview, "day")) { calendar_day_view(year, month, day); } @@ -1239,17 +1361,13 @@ void do_calendar_view(void) { } } - /** Free the calendar stuff */ - free_calendar_buffer(); - + /* Free the in-memory list of calendar items */ + DeleteHash(&WC->disp_cal_items); } -/** - * \brief get task due date - * Helper function for do_tasks_view(). - * \param vtodo a task to get the due date - * \return the date/time due. +/* + * Helper function for do_tasks_view(). Returns the due date/time of a vtodo. */ time_t get_task_due_date(icalcomponent *vtodo) { icalproperty *p; @@ -1258,7 +1376,7 @@ time_t get_task_due_date(icalcomponent *vtodo) { return(0L); } - /** + /* * If we're looking at a fully encapsulated VCALENDAR * rather than a VTODO component, recurse into the data * structure until we get a VTODO. @@ -1267,8 +1385,8 @@ time_t get_task_due_date(icalcomponent *vtodo) { return get_task_due_date( icalcomponent_get_first_component( vtodo, ICAL_VTODO_COMPONENT - ) - ); + ) + ); } p = icalcomponent_get_first_property(vtodo, ICAL_DUE_PROPERTY); @@ -1281,111 +1399,131 @@ time_t get_task_due_date(icalcomponent *vtodo) { } -/** - * \brief Compare the due dates of two tasks (this is for sorting) - * \param task1 first task to compare - * \param task2 second task to compare +/* + * Compare the due dates of two tasks (this is for sorting) */ -int task_due_cmp(const void *task1, const void *task2) { +int task_due_cmp(const void *vtask1, const void *vtask2) { + disp_cal * Task1 = (disp_cal *)GetSearchPayload(vtask1); + disp_cal * Task2 = (disp_cal *)GetSearchPayload(vtask2); + time_t t1; time_t t2; - t1 = get_task_due_date(((struct disp_cal *)task1)->cal); - t2 = get_task_due_date(((struct disp_cal *)task2)->cal); - + t1 = get_task_due_date(Task1->cal); + t2 = get_task_due_date(Task2->cal); if (t1 < t2) return(-1); if (t1 > t2) return(1); return(0); } +/* + * qsort filter to move completed tasks to bottom of task list + */ +int task_completed_cmp(const void *vtask1, const void *vtask2) { + disp_cal * Task1 = (disp_cal *)GetSearchPayload(vtask1); +// disp_cal * Task2 = (disp_cal *)GetSearchPayload(vtask2); + icalproperty_status t1 = icalcomponent_get_status((Task1)->cal); + // icalproperty_status t2 = icalcomponent_get_status(((struct disp_cal *)task2)->cal); + + if (t1 == ICAL_STATUS_COMPLETED) + return 1; + return 0; +} -/** - * \brief do the whole task view stuff + +/* + * do the whole task view stuff */ void do_tasks_view(void) { - int i; + long hklen; + char *HashKey; + void *vCal; + disp_cal *Cal; + HashPos *Pos; + int nItems; time_t due; - int bg = 0; char buf[SIZ]; icalproperty *p; + struct wcsession *WCC = WC; /* This is done to make it run faster; WC is a function */ wprintf("
    " - "\n\n" + "
    \n\n" "\n" - ); + wprintf("\n", + _("Show All")); - /** Sort them if necessary */ - if (WC->num_cal > 1) { - qsort(WC->disp_cal, - WC->num_cal, - sizeof(struct disp_cal), - task_due_cmp - ); - } + nItems = GetCount(WC->disp_cal_items); - if (WC->num_cal) for (i=0; i<(WC->num_cal); ++i) { + /* Sort them if necessary + if (nItems > 1) { + SortByPayload(WC->disp_cal_items, task_due_cmp); + } + * this shouldn't be neccessary, since we sort by the start time. + */ - bg = 1 - bg; - wprintf("\n"); - due = get_task_due_date(WC->disp_cal[i].cal); - fmt_date(buf, due, 0); - wprintf("\n", buf); + else { + wprintf(">"); + } + wprintf(""); + wprintf(""); + wprintf(""); } - wprintf("
    "); + wprintf(_("Completed?")); + wprintf(""); wprintf(_("Name of task")); wprintf(""); wprintf(_("Date due")); - wprintf("
    "); + wprintf(_("Category")); + wprintf(" ()
    ", - (bg ? "DDDDDD" : "FFFFFF") - ); + /* And then again, by completed */ + if (nItems > 1) { + SortByPayload(WC->disp_cal_items, + task_completed_cmp); + } - p = icalcomponent_get_first_property(WC->disp_cal[i].cal, - ICAL_SUMMARY_PROPERTY); - wprintf("disp_cal[i].cal_msgnum ); + Pos = GetNewHashPos(); + while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) { + Cal = (disp_cal*)vCal; + wprintf("
    "); + icalproperty_status todoStatus = icalcomponent_get_status(Cal->cal); + wprintf("\n"); + p = icalcomponent_get_first_property(Cal->cal, + ICAL_SUMMARY_PROPERTY); + wprintf("cal_msgnum ); urlescputs(WC->wc_roomname); wprintf("\">"); - wprintf(" "); + /* wprintf(" "); */ if (p != NULL) { escputs((char *)icalproperty_get_comment(p)); } wprintf("\n"); wprintf("cal); + wprintf(" 0) { + webcit_fmt_date(buf, due, 0); + wprintf(">%s",buf); } - wprintf(">%s
    "); + p = icalcomponent_get_first_property(Cal->cal, + ICAL_CATEGORIES_PROPERTY); + if (p != NULL) { + escputs((char *)icalproperty_get_categories(p)); + } + wprintf("
    \n"); - - /** Free the list */ - free_calendar_buffer(); + wprintf("
    \n"); + /* Free the list */ + DeleteHash(&WC->disp_cal_items); + DeleteHashPos(&Pos); } -#else /* WEBCIT_WITH_CALENDAR_SERVICE */ - -/**\brief stub for non-libical builds */ -void do_calendar_view(void) { - wprintf("
    "); - wprintf(_("The calendar view is not available.")); - wprintf("

    \n"); -} - -/**\brief stub for non-libical builds */ -void do_tasks_view(void) { - wprintf("
    "); - wprintf(_("The tasks view is not available.")); - wprintf("

    \n"); -} - -/**\brief stub for non-libical builds */ -void ajax_mini_calendar(void) { -} - -#endif /* WEBCIT_WITH_CALENDAR_SERVICE */ - -/** @} */