diff options
author | Damon Chaplin <damon@helixcode.com> | 2000-09-06 08:13:05 +0800 |
---|---|---|
committer | Damon Chaplin <damon@src.gnome.org> | 2000-09-06 08:13:05 +0800 |
commit | e8648e48175c1b6d26bff5316c2c7d738245a63c (patch) | |
tree | b6dcd1e5670462fe810b90a601013556d5db2604 /calendar/gui/dialogs | |
parent | 6403bd5b4def7c610285d2aaad10e793b321091d (diff) | |
download | gsoc2013-evolution-e8648e48175c1b6d26bff5316c2c7d738245a63c.tar gsoc2013-evolution-e8648e48175c1b6d26bff5316c2c7d738245a63c.tar.gz gsoc2013-evolution-e8648e48175c1b6d26bff5316c2c7d738245a63c.tar.bz2 gsoc2013-evolution-e8648e48175c1b6d26bff5316c2c7d738245a63c.tar.lz gsoc2013-evolution-e8648e48175c1b6d26bff5316c2c7d738245a63c.tar.xz gsoc2013-evolution-e8648e48175c1b6d26bff5316c2c7d738245a63c.tar.zst gsoc2013-evolution-e8648e48175c1b6d26bff5316c2c7d738245a63c.zip |
uses the new TaskEditor dialog.
2000-09-06 Damon Chaplin <damon@helixcode.com>
* gui/e-calendar-table.c (e_calendar_table_open_task): uses the new
TaskEditor dialog.
* gui/dialogs/task-editor.[hc]:
* gui/dialogs/task-editor-dialog.glade: updated. Still need to fix the
'Status' property (CalComponent doesn't support it yet), and use a
replacement for GnomeDateEdit, since we need to support setting 'None'
as the date.
2000-09-04 Damon Chaplin <damon@helixcode.com>
* gui/event-editor.c (obj_updated_cb):
(obj_removed_cb): compare the updated object's uid with the one we
are editing, and just return if it doesn't match.
2000-09-01 Damon Chaplin <damon@helixcode.com>
* gui/gnome-cal.c (gnome_calendar_tag_calendar): added check to see
if the client has loaded successfully. Gets rid of a few warnings.
svn path=/trunk/; revision=5217
Diffstat (limited to 'calendar/gui/dialogs')
-rw-r--r-- | calendar/gui/dialogs/task-editor-dialog.glade | 386 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-editor-dialog.glade.h | 16 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-editor.c | 929 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-editor.h | 5 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-page.glade | 386 |
5 files changed, 1186 insertions, 536 deletions
diff --git a/calendar/gui/dialogs/task-editor-dialog.glade b/calendar/gui/dialogs/task-editor-dialog.glade index 56f7f83422..8a8ca800d6 100644 --- a/calendar/gui/dialogs/task-editor-dialog.glade +++ b/calendar/gui/dialogs/task-editor-dialog.glade @@ -18,9 +18,11 @@ <class>GnomeApp</class> <name>task-editor-dialog</name> <visible>False</visible> + <title>task-editor-dialog</title> <type>GTK_WINDOW_TOPLEVEL</type> <position>GTK_WIN_POS_NONE</position> <modal>False</modal> + <default_height>350</default_height> <allow_shrink>False</allow_shrink> <allow_grow>True</allow_grow> <auto_shrink>False</auto_shrink> @@ -61,7 +63,7 @@ <widget> <class>GtkTable</class> <name>table3</name> - <rows>2</rows> + <rows>1</rows> <columns>2</columns> <homogeneous>False</homogeneous> <row_spacing>4</row_spacing> @@ -75,19 +77,19 @@ <widget> <class>GtkLabel</class> <name>label3</name> - <label>S_ubject:</label> + <label>S_ummary</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>entry1</default_focus_target> + <default_focus_target>summary</default_focus_target> <child> <left_attach>0</left_attach> <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> <xpad>0</xpad> <ypad>0</ypad> <xexpand>False</xexpand> @@ -101,7 +103,7 @@ <widget> <class>GtkEntry</class> - <name>entry1</name> + <name>summary</name> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> @@ -110,63 +112,11 @@ <child> <left_attach>1</left_attach> <right_attach>2</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label10</name> - <label>Owner:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> <top_attach>0</top_attach> <bottom_attach>1</bottom_attach> <xpad>0</xpad> <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label11</name> - <label></label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> + <xexpand>True</xexpand> <yexpand>False</yexpand> <xshrink>False</xshrink> <yshrink>False</yshrink> @@ -201,7 +151,7 @@ <class>GtkTable</class> <name>table1</name> <rows>2</rows> - <columns>2</columns> + <columns>4</columns> <homogeneous>False</homogeneous> <row_spacing>2</row_spacing> <column_spacing>4</column_spacing> @@ -213,9 +163,9 @@ <widget> <class>GnomeDateEdit</class> - <name>dateedit1</name> + <name>due-date</name> <show_time>True</show_time> - <use_24_format>False</use_24_format> + <use_24_format>True</use_24_format> <week_start_monday>False</week_start_monday> <lower_hour>7</lower_hour> <upper_hour>19</upper_hour> @@ -237,7 +187,7 @@ <widget> <class>GnomeDateEdit</class> - <name>dateedit2</name> + <name>start-date</name> <show_time>True</show_time> <use_24_format>True</use_24_format> <week_start_monday>False</week_start_monday> @@ -310,6 +260,66 @@ <yfill>False</yfill> </child> </widget> + + <widget> + <class>GtkLabel</class> + <name>label9</name> + <label>% Comp_lete:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <default_focus_target>percent-complete</default_focus_target> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>False</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkSpinButton</class> + <name>percent-complete</name> + <width>60</width> + <can_focus>True</can_focus> + <climb_rate>1</climb_rate> + <digits>0</digits> + <numeric>False</numeric> + <update_policy>GTK_UPDATE_ALWAYS</update_policy> + <snap>False</snap> + <wrap>False</wrap> + <value>0</value> + <lower>0</lower> + <upper>100</upper> + <step>10</step> + <page>10</page> + <page_size>10</page_size> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> </widget> </widget> @@ -344,7 +354,7 @@ <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>combo-entry1</default_focus_target> + <default_focus_target>status</default_focus_target> <child> <padding>0</padding> <expand>False</expand> @@ -353,35 +363,20 @@ </widget> <widget> - <class>GtkCombo</class> - <name>combo1</name> - <value_in_list>False</value_in_list> - <ok_if_empty>True</ok_if_empty> - <case_sensitive>False</case_sensitive> - <use_arrows>True</use_arrows> - <use_arrows_always>False</use_arrows_always> + <class>GtkOptionMenu</class> + <name>status</name> + <can_focus>True</can_focus> <items>Not Started In Progress Completed Cancelled </items> + <initial_choice>0</initial_choice> <child> <padding>0</padding> - <expand>True</expand> - <fill>True</fill> + <expand>False</expand> + <fill>False</fill> </child> - - <widget> - <class>GtkEntry</class> - <child_name>GtkCombo:entry</child_name> - <name>combo-entry1</name> - <width>60</width> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text>Not Started</text> - </widget> </widget> <widget> @@ -394,7 +389,7 @@ Cancelled <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>combo-entry2</default_focus_target> + <default_focus_target>priority</default_focus_target> <child> <padding>0</padding> <expand>False</expand> @@ -403,47 +398,32 @@ Cancelled </widget> <widget> - <class>GtkCombo</class> - <name>combo2</name> - <value_in_list>False</value_in_list> - <ok_if_empty>True</ok_if_empty> - <case_sensitive>False</case_sensitive> - <use_arrows>True</use_arrows> - <use_arrows_always>False</use_arrows_always> + <class>GtkOptionMenu</class> + <name>priority</name> + <can_focus>True</can_focus> <items>High Normal Low </items> + <initial_choice>0</initial_choice> <child> <padding>0</padding> - <expand>True</expand> - <fill>True</fill> + <expand>False</expand> + <fill>False</fill> </child> - - <widget> - <class>GtkEntry</class> - <child_name>GtkCombo:entry</child_name> - <name>combo-entry2</name> - <width>60</width> - <can_focus>True</can_focus> - <editable>False</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text>High</text> - </widget> </widget> <widget> <class>GtkLabel</class> - <name>label9</name> - <label>% Comp_lete:</label> + <name>label18</name> + <label>C_lassification:</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>spinbutton1</default_focus_target> + <default_focus_target>classification</default_focus_target> <child> <padding>0</padding> <expand>False</expand> @@ -452,25 +432,18 @@ Low </widget> <widget> - <class>GtkSpinButton</class> - <name>spinbutton1</name> + <class>GtkOptionMenu</class> + <name>classification</name> <can_focus>True</can_focus> - <climb_rate>1</climb_rate> - <digits>0</digits> - <numeric>False</numeric> - <update_policy>GTK_UPDATE_ALWAYS</update_policy> - <snap>False</snap> - <wrap>False</wrap> - <value>0</value> - <lower>0</lower> - <upper>100</upper> - <step>10</step> - <page>10</page> - <page_size>10</page_size> + <items>Public +Private +Confidential +</items> + <initial_choice>0</initial_choice> <child> <padding>0</padding> - <expand>True</expand> - <fill>True</fill> + <expand>False</expand> + <fill>False</fill> </child> </widget> </widget> @@ -490,8 +463,7 @@ Low <widget> <class>GtkText</class> - <name>text1</name> - <height>150</height> + <name>description</name> <can_focus>True</can_focus> <editable>True</editable> <text></text> @@ -513,17 +485,30 @@ Low <class>GtkButton</class> <name>button3</name> <can_focus>True</can_focus> - <label>_Contacts...</label> <child> <padding>0</padding> <expand>False</expand> <fill>False</fill> </child> + + <widget> + <class>GtkLabel</class> + <name>label16</name> + <sensitive>False</sensitive> + <label>_Contacts...</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>4</xpad> + <ypad>0</ypad> + </widget> </widget> <widget> <class>GtkEntry</class> - <name>entry2</name> + <name>contacts</name> + <sensitive>False</sensitive> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> @@ -540,17 +525,30 @@ Low <class>GtkButton</class> <name>button4</name> <can_focus>True</can_focus> - <label>Ca_tegories...</label> <child> <padding>0</padding> <expand>False</expand> <fill>False</fill> </child> + + <widget> + <class>GtkLabel</class> + <name>label17</name> + <sensitive>False</sensitive> + <label>Ca_tegories...</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>4</xpad> + <ypad>0</ypad> + </widget> </widget> <widget> <class>GtkEntry</class> - <name>entry3</name> + <name>categories</name> + <sensitive>False</sensitive> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> @@ -562,20 +560,6 @@ Low <fill>True</fill> </child> </widget> - - <widget> - <class>GtkCheckButton</class> - <name>checkbutton1</name> - <can_focus>True</can_focus> - <label>Private</label> - <active>False</active> - <draw_indicator>True</draw_indicator> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> </widget> </widget> @@ -596,7 +580,7 @@ Low <class>GtkTable</class> <name>table4</name> <border_width>4</border_width> - <rows>4</rows> + <rows>2</rows> <columns>2</columns> <homogeneous>False</homogeneous> <row_spacing>2</row_spacing> @@ -604,7 +588,7 @@ Low <widget> <class>GnomeDateEdit</class> - <name>dateedit3</name> + <name>completed-date</name> <show_time>True</show_time> <use_24_format>True</use_24_format> <week_start_monday>False</week_start_monday> @@ -654,32 +638,6 @@ Low <widget> <class>GtkLabel</class> - <name>label13</name> - <label>Location:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> <name>label14</name> <label>URL:</label> <justify>GTK_JUSTIFY_CENTER</justify> @@ -691,84 +649,10 @@ Low <child> <left_attach>0</left_attach> <right_attach>1</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry4</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> <top_attach>1</top_attach> <bottom_attach>2</bottom_attach> <xpad>0</xpad> <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry5</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label15</name> - <label>Resources:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> <xexpand>False</xexpand> <yexpand>False</yexpand> <xshrink>False</xshrink> @@ -780,7 +664,7 @@ Low <widget> <class>GtkEntry</class> - <name>entry6</name> + <name>url</name> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> @@ -789,8 +673,8 @@ Low <child> <left_attach>1</left_attach> <right_attach>2</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> <xpad>0</xpad> <ypad>0</ypad> <xexpand>True</xexpand> diff --git a/calendar/gui/dialogs/task-editor-dialog.glade.h b/calendar/gui/dialogs/task-editor-dialog.glade.h index 9ee959817f..9c20880b51 100644 --- a/calendar/gui/dialogs/task-editor-dialog.glade.h +++ b/calendar/gui/dialogs/task-editor-dialog.glade.h @@ -4,30 +4,30 @@ * DO NOT compile it as part of your application. */ -gchar *s = N_("S_ubject:"); -gchar *s = N_("Owner:"); +gchar *s = N_("task-editor-dialog"); +gchar *s = N_("S_ummary"); gchar *s = N_("Sta_rt Date:"); gchar *s = N_("_Due Date:"); +gchar *s = N_("% Comp_lete:"); gchar *s = N_("_Status:"); gchar *s = N_("Not Started\n" "In Progress\n" "Completed\n" "Cancelled\n" ""); -gchar *s = N_("Not Started"); gchar *s = N_("_Priority:"); gchar *s = N_("High\n" "Normal\n" "Low\n" ""); -gchar *s = N_("High"); -gchar *s = N_("% Comp_lete:"); +gchar *s = N_("C_lassification:"); +gchar *s = N_("Public\n" + "Private\n" + "Confidential\n" + ""); gchar *s = N_("_Contacts..."); gchar *s = N_("Ca_tegories..."); -gchar *s = N_("Private"); gchar *s = N_("Task"); gchar *s = N_("Date Completed:"); -gchar *s = N_("Location:"); gchar *s = N_("URL:"); -gchar *s = N_("Resources:"); gchar *s = N_("Details"); diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c index dd40c1b9df..a91278b84a 100644 --- a/calendar/gui/dialogs/task-editor.c +++ b/calendar/gui/dialogs/task-editor.c @@ -31,6 +31,8 @@ #include <gnome.h> #include <glade/glade.h> #include <e-util/e-util.h> +#include <e-util/e-dialog-widgets.h> +#include <cal-util/timeutil.h> #include <cal-client/cal-client.h> #include "task-editor.h" @@ -42,25 +44,118 @@ typedef struct { /* UI handler */ BonoboUIHandler *uih; + /* Client to use */ + CalClient *client; + /* Calendar component we are editing; this is an internal copy and is * not one of the read-only objects from the parent calendar. */ CalComponent *comp; + + /* This is TRUE while we are setting the widget values. We just return + from any signal handlers. */ + gboolean ignore_callbacks; + /* Widgets from the Glade file */ GtkWidget *app; + + GtkWidget *summary; + + GtkWidget *due_date; + GtkWidget *start_date; + + GtkWidget *percent_complete; + + GtkWidget *status; + GtkWidget *priority; + GtkWidget *classification; + + GtkWidget *description; + + GtkWidget *contacts; + GtkWidget *categories; + + GtkWidget *completed_date; + GtkWidget *url; } TaskEditorPrivate; +/* CalComponent doesn't support status yet, so we use this temporarily. */ +typedef enum { + STATUS_NOT_STARTED, + STATUS_IN_PROGRESS, + STATUS_COMPLETED, + STATUS_CANCELLED +} TaskEditorStatus; + +static const int status_map[] = { + STATUS_NOT_STARTED, + STATUS_IN_PROGRESS, + STATUS_COMPLETED, + 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 const int classification_map[] = { + CAL_COMPONENT_CLASS_PUBLIC, + CAL_COMPONENT_CLASS_PRIVATE, + CAL_COMPONENT_CLASS_CONFIDENTIAL, + -1 +}; + static void task_editor_class_init (TaskEditorClass *class); static void task_editor_init (TaskEditor *tedit); -TaskEditor * task_editor_construct (TaskEditor *tedit); +static gint app_delete_event_cb (GtkWidget *widget, + GdkEvent *event, + gpointer data); +static void close_dialog (TaskEditor *tedit); static gboolean get_widgets (TaskEditor *tedit); static void init_widgets (TaskEditor *tedit); static void create_menu (TaskEditor *tedit); static void create_toolbar (TaskEditor *tedit); static void task_editor_destroy (GtkObject *object); +static char * make_title_from_comp (CalComponent *comp); +static void clear_widgets (TaskEditor *tedit); +static void fill_widgets (TaskEditor *tedit); + +static void file_save_cb (GtkWidget *widget, gpointer data); +static void file_save_and_close_cb (GtkWidget *widget, gpointer data); +static void file_delete_cb (GtkWidget *widget, gpointer data); +static void file_close_cb (GtkWidget *widget, gpointer data); + +static void save_todo_object (TaskEditor *tedit); +static void dialog_to_comp_object (TaskEditor *tedit); + +static void obj_updated_cb (CalClient *client, const char *uid, gpointer data); +static void obj_removed_cb (CalClient *client, const char *uid, gpointer data); +static void raise_and_focus (GtkWidget *widget); + +static TaskEditorPriority priority_value_to_index (int priority_value); +static int priority_index_to_value (TaskEditorPriority priority); + +static void completed_date_changed (GnomeDateEdit *dedit, + TaskEditor *tedit); +static void status_changed (GtkMenu *menu, + TaskEditor *tedit); +static void percent_complete_changed (GtkAdjustment *adj, + TaskEditor *tedit); static GtkObjectClass *parent_class; @@ -77,7 +172,6 @@ task_editor_class_init (TaskEditorClass *class) parent_class = gtk_type_class (GTK_TYPE_OBJECT); - object_class->destroy = task_editor_destroy; } @@ -89,6 +183,8 @@ task_editor_init (TaskEditor *tedit) priv = g_new0 (TaskEditorPrivate, 1); tedit->priv = priv; + + priv->ignore_callbacks = FALSE; } @@ -104,7 +200,6 @@ task_editor_new (void) TaskEditor *tedit; tedit = TASK_EDITOR (gtk_type_new (task_editor_get_type ())); - return task_editor_construct (tedit); } @@ -159,10 +254,8 @@ task_editor_construct (TaskEditor *tedit) /* Hook to destruction of the dialog */ -#if 0 gtk_signal_connect (GTK_OBJECT (priv->app), "delete_event", GTK_SIGNAL_FUNC (app_delete_event_cb), tedit); -#endif /* Show the dialog */ @@ -177,6 +270,35 @@ task_editor_construct (TaskEditor *tedit) } +/* Callback used when the dialog box is destroyed */ +static gint +app_delete_event_cb (GtkWidget *widget, GdkEvent *event, gpointer data) +{ + TaskEditor *tedit; + + /* FIXME: need to check for a dirty object */ + + tedit = TASK_EDITOR (data); + close_dialog (tedit); + + return TRUE; +} + + +/* Closes the dialog box and emits the appropriate signals */ +static void +close_dialog (TaskEditor *tedit) +{ + TaskEditorPrivate *priv; + + priv = tedit->priv; + + g_assert (priv->app != NULL); + + gtk_object_destroy (GTK_OBJECT (tedit)); +} + + /* Gets the widgets from the XML file and returns if they are all available. * For the widgets whose values can be simply set with e-dialog-utils, it does * that as well. @@ -192,7 +314,40 @@ get_widgets (TaskEditor *tedit) priv->app = GW ("task-editor-dialog"); - return TRUE; + priv->summary = GW ("summary"); + + priv->due_date = GW ("due-date"); + priv->start_date = GW ("start-date"); + + priv->percent_complete = GW ("percent-complete"); + + priv->status = GW ("status"); + priv->priority = GW ("priority"); + priv->classification = GW ("classification"); + + priv->description = GW ("description"); + + priv->contacts = GW ("contacts"); + priv->categories = GW ("categories"); + + priv->completed_date = GW ("completed-date"); + priv->url = GW ("url"); + +#undef GW + + return (priv->app + && priv->summary + && priv->due_date + && priv->start_date + && priv->percent_complete + && priv->status + && priv->priority + && priv->classification + && priv->description + && priv->contacts + && priv->categories + && priv->completed_date + && priv->url); } @@ -201,9 +356,59 @@ static void init_widgets (TaskEditor *tedit) { TaskEditorPrivate *priv; + GnomeDateEdit *gde; + GtkWidget *widget; priv = tedit->priv; + + /* 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 (priv->completed_date), "date_changed", + GTK_SIGNAL_FUNC (completed_date_changed), tedit); + gtk_signal_connect (GTK_OBJECT (priv->completed_date), "time_changed", + GTK_SIGNAL_FUNC (completed_date_changed), tedit); + + gtk_signal_connect (GTK_OBJECT (GTK_OPTION_MENU (priv->status)->menu), + "deactivate", + GTK_SIGNAL_FUNC (status_changed), tedit); + + gtk_signal_connect (GTK_OBJECT (GTK_SPIN_BUTTON (priv->percent_complete)->adjustment), + "value_changed", + GTK_SIGNAL_FUNC (percent_complete_changed), tedit); + + + /* Hide the stupid 'Calendar' labels. */ + gde = GNOME_DATE_EDIT (priv->due_date); + gtk_widget_hide (gde->cal_label); + widget = gde->date_entry; + gtk_box_set_child_packing (GTK_BOX (widget->parent), widget, + FALSE, FALSE, 0, GTK_PACK_START); + widget = gde->time_entry; + gtk_box_set_child_packing (GTK_BOX (widget->parent), widget, + FALSE, FALSE, 0, GTK_PACK_START); + gtk_box_set_spacing (GTK_BOX (widget->parent), 2); + + gde = GNOME_DATE_EDIT (priv->start_date); + gtk_widget_hide (gde->cal_label); + widget = gde->date_entry; + gtk_box_set_child_packing (GTK_BOX (widget->parent), widget, + FALSE, FALSE, 0, GTK_PACK_START); + widget = gde->time_entry; + gtk_box_set_child_packing (GTK_BOX (widget->parent), widget, + FALSE, FALSE, 0, GTK_PACK_START); + gtk_box_set_spacing (GTK_BOX (widget->parent), 2); + + gde = GNOME_DATE_EDIT (priv->completed_date); + gtk_widget_hide (gde->cal_label); + widget = gde->date_entry; + gtk_box_set_child_packing (GTK_BOX (widget->parent), widget, + FALSE, FALSE, 0, GTK_PACK_START); + widget = gde->time_entry; + gtk_box_set_child_packing (GTK_BOX (widget->parent), widget, + FALSE, FALSE, 0, GTK_PACK_START); + gtk_box_set_spacing (GTK_BOX (widget->parent), 2); } @@ -238,11 +443,12 @@ static GnomeUIInfo file_menu[] = { GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_ITEM_NONE (N_("FIXME: S_end"), NULL, NULL), GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_MENU_SAVE_ITEM (NULL, NULL), + GNOMEUIINFO_MENU_SAVE_ITEM (file_save_cb, NULL), GNOMEUIINFO_MENU_SAVE_AS_ITEM (NULL, NULL), GNOMEUIINFO_ITEM_NONE (N_("FIXME: Save Attac_hments..."), NULL, NULL), GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Delete"), NULL, NULL), + GNOMEUIINFO_ITEM_STOCK (N_("_Delete"), NULL, + file_delete_cb, GNOME_STOCK_PIXMAP_TRASH), GNOMEUIINFO_ITEM_NONE (N_("FIXME: _Move to Folder..."), NULL, NULL), GNOMEUIINFO_ITEM_NONE (N_("FIXME: Cop_y to Folder..."), NULL, NULL), GNOMEUIINFO_SEPARATOR, @@ -252,7 +458,7 @@ static GnomeUIInfo file_menu[] = { GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_MENU_PROPERTIES_ITEM (NULL, NULL), GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_MENU_CLOSE_ITEM (NULL, NULL), + GNOMEUIINFO_MENU_CLOSE_ITEM (file_close_cb, NULL), GNOMEUIINFO_END }; @@ -406,31 +612,43 @@ create_menu (TaskEditor *tedit) /* Toolbar */ static GnomeUIInfo toolbar[] = { - GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Save and Close"), + GNOMEUIINFO_ITEM_STOCK (N_("Save and Close"), N_("Save the task and close the dialog box"), - NULL, + file_save_and_close_cb, GNOME_STOCK_PIXMAP_SAVE), GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_ITEM_NONE (N_("FIXME: Print..."), - N_("Print this item"), NULL), - GNOMEUIINFO_ITEM_NONE (N_("FIXME: Insert File..."), - N_("Insert a file as an attachment"), NULL), - GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_ITEM_NONE (N_("FIXME: Recurrence..."), - N_("Configure recurrence rules"), NULL), + GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Print..."), + N_("Print this item"), + NULL, + GNOME_STOCK_PIXMAP_PRINT), + GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Insert File..."), + N_("Insert a file as an attachment"), + NULL, + GNOME_STOCK_PIXMAP_ATTACH), GNOMEUIINFO_SEPARATOR, +#if 0 GNOMEUIINFO_ITEM_NONE (N_("FIXME: Assign Task..."), - N_("Assign the task to someone"), NULL), + N_("Assign the task to someone"), + NULL), GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_ITEM_NONE (N_("FIXME: Delete"), - N_("Delete this item"), NULL), +#endif + GNOMEUIINFO_ITEM_STOCK (N_("Delete"), + N_("Delete this task"), + file_delete_cb, + GNOME_STOCK_PIXMAP_TRASH), GNOMEUIINFO_SEPARATOR, - GNOMEUIINFO_ITEM_NONE (N_("FIXME: Previous"), - N_("Go to the previous item"), NULL), - GNOMEUIINFO_ITEM_NONE (N_("FIXME: Next"), - N_("Go to the next item"), NULL), + GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Previous"), + N_("Go to the previous item"), + NULL, + GNOME_STOCK_PIXMAP_BACK), + GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Next"), + N_("Go to the next item"), + NULL, + GNOME_STOCK_PIXMAP_FORWARD), GNOMEUIINFO_ITEM_STOCK (N_("FIXME: Help"), - N_("See online help"), NULL, GNOME_STOCK_PIXMAP_HELP), + N_("See online help"), + NULL, + GNOME_STOCK_PIXMAP_HELP), GNOMEUIINFO_END }; @@ -469,13 +687,672 @@ static void task_editor_destroy (GtkObject *object) { TaskEditor *tedit; + TaskEditorPrivate *priv; g_return_if_fail (object != NULL); g_return_if_fail (IS_TASK_EDITOR (object)); tedit = TASK_EDITOR (object); + priv = tedit->priv; + if (priv->uih) { + bonobo_object_unref (BONOBO_OBJECT (priv->uih)); + priv->uih = NULL; + } + + if (priv->app) { + gtk_widget_destroy (priv->app); + priv->app = NULL; + } + + if (priv->comp) { + gtk_object_unref (GTK_OBJECT (priv->comp)); + priv->comp = NULL; + } + + if (priv->client) { + gtk_signal_disconnect_by_data (GTK_OBJECT (priv->client), + tedit); + gtk_object_unref (GTK_OBJECT (priv->client)); + priv->client = NULL; + } + + if (priv->xml) { + gtk_object_unref (GTK_OBJECT (priv->xml)); + priv->xml = NULL; + } + g_free (priv); + tedit->priv = NULL; + + if (GTK_OBJECT_CLASS (parent_class)->destroy) + (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } +void +task_editor_set_cal_client (TaskEditor *tedit, + CalClient *client) +{ + TaskEditorPrivate *priv; + + g_return_if_fail (tedit != NULL); + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + priv = tedit->priv; + + if (client == priv->client) + return; + + if (client) + g_return_if_fail (IS_CAL_CLIENT (client)); + + if (client) + g_return_if_fail (cal_client_is_loaded (client)); + + if (client) + gtk_object_ref (GTK_OBJECT (client)); + + if (priv->client) { + gtk_signal_disconnect_by_data (GTK_OBJECT (priv->client), + tedit); + gtk_object_unref (GTK_OBJECT (priv->client)); + } + + priv->client = client; + + if (priv->client) { + gtk_signal_connect (GTK_OBJECT (priv->client), "obj_updated", + GTK_SIGNAL_FUNC (obj_updated_cb), tedit); + gtk_signal_connect (GTK_OBJECT (priv->client), "obj_removed", + GTK_SIGNAL_FUNC (obj_removed_cb), tedit); + } +} + + +/* Callback used when the calendar client tells us that an object changed */ +static void +obj_updated_cb (CalClient *client, const char *uid, gpointer data) +{ + TaskEditor *tedit; + TaskEditorPrivate *priv; + CalComponent *comp; + CalClientGetStatus status; + const gchar *editing_uid; + + tedit = TASK_EDITOR (data); + + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + priv = tedit->priv; + + /* If we aren't showing the object which has been updated, return. */ + if (!priv->comp) + return; + cal_component_get_uid (priv->comp, &editing_uid); + if (strcmp (uid, editing_uid)) + return; + + + /* Get the task from the server. */ + status = cal_client_get_object (priv->client, uid, &comp); + + switch (status) { + case CAL_CLIENT_GET_SUCCESS: + /* Everything is fine */ + break; + + case CAL_CLIENT_GET_SYNTAX_ERROR: + g_message ("obj_updated_cb(): Syntax error when getting object `%s'", uid); + return; + + case CAL_CLIENT_GET_NOT_FOUND: + /* The object is no longer in the server, so do nothing */ + return; + + default: + g_assert_not_reached (); + return; + } + + raise_and_focus (priv->app); +} + +/* Callback used when the calendar client tells us that an object was removed */ +static void +obj_removed_cb (CalClient *client, const char *uid, gpointer data) +{ + TaskEditor *tedit; + TaskEditorPrivate *priv; + const gchar *editing_uid; + + tedit = TASK_EDITOR (data); + + g_return_if_fail (tedit != NULL); + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + priv = tedit->priv; + + /* If we aren't showing the object which has been updated, return. */ + if (!priv->comp) + return; + cal_component_get_uid (priv->comp, &editing_uid); + if (strcmp (uid, editing_uid)) + return; + + + raise_and_focus (priv->app); +} + + +/* Brings attention to a window by raising it and giving it focus */ +static void +raise_and_focus (GtkWidget *widget) +{ + g_assert (GTK_WIDGET_REALIZED (widget)); + gdk_window_show (widget->window); + gtk_widget_grab_focus (widget); +} + + +/** + * task_editor_set_todo_object: + * @tedit: A #TaskEditor. + * @comp: A todo object. + * + * Sets the todo object that a task editor dialog will manipulate. + **/ +void +task_editor_set_todo_object (TaskEditor *tedit, + CalComponent *comp) +{ + TaskEditorPrivate *priv; + char *title; + + g_return_if_fail (tedit != NULL); + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + priv = tedit->priv; + + if (priv->comp) { + gtk_object_unref (GTK_OBJECT (priv->comp)); + priv->comp = NULL; + } + + if (comp) + priv->comp = cal_component_clone (comp); + + title = make_title_from_comp (priv->comp); + gtk_window_set_title (GTK_WINDOW (priv->app), title); + g_free (title); + + fill_widgets (tedit); +} + + +/* Creates an appropriate title for the task editor dialog */ +static char * +make_title_from_comp (CalComponent *comp) +{ + const char *summary; + CalComponentVType type; + CalComponentText text; + + if (!comp) + return g_strdup (_("Edit Task")); + + cal_component_get_summary (comp, &text); + if (text.value) + summary = text.value; + else + summary = _("No summary"); + + + type = cal_component_get_vtype (comp); + switch (type) { + case CAL_COMPONENT_EVENT: + return g_strdup_printf (_("Appointment - %s"), summary); + + case CAL_COMPONENT_TODO: + return g_strdup_printf (_("Task - %s"), summary); + + case CAL_COMPONENT_JOURNAL: + return g_strdup_printf (_("Journal entry - %s"), summary); + + default: + g_message ("make_title_from_comp(): Cannot handle object of type %d", type); + return NULL; + } +} + + +/* Fills the widgets with default values */ +static void +clear_widgets (TaskEditor *tedit) +{ + TaskEditorPrivate *priv; + + priv = tedit->priv; + + +} + +/* Fills in the widgets with the proper values */ +static void +fill_widgets (TaskEditor *tedit) +{ + TaskEditorPrivate *priv; + CalComponentText text; + CalComponentDateTime d; + struct icaltimetype *completed; + CalComponentClassification classification; + GSList *l; + time_t t; + int *priority_value, *percent; + TaskEditorPriority priority; + const char *url; + + priv = tedit->priv; + + clear_widgets (tedit); + + if (!priv->comp) + return; + + /* We want to ignore any signals emitted while changing fields. */ + priv->ignore_callbacks = TRUE; + + + cal_component_get_summary (priv->comp, &text); + e_dialog_editable_set (priv->summary, text.value); + + cal_component_get_description_list (priv->comp, &l); + if (l) { + text = *(CalComponentText *)l->data; + e_dialog_editable_set (priv->description, text.value); + } else { + e_dialog_editable_set (priv->description, NULL); + } + cal_component_free_text_list (l); + + /* Due Date. */ + cal_component_get_due (priv->comp, &d); + if (d.value) { + t = icaltime_as_timet (*d.value); + } else { + /* FIXME: Can't set GnomeDateEdit to a date of 'None'. */ + t = time (NULL); + } + e_dialog_dateedit_set (priv->due_date, t); + + /* Start Date. */ + cal_component_get_dtstart (priv->comp, &d); + if (d.value) { + t = icaltime_as_timet (*d.value); + } else { + /* FIXME: Can't set GnomeDateEdit to a date of 'None'. */ + t = time (NULL); + } + e_dialog_dateedit_set (priv->start_date, t); + + /* Completed Date. */ + cal_component_get_completed (priv->comp, &completed); + if (completed) { + t = icaltime_as_timet (*completed); + cal_component_free_icaltimetype (completed); + } else { + /* FIXME: Can't set GnomeDateEdit to a date of 'None'. */ + t = time (NULL); + } + e_dialog_dateedit_set (priv->completed_date, t); + + /* Percent Complete. */ + cal_component_get_percent (priv->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. FIXME: CalComponent doesn't support this yet. */ + e_dialog_option_menu_set (priv->status, STATUS_IN_PROGRESS, + status_map); + + /* Priority. */ + cal_component_get_priority (priv->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); + + + /* Classification. */ + cal_component_get_classification (priv->comp, &classification); + e_dialog_option_menu_set (priv->classification, classification, + classification_map); + + + /* URL. */ + cal_component_get_url (priv->comp, &url); + e_dialog_editable_set (priv->url, url); + + priv->ignore_callbacks = FALSE; +} + + +static void +save_todo_object (TaskEditor *tedit) +{ + TaskEditorPrivate *priv; + char *title; + + priv = tedit->priv; + + g_return_if_fail (priv->client != NULL); + + if (!priv->comp) + return; + + dialog_to_comp_object (tedit); + + title = make_title_from_comp (priv->comp); + gtk_window_set_title (GTK_WINDOW (priv->app), title); + g_free (title); + + if (!cal_client_update_object (priv->client, priv->comp)) + g_message ("save_todo_object(): Could not update the object!"); +} + + +/* Get the values of the widgets in the event editor and put them in the iCalObject */ +static void +dialog_to_comp_object (TaskEditor *tedit) +{ + TaskEditorPrivate *priv; + CalComponent *comp; + CalComponentText *text; + CalComponentDateTime date; + time_t t; + GSList *list; + TaskEditorStatus status; + TaskEditorPriority priority; + int priority_value, percent; + CalComponentClassification classification; + char *url; + + priv = tedit->priv; + comp = priv->comp; + + /* Summary. */ + text = g_new0 (CalComponentText, 1); + text->value = e_dialog_editable_get (priv->summary); + cal_component_set_summary (comp, text); + + /* Description. Note that we use the text variable again, and it is + freed in cal_component_free_text_list(). */ + list = NULL; + text->value = e_dialog_editable_get (priv->description); + list = g_slist_prepend (list, text); + cal_component_set_description_list (comp, list); + cal_component_free_text_list (list); + + + date.value = g_new (struct icaltimetype, 1); + date.tzid = NULL; + + /* Due Date. */ + t = e_dialog_dateedit_get (priv->due_date); + *date.value = icaltime_from_timet (t, FALSE, FALSE); + cal_component_set_due (comp, &date); + + /* Start Date. */ + t = e_dialog_dateedit_get (priv->start_date); + *date.value = icaltime_from_timet (t, FALSE, FALSE); + cal_component_set_dtstart (comp, &date); + + /* Completed Date. */ + t = e_dialog_dateedit_get (priv->completed_date); + *date.value = icaltime_from_timet (t, FALSE, FALSE); + cal_component_set_completed (comp, date.value); + + g_free (date.value); + + /* Percent Complete. */ + percent = e_dialog_spin_get_int (priv->percent_complete); + cal_component_set_percent (comp, &percent); + + /* Status. FIXME: CalComponent doesn't support it. */ + status = e_dialog_option_menu_get (priv->status, status_map); +#if 0 + cal_component_set_status (comp, status); +#endif + + /* 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); + + /* Classification. */ + classification = e_dialog_option_menu_get (priv->classification, + classification_map); + cal_component_set_classification (comp, classification); + + + /* URL. */ + url = e_dialog_editable_get (priv->url); + cal_component_set_url (comp, url); + + + + + cal_component_commit_sequence (comp); +} + + + +/* File/Save callback */ +static void +file_save_cb (GtkWidget *widget, gpointer data) +{ + TaskEditor *tedit; + + tedit = TASK_EDITOR (data); + save_todo_object (tedit); +} + +/* File/Save and Close callback */ +static void +file_save_and_close_cb (GtkWidget *widget, gpointer data) +{ + TaskEditor *tedit; + + tedit = TASK_EDITOR (data); + save_todo_object (tedit); + close_dialog (tedit); +} + +/* File/Delete callback */ +static void +file_delete_cb (GtkWidget *widget, gpointer data) +{ + TaskEditor *tedit; + TaskEditorPrivate *priv; + const char *uid; + + tedit = TASK_EDITOR (data); + + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + priv = tedit->priv; + + g_return_if_fail (priv->comp); + + cal_component_get_uid (priv->comp, &uid); + + /* We don't check the return value; FALSE can mean the object was not in + * the server anyways. + */ + cal_client_remove_object (priv->client, uid); + + close_dialog (tedit); +} + +/* File/Close callback */ +static void +file_close_cb (GtkWidget *widget, gpointer data) +{ + TaskEditor *tedit; + + tedit = TASK_EDITOR (data); + + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + close_dialog (tedit); +} + + +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; + } + + return retval; +} + + +static void +completed_date_changed (GnomeDateEdit *dedit, + TaskEditor *tedit) +{ + TaskEditorPrivate *priv; + time_t t; + + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + priv = tedit->priv; + + if (priv->ignore_callbacks) + return; + + t = e_dialog_dateedit_get (priv->completed_date); + /* FIXME: We want to check for 'None' here. */ + priv->ignore_callbacks = TRUE; + if (0) { + /* What do we do if the 'Date Completed' property is set to + 'None' ? The status should not be 'Completed' and the + percent-complete should not be 100%, but what do we set + them to? */ + + } else { + e_dialog_option_menu_set (priv->status, STATUS_COMPLETED, + status_map); + e_dialog_spin_set (priv->percent_complete, 100); + } + priv->ignore_callbacks = FALSE; +} + + +static void +status_changed (GtkMenu *menu, + TaskEditor *tedit) +{ + TaskEditorPrivate *priv; + TaskEditorStatus status; + + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + priv = tedit->priv; + + if (priv->ignore_callbacks) + return; + + status = e_dialog_option_menu_get (priv->status, status_map); + priv->ignore_callbacks = TRUE; + if (status == STATUS_NOT_STARTED) { + e_dialog_spin_set (priv->percent_complete, 0); + /* FIXME: Set to 'None'. */ + e_dialog_dateedit_set (priv->completed_date, time (NULL)); + } else if (status == STATUS_COMPLETED) { + e_dialog_spin_set (priv->percent_complete, 100); + e_dialog_dateedit_set (priv->completed_date, time (NULL)); + } + priv->ignore_callbacks = FALSE; +} + + +static void +percent_complete_changed (GtkAdjustment *adj, + TaskEditor *tedit) +{ + TaskEditorPrivate *priv; + gint percent; + TaskEditorStatus status; + time_t date_completed; + + g_return_if_fail (IS_TASK_EDITOR (tedit)); + + priv = tedit->priv; + + if (priv->ignore_callbacks) + return; + + percent = e_dialog_spin_get_int (priv->percent_complete); + priv->ignore_callbacks = TRUE; + + if (percent == 100) { + date_completed = time (NULL); + status = STATUS_COMPLETED; + } else { + /* FIXME: Set to 'None'. */ + date_completed = time (NULL); + + if (percent == 0) + status = STATUS_NOT_STARTED; + else + status = STATUS_IN_PROGRESS; + } + + e_dialog_dateedit_set (priv->completed_date, date_completed); + e_dialog_option_menu_set (priv->status, status, status_map); + + priv->ignore_callbacks = FALSE; +} + diff --git a/calendar/gui/dialogs/task-editor.h b/calendar/gui/dialogs/task-editor.h index 159b969ab9..a53d29c2a2 100644 --- a/calendar/gui/dialogs/task-editor.h +++ b/calendar/gui/dialogs/task-editor.h @@ -54,8 +54,13 @@ struct _TaskEditorClass GtkType task_editor_get_type (void); +TaskEditor* task_editor_construct (TaskEditor *tedit); TaskEditor* task_editor_new (void); +void task_editor_set_cal_client (TaskEditor *tedit, + CalClient *client); +void task_editor_set_todo_object (TaskEditor *tedit, + CalComponent *comp); END_GNOME_DECLS diff --git a/calendar/gui/dialogs/task-page.glade b/calendar/gui/dialogs/task-page.glade index 56f7f83422..8a8ca800d6 100644 --- a/calendar/gui/dialogs/task-page.glade +++ b/calendar/gui/dialogs/task-page.glade @@ -18,9 +18,11 @@ <class>GnomeApp</class> <name>task-editor-dialog</name> <visible>False</visible> + <title>task-editor-dialog</title> <type>GTK_WINDOW_TOPLEVEL</type> <position>GTK_WIN_POS_NONE</position> <modal>False</modal> + <default_height>350</default_height> <allow_shrink>False</allow_shrink> <allow_grow>True</allow_grow> <auto_shrink>False</auto_shrink> @@ -61,7 +63,7 @@ <widget> <class>GtkTable</class> <name>table3</name> - <rows>2</rows> + <rows>1</rows> <columns>2</columns> <homogeneous>False</homogeneous> <row_spacing>4</row_spacing> @@ -75,19 +77,19 @@ <widget> <class>GtkLabel</class> <name>label3</name> - <label>S_ubject:</label> + <label>S_ummary</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>entry1</default_focus_target> + <default_focus_target>summary</default_focus_target> <child> <left_attach>0</left_attach> <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> <xpad>0</xpad> <ypad>0</ypad> <xexpand>False</xexpand> @@ -101,7 +103,7 @@ <widget> <class>GtkEntry</class> - <name>entry1</name> + <name>summary</name> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> @@ -110,63 +112,11 @@ <child> <left_attach>1</left_attach> <right_attach>2</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label10</name> - <label>Owner:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> <top_attach>0</top_attach> <bottom_attach>1</bottom_attach> <xpad>0</xpad> <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label11</name> - <label></label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>0</top_attach> - <bottom_attach>1</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> + <xexpand>True</xexpand> <yexpand>False</yexpand> <xshrink>False</xshrink> <yshrink>False</yshrink> @@ -201,7 +151,7 @@ <class>GtkTable</class> <name>table1</name> <rows>2</rows> - <columns>2</columns> + <columns>4</columns> <homogeneous>False</homogeneous> <row_spacing>2</row_spacing> <column_spacing>4</column_spacing> @@ -213,9 +163,9 @@ <widget> <class>GnomeDateEdit</class> - <name>dateedit1</name> + <name>due-date</name> <show_time>True</show_time> - <use_24_format>False</use_24_format> + <use_24_format>True</use_24_format> <week_start_monday>False</week_start_monday> <lower_hour>7</lower_hour> <upper_hour>19</upper_hour> @@ -237,7 +187,7 @@ <widget> <class>GnomeDateEdit</class> - <name>dateedit2</name> + <name>start-date</name> <show_time>True</show_time> <use_24_format>True</use_24_format> <week_start_monday>False</week_start_monday> @@ -310,6 +260,66 @@ <yfill>False</yfill> </child> </widget> + + <widget> + <class>GtkLabel</class> + <name>label9</name> + <label>% Comp_lete:</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>0</xpad> + <ypad>0</ypad> + <default_focus_target>percent-complete</default_focus_target> + <child> + <left_attach>2</left_attach> + <right_attach>3</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>False</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>False</xfill> + <yfill>False</yfill> + </child> + </widget> + + <widget> + <class>GtkSpinButton</class> + <name>percent-complete</name> + <width>60</width> + <can_focus>True</can_focus> + <climb_rate>1</climb_rate> + <digits>0</digits> + <numeric>False</numeric> + <update_policy>GTK_UPDATE_ALWAYS</update_policy> + <snap>False</snap> + <wrap>False</wrap> + <value>0</value> + <lower>0</lower> + <upper>100</upper> + <step>10</step> + <page>10</page> + <page_size>10</page_size> + <child> + <left_attach>3</left_attach> + <right_attach>4</right_attach> + <top_attach>0</top_attach> + <bottom_attach>1</bottom_attach> + <xpad>0</xpad> + <ypad>0</ypad> + <xexpand>True</xexpand> + <yexpand>False</yexpand> + <xshrink>False</xshrink> + <yshrink>False</yshrink> + <xfill>True</xfill> + <yfill>False</yfill> + </child> + </widget> </widget> </widget> @@ -344,7 +354,7 @@ <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>combo-entry1</default_focus_target> + <default_focus_target>status</default_focus_target> <child> <padding>0</padding> <expand>False</expand> @@ -353,35 +363,20 @@ </widget> <widget> - <class>GtkCombo</class> - <name>combo1</name> - <value_in_list>False</value_in_list> - <ok_if_empty>True</ok_if_empty> - <case_sensitive>False</case_sensitive> - <use_arrows>True</use_arrows> - <use_arrows_always>False</use_arrows_always> + <class>GtkOptionMenu</class> + <name>status</name> + <can_focus>True</can_focus> <items>Not Started In Progress Completed Cancelled </items> + <initial_choice>0</initial_choice> <child> <padding>0</padding> - <expand>True</expand> - <fill>True</fill> + <expand>False</expand> + <fill>False</fill> </child> - - <widget> - <class>GtkEntry</class> - <child_name>GtkCombo:entry</child_name> - <name>combo-entry1</name> - <width>60</width> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text>Not Started</text> - </widget> </widget> <widget> @@ -394,7 +389,7 @@ Cancelled <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>combo-entry2</default_focus_target> + <default_focus_target>priority</default_focus_target> <child> <padding>0</padding> <expand>False</expand> @@ -403,47 +398,32 @@ Cancelled </widget> <widget> - <class>GtkCombo</class> - <name>combo2</name> - <value_in_list>False</value_in_list> - <ok_if_empty>True</ok_if_empty> - <case_sensitive>False</case_sensitive> - <use_arrows>True</use_arrows> - <use_arrows_always>False</use_arrows_always> + <class>GtkOptionMenu</class> + <name>priority</name> + <can_focus>True</can_focus> <items>High Normal Low </items> + <initial_choice>0</initial_choice> <child> <padding>0</padding> - <expand>True</expand> - <fill>True</fill> + <expand>False</expand> + <fill>False</fill> </child> - - <widget> - <class>GtkEntry</class> - <child_name>GtkCombo:entry</child_name> - <name>combo-entry2</name> - <width>60</width> - <can_focus>True</can_focus> - <editable>False</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text>High</text> - </widget> </widget> <widget> <class>GtkLabel</class> - <name>label9</name> - <label>% Comp_lete:</label> + <name>label18</name> + <label>C_lassification:</label> <justify>GTK_JUSTIFY_CENTER</justify> <wrap>False</wrap> <xalign>0.5</xalign> <yalign>0.5</yalign> <xpad>0</xpad> <ypad>0</ypad> - <default_focus_target>spinbutton1</default_focus_target> + <default_focus_target>classification</default_focus_target> <child> <padding>0</padding> <expand>False</expand> @@ -452,25 +432,18 @@ Low </widget> <widget> - <class>GtkSpinButton</class> - <name>spinbutton1</name> + <class>GtkOptionMenu</class> + <name>classification</name> <can_focus>True</can_focus> - <climb_rate>1</climb_rate> - <digits>0</digits> - <numeric>False</numeric> - <update_policy>GTK_UPDATE_ALWAYS</update_policy> - <snap>False</snap> - <wrap>False</wrap> - <value>0</value> - <lower>0</lower> - <upper>100</upper> - <step>10</step> - <page>10</page> - <page_size>10</page_size> + <items>Public +Private +Confidential +</items> + <initial_choice>0</initial_choice> <child> <padding>0</padding> - <expand>True</expand> - <fill>True</fill> + <expand>False</expand> + <fill>False</fill> </child> </widget> </widget> @@ -490,8 +463,7 @@ Low <widget> <class>GtkText</class> - <name>text1</name> - <height>150</height> + <name>description</name> <can_focus>True</can_focus> <editable>True</editable> <text></text> @@ -513,17 +485,30 @@ Low <class>GtkButton</class> <name>button3</name> <can_focus>True</can_focus> - <label>_Contacts...</label> <child> <padding>0</padding> <expand>False</expand> <fill>False</fill> </child> + + <widget> + <class>GtkLabel</class> + <name>label16</name> + <sensitive>False</sensitive> + <label>_Contacts...</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>4</xpad> + <ypad>0</ypad> + </widget> </widget> <widget> <class>GtkEntry</class> - <name>entry2</name> + <name>contacts</name> + <sensitive>False</sensitive> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> @@ -540,17 +525,30 @@ Low <class>GtkButton</class> <name>button4</name> <can_focus>True</can_focus> - <label>Ca_tegories...</label> <child> <padding>0</padding> <expand>False</expand> <fill>False</fill> </child> + + <widget> + <class>GtkLabel</class> + <name>label17</name> + <sensitive>False</sensitive> + <label>Ca_tegories...</label> + <justify>GTK_JUSTIFY_CENTER</justify> + <wrap>False</wrap> + <xalign>0.5</xalign> + <yalign>0.5</yalign> + <xpad>4</xpad> + <ypad>0</ypad> + </widget> </widget> <widget> <class>GtkEntry</class> - <name>entry3</name> + <name>categories</name> + <sensitive>False</sensitive> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> @@ -562,20 +560,6 @@ Low <fill>True</fill> </child> </widget> - - <widget> - <class>GtkCheckButton</class> - <name>checkbutton1</name> - <can_focus>True</can_focus> - <label>Private</label> - <active>False</active> - <draw_indicator>True</draw_indicator> - <child> - <padding>0</padding> - <expand>False</expand> - <fill>False</fill> - </child> - </widget> </widget> </widget> @@ -596,7 +580,7 @@ Low <class>GtkTable</class> <name>table4</name> <border_width>4</border_width> - <rows>4</rows> + <rows>2</rows> <columns>2</columns> <homogeneous>False</homogeneous> <row_spacing>2</row_spacing> @@ -604,7 +588,7 @@ Low <widget> <class>GnomeDateEdit</class> - <name>dateedit3</name> + <name>completed-date</name> <show_time>True</show_time> <use_24_format>True</use_24_format> <week_start_monday>False</week_start_monday> @@ -654,32 +638,6 @@ Low <widget> <class>GtkLabel</class> - <name>label13</name> - <label>Location:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>1</top_attach> - <bottom_attach>2</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> <name>label14</name> <label>URL:</label> <justify>GTK_JUSTIFY_CENTER</justify> @@ -691,84 +649,10 @@ Low <child> <left_attach>0</left_attach> <right_attach>1</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>False</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry4</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> <top_attach>1</top_attach> <bottom_attach>2</bottom_attach> <xpad>0</xpad> <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkEntry</class> - <name>entry5</name> - <can_focus>True</can_focus> - <editable>True</editable> - <text_visible>True</text_visible> - <text_max_length>0</text_max_length> - <text></text> - <child> - <left_attach>1</left_attach> - <right_attach>2</right_attach> - <top_attach>2</top_attach> - <bottom_attach>3</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> - <xexpand>True</xexpand> - <yexpand>False</yexpand> - <xshrink>False</xshrink> - <yshrink>False</yshrink> - <xfill>True</xfill> - <yfill>False</yfill> - </child> - </widget> - - <widget> - <class>GtkLabel</class> - <name>label15</name> - <label>Resources:</label> - <justify>GTK_JUSTIFY_CENTER</justify> - <wrap>False</wrap> - <xalign>0</xalign> - <yalign>0.5</yalign> - <xpad>0</xpad> - <ypad>0</ypad> - <child> - <left_attach>0</left_attach> - <right_attach>1</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> - <xpad>0</xpad> - <ypad>0</ypad> <xexpand>False</xexpand> <yexpand>False</yexpand> <xshrink>False</xshrink> @@ -780,7 +664,7 @@ Low <widget> <class>GtkEntry</class> - <name>entry6</name> + <name>url</name> <can_focus>True</can_focus> <editable>True</editable> <text_visible>True</text_visible> @@ -789,8 +673,8 @@ Low <child> <left_attach>1</left_attach> <right_attach>2</right_attach> - <top_attach>3</top_attach> - <bottom_attach>4</bottom_attach> + <top_attach>1</top_attach> + <bottom_attach>2</bottom_attach> <xpad>0</xpad> <ypad>0</ypad> <xexpand>True</xexpand> |