[evolution] Bug #555130 - Redesign task editor



commit 9e33bb17287ecb26c3fed164e7b441475dc1b2cb
Author: Milan Crha <mcrha redhat com>
Date:   Thu Jun 6 15:56:29 2013 +0200

    Bug #555130 - Redesign task editor

 calendar/gui/dialogs/Makefile.am          |    4 -
 calendar/gui/dialogs/task-details-page.c  |  789 -----------------------------
 calendar/gui/dialogs/task-details-page.h  |   75 ---
 calendar/gui/dialogs/task-details-page.ui |  453 -----------------
 calendar/gui/dialogs/task-editor.c        |   62 ---
 calendar/gui/dialogs/task-page.c          |  522 +++++++++++++++++++
 calendar/gui/dialogs/task-page.ui         |  407 +++++++++++++--
 po/POTFILES.in                            |    2 -
 8 files changed, 884 insertions(+), 1430 deletions(-)
---
diff --git a/calendar/gui/dialogs/Makefile.am b/calendar/gui/dialogs/Makefile.am
index f95464f..42e6730 100644
--- a/calendar/gui/dialogs/Makefile.am
+++ b/calendar/gui/dialogs/Makefile.am
@@ -43,7 +43,6 @@ ecalendarinclude_HEADERS =            \
        select-source-dialog.h          \
        send-comp.h                     \
        task-editor.h                   \
-       task-details-page.h             \
        task-page.h
 
 libcal_dialogs_la_LIBADD =                                     \
@@ -101,8 +100,6 @@ libcal_dialogs_la_SOURCES =         \
        send-comp.h                     \
        task-editor.c                   \
        task-editor.h                   \
-       task-details-page.c             \
-       task-details-page.h             \
        task-page.c                     \
        task-page.h             
 
@@ -115,7 +112,6 @@ ui_DATA =                           \
        memo-page.ui                    \
        recurrence-page.ui              \
        schedule-page.ui                \
-       task-details-page.ui            \
        task-page.ui
 
 CLEANFILES = $(BUILT_SOURCES)
diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c
index 07ad568..89b77ab 100644
--- a/calendar/gui/dialogs/task-editor.c
+++ b/calendar/gui/dialogs/task-editor.c
@@ -33,7 +33,6 @@
 #include <glib/gi18n.h>
 
 #include "task-page.h"
-#include "task-details-page.h"
 #include "cancel-comp.h"
 #include "task-editor.h"
 
@@ -43,8 +42,6 @@
 
 struct _TaskEditorPrivate {
        TaskPage *task_page;
-       TaskDetailsPage *task_details_page;
-       GtkWidget *task_details_window;
 
        EMeetingStore *model;
        gboolean assignment_shown;
@@ -67,19 +64,10 @@ static const gchar *ui =
 "    <menu action='insert-menu'>"
 "      <menuitem action='send-options'/>"
 "    </menu>"
-"    <menu action='options-menu'>"
-"      <menu action='classification-menu'>"
-"        <menuitem action='classify-public'/>"
-"        <menuitem action='classify-private'/>"
-"        <menuitem action='classify-confidential'/>"
-"      </menu>"
-"      <menuitem action='option-status'/>"
-"    </menu>"
 "  </menubar>"
 "  <toolbar name='main-toolbar'>"
 "    <placeholder name='content'>"
 "      <toolitem action='view-time-zone'/>"
-"      <toolitem action='option-status'/>"
 "    </placeholder>"
 "  </toolbar>"
 "</ui>";
@@ -93,29 +81,12 @@ static gboolean     task_editor_send_comp           (CompEditor *editor,
 G_DEFINE_TYPE (TaskEditor, task_editor, TYPE_COMP_EDITOR)
 
 static void
-action_option_status_cb (GtkAction *action,
-                         TaskEditor *editor)
-{
-       gtk_widget_show (editor->priv->task_details_window);
-}
-
-static void
 action_send_options_cb (GtkAction *action,
                         TaskEditor *editor)
 {
        task_page_send_options_clicked_cb (editor->priv->task_page);
 }
 
-static GtkActionEntry task_entries[] = {
-
-       { "option-status",
-         "stock_view-details",
-         N_("_Status Details"),
-         "<Control>t",
-         N_("Click to change or view the status details of the task"),
-         G_CALLBACK (action_option_status_cb) }
-};
-
 static GtkActionEntry assigned_task_entries[] = {
 
        { "send-options",
@@ -147,11 +118,6 @@ task_editor_dispose (GObject *object)
                priv->task_page = NULL;
        }
 
-       if (priv->task_details_page) {
-               g_object_unref (priv->task_details_page);
-               priv->task_details_page = NULL;
-       }
-
        if (priv->model) {
                g_object_unref (priv->model);
                priv->model = NULL;
@@ -290,7 +256,6 @@ task_editor_init (TaskEditor *te)
        CompEditor *editor = COMP_EDITOR (te);
        GtkUIManager *ui_manager;
        GtkActionGroup *action_group;
-       GtkWidget *content_area;
        GtkAction *action;
        const gchar *id;
        GError *error = NULL;
@@ -300,33 +265,6 @@ task_editor_init (TaskEditor *te)
        te->priv->assignment_shown = TRUE;
        te->priv->updating = FALSE;
 
-       te->priv->task_details_window = gtk_dialog_new_with_buttons (
-               _("Task Details"), GTK_WINDOW (te), GTK_DIALOG_MODAL,
-               GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, NULL);
-       g_signal_connect (
-               te->priv->task_details_window, "response",
-               G_CALLBACK (gtk_widget_hide), NULL);
-       g_signal_connect (
-               te->priv->task_details_window, "delete-event",
-               G_CALLBACK (gtk_widget_hide), NULL);
-
-       te->priv->task_details_page = task_details_page_new (editor);
-       content_area = gtk_dialog_get_content_area (
-               GTK_DIALOG (te->priv->task_details_window));
-       gtk_container_add (
-               GTK_CONTAINER (content_area),
-               comp_editor_page_get_widget (
-               (CompEditorPage *) te->priv->task_details_page));
-       gtk_widget_show_all (
-               gtk_bin_get_child (GTK_BIN (te->priv->task_details_window)));
-       comp_editor_append_page (
-               editor, COMP_EDITOR_PAGE (te->priv->task_details_page), NULL, FALSE);
-
-       action_group = comp_editor_get_action_group (editor, "individual");
-       gtk_action_group_add_actions (
-               action_group, task_entries,
-               G_N_ELEMENTS (task_entries), te);
-
        action_group = comp_editor_get_action_group (editor, "coordinated");
        gtk_action_group_add_actions (
                action_group, assigned_task_entries,
diff --git a/calendar/gui/dialogs/task-page.c b/calendar/gui/dialogs/task-page.c
index 1eb5f00..fcc00fa 100644
--- a/calendar/gui/dialogs/task-page.c
+++ b/calendar/gui/dialogs/task-page.c
@@ -78,9 +78,16 @@ struct _TaskPagePrivate {
 
        GtkWidget *due_date;
        GtkWidget *start_date;
+       GtkWidget *completed_date;
        GtkWidget *timezone;
        GtkWidget *timezone_label;
 
+       GtkWidget *status_combo;
+       GtkWidget *priority_combo;
+       GtkWidget *percent_complete;
+       GtkWidget *classification_combo;
+       GtkWidget *web_page_entry;
+
        GtkWidget *description;
 
        GtkWidget *categories_btn;
@@ -123,12 +130,79 @@ static const gint classification_map[] = {
        -1
 };
 
+/* Note that these two arrays must match. */
+static const gint status_map[] = {
+       ICAL_STATUS_NONE,
+       ICAL_STATUS_INPROCESS,
+       ICAL_STATUS_COMPLETED,
+       ICAL_STATUS_CANCELLED,
+       -1
+};
+
+typedef enum {
+       PRIORITY_HIGH,
+       PRIORITY_NORMAL,
+       PRIORITY_LOW,
+       PRIORITY_UNDEFINED
+} TaskEditorPriority;
+
+static const gint priority_map[] = {
+       PRIORITY_HIGH,
+       PRIORITY_NORMAL,
+       PRIORITY_LOW,
+       PRIORITY_UNDEFINED,
+       -1
+};
+
 static gboolean task_page_fill_timezones (CompEditorPage *page, GHashTable *timezones);
 static void task_page_select_organizer (TaskPage *tpage, const gchar *backend_address);
 static void set_subscriber_info_string (TaskPage *tpage, const gchar *backend_address);
 
 G_DEFINE_TYPE (TaskPage, task_page, TYPE_COMP_EDITOR_PAGE)
 
+static TaskEditorPriority
+priority_value_to_index (gint 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 gint
+priority_index_to_value (TaskEditorPriority priority)
+{
+       gint 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 = 0;
+               break;
+       }
+
+       return retval;
+}
+
 static gboolean
 get_current_identity (TaskPage *page,
                       gchar **name,
@@ -194,6 +268,7 @@ clear_widgets (TaskPage *tpage)
 {
        TaskPagePrivate *priv = tpage->priv;
        CompEditor *editor;
+       GtkWidget *entry;
 
        editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
 
@@ -211,6 +286,14 @@ clear_widgets (TaskPage *tpage)
 
        /* Categories */
        gtk_entry_set_text (GTK_ENTRY (priv->categories), "");
+
+       e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), -1);
+       e_dialog_combo_box_set (priv->status_combo, ICAL_STATUS_NONE, status_map);
+       e_dialog_combo_box_set (priv->priority_combo, PRIORITY_UNDEFINED, priority_map);
+       gtk_spin_button_set_value (GTK_SPIN_BUTTON (priv->percent_complete), 0);
+
+       entry = e_url_entry_get_entry (E_URL_ENTRY (priv->web_page_entry));
+       gtk_entry_set_text (GTK_ENTRY (entry), "");
 }
 
 static gboolean
@@ -266,6 +349,7 @@ sensitize_widgets (TaskPage *tpage)
        ECalClient *client;
        GtkActionGroup *action_group;
        GtkAction *action;
+       GtkWidget *entry;
        gboolean read_only, sens = TRUE, sensitize;
 
        editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
@@ -310,6 +394,15 @@ sensitize_widgets (TaskPage *tpage)
        gtk_widget_set_sensitive (priv->categories_btn, !read_only);
        gtk_editable_set_editable (GTK_EDITABLE (priv->categories), !read_only);
 
+       gtk_widget_set_sensitive (priv->completed_date, !read_only);
+       gtk_widget_set_sensitive (priv->status_combo, !read_only);
+       gtk_widget_set_sensitive (priv->priority_combo, !read_only);
+       gtk_widget_set_sensitive (priv->percent_complete, !read_only);
+       gtk_widget_set_sensitive (priv->classification_combo, !read_only);
+
+       entry = e_url_entry_get_entry (E_URL_ENTRY (priv->web_page_entry));
+       gtk_editable_set_editable (GTK_EDITABLE (entry), !read_only);
+
        gtk_widget_set_sensitive (priv->organizer, !read_only);
        gtk_widget_set_sensitive (priv->add, (!read_only &&  sens));
        gtk_widget_set_sensitive (priv->edit, (!read_only && sens));
@@ -492,6 +585,11 @@ task_page_fill_widgets (CompEditorPage *page,
        icaltimezone *zone, *default_zone;
        gchar *backend_addr = NULL;
        gboolean active;
+       gint *priority_value, *percent = NULL;
+       TaskEditorPriority priority;
+       icalproperty_status status;
+       const gchar *url;
+       struct icaltimetype *completed = NULL;
 
        tpage = TASK_PAGE (page);
        priv = tpage->priv;
@@ -754,6 +852,74 @@ task_page_fill_widgets (CompEditorPage *page,
 
        g_free (backend_addr);
 
+       /* Percent Complete. */
+       e_cal_component_get_percent (comp, &percent);
+       if (percent) {
+               gtk_spin_button_set_value (
+                       GTK_SPIN_BUTTON (priv->percent_complete), *percent);
+       } else {
+               /* FIXME: Could check if task is completed and set 100%. */
+               gtk_spin_button_set_value (
+                       GTK_SPIN_BUTTON (priv->percent_complete), 0);
+       }
+
+       /* Status. */
+       e_cal_component_get_status (comp, &status);
+       if (status == ICAL_STATUS_NONE || status == ICAL_STATUS_NEEDSACTION) {
+               /* Try to use the percent value. */
+               if (percent) {
+                       if (*percent == 100)
+                               status = ICAL_STATUS_COMPLETED;
+                       else if (*percent > 0)
+                               status = ICAL_STATUS_INPROCESS;
+                       else
+                               status = ICAL_STATUS_NONE;
+               } else
+                       status = ICAL_STATUS_NONE;
+       }
+       e_dialog_combo_box_set (priv->status_combo, status, status_map);
+
+       if (percent)
+               e_cal_component_free_percent (percent);
+
+       /* Completed Date. */
+       e_cal_component_get_completed (comp, &completed);
+       if (completed) {
+               icaltimezone *utc_zone, *zone;
+
+               /* Completed is in UTC, but that would confuse the user, so
+                * we convert it to local time. */
+               utc_zone = icaltimezone_get_utc_timezone ();
+               zone = comp_editor_get_timezone (editor);
+
+               icaltimezone_convert_time (completed, utc_zone, zone);
+
+               e_date_edit_set_date (
+                       E_DATE_EDIT (priv->completed_date),
+                       completed->year, completed->month,
+                       completed->day);
+               e_date_edit_set_time_of_day (
+                       E_DATE_EDIT (priv->completed_date),
+                       completed->hour,
+                       completed->minute);
+
+               e_cal_component_free_icaltimetype (completed);
+       }
+
+       /* Priority. */
+       e_cal_component_get_priority (comp, &priority_value);
+       if (priority_value) {
+               priority = priority_value_to_index (*priority_value);
+               e_cal_component_free_priority (priority_value);
+       } else {
+               priority = PRIORITY_UNDEFINED;
+       }
+       e_dialog_combo_box_set (priv->priority_combo, priority, priority_map);
+
+       /* URL */
+       e_cal_component_get_url (comp, &url);
+       gtk_entry_set_text (GTK_ENTRY (e_url_entry_get_entry (E_URL_ENTRY (priv->web_page_entry))), url ? url 
: "");
+
        sensitize_widgets (tpage);
 
        return TRUE;
@@ -775,6 +941,13 @@ task_page_fill_component (CompEditorPage *page,
        gboolean start_date_set, due_date_set;
        GtkTextBuffer *text_buffer;
        GtkTextIter text_iter_start, text_iter_end;
+       struct icaltimetype icalcomplete, icaltoday;
+       icalproperty_status status;
+       TaskEditorPriority priority;
+       gint priority_value, percent;
+       const gchar *text;
+       gboolean date_set;
+       icaltimezone *zone;
 
        tpage = TASK_PAGE (page);
        priv = tpage->priv;
@@ -783,6 +956,7 @@ task_page_fill_component (CompEditorPage *page,
        editor = comp_editor_page_get_editor (page);
        client = comp_editor_get_client (editor);
        flags = comp_editor_get_flags (editor);
+       zone = comp_editor_get_timezone (editor);
 
        /* Summary. */
 
@@ -976,6 +1150,77 @@ task_page_fill_component (CompEditorPage *page,
                        set_attendees (comp, e_meeting_store_get_attendees (priv->meeting_store));
        }
 
+       /* Percent Complete. */
+       percent = gtk_spin_button_get_value_as_int (
+               GTK_SPIN_BUTTON (priv->percent_complete));
+       e_cal_component_set_percent (comp, &percent);
+
+       /* Status. */
+       status = e_dialog_combo_box_get (priv->status_combo, status_map);
+       e_cal_component_set_status (comp, status);
+
+       /* Priority. */
+       priority = e_dialog_combo_box_get (priv->priority_combo, priority_map);
+       priority_value = priority_index_to_value (priority);
+       e_cal_component_set_priority (comp, &priority_value);
+
+       icalcomplete = icaltime_null_time ();
+
+       /* COMPLETED must be in UTC. */
+       icalcomplete.is_utc = 1;
+
+       /* Completed Date. */
+       if (!e_date_edit_date_is_valid (E_DATE_EDIT (priv->completed_date)) ||
+           !e_date_edit_time_is_valid (E_DATE_EDIT (priv->completed_date))) {
+               comp_editor_page_display_validation_error (
+                       page, _("Completed date is wrong"),
+                       priv->completed_date);
+               return FALSE;
+       }
+
+       date_set = e_date_edit_get_date (
+               E_DATE_EDIT (priv->completed_date),
+               &icalcomplete.year,
+               &icalcomplete.month,
+               &icalcomplete.day);
+
+       if (date_set) {
+               e_date_edit_get_time_of_day (
+                       E_DATE_EDIT (priv->completed_date),
+                       &icalcomplete.hour,
+                       &icalcomplete.minute);
+
+               /* COMPLETED today or before */
+               icaltoday = icaltime_current_time_with_zone (zone);
+               icaltimezone_convert_time (
+                       &icaltoday, zone,
+                       icaltimezone_get_utc_timezone ());
+
+               if (icaltime_compare_date_only (icalcomplete, icaltoday) > 0) {
+                       comp_editor_page_display_validation_error (
+                               page, _("Completed date is wrong"),
+                               priv->completed_date);
+                       return FALSE;
+               }
+
+               /* COMPLETED must be in UTC, so we assume that the date in the
+                * dialog is in the current timezone, and we now convert it
+                * to UTC. 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. */
+               icaltimezone_convert_time (
+                       &icalcomplete, zone,
+                               icaltimezone_get_utc_timezone ());
+               e_cal_component_set_completed (comp, &icalcomplete);
+       } else {
+               e_cal_component_set_completed (comp, NULL);
+       }
+
+       /* URL. */
+       text = gtk_entry_get_text (GTK_ENTRY (e_url_entry_get_entry (E_URL_ENTRY (priv->web_page_entry))));
+       e_cal_component_set_url (comp, text);
+
        return TRUE;
 }
 
@@ -997,6 +1242,16 @@ task_page_fill_timezones (CompEditorPage *page,
                        g_hash_table_insert (timezones, (gpointer) icaltimezone_get_tzid (zone), zone);
        }
 
+       /* Add UTC timezone, which is the one
+        * used for the DATE-COMPLETED property. */
+       zone = icaltimezone_get_utc_timezone ();
+       if (zone != NULL) {
+               gconstpointer tzid = icaltimezone_get_tzid (zone);
+
+               if (!g_hash_table_lookup (timezones, tzid))
+                       g_hash_table_insert (timezones, (gpointer) tzid, zone);
+       }
+
        return TRUE;
 }
 
@@ -1495,6 +1750,13 @@ get_widgets (TaskPage *tpage)
        priv->start_date = e_builder_get_widget (priv->builder, "start-date");
        gtk_widget_show (priv->start_date);
 
+       priv->completed_date = e_builder_get_widget (priv->builder, "completed-date");
+       priv->status_combo = e_builder_get_widget (priv->builder, "status-combobox");
+       priv->priority_combo = e_builder_get_widget (priv->builder, "priority-combobox");
+       priv->percent_complete = e_builder_get_widget (priv->builder, "percent-complete");
+       priv->classification_combo = e_builder_get_widget (priv->builder, "classification-combobox");
+       priv->web_page_entry = e_builder_get_widget (priv->builder, "web-page-entry");
+
        priv->timezone = e_builder_get_widget (priv->builder, "timezone");
        priv->timezone_label = e_builder_get_widget (priv->builder, "timezone-label");
        priv->attendees_label = e_builder_get_widget (priv->builder, "attendees-label");
@@ -1548,6 +1810,12 @@ get_widgets (TaskPage *tpage)
                && priv->categories_btn
                && priv->categories
                && priv->organizer
+               && priv->completed_date
+               && priv->status_combo
+               && priv->priority_combo
+               && priv->percent_complete
+               && priv->classification_combo
+               && priv->web_page_entry
                );
 }
 
@@ -1914,6 +2182,210 @@ task_page_send_options_clicked_cb (TaskPage *tpage)
        e_send_options_dialog_run (priv->sod, toplevel, E_ITEM_TASK);
 }
 
+static void
+complete_date_changed (TaskPage *tpage,
+                       time_t ctime,
+                       gboolean complete)
+{
+       CompEditorPageDates dates = {NULL, NULL, NULL, NULL};
+       icaltimezone *zone;
+       struct icaltimetype completed_tt = icaltime_null_time ();
+
+       /* 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 (tpage),
+                                              &dates);
+}
+
+static void
+completed_date_changed_cb (EDateEdit *dedit,
+                          TaskPage *tpage)
+{
+       TaskPagePrivate *priv = tpage->priv;
+       CompEditorPageDates dates = {NULL, NULL, NULL, NULL};
+       struct icaltimetype completed_tt = icaltime_null_time ();
+       icalproperty_status status;
+       gboolean date_set;
+
+       if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tpage)))
+               return;
+
+       comp_editor_page_set_updating (COMP_EDITOR_PAGE (tpage), TRUE);
+
+       date_set = e_date_edit_get_date (
+               E_DATE_EDIT (priv->completed_date),
+               &completed_tt.year,
+               &completed_tt.month,
+               &completed_tt.day);
+       e_date_edit_get_time_of_day (
+               E_DATE_EDIT (priv->completed_date),
+               &completed_tt.hour,
+               &completed_tt.minute);
+
+       status = e_dialog_combo_box_get (priv->status_combo, status_map);
+
+       if (!date_set) {
+               completed_tt = icaltime_null_time ();
+               if (status == ICAL_STATUS_COMPLETED) {
+                       e_dialog_combo_box_set (
+                               priv->status_combo,
+                               ICAL_STATUS_NONE,
+                               status_map);
+                       gtk_spin_button_set_value (
+                               GTK_SPIN_BUTTON (priv->percent_complete), 0);
+               }
+       } else {
+               if (status != ICAL_STATUS_COMPLETED) {
+                       e_dialog_combo_box_set (
+                               priv->status_combo,
+                               ICAL_STATUS_COMPLETED,
+                               status_map);
+               }
+               gtk_spin_button_set_value (
+                       GTK_SPIN_BUTTON (priv->percent_complete), 100);
+       }
+
+       comp_editor_page_set_updating (COMP_EDITOR_PAGE (tpage), FALSE);
+
+       /* Notify upstream */
+       dates.complete = &completed_tt;
+       comp_editor_page_notify_dates_changed (COMP_EDITOR_PAGE (tpage), &dates);
+}
+
+static void
+status_changed (GtkWidget *combo,
+                TaskPage *tpage)
+{
+       TaskPagePrivate *priv;
+       icalproperty_status status;
+       CompEditor *editor;
+       time_t ctime = -1;
+
+       priv = tpage->priv;
+
+       if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tpage)))
+               return;
+
+       editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
+
+       comp_editor_page_set_updating (COMP_EDITOR_PAGE (tpage), TRUE);
+
+       status = e_dialog_combo_box_get (priv->status_combo, status_map);
+       if (status == ICAL_STATUS_NONE) {
+               gtk_spin_button_set_value (
+                       GTK_SPIN_BUTTON (priv->percent_complete), 0);
+               e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
+               complete_date_changed (tpage, 0, FALSE);
+       } else if (status == ICAL_STATUS_INPROCESS) {
+               gint percent_complete = gtk_spin_button_get_value_as_int (
+                       GTK_SPIN_BUTTON (priv->percent_complete));
+               if (percent_complete <= 0 || percent_complete >= 100)
+                       gtk_spin_button_set_value (
+                               GTK_SPIN_BUTTON (priv->percent_complete), 50);
+
+               e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
+               complete_date_changed (tpage, 0, FALSE);
+       } else if (status == ICAL_STATUS_COMPLETED) {
+               gtk_spin_button_set_value (
+                       GTK_SPIN_BUTTON (priv->percent_complete), 100);
+               ctime = time (NULL);
+               e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
+               complete_date_changed (tpage, ctime, TRUE);
+       }
+
+       comp_editor_page_set_updating (COMP_EDITOR_PAGE (tpage), FALSE);
+
+       comp_editor_set_changed (editor, TRUE);
+}
+
+static void
+percent_complete_changed (GtkAdjustment *adj,
+                          TaskPage *tpage)
+{
+       TaskPagePrivate *priv;
+       gint percent;
+       icalproperty_status status;
+       CompEditor *editor;
+       gboolean complete;
+       time_t ctime = -1;
+
+       priv = tpage->priv;
+
+       if (comp_editor_page_get_updating (COMP_EDITOR_PAGE (tpage)))
+               return;
+
+       editor = comp_editor_page_get_editor (COMP_EDITOR_PAGE (tpage));
+
+       comp_editor_page_set_updating (COMP_EDITOR_PAGE (tpage), TRUE);
+
+       percent = gtk_spin_button_get_value_as_int (
+               GTK_SPIN_BUTTON (priv->percent_complete));
+       if (percent == 100) {
+               complete = TRUE;
+               ctime = time (NULL);
+               status = ICAL_STATUS_COMPLETED;
+       } else {
+               complete = FALSE;
+
+               if (percent == 0)
+                       status = ICAL_STATUS_NONE;
+               else
+                       status = ICAL_STATUS_INPROCESS;
+       }
+
+       e_dialog_combo_box_set (priv->status_combo, status, status_map);
+       e_date_edit_set_time (E_DATE_EDIT (priv->completed_date), ctime);
+       complete_date_changed (tpage, ctime, complete);
+
+       comp_editor_page_set_updating (COMP_EDITOR_PAGE (tpage), FALSE);
+
+       comp_editor_set_changed (editor, TRUE);
+}
+
+static gboolean
+task_page_transform_classification_to_combo (GBinding *binding,
+                                            const GValue *source_value,
+                                            GValue *target_value,
+                                            gpointer user_data)
+{
+       gint action_value;
+
+       g_return_val_if_fail (source_value != NULL, FALSE);
+       g_return_val_if_fail (target_value != NULL, FALSE);
+
+       action_value = g_value_get_int (source_value);
+       g_value_set_int (target_value, action_value - 1);
+
+       return TRUE;
+}
+
+static gboolean
+task_page_transform_classification_from_combo (GBinding *binding,
+                                              const GValue *source_value,
+                                              GValue *target_value,
+                                              gpointer user_data)
+{
+       gint combo_value;
+
+       g_return_val_if_fail (source_value != NULL, FALSE);
+       g_return_val_if_fail (target_value != NULL, FALSE);
+
+       combo_value = g_value_get_int (source_value);
+       g_value_set_int (target_value, combo_value + 1);
+
+       return TRUE;
+}
+
 /* Hooks the widget signals */
 static gboolean
 init_widgets (TaskPage *tpage)
@@ -1924,6 +2396,7 @@ init_widgets (TaskPage *tpage)
        GtkTextBuffer *text_buffer;
        icaltimezone *zone;
        gboolean active;
+       GtkAdjustment *adjustment;
 
        priv = tpage->priv;
 
@@ -2045,6 +2518,45 @@ init_widgets (TaskPage *tpage)
        zone = comp_editor_get_timezone (editor);
        e_timezone_entry_set_default_timezone (E_TIMEZONE_ENTRY (priv->timezone), zone);
 
+       /* Make sure the EDateEdit widgets use our timezones to get the
+        * current time. */
+       e_date_edit_set_get_time_callback (
+               E_DATE_EDIT (priv->completed_date),
+               (EDateEditGetTimeCallback) comp_editor_get_current_time,
+               g_object_ref (editor),
+               (GDestroyNotify) g_object_unref);
+
+       /* Connect signals. The Status, Percent Complete & Date Completed
+        * properties are closely related so whenever one changes we may need
+        * to update the other 2. */
+       g_signal_connect (
+               GTK_COMBO_BOX (priv->status_combo), "changed",
+               G_CALLBACK (status_changed), tpage);
+
+       adjustment = gtk_spin_button_get_adjustment (
+               GTK_SPIN_BUTTON (priv->percent_complete));
+       g_signal_connect (
+               adjustment, "value_changed",
+               G_CALLBACK (percent_complete_changed), tpage);
+
+       /* Priority */
+       g_signal_connect_swapped (
+               GTK_COMBO_BOX (priv->priority_combo), "changed",
+               G_CALLBACK (comp_editor_page_changed), tpage);
+
+       /* Completed Date */
+       g_signal_connect (
+               priv->completed_date, "changed",
+               G_CALLBACK (completed_date_changed_cb), tpage);
+       g_signal_connect_swapped (
+               priv->completed_date, "changed",
+               G_CALLBACK (comp_editor_page_changed), tpage);
+
+       /* URL */
+       g_signal_connect_swapped (
+               e_url_entry_get_entry (E_URL_ENTRY (priv->web_page_entry)), "changed",
+               G_CALLBACK (comp_editor_page_changed), tpage);
+
        action = comp_editor_get_action (editor, "view-time-zone");
        active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        task_page_set_show_timezone (tpage, active);
@@ -2076,6 +2588,16 @@ init_widgets (TaskPage *tpage)
        active = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        task_page_set_show_categories (tpage, active);
 
+       /* Classification */
+       action = comp_editor_get_action (editor, "classify-public");
+       g_object_bind_property_full (
+               action, "current-value",
+               priv->classification_combo, "active",
+               G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
+               task_page_transform_classification_to_combo,
+               task_page_transform_classification_from_combo,
+               NULL, NULL);
+
        return TRUE;
 }
 
diff --git a/calendar/gui/dialogs/task-page.ui b/calendar/gui/dialogs/task-page.ui
index 79ab450..8269f09 100644
--- a/calendar/gui/dialogs/task-page.ui
+++ b/calendar/gui/dialogs/task-page.ui
@@ -1,27 +1,90 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <!-- interface-requires gtk+ 2.12 -->
-  <!-- interface-requires evolution 0.0 -->
-  <!-- interface-naming-policy toplevel-contextual -->
+  <!-- interface-requires gtk+ 3.0 -->
+  <object class="GtkListStore" id="classification-model">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task classification">Public</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task classification">Private</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task 
classification">Confidential</col>
+      </row>
+    </data>
+  </object>
   <object class="GtkListStore" id="model1">
     <columns>
       <!-- column-name gchararray -->
       <column type="gchararray"/>
     </columns>
   </object>
+  <object class="GtkAdjustment" id="percent-adjustment">
+    <property name="upper">100</property>
+    <property name="step_increment">1</property>
+    <property name="page_increment">10</property>
+  </object>
+  <object class="GtkListStore" id="priority-model">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task priority">High</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task priority">Normal</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task priority">Low</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task priority">Undefined</col>
+      </row>
+    </data>
+  </object>
+  <object class="GtkListStore" id="status-model">
+    <columns>
+      <!-- column-name gchararray -->
+      <column type="gchararray"/>
+    </columns>
+    <data>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task status">Not Started</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task status">In Progress</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task status">Completed</col>
+      </row>
+      <row>
+        <col id="0" translatable="yes" comments="To Translators: This is task status">Canceled</col>
+      </row>
+    </data>
+  </object>
   <object class="GtkWindow" id="task-toplevel">
+    <property name="can_focus">False</property>
     <property name="title">window1</property>
     <child>
       <object class="GtkVBox" id="task-page">
         <property name="visible">True</property>
+        <property name="can_focus">False</property>
         <property name="border_width">3</property>
-        <property name="orientation">vertical</property>
         <property name="spacing">6</property>
         <child>
           <object class="GtkHBox" id="generic-info">
+            <property name="can_focus">False</property>
             <child>
               <object class="GtkImage" id="generic-info-image">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -33,6 +96,7 @@
             <child>
               <object class="GtkLabel" id="generic-info-msgs">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
               </object>
               <packing>
                 <property name="expand">False</property>
@@ -51,15 +115,18 @@
         <child>
           <object class="GtkHBox" id="hbox7">
             <property name="visible">True</property>
+            <property name="can_focus">False</property>
             <child>
               <object class="GtkHBox" id="hbox15">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <child>
                   <placeholder/>
                 </child>
               </object>
               <packing>
                 <property name="expand">False</property>
+                <property name="fill">True</property>
                 <property name="padding">4</property>
                 <property name="position">0</property>
               </packing>
@@ -67,13 +134,15 @@
             <child>
               <object class="GtkTable" id="table3">
                 <property name="visible">True</property>
-                <property name="n_rows">8</property>
-                <property name="n_columns">2</property>
+                <property name="can_focus">False</property>
+                <property name="n_rows">10</property>
+                <property name="n_columns">4</property>
                 <property name="column_spacing">12</property>
                 <child>
                   <object class="GtkLabel" id="summary-label">
                     <property name="visible">True</property>
-                    <property name="xalign">0</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
                     <property name="label" translatable="yes">Su_mmary:</property>
                     <property name="use_underline">True</property>
                     <property name="justify">center</property>
@@ -83,25 +152,27 @@
                     <property name="top_attach">2</property>
                     <property name="bottom_attach">3</property>
                     <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
+                    <property name="y_options"/>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkLabel" id="org-task-label">
                     <property name="visible">True</property>
-                    <property name="xalign">0</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
                     <property name="label" translatable="yes">Organi_zer:</property>
                     <property name="use_underline">True</property>
                   </object>
                   <packing>
                     <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
+                    <property name="y_options"/>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkLabel" id="due-date-label">
                     <property name="visible">True</property>
-                    <property name="xalign">0</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
                     <property name="label" translatable="yes">D_ue date:</property>
                     <property name="use_underline">True</property>
                     <property name="justify">center</property>
@@ -111,13 +182,14 @@
                     <property name="top_attach">4</property>
                     <property name="bottom_attach">5</property>
                     <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
+                    <property name="y_options"/>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkLabel" id="start-date-label">
                     <property name="visible">True</property>
-                    <property name="xalign">0</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
                     <property name="label" translatable="yes">Sta_rt date:</property>
                     <property name="use_underline">True</property>
                     <property name="justify">center</property>
@@ -127,7 +199,7 @@
                     <property name="top_attach">3</property>
                     <property name="bottom_attach">4</property>
                     <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
+                    <property name="y_options"/>
                   </packing>
                 </child>
                 <child>
@@ -139,29 +211,31 @@
                     <property name="use_underline">True</property>
                   </object>
                   <packing>
-                    <property name="top_attach">6</property>
-                    <property name="bottom_attach">7</property>
+                    <property name="top_attach">8</property>
+                    <property name="bottom_attach">9</property>
                     <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
+                    <property name="y_options"/>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkLabel" id="timezone-label">
                     <property name="visible">True</property>
-                    <property name="xalign">0</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
                     <property name="label" translatable="yes">Time zone:</property>
                   </object>
                   <packing>
-                    <property name="top_attach">5</property>
-                    <property name="bottom_attach">6</property>
+                    <property name="top_attach">7</property>
+                    <property name="bottom_attach">8</property>
                     <property name="x_options">GTK_FILL</property>
-                    <property name="y_options"></property>
+                    <property name="y_options"/>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkLabel" id="label18">
                     <property name="visible">True</property>
-                    <property name="xalign">0</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
                     <property name="yalign">0</property>
                     <property name="label" translatable="yes">_Description:</property>
                     <property name="use_underline">True</property>
@@ -169,8 +243,8 @@
                     <property name="mnemonic_widget">description</property>
                   </object>
                   <packing>
-                    <property name="top_attach">7</property>
-                    <property name="bottom_attach">8</property>
+                    <property name="top_attach">9</property>
+                    <property name="bottom_attach">10</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options">GTK_FILL</property>
                   </packing>
@@ -219,9 +293,9 @@
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
-                    <property name="top_attach">5</property>
-                    <property name="bottom_attach">6</property>
+                    <property name="right_attach">4</property>
+                    <property name="top_attach">7</property>
+                    <property name="bottom_attach">8</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options">GTK_FILL</property>
                     <property name="y_padding">3</property>
@@ -229,12 +303,10 @@
                 </child>
                 <child>
                   <object class="GtkScrolledWindow" id="scrolledwindow1">
+                    <property name="height_request">100</property>
                     <property name="visible">True</property>
                     <property name="can_focus">False</property>
-                    <property name="hscrollbar_policy">automatic</property>
-                    <property name="vscrollbar_policy">automatic</property>
                     <property name="shadow_type">in</property>
-                    <property name="height_request">100</property>
                     <child>
                       <object class="GtkTextView" id="description">
                         <property name="width_request">400</property>
@@ -247,9 +319,9 @@
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
-                    <property name="top_attach">7</property>
-                    <property name="bottom_attach">8</property>
+                    <property name="right_attach">4</property>
+                    <property name="top_attach">9</property>
+                    <property name="bottom_attach">10</property>
                     <property name="y_padding">3</property>
                   </packing>
                 </child>
@@ -260,16 +332,17 @@
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
+                    <property name="right_attach">4</property>
                     <property name="top_attach">2</property>
                     <property name="bottom_attach">3</property>
-                    <property name="y_options"></property>
+                    <property name="y_options"/>
                     <property name="y_padding">3</property>
                   </packing>
                 </child>
                 <child>
                   <object class="GtkHBox" id="list-box">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <property name="spacing">6</property>
                     <child>
                       <placeholder/>
@@ -277,7 +350,7 @@
                     <child>
                       <object class="GtkVButtonBox" id="attendee-box">
                         <property name="visible">True</property>
-                        <property name="orientation">vertical</property>
+                        <property name="can_focus">False</property>
                         <property name="layout_style">start</property>
                         <child>
                           <object class="GtkButton" id="add-attendee">
@@ -327,6 +400,7 @@
                       </object>
                       <packing>
                         <property name="expand">False</property>
+                        <property name="fill">True</property>
                         <property name="pack_type">end</property>
                         <property name="position">1</property>
                       </packing>
@@ -334,7 +408,7 @@
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
+                    <property name="right_attach">4</property>
                     <property name="top_attach">1</property>
                     <property name="bottom_attach">2</property>
                     <property name="x_options">GTK_FILL</property>
@@ -345,7 +419,7 @@
                 <child>
                   <object class="GtkVBox" id="vbox1">
                     <property name="visible">True</property>
-                    <property name="orientation">vertical</property>
+                    <property name="can_focus">False</property>
                     <child>
                       <object class="GtkButton" id="invite">
                         <property name="visible">True</property>
@@ -354,15 +428,18 @@
                         <child>
                           <object class="GtkAlignment" id="alignment1">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
                             <property name="xscale">0</property>
                             <property name="yscale">0</property>
                             <child>
                               <object class="GtkHBox" id="hbox14">
                                 <property name="visible">True</property>
+                                <property name="can_focus">False</property>
                                 <property name="spacing">2</property>
                                 <child>
                                   <object class="GtkImage" id="image1">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <property name="stock">gtk-jump-to</property>
                                   </object>
                                   <packing>
@@ -374,6 +451,7 @@
                                 <child>
                                   <object class="GtkLabel" id="attendees-label">
                                     <property name="visible">True</property>
+                                    <property name="can_focus">False</property>
                                     <property name="label" translatable="yes">Atte_ndees...</property>
                                     <property name="use_underline">True</property>
                                   </object>
@@ -408,26 +486,38 @@
                 <child>
                   <object class="GtkHBox" id="hbox12">
                     <property name="visible">True</property>
+                    <property name="can_focus">False</property>
                     <property name="spacing">6</property>
                     <property name="homogeneous">True</property>
                     <child>
                       <object class="GtkComboBox" id="organizer">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="model">model1</property>
-                        <property name="has-entry">True</property>
-                        <property name="entry-text-column">0</property>
+                        <property name="has_entry">True</property>
+                        <property name="entry_text_column">0</property>
+                        <child internal-child="entry">
+                          <object class="GtkEntry" id="combobox-entry2">
+                            <property name="can_focus">False</property>
+                          </object>
+                        </child>
                       </object>
                       <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
                         <property name="position">0</property>
                       </packing>
                     </child>
                     <child>
                       <object class="GtkHBox" id="hbox13">
                         <property name="visible">True</property>
+                        <property name="can_focus">False</property>
                         <property name="spacing">6</property>
                         <child>
                           <object class="GtkLabel" id="group-label">
                             <property name="visible">True</property>
+                            <property name="can_focus">False</property>
+                            <property name="xalign">1</property>
                             <property name="label" translatable="yes">_List:</property>
                             <property name="use_underline">True</property>
                           </object>
@@ -444,20 +534,22 @@
                             <property name="visible">True</property>
                           </object>
                           <packing>
-                            <property name="position">1</property>
                             <property name="expand">True</property>
                             <property name="fill">True</property>
+                            <property name="position">1</property>
                           </packing>
                         </child>
                       </object>
                       <packing>
+                        <property name="expand">True</property>
+                        <property name="fill">True</property>
                         <property name="position">1</property>
                       </packing>
                     </child>
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
-                    <property name="right_attach">2</property>
+                    <property name="right_attach">4</property>
                     <property name="x_options">GTK_FILL</property>
                     <property name="y_options">GTK_FILL</property>
                     <property name="y_padding">3</property>
@@ -470,33 +562,258 @@
                   </object>
                   <packing>
                     <property name="left_attach">1</property>
+                    <property name="right_attach">4</property>
+                    <property name="top_attach">8</property>
+                    <property name="bottom_attach">9</property>
+                    <property name="y_options"/>
+                    <property name="y_padding">3</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="status-label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">_Status:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">status-combobox</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">2</property>
+                    <property name="right_attach">3</property>
+                    <property name="top_attach">3</property>
+                    <property name="bottom_attach">4</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options">GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="completed-date-label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">Date _completed:</property>
+                    <property name="use_underline">True</property>
+                    <property name="justify">center</property>
+                    <property name="mnemonic_widget">completed-date</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">5</property>
+                    <property name="bottom_attach">6</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="EDateEdit" type-func="e_date_edit_get_type" id="completed-date">
+                    <property name="visible">True</property>
+                    <property name="show-date">True</property>
+                    <property name="show-time">False</property>
+                    <property name="allow-no-date-set">True</property>
+                    <accessibility>
+                      <relation target="completed-date-label" type="labelled-by"/>
+                    </accessibility>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
+                    <property name="right_attach">2</property>
+                    <property name="top_attach">5</property>
+                    <property name="bottom_attach">6</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options">GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="percent-complete-label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">_Percent complete:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">percent-complete</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">2</property>
+                    <property name="right_attach">3</property>
+                    <property name="top_attach">5</property>
+                    <property name="bottom_attach">6</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options">GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="priority-label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">Priorit_y:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">priority-combobox</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">2</property>
+                    <property name="right_attach">3</property>
+                    <property name="top_attach">4</property>
+                    <property name="bottom_attach">5</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options">GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="classification-label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">C_lassification:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">classification-combobox</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">2</property>
+                    <property name="right_attach">3</property>
+                    <property name="top_attach">6</property>
+                    <property name="bottom_attach">7</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options">GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkLabel" id="web-page-label">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="xalign">1</property>
+                    <property name="label" translatable="yes">_Web Page:</property>
+                    <property name="use_underline">True</property>
+                    <property name="mnemonic_widget">web-page-entry</property>
+                  </object>
+                  <packing>
+                    <property name="top_attach">6</property>
+                    <property name="bottom_attach">7</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options">GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkComboBox" id="status-combobox">
+                    <property name="width_request">150</property>
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="model">status-model</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="renderer2"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="left_attach">3</property>
+                    <property name="right_attach">4</property>
+                    <property name="top_attach">3</property>
+                    <property name="bottom_attach">4</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkComboBox" id="priority-combobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="model">priority-model</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="renderer1"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="left_attach">3</property>
+                    <property name="right_attach">4</property>
+                    <property name="top_attach">4</property>
+                    <property name="bottom_attach">5</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkComboBox" id="classification-combobox">
+                    <property name="visible">True</property>
+                    <property name="can_focus">False</property>
+                    <property name="model">classification-model</property>
+                    <child>
+                      <object class="GtkCellRendererText" id="renderer4"/>
+                      <attributes>
+                        <attribute name="text">0</attribute>
+                      </attributes>
+                    </child>
+                  </object>
+                  <packing>
+                    <property name="left_attach">3</property>
+                    <property name="right_attach">4</property>
+                    <property name="top_attach">6</property>
+                    <property name="bottom_attach">7</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"/>
+                  </packing>
+                </child>
+                <child>
+                  <object class="EUrlEntry" type-func="e_url_entry_get_type" id="web-page-entry">
+                    <property name="visible">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">1</property>
                     <property name="right_attach">2</property>
                     <property name="top_attach">6</property>
                     <property name="bottom_attach">7</property>
-                    <property name="y_options"></property>
-                    <property name="y_padding">3</property>
+                    <property name="y_options">GTK_FILL</property>
+                  </packing>
+                </child>
+                <child>
+                  <object class="GtkSpinButton" id="percent-complete">
+                    <property name="visible">True</property>
+                    <property name="can_focus">True</property>
+                    <property name="invisible_char">●</property>
+                    <property name="invisible_char_set">True</property>
+                    <property name="adjustment">percent-adjustment</property>
+                    <property name="climb_rate">1</property>
+                    <property name="numeric">True</property>
+                  </object>
+                  <packing>
+                    <property name="left_attach">3</property>
+                    <property name="right_attach">4</property>
+                    <property name="top_attach">5</property>
+                    <property name="bottom_attach">6</property>
+                    <property name="x_options">GTK_FILL</property>
+                    <property name="y_options"/>
                   </packing>
                 </child>
               </object>
               <packing>
+                <property name="expand">True</property>
+                <property name="fill">True</property>
                 <property name="position">1</property>
               </packing>
             </child>
             <child>
               <object class="GtkHBox" id="hbox16">
                 <property name="visible">True</property>
+                <property name="can_focus">False</property>
                 <child>
                   <placeholder/>
                 </child>
               </object>
               <packing>
                 <property name="expand">False</property>
+                <property name="fill">True</property>
                 <property name="padding">4</property>
                 <property name="position">2</property>
               </packing>
             </child>
           </object>
           <packing>
+            <property name="expand">True</property>
+            <property name="fill">True</property>
             <property name="position">1</property>
           </packing>
         </child>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 7f8dc04..6b7b1da 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -75,8 +75,6 @@ calendar/gui/dialogs/schedule-page.c
 [type: gettext/glade]calendar/gui/dialogs/schedule-page.ui
 calendar/gui/dialogs/select-source-dialog.c
 calendar/gui/dialogs/send-comp.c
-calendar/gui/dialogs/task-details-page.c
-[type: gettext/glade]calendar/gui/dialogs/task-details-page.ui
 calendar/gui/dialogs/task-editor.c
 calendar/gui/dialogs/task-page.c
 [type: gettext/glade]calendar/gui/dialogs/task-page.ui


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