X-Git-Url: https://code.citadel.org/?p=citadel.git;a=blobdiff_plain;f=webcit%2Fcalendar_view.c;h=c8820b22c6333092e972889fc79f4bfaae8b7e6f;hp=8ff0a4dbcea5d630629ed035493bdbe2f6b09bca;hb=4b4dc864ede7c5d8d956febe4a0afb422b78e7c4;hpb=3e14f31738c6a9ede5f026b6de43bcd21197a06d
diff --git a/webcit/calendar_view.c b/webcit/calendar_view.c
index 8ff0a4dbc..c8820b22c 100644
--- a/webcit/calendar_view.c
+++ b/webcit/calendar_view.c
@@ -1,11 +1,26 @@
/*
- * $Id$
- *
* Handles the HTML display of calendar items.
+ *
+ * Copyright (c) 1996-2011 by the citadel.org team
+ *
+ * This program is open source software. You can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "webcit.h"
#include "webserver.h"
+#include "calendar.h"
/* These define how high the hour rows are in the day view */
#define TIMELINE 30
@@ -25,7 +40,7 @@ void embeddable_mini_calendar(int year, int month)
long weekstart = 0;
char url[256];
char div_id[256];
-
+
snprintf(div_id, sizeof div_id, "mini_calendar_%d", rand() );
/* Determine what day to start. If an impossible value is found, start on Sunday.
@@ -60,15 +75,15 @@ void embeddable_mini_calendar(int year, int month)
localtime_r(&thetime, &tm);
}
- wprintf("
\n", div_id);
+ wc_printf("
\n", div_id);
/* Previous month link */
localtime_r(&previous_month, &tm);
- wprintf("
«",
+ wc_printf("
«",
(int)(tm.tm_year)+1900, tm.tm_mon + 1);
wc_strftime(colheader_label, sizeof colheader_label, "%B", &starting_tm);
- wprintf(" "
+ wc_printf(" "
"
"
"%s %d"
""
@@ -76,20 +91,20 @@ void embeddable_mini_calendar(int year, int month)
/* Next month link */
localtime_r(&next_month, &tm);
- wprintf("
»",
+ wc_printf("
»",
(int)(tm.tm_year)+1900, tm.tm_mon + 1);
- wprintf("
"
+ wc_printf(""
"");
colheader_time = thetime;
for (i=0; i<7; ++i) {
colheader_time = thetime + (i * 86400) ;
localtime_r(&colheader_time, &colheader_tm);
wc_strftime(colheader_label, sizeof colheader_label, "%A", &colheader_tm);
- wprintf("%c | ", colheader_label[0]);
+ wc_printf("%c | ", colheader_label[0]);
}
- wprintf("
\n");
+ wc_printf("\n");
/* Now do 35 or 42 days */
@@ -100,21 +115,21 @@ void embeddable_mini_calendar(int year, int month)
/* Before displaying Sunday, start a new row */
if ((i % 7) == 0) {
- wprintf("");
+ wc_printf("
");
}
if (tm.tm_mon == month-1) {
- snprintf(url, sizeof url, "readfwd?calview=day&year=%d&month=%d&day=%d",
+ snprintf(url, sizeof url, "readfwd?calview=day?year=%d?month=%d?day=%d",
tm.tm_year+1900, tm.tm_mon+1, tm.tm_mday);
- wprintf("%d | ", url, tm.tm_mday);
+ wc_printf("%d | ", url, tm.tm_mday);
}
else {
- wprintf(" | ");
+ wc_printf(" | ");
}
/* After displaying one week, end the row */
if ((i % 7) == 6) {
- wprintf("
\n");
+ wc_printf("\n");
}
}
@@ -122,7 +137,7 @@ void embeddable_mini_calendar(int year, int month)
thetime += (time_t)86400; /* ahead 24 hours */
}
- wprintf("
" /* end of inner table */
+ wc_printf("
" /* end of inner table */
"
\n");
StrBufAppendPrintf(WC->trailing_javascript,
@@ -163,6 +178,7 @@ void calendar_month_view_display_events(int year, int month, int day)
struct icaltimetype end_t;
struct icaltimetype today_start_t;
struct icaltimetype today_end_t;
+ struct icaltimetype today_t;
struct tm starting_tm;
struct tm ending_tm;
int all_day_event = 0;
@@ -172,7 +188,7 @@ void calendar_month_view_display_events(int year, int month, int day)
time_t tt;
if (GetCount(WCC->disp_cal_items) == 0) {
- wprintf("
\n");
+ wc_printf("
\n");
return;
}
@@ -199,6 +215,14 @@ 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;
+ /*
+ * Create another one without caring about the timezone for all day events.
+ */
+ today_t = icaltime_null_date();
+ today_t.year = year;
+ today_t.month = month;
+ today_t.day = day;
+
/*
* Now loop through our list of events to see which ones occur today.
*/
@@ -224,7 +248,7 @@ void calendar_month_view_display_events(int year, int month, int day)
if (all_day_event)
{
- show_event = ((t.year == year) && (t.month == month) && (t.day == day));
+ show_event = ical_ctdl_is_overlap(t, end_t, today_t, icaltime_null_time());
}
else
{
@@ -235,103 +259,147 @@ void calendar_month_view_display_events(int year, int month, int day)
* If we determined that this event occurs today, then display it.
*/
if (show_event) {
+
+ /* time_t logtt = icaltime_as_timet(t);
+ syslog(LOG_DEBUG, "Match on %04d-%02d-%02d for event %x%s on %s",
+ year, month, day,
+ (int)Cal, ((all_day_event) ? " (all day)" : ""),
+ ctime(&logtt)
+ ); */
+
p = icalcomponent_get_first_property(Cal->cal, ICAL_SUMMARY_PROPERTY);
+ if (p == NULL) {
+ p = icalproperty_new_summary(_("Untitled Event"));
+ icalcomponent_add_property(Cal->cal, p);
+ }
if (p != NULL) {
if (all_day_event) {
- wprintf("
"
+ wc_printf(""
""
);
}
- wprintf(""
+
+ wc_printf(""
""
+ ,
(Cal->unread)?"_unread":"_read",
Cal->cal_msgnum,
year, month, day
- );
+ );
+
+ escputs((char *) icalproperty_get_comment(p));
+
+ wc_printf("");
- wprintf("%s: %s ", _("From"), Cal->from);
- wprintf("%s ", _("Summary:"));
+ wc_printf("%s: %s ", _("From"), Cal->from);
+ wc_printf("%s ", _("Summary:"));
escputs((char *)icalproperty_get_comment(p));
- wprintf(" ");
-
+ wc_printf(" ");
+
q = icalcomponent_get_first_property(
Cal->cal,
ICAL_LOCATION_PROPERTY);
if (q) {
- wprintf("%s ", _("Location:"));
+ wc_printf("%s ", _("Location:"));
escputs((char *)icalproperty_get_comment(q));
- wprintf(" ");
+ wc_printf(" ");
}
-
+
/*
* Only show start/end times if we're actually looking at the VEVENT
* component. Otherwise it shows bogus dates for e.g. timezones
*/
if (icalcomponent_isa(Cal->cal) == ICAL_VEVENT_COMPONENT) {
-
+
q = icalcomponent_get_first_property(Cal->cal, ICAL_DTSTART_PROPERTY);
if (q != NULL) {
+ int no_end = 0;
+
t = icalproperty_get_dtstart(q);
-
+ q = icalcomponent_get_first_property(Cal->cal, ICAL_DTEND_PROPERTY);
+ if (q != NULL) {
+ end_t = icalproperty_get_dtend(q);
+ }
+ else {
+ /*
+ * events with starting date/time equal
+ * ending date/time might get only
+ * DTSTART but no DTEND
+ */
+ no_end = 1;
+ }
+
if (t.is_date) {
+ /* all day event */
struct tm d_tm;
- char d_str[32];
+
+ if (!no_end) {
+ /* end given, have to adjust it */
+ icaltime_adjust(&end_t, -1, 0, 0, 0);
+ }
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);
+ wc_strftime(buf, sizeof buf, "%x", &d_tm);
+
+ if (no_end || !icaltime_compare(t, end_t)) {
+ wc_printf("%s %s ",
+ _("Date:"), buf);
+ }
+ else {
+ wc_printf("%s %s ",
+ _("Starting date:"), buf);
+ d_tm.tm_year = end_t.year - 1900;
+ d_tm.tm_mon = end_t.month - 1;
+ d_tm.tm_mday = end_t.day;
+ wc_strftime(buf, sizeof buf, "%x", &d_tm);
+ wc_printf("%s %s ",
+ _("Ending date:"), buf);
+ }
}
else {
tt = icaltime_as_timet(t);
- webcit_fmt_date(buf, tt, DATEFMT_BRIEF);
- wprintf("%s %s ",
- _("Starting date/time:"), buf);
-
- /*
- * 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);
- webcit_fmt_date(buf, tt, DATEFMT_BRIEF);
- wprintf("%s %s ", _("Ending date/time:"), buf);
+ webcit_fmt_date(buf, 256, tt, DATEFMT_BRIEF);
+ if (no_end || !icaltime_compare(t, end_t)) {
+ wc_printf("%s %s ",
+ _("Date/time:"), buf);
+ }
+ else {
+ wc_printf("%s %s ",
+ _("Starting date/time:"), buf);
+ tt = icaltime_as_timet(end_t);
+ webcit_fmt_date(buf, 256, tt, DATEFMT_BRIEF);
+ wc_printf("%s %s ", _("Ending date/time:"), buf);
}
-
+
}
}
-
+
}
-
+
q = icalcomponent_get_first_property(Cal->cal, ICAL_DESCRIPTION_PROPERTY);
if (q) {
- wprintf("%s ", _("Notes:"));
+ wc_printf("%s ", _("Notes:"));
escputs((char *)icalproperty_get_comment(q));
- wprintf(" ");
+ wc_printf(" ");
}
-
- wprintf("\">");
- escputs((char *)
- icalproperty_get_comment(p));
- wprintf(" \n");
-
+
+ wc_printf("");
+ wc_printf(" \n");
+
if (all_day_event) {
- wprintf(" |
");
+ wc_printf("
");
}
-
+
}
-
+
}
-
-
+
+
}
DeleteHashPos(&Pos);
}
@@ -356,20 +424,16 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) {
icalproperty *e;
struct icaltimetype t;
disp_cal *Cal;
- int month, day, year;
int all_day_event = 0;
char *timeformat;
int time_format;
-
+
time_format = get_time_format_cached ();
if (time_format == WC_TIMEFORMAT_24) timeformat="%k:%M";
else timeformat="%I:%M %p";
localtime_r(&thetime, &today_tm);
- month = today_tm.tm_mon + 1;
- day = today_tm.tm_mday;
- year = today_tm.tm_year + 1900;
Pos = GetNewHashPos(WCC->disp_cal_items, 0);
while (GetNextHashPos(WCC->disp_cal_items, Pos, &hklen, &HashKey, &vCal)) {
@@ -392,14 +456,18 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) {
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)) {
-
-
+
+
char sbuf[255];
char ebuf[255];
-
+
p = icalcomponent_get_first_property(
Cal->cal,
ICAL_SUMMARY_PROPERTY);
+ if (p == NULL) {
+ p = icalproperty_new_summary(_("Untitled Event"));
+ icalcomponent_add_property(Cal->cal, p);
+ }
e = icalcomponent_get_first_property(
Cal->cal,
ICAL_DTEND_PROPERTY);
@@ -412,36 +480,36 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) {
difftime=(event_tte-event_tts)/60;
hours=(int)(difftime / 60);
minutes=difftime % 60;
- wprintf("
%i:%2i | "
+ wc_printf(" |
%i:%2i | "
""
"",
daycolor,
hours, minutes,
- (Cal->unread)?"_unread":"_read",
+ (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);
-
- wprintf(" | "
+
+ wc_printf(""
"%s | %s |
",
daycolor,
sbuf,
daycolor,
ebuf);
}
-
+
}
-
-
+
+
}
}
DeleteHashPos(&Pos);
@@ -454,15 +522,23 @@ void calendar_month_view_brief_events(time_t thetime, const char *daycolor) {
void calendar_month_view(int year, int month, int day) {
struct tm starting_tm;
struct tm tm;
+ struct tm today_tm;
time_t thetime;
int i;
time_t previous_month;
time_t next_month;
time_t colheader_time;
+ time_t today_timet;
struct tm colheader_tm;
char colheader_label[32];
long weekstart = 0;
+ /*
+ * Make sure we know which day is today.
+ */
+ today_timet = time(NULL);
+ localtime_r(&today_timet, &today_tm);
+
/*
* Determine what day to start. If an impossible value is found, start on Sunday.
*/
@@ -497,45 +573,45 @@ void calendar_month_view(int year, int month, int day) {
}
/* Outer table (to get the background color) */
- wprintf("