[evolution] Bug #572176 - Allow Local iCal Files To Be Selected As Cal Source



commit ff186e22dd664953566250c9295a147a4e1d4d5d
Author: Milan Crha <mcrha redhat com>
Date:   Mon Jul 27 13:02:47 2009 +0200

    Bug #572176 - Allow Local iCal Files To Be Selected As Cal Source

 plugins/calendar-file/calendar-file.c              |  268 +++++++++++++++++++-
 .../org-gnome-calendar-file.eplug.xml              |    4 +-
 2 files changed, 264 insertions(+), 8 deletions(-)
---
diff --git a/plugins/calendar-file/calendar-file.c b/plugins/calendar-file/calendar-file.c
index 9d21d62..fa6aaa7 100644
--- a/plugins/calendar-file/calendar-file.c
+++ b/plugins/calendar-file/calendar-file.c
@@ -27,15 +27,160 @@
 #include <glib/gi18n.h>
 #include <string.h>
 
-GtkWidget *e_calendar_file_dummy (EPlugin *epl, EConfigHookItemFactoryData *data);
+static void
+location_changed (GtkFileChooserButton *widget, ESource *source)
+{
+	char *filename;
+
+	g_return_if_fail (widget != NULL);
+	g_return_if_fail (source != NULL);
+
+	filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
+	e_source_set_property (source, "custom-file", (filename && *filename) ? filename : NULL);
+	g_free (filename);
+}
+
+static void
+set_refresh_time (ESource *source, GtkWidget *spin, GtkWidget *combobox)
+{
+	gint time;
+	gint item_num = 0;
+	const gchar *refresh_str = e_source_get_property (source, "refresh");
+	time = refresh_str ? atoi (refresh_str) : 30;
+
+	if (time  && !(time % 10080)) {
+		/* weeks */
+		item_num = 3;
+		time /= 10080;
+	} else if (time && !(time % 1440)) {
+		/* days */
+		item_num = 2;
+		time /= 1440;
+	} else if (time && !(time % 60)) {
+		/* hours */
+		item_num = 1;
+		time /= 60;
+	}
+	gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), item_num);
+	gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), time);
+}
+
+static gchar *
+get_refresh_minutes (GtkWidget *spin, GtkWidget *combobox)
+{
+	gint setting = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (spin));
+	switch (gtk_combo_box_get_active (GTK_COMBO_BOX (combobox))) {
+	case 0:
+		/* minutes */
+		break;
+	case 1:
+		/* hours */
+		setting *= 60;
+		break;
+	case 2:
+		/* days */
+		setting *= 1440;
+		break;
+	case 3:
+		/* weeks - is this *really* necessary? */
+		setting *= 10080;
+		break;
+	default:
+		g_warning ("Time unit out of range");
+		break;
+	}
+
+	return g_strdup_printf ("%d", setting);
+}
+
+static void
+spin_changed (GtkSpinButton *spin, ESource *source)
+{
+	gchar *refresh_str;
+	GtkWidget *combobox;
+
+	combobox = g_object_get_data (G_OBJECT (spin), "combobox");
+
+	refresh_str = get_refresh_minutes ((GtkWidget *) spin, combobox);
+	e_source_set_property (source, "refresh", refresh_str);
+	g_free (refresh_str);
+}
+
+static void
+combobox_changed (GtkComboBox *combobox, ESource *source)
+{
+	gchar *refresh_str;
+	GtkWidget *spin;
+
+	spin = g_object_get_data (G_OBJECT (combobox), "spin");
+
+	refresh_str = get_refresh_minutes (spin, (GtkWidget *) combobox);
+	e_source_set_property (source, "refresh", refresh_str);
+	g_free (refresh_str);
+}
+
+static void
+maincheck_toggled (GtkToggleButton *check, ESource *source)
+{
+	GtkWidget *w;
+	gboolean enabled = gtk_toggle_button_get_active (check);
+
+	w = g_object_get_data (G_OBJECT (check), "child");
+	gtk_widget_set_sensitive (w, enabled);
+
+	if (enabled) {
+		char *file;
+
+		w = g_object_get_data (G_OBJECT (check), "file-chooser");
+		file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (w));
+		e_source_set_property (source, "custom-file", (file && *file) ? file : NULL);
+		g_free (file);
+	} else {
+		e_source_set_property (source, "custom-file", NULL);
+	}
+}
+
+static void
+refresh_type_changed (GtkComboBox *refresh_type, ESource *source)
+{
+	GtkWidget *spin, *combobox;
+	gint active = gtk_combo_box_get_active (refresh_type);
+	char buff[2] = {0};
+
+	spin = g_object_get_data (G_OBJECT (refresh_type), "spin");
+	combobox = g_object_get_data (G_OBJECT (refresh_type), "combobox");
+
+	if (active < 0 || active > 2)
+		active = 0;
+
+	if (active == 2) {
+		gtk_widget_show (spin);
+		gtk_widget_show (combobox);
+	} else {
+		gtk_widget_hide (spin);
+		gtk_widget_hide (combobox);
+	}
+
+	buff [0] = '0' + active;
+	e_source_set_property (source, "refresh-type", buff);
+}
+
+static void
+force_readonly_toggled (GtkToggleButton *check, ESource *source)
+{
+	e_source_set_property (source, "custom-file-readonly", gtk_toggle_button_get_active (check) ? "1" : NULL);
+}
+
+GtkWidget *e_calendar_file_customs (EPlugin *epl, EConfigHookItemFactoryData *data);
 
 GtkWidget *
-e_calendar_file_dummy (EPlugin *epl, EConfigHookItemFactoryData *data)
+e_calendar_file_customs (EPlugin *epl, EConfigHookItemFactoryData *data)
 {
 	ECalConfigTargetSource *t = (ECalConfigTargetSource *) data->target;
 	ESource *source = t->source;
 	gchar *uri_text;
-	const gchar *relative_uri;
+	const gchar *relative_uri, *value;
+	GtkWidget *w1, *w2, *w3, *box1, *box2, *mainbox, *maincheck;
 
         uri_text = e_source_get_uri (source);
 	if (strncmp (uri_text, "file", 4)) {
@@ -45,13 +190,124 @@ e_calendar_file_dummy (EPlugin *epl, EConfigHookItemFactoryData *data)
 	}
 
 	relative_uri = e_source_peek_relative_uri (source);
-	g_free (uri_text);
 
-	if (relative_uri && *relative_uri) {
+	if (relative_uri && g_str_equal (relative_uri, "system")) {
+		g_free (uri_text);
 		return NULL;
 	}
 
 	e_source_set_relative_uri (source, e_source_peek_uid (source));
 
-	return NULL;
+	mainbox = gtk_vbox_new (FALSE, 2);
+	gtk_table_attach (GTK_TABLE (data->parent), mainbox, 1, 2, GTK_TABLE (data->parent)->nrows, GTK_TABLE (data->parent)->nrows + 1, GTK_EXPAND | GTK_FILL, 0, 0, 0);
+
+	maincheck = gtk_check_button_new_with_mnemonic (_("_Customize options"));
+	g_signal_connect (G_OBJECT (maincheck), "toggled", G_CALLBACK (maincheck_toggled), source);
+	gtk_box_pack_start ((GtkBox *)mainbox, maincheck, TRUE, TRUE, 2);
+
+	box1 = gtk_hbox_new (FALSE, 2);
+	gtk_box_pack_start ((GtkBox *)mainbox, box1, TRUE, TRUE, 2);
+
+	g_object_set_data ((GObject*)maincheck, "child", box1);
+
+	/* left-most space, the first one */
+	w1 = gtk_label_new ("");
+	gtk_box_pack_start ((GtkBox *)box1, w1, FALSE, TRUE, 8);
+
+	box2 = gtk_vbox_new (FALSE, 2);
+	gtk_box_pack_start ((GtkBox *)box1, box2, TRUE, TRUE, 2);
+
+	box1 = box2;
+	box2 = gtk_hbox_new (FALSE, 2);
+	gtk_box_pack_start ((GtkBox *)box1, box2, TRUE, TRUE, 2);
+
+	w1 = gtk_label_new_with_mnemonic (_("File _name:"));
+	gtk_misc_set_alignment (GTK_MISC (w1), 0.0, 0.5);
+	gtk_box_pack_start ((GtkBox *)box2, w1, FALSE, TRUE, 2);
+
+	w2 = gtk_file_chooser_button_new (_("Choose calendar file"), GTK_FILE_CHOOSER_ACTION_OPEN);
+	gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (w2), TRUE);
+	gtk_label_set_mnemonic_widget (GTK_LABEL (w1), w2);
+	g_signal_connect (G_OBJECT (w2), "file-set", G_CALLBACK (location_changed), source);
+	gtk_box_pack_start ((GtkBox *)box2, w2, TRUE, TRUE, 2);
+
+	g_object_set_data (G_OBJECT (maincheck), "file-chooser", w2);
+
+	value = e_source_get_property (source, "custom-file");
+	if (value && *value) {
+		gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (w2), value);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (maincheck), TRUE);
+	} else {
+		char *uri = NULL;
+
+		switch (t->source_type) {
+		case E_CAL_SOURCE_TYPE_EVENT:
+			uri = g_strconcat (uri_text, "/", "calendar.ics", NULL);
+			break;
+		case E_CAL_SOURCE_TYPE_TODO:
+			uri = g_strconcat (uri_text, "/", "tasks.ics", NULL);
+			break;
+		case E_CAL_SOURCE_TYPE_JOURNAL:
+			uri = g_strconcat (uri_text, "/", "journal.ics", NULL);
+			break;
+		case E_CAL_SOURCE_TYPE_LAST:
+			break;
+		}
+
+		if (uri && *uri)
+			gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (w2), uri);
+		gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (maincheck), FALSE);
+		g_free (uri);
+	}
+	maincheck_toggled (GTK_TOGGLE_BUTTON (maincheck), source);
+
+	box2 = gtk_hbox_new (FALSE, 2);
+	gtk_box_pack_start ((GtkBox *)box1, box2, FALSE, TRUE, 2);
+
+	w1 = gtk_label_new_with_mnemonic (_("Re_fresh:"));
+	gtk_misc_set_alignment (GTK_MISC (w1), 0.0, 0.5);
+	gtk_box_pack_start ((GtkBox *)box2, w1, FALSE, TRUE, 2);
+
+	w2 = gtk_combo_box_new_text ();
+	gtk_combo_box_append_text ((GtkComboBox *)w2, _("On open"));
+	gtk_combo_box_append_text ((GtkComboBox *)w2, _("On file change"));
+	gtk_combo_box_append_text ((GtkComboBox *)w2, _("Periodically"));
+	gtk_label_set_mnemonic_widget (GTK_LABEL (w1), w2);
+	gtk_box_pack_start ((GtkBox *)box2, w2, FALSE, TRUE, 2);
+
+	value = e_source_get_property (source, "refresh-type");
+	gtk_combo_box_set_active ((GtkComboBox *)w2, (value && *value && !value[1] && value [0] >= '0' && value [0] <= '2') ? value [0] - '0' : 0);
+
+	w1 = w2;
+	w2 = gtk_spin_button_new_with_range (1, 100, 1);
+	gtk_box_pack_start (GTK_BOX (box2), w2, FALSE, TRUE, 0);
+
+	w3 = gtk_combo_box_new_text ();
+	gtk_combo_box_append_text (GTK_COMBO_BOX (w3), _("minutes"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (w3), _("hours"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (w3), _("days"));
+	gtk_combo_box_append_text (GTK_COMBO_BOX (w3), _("weeks"));
+	set_refresh_time (source, w2, w3);
+	gtk_box_pack_start (GTK_BOX (box2), w3, FALSE, TRUE, 0);
+
+	g_object_set_data (G_OBJECT (w1), "spin", w2);
+	g_object_set_data (G_OBJECT (w1), "combobox", w3);
+	g_object_set_data (G_OBJECT (w2), "combobox", w3);
+
+	g_signal_connect (G_OBJECT (w1), "changed", G_CALLBACK (refresh_type_changed), source);
+	g_signal_connect (G_OBJECT (w2), "value-changed", G_CALLBACK (spin_changed), source);
+	g_signal_connect (G_OBJECT (w3), "changed", G_CALLBACK (combobox_changed), source);
+
+	w2 = gtk_check_button_new_with_mnemonic (_("Force read _only"));
+	g_signal_connect (G_OBJECT (w2), "toggled", G_CALLBACK (force_readonly_toggled), source);
+	gtk_box_pack_start ((GtkBox *)box1, w2, TRUE, TRUE, 2);
+
+	gtk_widget_show_all (mainbox);
+
+	/* w1 is a refresh-type combobox, and it hides widgets,
+	   thus should be called after show_all call */
+	refresh_type_changed (GTK_COMBO_BOX (w1), source);
+	g_free (uri_text);
+
+	return mainbox;
 }
diff --git a/plugins/calendar-file/org-gnome-calendar-file.eplug.xml b/plugins/calendar-file/org-gnome-calendar-file.eplug.xml
index 9b14610..a9c6379 100644
--- a/plugins/calendar-file/org-gnome-calendar-file.eplug.xml
+++ b/plugins/calendar-file/org-gnome-calendar-file.eplug.xml
@@ -14,8 +14,8 @@
 	     id="org.gnome.evolution.calendar.calendarProperties">
                 <item
 		 type="item_table"
-		 path="00.general/00.source/00.file_dummy"
-		 factory="e_calendar_file_dummy"/>
+		 path="00.general/00.source/99.file_customs"
+		 factory="e_calendar_file_customs"/>
             </group>
         </hook>
     </e-plugin>



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]