diff options
author | JP Rosevear <jpr@ximian.com> | 2001-08-10 07:08:33 +0800 |
---|---|---|
committer | JP Rosevear <jpr@src.gnome.org> | 2001-08-10 07:08:33 +0800 |
commit | 8ff06a283d19aa223c2d0bc0d55335eb221f7ff1 (patch) | |
tree | e8c5f4287cc15fe3c6f4fc8085e956feab645266 /calendar/gui/dialogs/task-details-page.c | |
parent | a1dbf7e2b8b79455eedec53cc9f2221e97215a9f (diff) | |
download | gsoc2013-evolution-8ff06a283d19aa223c2d0bc0d55335eb221f7ff1.tar.gz gsoc2013-evolution-8ff06a283d19aa223c2d0bc0d55335eb221f7ff1.tar.zst gsoc2013-evolution-8ff06a283d19aa223c2d0bc0d55335eb221f7ff1.zip |
Remove progress frame
2001-08-09 JP Rosevear <jpr@ximian.com>
* gui/dialogs/task-page.*: Remove progress frame
* gui/dialogs/task-details-page.*: Put in progress frame, remove
basics frame
* gui/dialogs/task-editor.c (set_menu_sens): util function to set
menu sensitivity based on state
(task_editor_init): add meeting page
(task_editor_edit_comp): show page if necessary
(task_editor_destroy): unref meeting page
(assign_task_cmd): bring up meeting page
(refresh_task_cmd): save before sending
(forward_cmd): ditto
* gui/dialogs/comp-editor.c (save_cmd): implement new save command
svn path=/trunk/; revision=11846
Diffstat (limited to 'calendar/gui/dialogs/task-details-page.c')
-rw-r--r-- | calendar/gui/dialogs/task-details-page.c | 476 |
1 files changed, 272 insertions, 204 deletions
diff --git a/calendar/gui/dialogs/task-details-page.c b/calendar/gui/dialogs/task-details-page.c index 6212e8f76f..3955abc182 100644 --- a/calendar/gui/dialogs/task-details-page.c +++ b/calendar/gui/dialogs/task-details-page.c @@ -1,4 +1,4 @@ -/* Evolution calendar - Main page of the task editor dialog +/* Evolution calendar - task details page * * Copyright (C) 2001 Ximian, Inc. * @@ -47,23 +47,41 @@ struct _TaskDetailsPagePrivate { /* Widgets from the Glade file */ GtkWidget *main; - GtkWidget *summary; - GtkWidget *date_time; - + GtkWidget *status; + GtkWidget *priority; + GtkWidget *percent_complete; + GtkWidget *completed_date; GtkWidget *url; - GtkWidget *organizer; - GtkWidget *organizer_lbl; - GtkWidget *delegated_to; - GtkWidget *delegated_to_lbl; - GtkWidget *delegated_from; - GtkWidget *delegated_from_lbl; - gboolean updating; }; +/* Note that these two arrays must match. */ +static const int status_map[] = { + ICAL_STATUS_NEEDSACTION, + ICAL_STATUS_INPROCESS, + ICAL_STATUS_COMPLETED, + ICAL_STATUS_CANCELLED, + -1 +}; + +typedef enum { + PRIORITY_HIGH, + PRIORITY_NORMAL, + PRIORITY_LOW, + PRIORITY_UNDEFINED, +} TaskEditorPriority; + +static const int priority_map[] = { + PRIORITY_HIGH, + PRIORITY_NORMAL, + PRIORITY_LOW, + PRIORITY_UNDEFINED, + -1 +}; + static void task_details_page_class_init (TaskDetailsPageClass *class); @@ -74,8 +92,6 @@ static GtkWidget *task_details_page_get_widget (CompEditorPage *page); static void task_details_page_focus_main_widget (CompEditorPage *page); static void task_details_page_fill_widgets (CompEditorPage *page, CalComponent *comp); static void task_details_page_fill_component (CompEditorPage *page, CalComponent *comp); -static void task_details_page_set_summary (CompEditorPage *page, const char *summary); -static void task_details_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates); static CompEditorPageClass *parent_class = NULL; @@ -130,8 +146,6 @@ task_details_page_class_init (TaskDetailsPageClass *class) editor_page_class->focus_main_widget = task_details_page_focus_main_widget; editor_page_class->fill_widgets = task_details_page_fill_widgets; editor_page_class->fill_component = task_details_page_fill_component; - editor_page_class->set_summary = task_details_page_set_summary; - editor_page_class->set_dates = task_details_page_set_dates; object_class->destroy = task_details_page_destroy; } @@ -148,8 +162,11 @@ task_details_page_init (TaskDetailsPage *tdpage) priv->xml = NULL; priv->main = NULL; - priv->summary = NULL; - priv->date_time = NULL; + + priv->status = NULL; + priv->priority = NULL; + priv->percent_complete = NULL; + priv->completed_date = NULL; priv->url = NULL; @@ -206,7 +223,52 @@ task_details_page_focus_main_widget (CompEditorPage *page) tdpage = TASK_DETAILS_PAGE (page); priv = tdpage->priv; - gtk_widget_grab_focus (priv->organizer); + gtk_widget_grab_focus (priv->status); +} + + +static TaskEditorPriority +priority_value_to_index (int priority_value) +{ + TaskEditorPriority retval; + + if (priority_value == 0) + retval = PRIORITY_UNDEFINED; + else if (priority_value <= 4) + retval = PRIORITY_HIGH; + else if (priority_value == 5) + retval = PRIORITY_NORMAL; + else + retval = PRIORITY_LOW; + + return retval; +} + +static int +priority_index_to_value (TaskEditorPriority priority) +{ + int retval; + + switch (priority) { + case PRIORITY_UNDEFINED: + retval = 0; + break; + case PRIORITY_HIGH: + retval = 3; + break; + case PRIORITY_NORMAL: + retval = 5; + break; + case PRIORITY_LOW: + retval = 7; + break; + default: + retval = -1; + g_assert_not_reached (); + break; + } + + return retval; } /* Fills the widgets with default values */ @@ -217,12 +279,6 @@ clear_widgets (TaskDetailsPage *tdpage) priv = tdpage->priv; - /* Summary */ - gtk_label_set_text (GTK_LABEL (priv->summary), ""); - - /* Start date */ - gtk_label_set_text (GTK_LABEL (priv->date_time), ""); - /* Date completed */ e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), -1); @@ -236,12 +292,11 @@ task_details_page_fill_widgets (CompEditorPage *page, CalComponent *comp) { TaskDetailsPage *tdpage; TaskDetailsPagePrivate *priv; - GSList *list; - CalComponentText text; - CalComponentOrganizer organizer; + int *priority_value, *percent; + TaskEditorPriority priority; + icalproperty_status status; const char *url; - CompEditorPageDates dates; - + tdpage = TASK_DETAILS_PAGE (page); priv = tdpage->priv; @@ -250,37 +305,45 @@ task_details_page_fill_widgets (CompEditorPage *page, CalComponent *comp) /* Clean the screen */ clear_widgets (tdpage); - /* Summary */ - cal_component_get_summary (comp, &text); - task_details_page_set_summary (page, text.value); + /* Percent Complete. */ + cal_component_get_percent (comp, &percent); + if (percent) { + e_dialog_spin_set (priv->percent_complete, *percent); + cal_component_free_percent (percent); + } else { + /* FIXME: Could check if task is completed and set 100%. */ + e_dialog_spin_set (priv->percent_complete, 0); + } + + /* Status. */ + cal_component_get_status (comp, &status); + if (status == ICAL_STATUS_NONE) { + /* Try to use the percent value. */ + if (percent) { + if (*percent == 0) + status = ICAL_STATUS_NEEDSACTION; + else if (*percent == 100) + status = ICAL_STATUS_COMPLETED; + else + status = ICAL_STATUS_INPROCESS; + } else + status = ICAL_STATUS_NEEDSACTION; + } + e_dialog_option_menu_set (priv->status, status, status_map); + + /* Priority. */ + cal_component_get_priority (comp, &priority_value); + if (priority_value) { + priority = priority_value_to_index (*priority_value); + cal_component_free_priority (priority_value); + } else { + priority = PRIORITY_UNDEFINED; + } + e_dialog_option_menu_set (priv->priority, priority, priority_map); - /* Dates */ - comp_editor_dates (&dates, comp); - task_details_page_set_dates (page, &dates); - /* URL */ cal_component_get_url (comp, &url); e_dialog_editable_set (priv->url, url); - - /* Delegation */ - cal_component_get_organizer (comp, &organizer); - if (organizer.value) - e_dialog_editable_set (priv->organizer, organizer.value); - - cal_component_get_attendee_list (comp, &list); - if (list != NULL) { - CalComponentAttendee *attendee; - - attendee = list->data; - if (attendee->delto) - e_dialog_editable_set (priv->delegated_to, attendee->delto); - if (attendee->delfrom) { - gchar *s = e_utf8_to_gtk_string (priv->delegated_from, attendee->delfrom); - gtk_label_set_text (GTK_LABEL (priv->delegated_from), s); - g_free (s); - } - } - cal_component_free_attendee_list (list); priv->updating = FALSE; } @@ -292,15 +355,28 @@ task_details_page_fill_component (CompEditorPage *page, CalComponent *comp) TaskDetailsPage *tdpage; TaskDetailsPagePrivate *priv; struct icaltimetype icaltime; - GSList list; - CalComponentOrganizer organizer; - CalComponentAttendee attendee; + icalproperty_status status; + TaskEditorPriority priority; + int priority_value, percent; char *url; gboolean date_set; tdpage = TASK_DETAILS_PAGE (page); priv = tdpage->priv; + /* Percent Complete. */ + percent = e_dialog_spin_get_int (priv->percent_complete); + cal_component_set_percent (comp, &percent); + + /* Status. */ + status = e_dialog_option_menu_get (priv->status, status_map); + cal_component_set_status (comp, status); + + /* Priority. */ + priority = e_dialog_option_menu_get (priv->priority, priority_map); + priority_value = priority_index_to_value (priority); + cal_component_set_priority (comp, &priority_value); + icaltime = icaltime_null_time (); /* COMPLETED must be in UTC. */ @@ -335,90 +411,6 @@ task_details_page_fill_component (CompEditorPage *page, CalComponent *comp) cal_component_set_url (comp, url); if (url) g_free (url); - - /* Delegation */ - organizer.value = e_dialog_editable_get (priv->organizer); - organizer.sentby = NULL; - organizer.cn = NULL; - organizer.language = NULL; - cal_component_set_organizer (comp, &organizer); - attendee.value = e_dialog_editable_get (priv->delegated_to); - attendee.member = NULL; - attendee.cutype = CAL_COMPONENT_CUTYPE_INDIVIDUAL; - attendee.role = CAL_COMPONENT_ROLE_REQUIRED; - attendee.status = CAL_COMPONENT_PARTSTAT_NEEDSACTION; - attendee.rsvp = TRUE; - attendee.delto = e_dialog_editable_get (priv->delegated_to); - attendee.delfrom = NULL; - attendee.sentby = NULL; - attendee.cn = NULL; - attendee.language = NULL; - list.data = &attendee; - list.next = NULL; - cal_component_set_attendee_list (comp, &list); - g_free ((char *)organizer.value); - g_free ((char *)attendee.value); - g_free ((char *)attendee.delto); - g_free ((char *)attendee.delfrom); -} - -/* set_summary handler for the task page */ -static void -task_details_page_set_summary (CompEditorPage *page, const char *summary) -{ - TaskDetailsPage *tdpage; - TaskDetailsPagePrivate *priv; - gchar *s; - - tdpage = TASK_DETAILS_PAGE (page); - priv = tdpage->priv; - - s = e_utf8_to_gtk_string (priv->summary, summary); - gtk_label_set_text (GTK_LABEL (priv->summary), s); - g_free (s); -} - -static void -task_details_page_set_dates (CompEditorPage *page, CompEditorPageDates *dates) -{ - TaskDetailsPage *tdpage; - TaskDetailsPagePrivate *priv; - - tdpage = TASK_DETAILS_PAGE (page); - priv = tdpage->priv; - - if (priv->updating) - return; - - priv->updating = TRUE; - - comp_editor_date_label (dates, priv->date_time); - - if (dates->complete) { - if (icaltime_is_null_time (*dates->complete)) { - e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), -1); - } else { - struct icaltimetype *tt = dates->complete; - - /* Convert it from UTC to local time to display. - FIXME: We should really use one timezone for the - entire time the dialog is shown. Otherwise if the - user changes the timezone, the COMPLETED date may - get changed as well. */ - char *location = calendar_config_get_timezone (); - icaltimezone *zone = icaltimezone_get_builtin_timezone (location); - icaltimezone_convert_time (tt, - icaltimezone_get_utc_timezone (), - zone); - - e_date_edit_set_date (E_DATE_EDIT (priv->completed_date), - tt->year, tt->month, tt->day); - e_date_edit_set_time_of_day (E_DATE_EDIT (priv->completed_date), - tt->hour, tt->minute); - } - } - - priv->updating = FALSE; } @@ -440,44 +432,58 @@ get_widgets (TaskDetailsPage *tdpage) gtk_widget_ref (priv->main); gtk_widget_unparent (priv->main); - priv->summary = GW ("summary"); - priv->date_time = GW ("date-time"); + priv->status = GW ("status"); + priv->priority = GW ("priority"); + priv->percent_complete = GW ("percent-complete"); priv->completed_date = GW ("completed-date"); priv->url = GW ("url"); - priv->organizer = GW ("organizer"); - priv->organizer_lbl = GW ("organizer-label"); - priv->delegated_to = GW ("delegated-to"); - priv->delegated_to_lbl = GW ("delegated-to-label"); - priv->delegated_from = GW ("delegated-from"); - priv->delegated_from_lbl = GW ("delegated-from-label"); - #undef GW - return (priv->summary - && priv->date_time + return (priv->status + && priv->priority + && priv->percent_complete && priv->completed_date - && priv->url - && priv->organizer - && priv->organizer_lbl - && priv->delegated_to - && priv->delegated_to_lbl - && priv->delegated_from - && priv->delegated_from_lbl); + && priv->url); +} + + +static void +complete_date_changed (TaskDetailsPage *tdpage, time_t ctime, gboolean complete) +{ + TaskDetailsPagePrivate *priv; + CompEditorPageDates dates = {NULL, NULL, NULL, NULL}; + icaltimezone *zone; + struct icaltimetype completed_tt = icaltime_null_time(); + + priv = tdpage->priv; + + /* Get the current time in UTC. */ + zone = icaltimezone_get_utc_timezone (); + completed_tt = icaltime_from_timet_with_zone (ctime, FALSE, zone); + completed_tt.is_utc = TRUE; + + dates.start = NULL; + dates.end = NULL; + dates.due = NULL; + if (complete) + dates.complete = &completed_tt; + + /* Notify upstream */ + comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tdpage), + &dates); } -/* Callback used when the start or end date widgets change. We check that the - * start date < end date and we set the "all day task" button as appropriate. - */ static void date_changed_cb (EDateEdit *dedit, gpointer data) { TaskDetailsPage *tdpage; TaskDetailsPagePrivate *priv; - CompEditorPageDates dates; - struct icaltimetype completed_tt = icaltime_null_time(); + CompEditorPageDates dates = {NULL, NULL, NULL, NULL}; + struct icaltimetype completed_tt; + icalproperty_status status; gboolean date_set; tdpage = TASK_DETAILS_PAGE (data); @@ -493,18 +499,97 @@ date_changed_cb (EDateEdit *dedit, gpointer data) e_date_edit_get_time_of_day (E_DATE_EDIT (priv->completed_date), &completed_tt.hour, &completed_tt.minute); - if (!date_set) + if (!date_set) { completed_tt = icaltime_null_time (); - dates.start = NULL; - dates.end = NULL; - dates.due = NULL; - dates.complete = &completed_tt; + status = e_dialog_option_menu_get (priv->status, status_map); + if (status == ICAL_STATUS_COMPLETED) { + e_dialog_option_menu_set (priv->status, ICAL_STATUS_NEEDSACTION, status_map); + e_dialog_spin_set (priv->percent_complete, 0); + } + } else { + e_dialog_option_menu_set (priv->status, ICAL_STATUS_COMPLETED, status_map); + e_dialog_spin_set (priv->percent_complete, 100); + } /* Notify upstream */ comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tdpage), &dates); } +static void +status_changed (GtkMenu *menu, TaskDetailsPage *tdpage) +{ + TaskDetailsPagePrivate *priv; + icalproperty_status status; + time_t ctime = -1; + + priv = tdpage->priv; + + if (priv->updating) + return; + + priv->updating = TRUE; + + status = e_dialog_option_menu_get (priv->status, status_map); + if (status == ICAL_STATUS_NEEDSACTION) { + e_dialog_spin_set (priv->percent_complete, 0); + e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime); + complete_date_changed (tdpage, 0, FALSE); + } else if (status == ICAL_STATUS_INPROCESS) { + e_dialog_spin_set (priv->percent_complete, 50); + e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime); + complete_date_changed (tdpage, 0, FALSE); + } else if (status == ICAL_STATUS_COMPLETED) { + e_dialog_spin_set (priv->percent_complete, 100); + ctime = time (NULL); + e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime); + complete_date_changed (tdpage, ctime, TRUE); + } + + priv->updating = FALSE; + + comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage)); +} + +static void +percent_complete_changed (GtkAdjustment *adj, TaskDetailsPage *tdpage) +{ + TaskDetailsPagePrivate *priv; + gint percent; + icalproperty_status status; + gboolean complete; + time_t ctime = -1; + + priv = tdpage->priv; + + if (priv->updating) + return; + + priv->updating = TRUE; + + percent = e_dialog_spin_get_int (priv->percent_complete); + if (percent == 100) { + complete = TRUE; + ctime = time (NULL); + status = ICAL_STATUS_COMPLETED; + } else { + complete = FALSE; + + if (percent == 0) + status = ICAL_STATUS_NEEDSACTION; + else + status = ICAL_STATUS_INPROCESS; + } + + e_dialog_option_menu_set (priv->status, status, status_map); + e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime); + complete_date_changed (tdpage, ctime, complete); + + priv->updating = FALSE; + + comp_editor_page_notify_changed (COMP_EDITOR_PAGE (tdpage)); +} + /* This is called when any field is changed; it notifies upstream. */ static void field_changed_cb (GtkWidget *widget, gpointer data) @@ -533,6 +618,22 @@ init_widgets (TaskDetailsPage *tdpage) (EDateEditGetTimeCallback) comp_editor_get_current_time, tdpage, NULL); + /* Connect signals. The Status, Percent Complete & Date Completed + properties are closely related so whenever one changes we may need + to update the other 2. */ + gtk_signal_connect (GTK_OBJECT (GTK_OPTION_MENU (priv->status)->menu), + "deactivate", + GTK_SIGNAL_FUNC (status_changed), tdpage); + + gtk_signal_connect (GTK_OBJECT (GTK_SPIN_BUTTON (priv->percent_complete)->adjustment), + "value_changed", + GTK_SIGNAL_FUNC (percent_complete_changed), tdpage); + + /* Priority */ + gtk_signal_connect (GTK_OBJECT (GTK_OPTION_MENU (priv->priority)->menu), + "deactivate", + GTK_SIGNAL_FUNC (field_changed_cb), tdpage); + /* Completed Date */ gtk_signal_connect (GTK_OBJECT (priv->completed_date), "changed", GTK_SIGNAL_FUNC (date_changed_cb), tdpage); @@ -540,14 +641,6 @@ init_widgets (TaskDetailsPage *tdpage) /* URL */ gtk_signal_connect (GTK_OBJECT (priv->url), "changed", GTK_SIGNAL_FUNC (field_changed_cb), tdpage); - - /* Delegation */ - gtk_signal_connect (GTK_OBJECT (priv->organizer), "changed", - GTK_SIGNAL_FUNC (field_changed_cb), tdpage); - - gtk_signal_connect (GTK_OBJECT (priv->delegated_to), "changed", - GTK_SIGNAL_FUNC (field_changed_cb), tdpage); - } @@ -609,31 +702,6 @@ task_details_page_new (void) return tdpage; } -void -task_details_page_show_delegation (TaskDetailsPage *tdpage, gboolean show) -{ - TaskDetailsPagePrivate *priv; - - priv = tdpage->priv; - - if (show) { - gtk_widget_show (priv->organizer); - gtk_widget_show (priv->organizer_lbl); - gtk_widget_show (priv->delegated_to); - gtk_widget_show (priv->delegated_to_lbl); - gtk_widget_show (priv->delegated_from); - gtk_widget_show (priv->delegated_from_lbl); - comp_editor_page_notify_needs_send (COMP_EDITOR_PAGE (tdpage)); - } else { - gtk_widget_hide (priv->organizer); - gtk_widget_hide (priv->organizer_lbl); - gtk_widget_hide (priv->delegated_to); - gtk_widget_hide (priv->delegated_to_lbl); - gtk_widget_hide (priv->delegated_from); - gtk_widget_hide (priv->delegated_from_lbl); - } -} - GtkWidget *task_details_page_create_date_edit (void); GtkWidget * |