aboutsummaryrefslogtreecommitdiffstats
path: root/calendar
diff options
context:
space:
mode:
Diffstat (limited to 'calendar')
-rw-r--r--calendar/ChangeLog6
-rw-r--r--calendar/gui/calendar-summary.c407
2 files changed, 322 insertions, 91 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog
index d465f49558..11a0cb12f5 100644
--- a/calendar/ChangeLog
+++ b/calendar/ChangeLog
@@ -1,3 +1,9 @@
+2001-01-08 Iain Holmes <iain@helixcode.com>
+
+ * gui/calendar-summary.c (create_summary_view): Add a PropertyControl
+ interface to set whether or not to show tasks and appointments. Add
+ a PersistStream to remember this.
+
2001-01-09 Dave Camp <dave@helixcode.com>
* gui/Makefile.am: Replaced e-meet-dialog.glade.h with
diff --git a/calendar/gui/calendar-summary.c b/calendar/gui/calendar-summary.c
index 6948b72df7..98e0bdb887 100644
--- a/calendar/gui/calendar-summary.c
+++ b/calendar/gui/calendar-summary.c
@@ -35,6 +35,9 @@
#include <evolution-services/executive-summary-component.h>
#include <evolution-services/executive-summary-html-view.h>
+#include <gnome-xml/parser.h>
+#include <gnome-xml/xmlmemory.h>
+
#include "cal-util/cal-component.h"
#include "cal-util/timeutil.h"
#include "calendar-model.h"
@@ -44,9 +47,16 @@
typedef struct {
ExecutiveSummaryComponent *component;
ExecutiveSummaryHtmlView *view;
+ BonoboPropertyControl *property_control;
CalClient *client;
gboolean cal_loaded;
+ GtkWidget *show_appointments;
+ GtkWidget *show_tasks;
+
+ gboolean appointments;
+ gboolean tasks;
+
char *title;
char *icon;
@@ -81,111 +91,123 @@ generate_html_summary (CalSummary *summary)
datestr = g_new (char, 256);
timeptr = localtime (&t);
strftime (datestr, 255, _("%A, %e %B %Y"), timeptr);
- ret_html = g_strdup_printf ("<p align=\"center\">Appointments</p>"
- "<hr><b>%s</b><br><ul>", datestr);
+ ret_html = g_strdup_printf ("<b>%s</b>", datestr);
g_free (datestr);
- uids = cal_client_get_objects_in_range (summary->client,
- CALOBJ_TYPE_EVENT, day_begin,
- day_end);
- for (l = uids; l; l = l->next){
- CalComponent *comp;
- CalComponentText text;
- CalClientGetStatus status;
- CalComponentDateTime start, end;
- struct icaltimetype *end_time;
- time_t start_t, end_t;
- struct tm *start_tm, *end_tm;
- char *start_str, *end_str;
- char *uid;
- char *tmp2;
-
- uid = l->data;
- status = cal_client_get_object (summary->client, uid, &comp);
- if (status != CAL_CLIENT_GET_SUCCESS)
- continue;
+ if (summary->appointments) {
+ tmp = ret_html;
+ ret_html = g_strdup_printf ("%s<p align=\"center\">Appointments</p><hr><ul>",
+ tmp);
+ g_free (tmp);
- cal_component_get_summary (comp, &text);
- cal_component_get_dtstart (comp, &start);
- cal_component_get_dtend (comp, &end);
-
- g_print ("text.value: %s\n", text.value);
- end_time = end.value;
-
- start_t = icaltime_as_timet (*start.value);
-
- start_str = g_new (char, 20);
- start_tm = localtime (&start_t);
- strftime (start_str, 19, _("%I:%M%p"), start_tm);
-
- if (end_time) {
- end_str = g_new (char, 20);
- end_t = icaltime_as_timet (*end_time);
- end_tm = localtime (&end_t);
- strftime (end_str, 19, _("%I:%M%p"), end_tm);
- } else {
- end_str = g_strdup ("...");
+ uids = cal_client_get_objects_in_range (summary->client,
+ CALOBJ_TYPE_EVENT, day_begin,
+ day_end);
+ for (l = uids; l; l = l->next){
+ CalComponent *comp;
+ CalComponentText text;
+ CalClientGetStatus status;
+ CalComponentDateTime start, end;
+ struct icaltimetype *end_time;
+ time_t start_t, end_t;
+ struct tm *start_tm, *end_tm;
+ char *start_str, *end_str;
+ char *uid;
+ char *tmp2;
+
+ uid = l->data;
+ status = cal_client_get_object (summary->client, uid, &comp);
+ if (status != CAL_CLIENT_GET_SUCCESS)
+ continue;
+
+ cal_component_get_summary (comp, &text);
+ cal_component_get_dtstart (comp, &start);
+ cal_component_get_dtend (comp, &end);
+
+ g_print ("text.value: %s\n", text.value);
+ end_time = end.value;
+
+ start_t = icaltime_as_timet (*start.value);
+
+ start_str = g_new (char, 20);
+ start_tm = localtime (&start_t);
+ strftime (start_str, 19, _("%I:%M%p"), start_tm);
+
+ if (end_time) {
+ end_str = g_new (char, 20);
+ end_t = icaltime_as_timet (*end_time);
+ end_tm = localtime (&end_t);
+ strftime (end_str, 19, _("%I:%M%p"), end_tm);
+ } else {
+ end_str = g_strdup ("...");
+ }
+
+ tmp2 = g_strdup_printf ("<li>%s:%s -> %s</li>", text.value, start_str, end_str);
+ g_free (start_str);
+ g_free (end_str);
+
+ tmp = ret_html;
+ ret_html = g_strconcat (ret_html, tmp2, NULL);
+ g_free (tmp);
+ g_free (tmp2);
}
-
- tmp2 = g_strdup_printf ("<li>%s:%s -> %s</li>", text.value, start_str, end_str);
- g_free (start_str);
- g_free (end_str);
-
+
+ cal_obj_uid_list_free (uids);
+
tmp = ret_html;
- ret_html = g_strconcat (ret_html, tmp2, NULL);
+ ret_html = g_strconcat (ret_html, "</ul>", NULL);
g_free (tmp);
- g_free (tmp2);
}
-
- cal_obj_uid_list_free (uids);
-
- tmp = ret_html;
- ret_html = g_strconcat (ret_html,
- "</ul><p align=\"center\">Tasks<hr><ul>",
- NULL);
- g_free (tmp);
-
- /* Generate a list of tasks */
- uids = cal_client_get_uids (summary->client, CALOBJ_TYPE_TODO);
- for (l = uids; l; l = l->next){
- CalComponent *comp;
- CalComponentText text;
- CalClientGetStatus status;
- struct icaltimetype *completed;
- char *uid;
- char *tmp2;
-
- uid = l->data;
- status = cal_client_get_object (summary->client, uid, &comp);
- if (status != CAL_CLIENT_GET_SUCCESS)
- continue;
+
+ if (summary->tasks) {
+ tmp = ret_html;
+ ret_html = g_strconcat (ret_html,
+ "<p align=\"center\">Tasks</p><hr><ul>",
+ NULL);
+ g_free (tmp);
- cal_component_get_summary (comp, &text);
- cal_component_get_completed (comp, &completed);
-
- if (completed == NULL) {
- tmp2 = g_strdup_printf ("<li>%s</li>", text.value);
- } else {
- tmp2 = g_strdup_printf ("<li><strike>%s</strike></li>",
- text.value);
- cal_component_free_icaltimetype (completed);
+ /* Generate a list of tasks */
+ uids = cal_client_get_uids (summary->client, CALOBJ_TYPE_TODO);
+ for (l = uids; l; l = l->next){
+ CalComponent *comp;
+ CalComponentText text;
+ CalClientGetStatus status;
+ struct icaltimetype *completed;
+ char *uid;
+ char *tmp2;
+
+ uid = l->data;
+ status = cal_client_get_object (summary->client, uid, &comp);
+ if (status != CAL_CLIENT_GET_SUCCESS)
+ continue;
+
+ cal_component_get_summary (comp, &text);
+ cal_component_get_completed (comp, &completed);
+
+ if (completed == NULL) {
+ tmp2 = g_strdup_printf ("<li>%s</li>", text.value);
+ } else {
+ tmp2 = g_strdup_printf ("<li><strike>%s</strike></li>",
+ text.value);
+ cal_component_free_icaltimetype (completed);
+ }
+
+ tmp = ret_html;
+ ret_html = g_strconcat (ret_html, tmp2, NULL);
+ g_free (tmp);
+ g_free (tmp2);
}
-
+
+ cal_obj_uid_list_free (uids);
+
tmp = ret_html;
- ret_html = g_strconcat (ret_html, tmp2, NULL);
+ ret_html = g_strconcat (ret_html, "</ul>", NULL);
g_free (tmp);
- g_free (tmp2);
}
-
- cal_obj_uid_list_free (uids);
-
- tmp = ret_html;
- ret_html = g_strconcat (ret_html, "</ul>", NULL);
- g_free (tmp);
-
+
executive_summary_html_view_set_html (summary->view, ret_html);
g_free (ret_html);
-
+
summary->idle = 0;
return FALSE;
}
@@ -309,6 +331,194 @@ alarm_fn (gpointer alarm_id,
generate_html_summary (summary);
}
+/* PersistStream callbacks */
+static void
+load_from_stream (BonoboPersistStream *ps,
+ Bonobo_Stream stream,
+ Bonobo_Persist_ContentType type,
+ gpointer data,
+ CORBA_Environment *ev)
+{
+ CalSummary *summary = (CalSummary *) data;
+ char *str;
+ xmlChar *xml_str;
+ xmlDocPtr doc;
+ xmlNodePtr root, children;
+
+ if (*type && g_strcasecmp (type, "application/x-evolution-calendar-summary") != 0) {
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ ex_Bonobo_Persist_WrongDataType, NULL);
+ return;
+ }
+
+ bonobo_stream_client_read_string (stream, &str, ev);
+ if (ev->_major != CORBA_NO_EXCEPTION || str == NULL) {
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ ex_Bonobo_Persist_WrongDataType, NULL);
+ return;
+ }
+
+ doc = xmlParseDoc ((xmlChar *) str);
+
+ if (doc == NULL) {
+ g_warning ("Bad data: %s!", str);
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ ex_Bonobo_Persist_WrongDataType, NULL);
+ g_free (str);
+ return;
+ }
+
+ g_free (str);
+ root = doc->root;
+ children = root->childs;
+ while (children) {
+ if (strcasecmp (children->name, "showappointments") == 0) {
+ xml_str = xmlNodeListGetString (doc, children->childs, 1);
+ if (strcmp (xml_str, "TRUE") == 0)
+ summary->appointments = TRUE;
+ else
+ summary->appointments = FALSE;
+ xmlFree (xml_str);
+
+ children = children->next;
+ continue;
+ }
+
+ if (strcasecmp (children->name, "showtasks") == 0) {
+ xml_str = xmlNodeListGetString (doc, children->childs, 1);
+ if (strcmp (xml_str, "TRUE") == 0)
+ summary->tasks = TRUE;
+ else
+ summary->tasks = FALSE;
+ xmlFree (xml_str);
+
+ children = children->next;
+ continue;
+ }
+
+ g_print ("Unknown name: %s\n", children->name);
+ children = children->next;
+ }
+ xmlFreeDoc (doc);
+
+ summary->idle = g_idle_add (generate_html_summary, summary);
+}
+
+static char *
+summary_to_string (CalSummary *summary)
+{
+ xmlChar *out_str;
+ int out_len = 0;
+ xmlDocPtr doc;
+ xmlNsPtr ns;
+
+ doc = xmlNewDoc ("1.0");
+ ns = xmlNewGlobalNs (doc, "http://www.helixcode.com", "calendar-summary");
+ doc->root = xmlNewDocNode (doc, ns, "calendar-summary", NULL);
+
+ xmlNewChild (doc->root, ns, "showappointments",
+ summary->appointments ? "TRUE" : "FALSE");
+ xmlNewChild (doc->root, ns, "showtasks", summary->tasks ? "TRUE" : "FALSE");
+
+ xmlDocDumpMemory (doc, &out_str, &out_len);
+ return out_str;
+}
+
+static void
+save_to_stream (BonoboPersistStream *ps,
+ const Bonobo_Stream stream,
+ Bonobo_Persist_ContentType type,
+ gpointer data,
+ CORBA_Environment *ev)
+{
+ CalSummary *summary = (CalSummary *) data;
+ char *str;
+
+ if (*type && g_strcasecmp (type, "application/x-evolution-calendar-summary") != 0) {
+ CORBA_exception_set (ev, CORBA_USER_EXCEPTION,
+ ex_Bonobo_Persist_WrongDataType, NULL);
+ return;
+ }
+
+ str = summary_to_string (summary);
+ if (str)
+ bonobo_stream_client_printf (stream, TRUE, ev, str);
+ xmlFree (str);
+
+ return;
+}
+
+static Bonobo_Persist_ContentTypeList *
+content_types (BonoboPersistStream *ps,
+ void *closure,
+ CORBA_Environment *ev)
+{
+ return bonobo_persist_generate_content_types (1, "application/x-evolution-calendar-summary");
+}
+
+static void
+property_dialog_changed (GtkWidget *widget,
+ CalSummary *summary)
+{
+ bonobo_property_control_changed (summary->property_control, NULL);
+}
+
+static void
+property_dialog (BonoboPropertyControl *property_control,
+ int page_num,
+ gpointer user_data)
+{
+ BonoboControl *control;
+ CalSummary *summary = (CalSummary *) user_data;
+ GtkWidget *container, *vbox;
+
+ container = gtk_frame_new (_("Display"));
+ gtk_container_set_border_width (GTK_CONTAINER (container), 2);
+ vbox = gtk_vbox_new (FALSE, 2);
+ gtk_container_add (GTK_CONTAINER (container), vbox);
+
+ summary->show_appointments = gtk_check_button_new_with_label (_("Show appointments"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (summary->show_appointments),
+ summary->appointments);
+ gtk_signal_connect (GTK_OBJECT (summary->show_appointments), "toggled",
+ GTK_SIGNAL_FUNC (property_dialog_changed), summary);
+ gtk_box_pack_start (GTK_BOX (vbox), summary->show_appointments,
+ TRUE, TRUE, 0);
+
+ summary->show_tasks = gtk_check_button_new_with_label (_("Show tasks"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (summary->show_tasks),
+ summary->tasks);
+ gtk_signal_connect (GTK_OBJECT (summary->show_tasks), "toggled",
+ GTK_SIGNAL_FUNC (property_dialog_changed), summary);
+ gtk_box_pack_start (GTK_BOX (vbox), summary->show_tasks, TRUE, TRUE, 0);
+ gtk_widget_show_all (container);
+
+ control = bonobo_control_new (container);
+ return control;
+}
+
+static void
+property_action (GtkObject *property_control,
+ int page_num,
+ Bonobo_PropertyControl_Action action,
+ CalSummary *summary)
+{
+ switch (action) {
+ case Bonobo_PropertyControl_APPLY:
+ summary->appointments = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (summary->show_appointments));
+ summary->tasks = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (summary->show_tasks));
+ summary->idle = g_idle_add (generate_html_summary, summary);
+ break;
+
+ case Bonobo_PropertyControl_HELP:
+ g_print ("HELP\n");
+ break;
+
+ default:
+ break;
+ }
+}
+
BonoboObject *
create_summary_view (ExecutiveSummaryComponentFactory *_factory,
void *closure)
@@ -316,6 +526,7 @@ create_summary_view (ExecutiveSummaryComponentFactory *_factory,
BonoboObject *component, *view;
BonoboPersistStream *stream;
BonoboPropertyBag *bag;
+ BonoboPropertyControl *property_control;
BonoboEventSource *event_source;
CalSummary *summary;
char *html, *file;
@@ -333,6 +544,8 @@ create_summary_view (ExecutiveSummaryComponentFactory *_factory,
summary->client = cal_client_new ();
summary->cal_loaded = FALSE;
summary->idle = 0;
+ summary->appointments = TRUE;
+ summary->tasks = TRUE;
t = time (NULL);
day_end = time_day_end (t);
@@ -378,6 +591,18 @@ create_summary_view (ExecutiveSummaryComponentFactory *_factory,
"The icon for this component's window", 0);
bonobo_object_add_interface (component, BONOBO_OBJECT (bag));
+ property_control = bonobo_property_control_new_full (property_dialog,
+ 1, event_source,
+ summary);
+ summary->property_control = property_control;
+ gtk_signal_connect (GTK_OBJECT (property_control), "action",
+ GTK_SIGNAL_FUNC (property_action), summary);
+ bonobo_object_add_interface (component, BONOBO_OBJECT (property_control));
+
+ stream = bonobo_persist_stream_new (load_from_stream, save_to_stream,
+ NULL, content_types, summary);
+ bonobo_object_add_interface (component, BONOBO_OBJECT (stream));
+
running_views++;
return component;