aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/dialogs/meeting-page.c
diff options
context:
space:
mode:
authorJP Rosevear <jpr@ximian.com>2001-09-19 12:33:33 +0800
committerJP Rosevear <jpr@src.gnome.org>2001-09-19 12:33:33 +0800
commitd639a620a6438ea93787cedfe9f3eb87014275a3 (patch)
tree602d9156e8e33197fc27752d8fb976cce99d896c /calendar/gui/dialogs/meeting-page.c
parentd284de85386149adba1e94f1b05b6b2d631e8585 (diff)
downloadgsoc2013-evolution-d639a620a6438ea93787cedfe9f3eb87014275a3.tar
gsoc2013-evolution-d639a620a6438ea93787cedfe9f3eb87014275a3.tar.gz
gsoc2013-evolution-d639a620a6438ea93787cedfe9f3eb87014275a3.tar.bz2
gsoc2013-evolution-d639a620a6438ea93787cedfe9f3eb87014275a3.tar.lz
gsoc2013-evolution-d639a620a6438ea93787cedfe9f3eb87014275a3.tar.xz
gsoc2013-evolution-d639a620a6438ea93787cedfe9f3eb87014275a3.tar.zst
gsoc2013-evolution-d639a620a6438ea93787cedfe9f3eb87014275a3.zip
A page that shows the meeting time selector and free/busy data for
2001-09-18 JP Rosevear <jpr@ximian.com> * gui/dialogs/schedule-page.*: A page that shows the meeting time selector and free/busy data for attendees * gui/dialogs/meeting-page.c: use the meeting model to track/edit attendees, remove table value conversion routines and simple table routines (set_attendees): take a pointer array (meeting_page_destroy): destroy the pointer array, save state (meeting_page_init): new pointer array (meeting_page_fill_widgets): don't null the deleted attendees field (popup_delegate_cb): array add (popup_delete_cb): array add (cleanup_attendees): iterate over the array to unref now (meeting_page_fill_widgets): don't null out fields, no need to add attendees here (invite_entry_changed): use e_meeting_attendee routines (popup_delegate_cb): ditto (popup_delete_cb): ditto (meeting_page_new): take new arg and pass it to construct (meeting_page_construct): take new arg, use e-meeting-model routines to construct table * gui/dialogs/task-editor.c (task_editor_init): new meeting model (task_editor_destroy): unref the model * gui/dialogs/event-editor.c (event_editor_init): make new model and pass it to meeting and schedule pages (event_editor_set_cal_client): virtual function, set meeting model client (event_editor_edit_comp): add the attendees to the model (event_editor_destroy): unref model * gui/dialogs/comp-editor.h: add virtual function * gui/dialogs/comp-editor.c (comp_editor_set_cal_client): make set_cal_client a virutal function * gui/e-meeting-types.h: generally useful type defines * gui/e-meeting-time-sel*.[hc]: Move here and use an e-table for the attendee list and extract display information from the new meeting model and attendees * gui/e-meeting-time-sel.etspec: spec for the table * gui/e-meeting-attendee.[hc]: meeting attendees for the model, with to/from conversions for CalComponentAttendee structure, emits changed signal and allows getting and setting of free busy periods * gui/e-meeting-model.[hc]: move the model out on its own * gui/e-itip-control.c (write_error_html): clean up warnings svn path=/trunk/; revision=12968
Diffstat (limited to 'calendar/gui/dialogs/meeting-page.c')
-rw-r--r--calendar/gui/dialogs/meeting-page.c843
1 files changed, 105 insertions, 738 deletions
diff --git a/calendar/gui/dialogs/meeting-page.c b/calendar/gui/dialogs/meeting-page.c
index 9d833d304e..5a146e3d04 100644
--- a/calendar/gui/dialogs/meeting-page.c
+++ b/calendar/gui/dialogs/meeting-page.c
@@ -52,6 +52,8 @@
#include <e-destination.h>
#include "Evolution-Addressbook-SelectNames.h"
#include "../component-factory.h"
+#include "../e-meeting-attendee.h"
+#include "../e-meeting-model.h"
#include "../itip-utils.h"
#include "comp-editor-util.h"
#include "e-delegate-dialog.h"
@@ -74,27 +76,10 @@ enum columns {
MEETING_COLUMN_COUNT
};
-struct attendee {
- char *address;
- char *member;
-
- icalparameter_cutype cutype;
- icalparameter_role role;
- icalparameter_partstat status;
- gboolean rsvp;
-
- char *delto;
- char *delfrom;
- char *sentby;
- char *cn;
- char *language;
-};
-
/* Private part of the MeetingPage structure */
struct _MeetingPagePrivate {
/* Lists of attendees */
- GSList *attendees;
- GSList *deleted_attendees;
+ GPtrArray *deleted_attendees;
/* To use in case of cancellation */
CalComponent *comp;
@@ -121,8 +106,8 @@ struct _MeetingPagePrivate {
GtkWidget *invite;
/* E Table stuff */
- ETableModel *model;
- GtkWidget *etable;
+ EMeetingModel *model;
+ ETableScrolled *etable;
gint row;
/* For handling who the organizer is */
@@ -145,8 +130,6 @@ static void meeting_page_focus_main_widget (CompEditorPage *page);
static void meeting_page_fill_widgets (CompEditorPage *page, CalComponent *comp);
static void meeting_page_fill_component (CompEditorPage *page, CalComponent *comp);
-static int row_count (ETableModel *etm, void *data);
-static void *init_value (ETableModel *etm, int col, void *data);
static gint right_click_cb (ETable *etable, gint row, gint col, GdkEvent *event, gpointer data);
static CompEditorPageClass *parent_class = NULL;
@@ -217,8 +200,7 @@ meeting_page_init (MeetingPage *mpage)
priv = g_new0 (MeetingPagePrivate, 1);
mpage->priv = priv;
- priv->attendees = NULL;
- priv->deleted_attendees = NULL;
+ priv->deleted_attendees = g_ptr_array_new ();
priv->comp = NULL;
@@ -233,56 +215,35 @@ meeting_page_init (MeetingPage *mpage)
}
static void
-set_attendees (CalComponent *comp, GSList *attendees)
+set_attendees (CalComponent *comp, const GPtrArray *attendees)
{
- GSList *comp_attendees = NULL;
- GSList *l;
+ GSList *comp_attendees = NULL, *l;
+ int i;
- for (l = attendees; l != NULL; l = l->next) {
- struct attendee *attendee = l->data;
- CalComponentAttendee *att = g_new0 (CalComponentAttendee, 1);
+ for (i = 0; i < attendees->len; i++) {
+ EMeetingAttendee *ia = g_ptr_array_index (attendees, i);
+ CalComponentAttendee *ca;
+ ca = e_meeting_attendee_as_cal_component_attendee (ia);
- att->value = attendee->address;
- att->member = (attendee->member && *attendee->member) ? attendee->member : NULL;
- att->cutype= attendee->cutype;
- att->role = attendee->role;
- att->status = attendee->status;
- att->rsvp = attendee->rsvp;
- att->delto = (attendee->delto && *attendee->delto) ? attendee->delto : NULL;
- att->delfrom = (attendee->delfrom && *attendee->delfrom) ? attendee->delfrom : NULL;
- att->sentby = (attendee->sentby && *attendee->sentby) ? attendee->sentby : NULL;
- att->cn = (attendee->cn && *attendee->cn) ? attendee->cn : NULL;
- att->language = (attendee->language && *attendee->language) ? attendee->language : NULL;
-
- comp_attendees = g_slist_prepend (comp_attendees, att);
+ comp_attendees = g_slist_prepend (comp_attendees, ca);
}
comp_attendees = g_slist_reverse (comp_attendees);
cal_component_set_attendee_list (comp, comp_attendees);
+
+ for (l = comp_attendees; l != NULL; l = l->next)
+ g_free (l->data);
g_slist_free (comp_attendees);
}
static void
-cleanup_attendees (GSList *attendees)
+cleanup_attendees (GPtrArray *attendees)
{
- GSList *l;
+ int i;
- for (l = attendees; l != NULL; l = l->next) {
- struct attendee *a = l->data;
-
- g_free (a->address);
- g_free (a->member);
- g_free (a->delto);
- g_free (a->delfrom);
- g_free (a->sentby);
- g_free (a->cn);
- g_free (a->language);
-
- g_free (a);
- }
-
- g_slist_free (attendees);
+ for (i = 0; i < attendees->len; i++)
+ gtk_object_unref (GTK_OBJECT (g_ptr_array_index (attendees, i)));
}
/* Destroy handler for the task page */
@@ -291,6 +252,8 @@ meeting_page_destroy (GtkObject *object)
{
MeetingPage *mpage;
MeetingPagePrivate *priv;
+ ETable *real_table;
+ char *filename;
g_return_if_fail (object != NULL);
g_return_if_fail (IS_MEETING_PAGE (object));
@@ -301,12 +264,21 @@ meeting_page_destroy (GtkObject *object)
if (priv->comp != NULL)
gtk_object_unref (GTK_OBJECT (priv->comp));
- cleanup_attendees (priv->attendees);
cleanup_attendees (priv->deleted_attendees);
+ g_ptr_array_free (priv->deleted_attendees, FALSE);
itip_addresses_free (priv->addresses);
g_list_free (priv->address_strings);
+ gtk_object_unref (GTK_OBJECT (priv->model));
+
+ /* Save state */
+ filename = g_strdup_printf ("%s/config/et-header-meeting-page",
+ evolution_dir);
+ real_table = e_table_scrolled_get_table (priv->etable);
+ e_table_save_state (real_table, filename);
+ g_free (filename);
+
if (priv->xml) {
gtk_object_unref (GTK_OBJECT (priv->xml));
priv->xml = NULL;
@@ -376,8 +348,8 @@ meeting_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
MeetingPage *mpage;
MeetingPagePrivate *priv;
CalComponentOrganizer organizer;
- GSList *attendees, *l;
- GList *l2;
+ GSList *attendees;
+ GList *l;
mpage = MEETING_PAGE (page);
priv = mpage->priv;
@@ -389,10 +361,7 @@ meeting_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
gtk_object_unref (GTK_OBJECT (priv->comp));
priv->comp = NULL;
- cleanup_attendees (priv->attendees);
cleanup_attendees (priv->deleted_attendees);
- priv->attendees = NULL;
- priv->deleted_attendees = NULL;
/* Clean the screen */
clear_widgets (mpage);
@@ -403,8 +372,8 @@ meeting_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
/* Organizer */
cal_component_get_organizer (comp, &organizer);
priv->addresses = itip_addresses_get ();
- for (l2 = priv->addresses; l2 != NULL; l2 = l2->next) {
- ItipAddress *a = l2->data;
+ for (l = priv->addresses; l != NULL; l = l->next) {
+ ItipAddress *a = l->data;
priv->address_strings = g_list_append (priv->address_strings, a->full);
if (a->default_address)
@@ -431,36 +400,11 @@ meeting_page_fill_widgets (CompEditorPage *page, CalComponent *comp)
e_dialog_editable_set (GTK_COMBO (priv->organizer)->entry, priv->default_address);
}
- /* Attendees */
- cal_component_get_attendee_list (comp, &attendees);
- for (l = attendees; l != NULL; l = l->next) {
- CalComponentAttendee *att = l->data;
- struct attendee *attendee = g_new0 (struct attendee, 1);
-
- attendee->address = att->value ? g_strdup (att->value) : g_strdup ("");
- attendee->member = att->member ? g_strdup (att->member) : g_strdup ("");
- attendee->cutype= att->cutype;
- attendee->role = att->role;
- attendee->status = att->status;
- attendee->rsvp = att->rsvp;
- attendee->delto = att->delto ? g_strdup (att->delto) : g_strdup ("");
- attendee->delfrom = att->delfrom ? g_strdup (att->delfrom) : g_strdup ("");
- attendee->sentby = att->sentby ? g_strdup (att->sentby) : g_strdup ("");
- attendee->cn = att->cn ? g_strdup (att->cn) : g_strdup ("");
- attendee->language = att->language ? g_strdup (att->language) : g_strdup ("");
-
- priv->attendees = g_slist_prepend (priv->attendees, attendee);
-
- }
- priv->attendees = g_slist_reverse (priv->attendees);
- cal_component_free_attendee_list (attendees);
-
- /* Table */
- e_table_model_rows_inserted (priv->model, 0, row_count (priv->model, mpage));
-
/* So the comp editor knows we need to send if anything changes */
- if (priv->attendees != NULL)
+ cal_component_get_attendee_list (comp, &attendees);
+ if (attendees != NULL)
comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage));
+ cal_component_free_attendee_list (attendees);
priv->updating = FALSE;
}
@@ -514,7 +458,7 @@ meeting_page_fill_component (CompEditorPage *page, CalComponent *comp)
g_free (cn);
}
- set_attendees (comp, priv->attendees);
+ set_attendees (comp, e_meeting_model_get_attendees (priv->model));
}
@@ -561,167 +505,6 @@ get_widgets (MeetingPage *mpage)
&& priv->existing_organizer_btn);
}
-
-static icalparameter_cutype
-text_to_type (const char *type)
-{
- if (!g_strcasecmp (type, _("Individual")))
- return ICAL_CUTYPE_INDIVIDUAL;
- else if (!g_strcasecmp (type, _("Group")))
- return ICAL_CUTYPE_GROUP;
- else if (!g_strcasecmp (type, _("Resource")))
- return ICAL_CUTYPE_RESOURCE;
- else if (!g_strcasecmp (type, _("Room")))
- return ICAL_CUTYPE_ROOM;
- else
- return ICAL_CUTYPE_NONE;
-}
-
-static char *
-type_to_text (icalparameter_cutype type)
-{
- switch (type) {
- case ICAL_CUTYPE_INDIVIDUAL:
- return _("Individual");
- case ICAL_CUTYPE_GROUP:
- return _("Group");
- case ICAL_CUTYPE_RESOURCE:
- return _("Resource");
- case ICAL_CUTYPE_ROOM:
- return _("Room");
- default:
- return _("Unknown");
- }
-
- return NULL;
-
-}
-
-static icalparameter_role
-text_to_role (const char *role)
-{
- if (!g_strcasecmp (role, _("Chair")))
- return ICAL_ROLE_CHAIR;
- else if (!g_strcasecmp (role, _("Required Participant")))
- return ICAL_ROLE_REQPARTICIPANT;
- else if (!g_strcasecmp (role, _("Optional Participant")))
- return ICAL_ROLE_OPTPARTICIPANT;
- else if (!g_strcasecmp (role, _("Non-Participant")))
- return ICAL_ROLE_NONPARTICIPANT;
- else
- return ICAL_ROLE_NONE;
-}
-
-static char *
-role_to_text (icalparameter_role role)
-{
- switch (role) {
- case ICAL_ROLE_CHAIR:
- return _("Chair");
- case ICAL_ROLE_REQPARTICIPANT:
- return _("Required Participant");
- case ICAL_ROLE_OPTPARTICIPANT:
- return _("Optional Participant");
- case ICAL_ROLE_NONPARTICIPANT:
- return _("Non-Participant");
- default:
- return _("Unknown");
- }
-
- return NULL;
-}
-
-static gboolean
-text_to_boolean (const char *role)
-{
- if (!g_strcasecmp (role, _("Yes")))
- return TRUE;
- else
- return FALSE;
-}
-
-static char *
-boolean_to_text (gboolean b)
-{
- if (b)
- return _("Yes");
- else
- return _("No");
-}
-
-static icalparameter_partstat
-text_to_partstat (const char *partstat)
-{
- if (!g_strcasecmp (partstat, _("Needs Action")))
- return ICAL_PARTSTAT_NEEDSACTION;
- else if (!g_strcasecmp (partstat, _("Accepted")))
- return ICAL_PARTSTAT_ACCEPTED;
- else if (!g_strcasecmp (partstat, _("Declined")))
- return ICAL_PARTSTAT_DECLINED;
- else if (!g_strcasecmp (partstat, _("Tentative")))
- return ICAL_PARTSTAT_TENTATIVE;
- else if (!g_strcasecmp (partstat, _("Delegated")))
- return ICAL_PARTSTAT_DELEGATED;
- else if (!g_strcasecmp (partstat, _("Completed")))
- return ICAL_PARTSTAT_COMPLETED;
- else if (!g_strcasecmp (partstat, _("In Process")))
- return ICAL_PARTSTAT_INPROCESS;
- else
- return ICAL_PARTSTAT_NONE;
-}
-
-static char *
-partstat_to_text (icalparameter_partstat partstat)
-{
- switch (partstat) {
- case ICAL_PARTSTAT_NEEDSACTION:
- return _("Needs Action");
- case ICAL_PARTSTAT_ACCEPTED:
- return _("Accepted");
- case ICAL_PARTSTAT_DECLINED:
- return _("Declined");
- case ICAL_PARTSTAT_TENTATIVE:
- return _("Tentative");
- case ICAL_PARTSTAT_DELEGATED:
- return _("Delegated");
- case ICAL_PARTSTAT_COMPLETED:
- return _("Completed");
- case ICAL_PARTSTAT_INPROCESS:
- return _("In Process");
- default:
- return _("Unknown");
- }
-
- return NULL;
-}
-
-static struct attendee *
-find_match (MeetingPage *mpage, const char *address, int *pos)
-{
- MeetingPagePrivate *priv;
- struct attendee *a;
- GSList *l;
- int i;
-
- priv = mpage->priv;
-
- if (address == NULL)
- return NULL;
-
- /* Make sure we can add the new delegatee person */
- for (l = priv->attendees, i = 0; l != NULL; l = l->next, i++) {
- a = l->data;
-
- if (a->address != NULL && !g_strcasecmp (itip_strip_mailto (a->address), itip_strip_mailto (address))) {
- if (pos != NULL)
- *pos = i;
- return a;
- }
- }
-
- return NULL;
-}
-
static void
duplicate_error (void)
{
@@ -759,50 +542,28 @@ invite_entry_changed (BonoboListener *listener,
return;
for (i = 0; destv[i] != NULL; i++) {
- struct attendee *a;
+ EMeetingAttendee *ia;
const char *name, *address;
- char *str;
- int row_cnt;
name = e_destination_get_name (destv[i]);
address = e_destination_get_email (destv[i]);
- if (find_match (mpage, address, NULL) == NULL) {
- a = g_new0 (struct attendee, 1);
-
- a->address = g_strdup_printf ("MAILTO:%s", address);
- a->member = init_value (NULL, MEETING_MEMBER_COL, mpage);
- str = init_value (NULL, MEETING_TYPE_COL, mpage);
- a->cutype = text_to_type (str);
- g_free (str);
+ if (e_meeting_model_find_attendee (priv->model, address, NULL) == NULL) {
+ ia = e_meeting_model_add_attendee_with_defaults (priv->model);
+ e_meeting_attendee_set_address (ia, g_strdup_printf ("MAILTO:%s", address));
if (!strcmp (section, _("Chair Persons")))
- a->role = ICAL_ROLE_CHAIR;
+ e_meeting_attendee_set_role (ia, ICAL_ROLE_CHAIR);
else if (!strcmp (section, _("Required Participants")))
- a->role = ICAL_ROLE_REQPARTICIPANT;
+ e_meeting_attendee_set_role (ia, ICAL_ROLE_REQPARTICIPANT);
else if (!strcmp (section, _("Optional Participants")))
- a->role = ICAL_ROLE_OPTPARTICIPANT;
+ e_meeting_attendee_set_role (ia, ICAL_ROLE_OPTPARTICIPANT);
else if (!strcmp (section, _("Non-Participants")))
- a->role = ICAL_ROLE_NONPARTICIPANT;
-
- str = init_value (NULL, MEETING_RSVP_COL, mpage);
- a->rsvp = text_to_boolean (str);
- g_free (str);
- a->delto = init_value (NULL, MEETING_DELTO_COL, mpage);
- a->delfrom = init_value (NULL, MEETING_DELTO_COL, mpage);
- str = init_value (NULL, MEETING_STATUS_COL, mpage);
- a->status = text_to_partstat (str);
- g_free (str);
- a->cn = name ? g_strdup (name) : g_strdup ("");
- a->language = init_value (NULL, MEETING_LANG_COL, mpage);
-
- priv->attendees = g_slist_append (priv->attendees, a);
-
- row_cnt = row_count (priv->model, mpage) - 1;
- e_table_model_row_inserted (priv->model, row_cnt);
+ e_meeting_attendee_set_role (ia, ICAL_ROLE_NONPARTICIPANT);
+ e_meeting_attendee_set_cn (ia, g_strdup (name));
- comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage));
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
+ comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage));
+ comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
}
}
e_destination_freev (destv);
@@ -976,373 +737,6 @@ init_widgets (MeetingPage *mpage)
GTK_SIGNAL_FUNC (invite_cb), mpage);
}
-static int
-column_count (ETableModel *etm, void *data)
-{
- return MEETING_COLUMN_COUNT;
-}
-
-static int
-row_count (ETableModel *etm, void *data)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
-
- mpage = MEETING_PAGE (data);
- priv = mpage->priv;
-
- return g_slist_length (priv->attendees);
-}
-
-static void
-append_row (ETableModel *etm, ETableModel *model, int row, void *data)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
- struct attendee *attendee;
- char *address;
- gint row_cnt;
-
- mpage = MEETING_PAGE (data);
- priv = mpage->priv;
-
- address = (char *) e_table_model_value_at (model, MEETING_ATTENDEE_COL, row);
- if (find_match (mpage, address, NULL) != NULL) {
- duplicate_error ();
- return;
- }
-
- attendee = g_new0 (struct attendee, 1);
-
- attendee->address = g_strdup_printf ("MAILTO:%s", address);
- attendee->member = g_strdup (e_table_model_value_at (model, MEETING_MEMBER_COL, row));
- attendee->cutype = text_to_type (e_table_model_value_at (model, MEETING_TYPE_COL, row));
- attendee->role = text_to_role (e_table_model_value_at (model, MEETING_ROLE_COL, row));
- attendee->rsvp = text_to_boolean (e_table_model_value_at (model, MEETING_RSVP_COL, row));
- attendee->delto = g_strdup (e_table_model_value_at (model, MEETING_DELTO_COL, row));
- attendee->delfrom = g_strdup (e_table_model_value_at (model, MEETING_DELFROM_COL, row));
- attendee->status = text_to_partstat (e_table_model_value_at (model, MEETING_STATUS_COL, row));
- attendee->cn = g_strdup (e_table_model_value_at (model, MEETING_CN_COL, row));
- attendee->language = g_strdup (e_table_model_value_at (model, MEETING_LANG_COL, row));
-
- priv->attendees = g_slist_append (priv->attendees, attendee);
-
- row_cnt = row_count (etm, data) - 1;
- e_table_model_row_inserted (E_TABLE_MODEL (etm), row_cnt);
-
- comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage));
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
-}
-
-static void *
-value_at (ETableModel *etm, int col, int row, void *data)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
- struct attendee *attendee;
-
- mpage = MEETING_PAGE (data);
- priv = mpage->priv;
-
- attendee = g_slist_nth_data (priv->attendees, row);
-
- switch (col) {
- case MEETING_ATTENDEE_COL:
- return (void *)itip_strip_mailto (attendee->address);
- case MEETING_MEMBER_COL:
- return attendee->member;
- case MEETING_TYPE_COL:
- return type_to_text (attendee->cutype);
- case MEETING_ROLE_COL:
- return role_to_text (attendee->role);
- case MEETING_RSVP_COL:
- return boolean_to_text (attendee->rsvp);
- case MEETING_DELTO_COL:
- return (void *)itip_strip_mailto (attendee->delto);
- case MEETING_DELFROM_COL:
- return (void *)itip_strip_mailto (attendee->delfrom);
- case MEETING_STATUS_COL:
- return partstat_to_text (attendee->status);
- case MEETING_CN_COL:
- return attendee->cn;
- case MEETING_LANG_COL:
- return attendee->language;
- }
-
- return NULL;
-}
-
-static void
-set_value_at (ETableModel *etm, int col, int row, const void *val, void *data)
-{
- MeetingPage *mpage;
- MeetingPagePrivate *priv;
- struct attendee *attendee;
-
- mpage = MEETING_PAGE (data);
- priv = mpage->priv;
-
- attendee = g_slist_nth_data (priv->attendees, row);
-
- switch (col) {
- case MEETING_ATTENDEE_COL:
- if (attendee->address)
- g_free (attendee->address);
- attendee->address = g_strdup_printf ("MAILTO:%s", (char *) val);
- break;
- case MEETING_MEMBER_COL:
- if (attendee->member)
- g_free (attendee->member);
- attendee->member = g_strdup (val);
- break;
- case MEETING_TYPE_COL:
- attendee->cutype = text_to_type (val);
- break;
- case MEETING_ROLE_COL:
- attendee->role = text_to_role (val);
- break;
- case MEETING_RSVP_COL:
- attendee->rsvp = text_to_boolean (val);
- break;
- case MEETING_DELTO_COL:
- if (attendee->delto)
- g_free (attendee->delto);
- attendee->delto = g_strdup (val);
- break;
- case MEETING_DELFROM_COL:
- if (attendee->delfrom)
- g_free (attendee->delfrom);
- attendee->delto = g_strdup (val);
- break;
- case MEETING_STATUS_COL:
- attendee->status = text_to_partstat (val);
- break;
- case MEETING_CN_COL:
- if (attendee->cn)
- g_free (attendee->cn);
- attendee->cn = g_strdup (val);
- break;
- case MEETING_LANG_COL:
- if (attendee->language)
- g_free (attendee->language);
- attendee->language = g_strdup (val);
- break;
- }
-
- if (!priv->updating) {
- comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage));
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
- }
-}
-
-static gboolean
-is_cell_editable (ETableModel *etm, int col, int row, void *data)
-{
- switch (col) {
- case MEETING_DELTO_COL:
- case MEETING_DELFROM_COL:
- return FALSE;
-
- default:
- }
-
- return TRUE;
-}
-
-static void *
-duplicate_value (ETableModel *etm, int col, const void *val, void *data)
-{
- return g_strdup (val);
-}
-
-static void
-free_value (ETableModel *etm, int col, void *val, void *data)
-{
- g_free (val);
-}
-
-static void *
-init_value (ETableModel *etm, int col, void *data)
-{
- switch (col) {
- case MEETING_ATTENDEE_COL:
- return g_strdup ("");
- case MEETING_MEMBER_COL:
- return g_strdup ("");
- case MEETING_TYPE_COL:
- return g_strdup (_("Individual"));
- case MEETING_ROLE_COL:
- return g_strdup (_("Required Participant"));
- case MEETING_RSVP_COL:
- return g_strdup (_("Yes"));
- case MEETING_DELTO_COL:
- return g_strdup ("");
- case MEETING_DELFROM_COL:
- return g_strdup ("");
- case MEETING_STATUS_COL:
- return g_strdup (_("Needs Action"));
- case MEETING_CN_COL:
- return g_strdup ("");
- case MEETING_LANG_COL:
- return g_strdup ("en");
- }
-
- return g_strdup ("");
-}
-
-static gboolean
-value_is_empty (ETableModel *etm, int col, const void *val, void *data)
-{
-
- switch (col) {
- case MEETING_ATTENDEE_COL:
- case MEETING_MEMBER_COL:
- case MEETING_DELTO_COL:
- case MEETING_DELFROM_COL:
- case MEETING_CN_COL:
- if (val && !g_strcasecmp (val, ""))
- return TRUE;
- else
- return FALSE;
- default:
- }
-
- return TRUE;
-}
-
-static char *
-value_to_string (ETableModel *etm, int col, const void *val, void *data)
-{
- return g_strdup (val);
-}
-
-static void
-etable_destroy_cb (ETable *real_table, MeetingPage *mpage)
-{
- char *filename;
-
- filename = g_strdup_printf ("%s/config/et-header-meeting-page",
- evolution_dir);
- e_table_save_state (real_table, filename);
- g_free (filename);
-}
-
-static void
-build_etable (MeetingPage *mpage)
-{
- MeetingPagePrivate *priv;
- ETable *real_table;
- ETableExtras *extras;
- GList *strings;
- ECell *popup_cell, *cell;
-
- char *filename;
-
- priv = mpage->priv;
-
- extras = e_table_extras_new ();
-
- /* For type */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- gtk_object_unref (GTK_OBJECT (cell));
-
- strings = NULL;
- strings = g_list_append (strings, _("Individual"));
- strings = g_list_append (strings, _("Group"));
- strings = g_list_append (strings, _("Resource"));
- strings = g_list_append (strings, _("Room"));
- strings = g_list_append (strings, _("Unknown"));
-
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell), strings);
- e_table_extras_add_cell (extras, "typeedit", popup_cell);
-
- /* For role */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- gtk_object_unref (GTK_OBJECT (cell));
-
- strings = NULL;
- strings = g_list_append (strings, _("Chair"));
- strings = g_list_append (strings, _("Required Participant"));
- strings = g_list_append (strings, _("Optional Participant"));
- strings = g_list_append (strings, _("Non-Participant"));
- strings = g_list_append (strings, _("Unknown"));
-
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell), strings);
- e_table_extras_add_cell (extras, "roleedit", popup_cell);
-
- /* For rsvp */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- gtk_object_unref (GTK_OBJECT (cell));
-
- strings = NULL;
- strings = g_list_append (strings, _("Yes"));
- strings = g_list_append (strings, _("No"));
-
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell), strings);
- e_table_extras_add_cell (extras, "rsvpedit", popup_cell);
-
- /* For status */
- cell = e_cell_text_new (NULL, GTK_JUSTIFY_LEFT);
- popup_cell = e_cell_combo_new ();
- e_cell_popup_set_child (E_CELL_POPUP (popup_cell), cell);
- gtk_object_unref (GTK_OBJECT (cell));
-
- strings = NULL;
- strings = g_list_append (strings, _("Needs Action"));
- strings = g_list_append (strings, _("Accepted"));
- strings = g_list_append (strings, _("Declined"));
- strings = g_list_append (strings, _("Tentative"));
- strings = g_list_append (strings, _("Delegated"));
-
- e_cell_combo_set_popdown_strings (E_CELL_COMBO (popup_cell), strings);
- e_table_extras_add_cell (extras, "statusedit", popup_cell);
-
-
- /* The table itself */
- priv->model = e_table_simple_new (column_count,
- row_count,
- append_row,
-
- value_at,
- set_value_at,
- is_cell_editable,
-
- NULL,
- NULL,
-
- duplicate_value,
- free_value,
- init_value,
- value_is_empty,
- value_to_string,
- mpage);
-
- priv->etable = e_table_scrolled_new_from_spec_file (priv->model,
- extras,
- EVOLUTION_ETSPECDIR "/meeting-page.etspec",
- NULL);
- filename = g_strdup_printf ("%s/config/et-header-meeting-page",
- evolution_dir);
- real_table = e_table_scrolled_get_table (E_TABLE_SCROLLED (priv->etable));
- e_table_load_state (real_table, filename);
- g_free (filename);
-
- gtk_signal_connect (GTK_OBJECT (real_table),
- "destroy", GTK_SIGNAL_FUNC (etable_destroy_cb),
- mpage);
-
- gtk_signal_connect (GTK_OBJECT (real_table),
- "right_click", GTK_SIGNAL_FUNC (right_click_cb), mpage);
-
- gtk_object_unref (GTK_OBJECT (extras));
-}
-
static void
popup_delegate_cb (GtkWidget *widget, gpointer data)
{
@@ -1350,78 +744,49 @@ popup_delegate_cb (GtkWidget *widget, gpointer data)
MeetingPagePrivate *priv;
EDelegateDialog *edd;
GtkWidget *dialog;
- struct attendee *a;
+ EMeetingAttendee *ia;
char *address = NULL, *name = NULL;
- gint row_cnt;
priv = mpage->priv;
- a = g_slist_nth_data (priv->attendees, priv->row);
+ ia = e_meeting_model_find_attendee_at_row (priv->model, priv->row);
/* Show dialog. */
- edd = e_delegate_dialog_new (NULL, itip_strip_mailto (a->delto));
+ edd = e_delegate_dialog_new (NULL, itip_strip_mailto (e_meeting_attendee_get_delto (ia)));
dialog = e_delegate_dialog_get_toplevel (edd);
if (gnome_dialog_run_and_close (GNOME_DIALOG (dialog)) == 0){
- struct attendee *a;
- char *str;
+ EMeetingAttendee *ic;
name = e_delegate_dialog_get_delegate_name (edd);
address = e_delegate_dialog_get_delegate (edd);
/* Make sure we can add the new delegatee person */
- if (find_match (mpage, address, NULL) != NULL) {
+ if (e_meeting_model_find_attendee (priv->model, address, NULL) != NULL) {
duplicate_error ();
goto cleanup;
}
/* Update information for attendee */
- a = g_slist_nth_data (priv->attendees, priv->row);
- if (a->delto) {
- struct attendee *b;
+ if (e_meeting_attendee_is_set_delto (ia)) {
+ EMeetingAttendee *ib;
- b = find_match (mpage, a->delto, NULL);
- if (b != NULL) {
- priv->attendees = g_slist_remove (priv->attendees, b);
- priv->deleted_attendees = g_slist_append (priv->deleted_attendees, b);
+ ib = e_meeting_model_find_attendee (priv->model, itip_strip_mailto (e_meeting_attendee_get_delto (ia)), NULL);
+ if (ib != NULL) {
+ gtk_object_ref (GTK_OBJECT (ib));
+ g_ptr_array_add (priv->deleted_attendees, ib);
- e_table_model_row_deleted (priv->model, priv->row);
+ e_meeting_model_remove_attendee (priv->model, ib);
}
- g_free (a->delto);
}
-
- a->delto = g_strdup_printf ("MAILTO:%s", address);
+ e_meeting_attendee_set_delto (ia, g_strdup_printf ("MAILTO:%s", address));
/* Construct delegatee information */
- a = g_new0 (struct attendee, 1);
-
- a->address = g_strdup_printf ("MAILTO:%s", address);
- a->member = init_value (NULL, MEETING_MEMBER_COL, mpage);
- str = init_value (NULL, MEETING_TYPE_COL, mpage);
- a->cutype = text_to_type (str);
- g_free (str);
- str = init_value (NULL, MEETING_ROLE_COL, mpage);
- a->role = text_to_role (str);
- g_free (str);
- str = init_value (NULL, MEETING_RSVP_COL, mpage);
- a->rsvp = text_to_boolean (str);
- g_free (str);
- a->delto = init_value (NULL, MEETING_DELTO_COL, mpage);
- a->delfrom = g_strdup_printf ("MAILTO:%s", (char *) value_at (NULL, MEETING_ATTENDEE_COL, priv->row, mpage));
- str = init_value (NULL, MEETING_STATUS_COL, mpage);
- a->status = text_to_partstat (str);
- g_free (str);
- a->cn = name ? g_strdup (name) : g_strdup ("");
- a->language = init_value (NULL, MEETING_LANG_COL, mpage);
+ ic = e_meeting_model_add_attendee_with_defaults (priv->model);
- priv->attendees = g_slist_append (priv->attendees, a);
-
- row_cnt = row_count (priv->model, mpage) - 1;
- e_table_model_row_changed (priv->model, priv->row);
- e_table_model_row_inserted (priv->model, row_cnt);
-
- comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage));
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
+ e_meeting_attendee_set_address (ic, g_strdup_printf ("MAILTO:%s", address));
+ e_meeting_attendee_set_delfrom (ic, g_strdup (e_meeting_attendee_get_address (ia)));
+ e_meeting_attendee_set_cn (ic, g_strdup (name));
}
cleanup:
@@ -1435,44 +800,33 @@ popup_delete_cb (GtkWidget *widget, gpointer data)
{
MeetingPage *mpage = MEETING_PAGE (data);
MeetingPagePrivate *priv;
- struct attendee *a;
+ EMeetingAttendee *ia;
int pos = 0;
priv = mpage->priv;
-
- a = g_slist_nth_data (priv->attendees, priv->row);
+
+ ia = e_meeting_model_find_attendee_at_row (priv->model, priv->row);
/* If this was a delegatee, no longer delegate */
- if (a->delfrom != NULL && *a->delfrom != '\0') {
- struct attendee *b;
+ if (e_meeting_attendee_is_set_delfrom (ia)) {
+ EMeetingAttendee *ib;
- b = find_match (mpage, a->delfrom, &pos);
- if (b != NULL && b->delto) {
- g_free (b->delto);
- b->delto = g_strdup ("");
-
- e_table_model_row_changed (priv->model, pos);
- }
+ ib = e_meeting_model_find_attendee (priv->model, e_meeting_attendee_get_delfrom (ia), &pos);
+ if (ib != NULL)
+ e_meeting_attendee_set_delto (ib, NULL);
}
/* Handle deleting all attendees in the delegation chain */
- pos = priv->row;
- while (a != NULL) {
- struct attendee *b = NULL;
-
- e_table_model_pre_change (priv->model);
-
- priv->attendees = g_slist_remove (priv->attendees, a);
- priv->deleted_attendees = g_slist_append (priv->deleted_attendees, a);
+ while (ia != NULL) {
+ EMeetingAttendee *ib = NULL;
- e_table_model_row_deleted (priv->model, pos);
+ gtk_object_ref (GTK_OBJECT (ia));
+ g_ptr_array_add (priv->deleted_attendees, ia);
+ e_meeting_model_remove_attendee (priv->model, ia);
- comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (mpage));
- comp_editor_page_notify_changed (COMP_EDITOR_PAGE (mpage));
-
- if (a->delto != NULL)
- b = find_match (mpage, a->delto, &pos);
- a = b;
+ if (e_meeting_attendee_get_delto (ia) != NULL)
+ ib = e_meeting_model_find_attendee (priv->model, e_meeting_attendee_get_delto (ia), NULL);
+ ia = ib;
}
}
@@ -1527,9 +881,11 @@ right_click_cb (ETable *etable, gint row, gint col, GdkEvent *event, gpointer da
* be created.
**/
MeetingPage *
-meeting_page_construct (MeetingPage *mpage)
+meeting_page_construct (MeetingPage *mpage, EMeetingModel *emm)
{
MeetingPagePrivate *priv;
+ ETable *real_table;
+ gchar *filename;
priv = mpage->priv;
@@ -1548,9 +904,21 @@ meeting_page_construct (MeetingPage *mpage)
}
/* The etable displaying attendees and their status */
- build_etable (mpage);
- gtk_widget_show (priv->etable);
- gtk_box_pack_start (GTK_BOX (priv->main), priv->etable, TRUE, TRUE, 2);
+ gtk_object_ref (GTK_OBJECT (emm));
+ priv->model = emm;
+
+ filename = g_strdup_printf ("%s/config/et-header-meeting-page", evolution_dir);
+ priv->etable = e_meeting_model_etable_from_model (priv->model,
+ EVOLUTION_ETSPECDIR "/meeting-page.etspec",
+ filename);
+ g_free (filename);
+
+ real_table = e_table_scrolled_get_table (priv->etable);
+ gtk_signal_connect (GTK_OBJECT (real_table),
+ "right_click", GTK_SIGNAL_FUNC (right_click_cb), mpage);
+
+ gtk_widget_show (GTK_WIDGET (priv->etable));
+ gtk_box_pack_start (GTK_BOX (priv->main), GTK_WIDGET (priv->etable), TRUE, TRUE, 2);
/* Init the widget signals */
init_widgets (mpage);
@@ -1567,12 +935,12 @@ meeting_page_construct (MeetingPage *mpage)
* not be created.
**/
MeetingPage *
-meeting_page_new (void)
+meeting_page_new (EMeetingModel *emm)
{
MeetingPage *mpage;
mpage = gtk_type_new (TYPE_MEETING_PAGE);
- if (!meeting_page_construct (mpage)) {
+ if (!meeting_page_construct (mpage, emm)) {
gtk_object_unref (GTK_OBJECT (mpage));
return NULL;
}
@@ -1605,4 +973,3 @@ meeting_page_get_cancel_comp (MeetingPage *mpage)
return cal_component_clone (priv->comp);
}
-