aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/event-editor.c
diff options
context:
space:
mode:
authorSeth Alves <alves@src.gnome.org>2000-05-16 00:51:36 +0800
committerSeth Alves <alves@src.gnome.org>2000-05-16 00:51:36 +0800
commit98317c656590737ced646d6fb4bd65e527c7e178 (patch)
treeea05e418a95b8ee4b5e8b27e6f4c0b11bf7bc2dd /calendar/gui/event-editor.c
parent71902b570c3e5ce5e6629b8353d3d404119e289b (diff)
downloadgsoc2013-evolution-98317c656590737ced646d6fb4bd65e527c7e178.tar
gsoc2013-evolution-98317c656590737ced646d6fb4bd65e527c7e178.tar.gz
gsoc2013-evolution-98317c656590737ced646d6fb4bd65e527c7e178.tar.bz2
gsoc2013-evolution-98317c656590737ced646d6fb4bd65e527c7e178.tar.lz
gsoc2013-evolution-98317c656590737ced646d6fb4bd65e527c7e178.tar.xz
gsoc2013-evolution-98317c656590737ced646d6fb4bd65e527c7e178.tar.zst
gsoc2013-evolution-98317c656590737ced646d6fb4bd65e527c7e178.zip
gladeified replacement for eventedit.c
* gui/event-editor.[ch]: gladeified replacement for eventedit.c * gui/event-editor-utils.[ch]: utilities used by event-editor.c * gui/event-editor-dialog.glade: glade file used by event-editor.c svn path=/trunk/; revision=3046
Diffstat (limited to 'calendar/gui/event-editor.c')
-rw-r--r--calendar/gui/event-editor.c438
1 files changed, 438 insertions, 0 deletions
diff --git a/calendar/gui/event-editor.c b/calendar/gui/event-editor.c
new file mode 100644
index 0000000000..50d6c8a346
--- /dev/null
+++ b/calendar/gui/event-editor.c
@@ -0,0 +1,438 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+#include <config.h>
+#include <gnome.h>
+#include <cal-util/timeutil.h>
+#include <gui/event-editor-utils.h>
+#include <gui/event-editor.h>
+
+typedef struct {
+ GladeXML *gui;
+ GtkWidget *dialog;
+ GnomeCalendar *gnome_cal;
+ iCalObject *ical;
+} EventEditorDialog;
+
+
+extern int day_begin, day_end;
+extern char *user_name;
+extern int am_pm_flag;
+extern int week_starts_on_monday;
+
+
+static void
+fill_in_dialog_from_ical (EventEditorDialog *dialog)
+{
+ iCalObject *ical = dialog->ical;
+ GladeXML *gui = dialog->gui;
+
+ store_to_editable (gui, "general-owner",
+ dialog->ical->organizer->addr ?
+ dialog->ical->organizer->addr : _("?"));
+
+ store_to_editable (gui, "general-summary", ical->summary);
+
+ /* start and end time */
+ store_to_gnome_dateedit (gui, "start-time", ical->dtstart);
+ store_to_gnome_dateedit (gui, "end-time", ical->dtend);
+
+ /* all day event checkbox */
+ if (get_time_t_hour (ical->dtstart) <= day_begin &&
+ get_time_t_hour (ical->dtend) >= day_end)
+ store_to_toggle (gui, "all-day-event", TRUE);
+ else
+ store_to_toggle (gui, "all-day-event", FALSE);
+
+ /* alarms */
+ store_to_toggle (gui, "alarm-display", ical->dalarm.enabled);
+ store_to_toggle (gui, "alarm-program", ical->palarm.enabled);
+ store_to_toggle (gui, "alarm-audio", ical->aalarm.enabled);
+ store_to_toggle (gui, "alarm-mail", ical->malarm.enabled);
+
+ /* alarm counts */
+ store_to_spin (gui, "alarm-display-amount", ical->dalarm.count);
+ store_to_spin (gui, "alarm-audio-amount", ical->aalarm.count);
+ store_to_spin (gui, "alarm-program-amount", ical->palarm.count);
+ store_to_spin (gui, "alarm-mail-amount", ical->malarm.count);
+
+ store_to_alarm_unit (gui, "alarm-display-unit", ical->dalarm.units);
+ store_to_alarm_unit (gui, "alarm-audio-unit", ical->aalarm.units);
+ store_to_alarm_unit (gui, "alarm-program-unit", ical->palarm.units);
+ store_to_alarm_unit (gui, "alarm-mail-unit", ical->malarm.units);
+
+ store_to_editable (gui, "run-program", ical->palarm.data);
+ store_to_editable (gui, "mail-to", ical->malarm.data);
+
+ /* classification */
+ if (strcmp (ical->class, "PUBLIC") == 0)
+ store_to_toggle (gui, "classification-public", TRUE);
+ if (strcmp (ical->class, "PRIVATE") == 0)
+ store_to_toggle (gui, "classification-private", TRUE);
+ if (strcmp (ical->class, "CONFIDENTIAL") == 0)
+ store_to_toggle (gui, "classification-confidential", TRUE);
+
+ /* recurrence rules */
+
+ if (! ical->recur)
+ return;
+
+ switch (ical->recur->type) {
+ case RECUR_DAILY:
+ store_to_toggle (gui, "recurrence-rule-daily", TRUE);
+ store_to_spin (gui, "recurrence-rule-daily-days", ical->recur->interval);
+ break;
+ case RECUR_WEEKLY:
+ store_to_toggle (gui, "recurrence-rule-weekly", TRUE);
+ store_to_spin (gui, "recurrence-rule-weekly-weeks", ical->recur->interval);
+ if (ical->recur->weekday & (1 << 0))
+ store_to_toggle (gui, "recurrence-rule-weekly-sun", TRUE);
+ if (ical->recur->weekday & (1 << 1))
+ store_to_toggle (gui, "recurrence-rule-weekly-mon", TRUE);
+ if (ical->recur->weekday & (1 << 2))
+ store_to_toggle (gui, "recurrence-rule-weekly-tue", TRUE);
+ if (ical->recur->weekday & (1 << 3))
+ store_to_toggle (gui, "recurrence-rule-weekly-wed", TRUE);
+ if (ical->recur->weekday & (1 << 4))
+ store_to_toggle (gui, "recurrence-rule-weekly-thu", TRUE);
+ if (ical->recur->weekday & (1 << 5))
+ store_to_toggle (gui, "recurrence-rule-weekly-fri", TRUE);
+ if (ical->recur->weekday & (1 << 6))
+ store_to_toggle (gui, "recurrence-rule-weekly-sat", TRUE);
+ break;
+ case RECUR_MONTHLY_BY_DAY:
+ store_to_toggle (gui, "recurrence-rule-monthly", TRUE);
+ store_to_toggle (gui, "recurrence-rule-monthly-on-day", TRUE);
+ store_to_spin (gui, "recurrence-rule-monthly-day", ical->recur->u.month_day);
+ store_to_spin (gui, "recurrence-rule-monthly-every-n-months", ical->recur->interval);
+ break;
+ case RECUR_MONTHLY_BY_POS:
+ store_to_toggle (gui, "recurrence-rule-monthly", TRUE);
+ store_to_toggle (gui, "recurrence-rule-monthly-weekday", TRUE);
+ store_to_option (gui, "recurrence-rule-monthly-week", ical->recur->u.month_pos);
+ store_to_option (gui, "recurrence-rule-monthly-day", ical->recur->weekday);
+ store_to_spin (gui, "recurrence-rule-monthly-every-n-months", ical->recur->interval);
+ break;
+ case RECUR_YEARLY_BY_DAY:
+ case RECUR_YEARLY_BY_MONTH:
+ store_to_toggle (gui, "recurrence-rule-yearly", TRUE);
+ store_to_spin (gui, "recurrence-rule-yearly-every-n-years", ical->recur->interval);
+ break;
+ }
+
+ /* recurrence ending date */
+ if (ical->recur->duration != 0) {
+ store_to_toggle (gui, "recurrence-ending-date-end-after", TRUE);
+ store_to_spin (gui, "recurrence-ending-date-end-after-count", ical->recur->duration);
+ }
+ else if (ical->recur->enddate != 0) {
+ store_to_toggle (gui, "recurrence-ending-date-end-on", TRUE);
+ /* Shorten by one day, as we store end-on date a day ahead */
+ store_to_gnome_dateedit (gui, "recurrence-ending-date-end-on-date", ical->recur->enddate - 86400);
+ }
+ /* else repeat forever */
+}
+
+
+static void
+fill_in_dialog_from_defaults (EventEditorDialog *dialog)
+{
+ time_t now = time (NULL);
+ time_t soon = time_add_minutes (now, 30);
+
+ store_to_editable (dialog->gui, "general-owner", "?");
+
+ /* start and end time */
+ store_to_gnome_dateedit (dialog->gui, "start-time", now);
+ store_to_gnome_dateedit (dialog->gui, "end-time", soon);
+}
+
+
+static void
+dialog_to_ical (EventEditorDialog *dialog)
+{
+ iCalObject *ical = dialog->ical;
+ gboolean all_day_event;
+ GladeXML *gui = dialog->gui;
+
+ /* general event information */
+
+ if (ical->summary)
+ g_free (ical->summary);
+ ical->summary = extract_from_editable (gui, "general-summary");
+
+ ical->dtstart = extract_from_gnome_dateedit (gui, "start-time");
+ ical->dtend = extract_from_gnome_dateedit (gui, "end-time");
+
+ all_day_event = extract_from_toggle (gui, "all-day-event");
+
+ ical->dalarm.enabled = extract_from_toggle (gui, "alarm-display");
+ ical->aalarm.enabled = extract_from_toggle (gui, "alarm-program");
+ ical->palarm.enabled = extract_from_toggle (gui, "alarm-audio");
+ ical->malarm.enabled = extract_from_toggle (gui, "alarm-mail");
+
+ ical->dalarm.count = extract_from_spin (gui, "alarm-display-amount");
+ ical->aalarm.count = extract_from_spin (gui, "alarm-audio-amount");
+ ical->palarm.count = extract_from_spin (gui, "alarm-program-amount");
+ ical->malarm.count = extract_from_spin (gui, "alarm-mail-amount");
+
+ ical->dalarm.units = extract_from_alarm_unit (gui, "alarm-display-unit");
+ ical->aalarm.units = extract_from_alarm_unit (gui, "alarm-audio-unit");
+ ical->palarm.units = extract_from_alarm_unit (gui, "alarm-program-unit");
+ ical->malarm.units = extract_from_alarm_unit (gui, "alarm-mail-unit");
+
+ ical->palarm.data = g_strdup (extract_from_editable (gui, "run-program"));
+ ical->malarm.data = g_strdup (extract_from_editable (gui, "mail-to"));
+
+ if (extract_from_toggle (gui, "classification-public"))
+ ical->class = g_strdup ("PUBLIC");
+ else if (extract_from_toggle (gui, "classification-private"))
+ ical->class = g_strdup ("PRIVATE");
+ else /* "classification-confidential" */
+ ical->class = g_strdup ("CONFIDENTIAL");
+
+
+ /* recurrence information */
+
+ if (extract_from_toggle (gui, "recurrence-rule-none"))
+ return; /* done */
+ if (!ical->recur)
+ ical->recur = g_new0 (Recurrence, 1);
+
+ if (extract_from_toggle (gui, "recurrence-rule-daily")) {
+ ical->recur->type = RECUR_DAILY;
+ ical->recur->interval = extract_from_spin (gui, "recurrence-rule-daily-days");
+ }
+ if (extract_from_toggle (gui, "recurrence-rule-weekly")) {
+ ical->recur->type = RECUR_WEEKLY;
+ ical->recur->interval = extract_from_spin (gui, "recurrence-rule-weekly-weeks");
+ ical->recur->weekday = 0;
+
+ if (extract_from_toggle (gui, "recurrence-rule-weekly-sun"))
+ ical->recur->weekday |= 1 << 0;
+ if (extract_from_toggle (gui, "recurrence-rule-weekly-mon"))
+ ical->recur->weekday |= 1 << 1;
+ if (extract_from_toggle (gui, "recurrence-rule-weekly-tue"))
+ ical->recur->weekday |= 1 << 2;
+ if (extract_from_toggle (gui, "recurrence-rule-weekly-wed"))
+ ical->recur->weekday |= 1 << 3;
+ if (extract_from_toggle (gui, "recurrence-rule-weekly-thu"))
+ ical->recur->weekday |= 1 << 4;
+ if (extract_from_toggle (gui, "recurrence-rule-weekly-fri"))
+ ical->recur->weekday |= 1 << 5;
+ if (extract_from_toggle (gui, "recurrence-rule-weekly-sat"))
+ ical->recur->weekday |= 1 << 6;
+ }
+ if (extract_from_toggle (gui, "recurrence-rule-monthly")) {
+ if (extract_from_toggle (gui, "recurrence-rule-monthly-on-day")) {
+ /* by day of in the month (ex: the 5th) */
+ ical->recur->type = RECUR_MONTHLY_BY_DAY;
+ ical->recur->u.month_day = extract_from_spin (gui, "recurrence-rule-monthly-day");
+
+ }
+ else { /* "recurrence-rule-monthly-weekday" is TRUE */
+ /* by position on the calender (ex: 2nd monday) */
+ ical->recur->type = RECUR_MONTHLY_BY_POS;
+ ical->recur->u.month_pos = extract_from_option (gui, "recurrence-rule-monthly-week");
+ ical->recur->weekday = extract_from_option (gui, "recurrence-rule-monthly-day");
+ }
+ ical->recur->interval = extract_from_spin (gui, "recurrence-rule-monthly-every-n-months");
+ }
+ if (extract_from_toggle (gui, "recurrence-rule-yearly")) {
+ ical->recur->type = RECUR_YEARLY_BY_DAY;
+ ical->recur->interval = extract_from_spin (gui, "recurrence-rule-yearly-every-n-years");
+ /* FIXME: need to specify anything else? I am assuming the code will look at the dtstart
+ * to figure out when to recur. - Federico
+ */
+ }
+
+ /* recurrence ending date */
+ if (extract_from_toggle (gui, "recurrence-ending-date-repeat-forever")) {
+ ical->recur->_enddate = 0;
+ ical->recur->enddate = 0;
+ ical->recur->duration = 0;
+ }
+ if (extract_from_toggle (gui, "recurrence-ending-date-end-on")) {
+ /* Also here, to ensure that the event is used, we add 86400 secs to get
+ get next day, in accordance to the RFC */
+ ical->recur->_enddate = extract_from_gnome_dateedit (gui, "recurrence-ending-date-end-on-date") + 86400;
+ ical->recur->enddate = ical->recur->_enddate;
+ ical->recur->duration = 0;
+ }
+ if (extract_from_toggle (gui, "recurrence-ending-date-end-after")) {
+ ical->recur->duration = extract_from_spin (gui, "recurrence-ending-date-end-after-count");
+ ical_object_compute_end (ical);
+ }
+}
+
+
+static void
+ee_ok (GtkWidget *widget, EventEditorDialog *dialog)
+{
+ dialog_to_ical (dialog);
+
+ if (dialog->ical->new)
+ gnome_calendar_add_object (dialog->gnome_cal, dialog->ical);
+ else
+ gnome_calendar_object_changed (dialog->gnome_cal,
+ dialog->ical,
+ CHANGE_ALL);
+ dialog->ical->new = 0;
+}
+
+
+static void
+ee_cancel (GtkWidget *widget, EventEditorDialog *dialog)
+{
+ if (dialog->ical) {
+ ical_object_unref (dialog->ical);
+ dialog->ical = NULL;
+ }
+}
+
+
+static void
+recurrence_toggled (GtkWidget *radio, EventEditorDialog *dialog)
+{
+ GtkWidget *recurrence_rule_notebook = glade_xml_get_widget (dialog->gui, "recurrence-rule-notebook");
+
+ GtkWidget *recurrence_rule_none = glade_xml_get_widget (dialog->gui, "recurrence-rule-none");
+ GtkWidget *recurrence_rule_daily = glade_xml_get_widget (dialog->gui, "recurrence-rule-daily");
+ GtkWidget *recurrence_rule_weekly = glade_xml_get_widget (dialog->gui, "recurrence-rule-weekly");
+ GtkWidget *recurrence_rule_monthly = glade_xml_get_widget (dialog->gui, "recurrence-rule-monthly");
+ GtkWidget *recurrence_rule_yearly = glade_xml_get_widget (dialog->gui, "recurrence-rule-yearly");
+
+ if (radio == recurrence_rule_none)
+ gtk_notebook_set_page (GTK_NOTEBOOK (recurrence_rule_notebook), 0);
+ if (radio == recurrence_rule_daily)
+ gtk_notebook_set_page (GTK_NOTEBOOK (recurrence_rule_notebook), 1);
+ if (radio == recurrence_rule_weekly)
+ gtk_notebook_set_page (GTK_NOTEBOOK (recurrence_rule_notebook), 2);
+ if (radio == recurrence_rule_monthly)
+ gtk_notebook_set_page (GTK_NOTEBOOK (recurrence_rule_notebook), 3);
+ if (radio == recurrence_rule_yearly)
+ gtk_notebook_set_page (GTK_NOTEBOOK (recurrence_rule_notebook), 4);
+}
+
+
+
+GtkWidget *event_editor_new (GnomeCalendar *gcal, iCalObject *ical)
+{
+ EventEditorDialog *dialog = g_new0 (EventEditorDialog, 1);
+
+ dialog->ical = ical;
+ dialog->gnome_cal = gcal;
+
+ printf ("glade_xml_new (%s, NULL)\n",
+ EVOLUTION_GLADEDIR "/event-editor-dialog.glade");
+
+ dialog->gui = glade_xml_new (EVOLUTION_GLADEDIR
+ "/event-editor-dialog.glade",
+ NULL);
+
+ dialog->dialog = glade_xml_get_widget (dialog->gui,
+ "event-editor-dialog");
+
+ gnome_dialog_button_connect (GNOME_DIALOG (dialog->dialog),
+ 0, GTK_SIGNAL_FUNC(ee_ok), dialog);
+ gnome_dialog_button_connect (GNOME_DIALOG (dialog->dialog),
+ 1, GTK_SIGNAL_FUNC(ee_cancel), dialog);
+
+
+ {
+ GtkWidget *recurrence_rule_none = glade_xml_get_widget (dialog->gui, "recurrence-rule-none");
+ GtkWidget *recurrence_rule_daily = glade_xml_get_widget (dialog->gui, "recurrence-rule-daily");
+ GtkWidget *recurrence_rule_weekly = glade_xml_get_widget (dialog->gui, "recurrence-rule-weekly");
+ GtkWidget *recurrence_rule_monthly = glade_xml_get_widget (dialog->gui, "recurrence-rule-monthly");
+ GtkWidget *recurrence_rule_yearly = glade_xml_get_widget (dialog->gui, "recurrence-rule-yearly");
+
+ gtk_signal_connect (GTK_OBJECT (recurrence_rule_none), "toggled",
+ GTK_SIGNAL_FUNC (recurrence_toggled), dialog);
+ gtk_signal_connect (GTK_OBJECT (recurrence_rule_daily), "toggled",
+ GTK_SIGNAL_FUNC (recurrence_toggled), dialog);
+ gtk_signal_connect (GTK_OBJECT (recurrence_rule_weekly), "toggled",
+ GTK_SIGNAL_FUNC (recurrence_toggled), dialog);
+ gtk_signal_connect (GTK_OBJECT (recurrence_rule_monthly), "toggled",
+ GTK_SIGNAL_FUNC (recurrence_toggled), dialog);
+ gtk_signal_connect (GTK_OBJECT (recurrence_rule_yearly), "toggled",
+ GTK_SIGNAL_FUNC (recurrence_toggled), dialog);
+
+ }
+
+
+
+ if (ical->new)
+ fill_in_dialog_from_defaults (dialog);
+ else
+ fill_in_dialog_from_ical (dialog);
+
+
+ gnome_dialog_run (GNOME_DIALOG(dialog->dialog));
+
+ gnome_dialog_close (GNOME_DIALOG(dialog->dialog));
+
+ return dialog->dialog;
+}
+
+
+void event_editor_new_whole_day (GnomeCalendar *owner, time_t day)
+{
+}
+
+
+
+GtkWidget *make_date_edit (void)
+{
+ return date_edit_new (time (NULL), TRUE);
+}
+
+
+GtkWidget *date_edit_new (time_t the_time, int show_time)
+{
+ return gnome_date_edit_new_flags (the_time,
+ ((show_time ? GNOME_DATE_EDIT_SHOW_TIME : 0)
+ | (am_pm_flag ? 0 : GNOME_DATE_EDIT_24_HR)
+ | (week_starts_on_monday
+ ? GNOME_DATE_EDIT_WEEK_STARTS_ON_MONDAY
+ : 0)));
+}
+
+
+
+GtkWidget *
+make_spin_button (int val, int low, int high)
+{
+ GtkAdjustment *adj;
+ GtkWidget *spin;
+
+ adj = GTK_ADJUSTMENT (gtk_adjustment_new (val, low, high, 1, 10, 10));
+ spin = gtk_spin_button_new (adj, 0.5, 0);
+ gtk_widget_set_usize (spin, 60, 0);
+
+ return spin;
+}
+
+
+/* todo
+
+ build some of the recur stuff by hand to take into account
+ the start-on-monday preference?
+
+ make the alarm controls insensitive until you enable them
+
+ get reading and storing of all_day_event to work
+
+ if you set the start time and it is after the end time, change
+ the end time
+
+ get the apply button to work right
+
+ make the properties stuff unglobal
+
+ figure out why alarm units aren't sticking between edits
+
+ extract from and store to the ending date in the recurrence rule stuff
+
+ finish the recurrence rule exceptions
+
+ */
+