diff options
author | Srinivasa Ragavan <sragavan@novell.com> | 2005-10-07 02:21:52 +0800 |
---|---|---|
committer | Srinivasa Ragavan <sragavan@src.gnome.org> | 2005-10-07 02:21:52 +0800 |
commit | 1e5c74f855dca5c1d1a017a7abbce39768e9efef (patch) | |
tree | 160a0738b7a58ff4d6a64decd54d0fcaf685743c /calendar | |
parent | 11f58b12100ae5177675ef31d16340b9e435e00a (diff) | |
download | gsoc2013-evolution-1e5c74f855dca5c1d1a017a7abbce39768e9efef.tar gsoc2013-evolution-1e5c74f855dca5c1d1a017a7abbce39768e9efef.tar.gz gsoc2013-evolution-1e5c74f855dca5c1d1a017a7abbce39768e9efef.tar.bz2 gsoc2013-evolution-1e5c74f855dca5c1d1a017a7abbce39768e9efef.tar.lz gsoc2013-evolution-1e5c74f855dca5c1d1a017a7abbce39768e9efef.tar.xz gsoc2013-evolution-1e5c74f855dca5c1d1a017a7abbce39768e9efef.tar.zst gsoc2013-evolution-1e5c74f855dca5c1d1a017a7abbce39768e9efef.zip |
Several bug fixes under calendar. Use common shortcut for preview pane.
2005-10-06 Srinivasa Ragavan <sragavan@novell.com>
* calendar/: Several bug fixes under calendar.
* ui/: Use common shortcut for preview pane.
svn path=/trunk/; revision=30497
Diffstat (limited to 'calendar')
-rw-r--r-- | calendar/ChangeLog | 49 | ||||
-rw-r--r-- | calendar/calendar.error.xml | 14 | ||||
-rw-r--r-- | calendar/gui/apps_evolution_calendar.schemas.in.in | 14 | ||||
-rw-r--r-- | calendar/gui/calendar-config-keys.h | 1 | ||||
-rw-r--r-- | calendar/gui/calendar-config.c | 16 | ||||
-rw-r--r-- | calendar/gui/calendar-config.h | 3 | ||||
-rw-r--r-- | calendar/gui/dialogs/comp-editor.c | 41 | ||||
-rw-r--r-- | calendar/gui/dialogs/event-editor.c | 18 | ||||
-rw-r--r-- | calendar/gui/dialogs/event-page.glade | 4 | ||||
-rw-r--r-- | calendar/gui/dialogs/meeting-page.c | 161 | ||||
-rw-r--r-- | calendar/gui/dialogs/meeting-page.glade | 2 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-details-page.glade | 2 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-editor.c | 10 | ||||
-rw-r--r-- | calendar/gui/dialogs/task-page.glade | 2 | ||||
-rw-r--r-- | calendar/gui/e-meeting-list-view.c | 29 | ||||
-rw-r--r-- | calendar/gui/e-meeting-time-sel.c | 3 | ||||
-rw-r--r-- | calendar/gui/e-tasks.c | 52 | ||||
-rw-r--r-- | calendar/gui/e-tasks.h | 2 | ||||
-rw-r--r-- | calendar/gui/tasks-control.c | 30 |
19 files changed, 366 insertions, 87 deletions
diff --git a/calendar/ChangeLog b/calendar/ChangeLog index e472203979..7e8b09867b 100644 --- a/calendar/ChangeLog +++ b/calendar/ChangeLog @@ -1,3 +1,52 @@ +2005-10-06 Srinivasa Ragavan <sragavan@novell.com> + + * calendar.error.xml: Added accels to the Disard new event/ + task dialog. + + * gui/apps_evolution_calendar.schemas.in.in: Added new key + for storing the presence of preview. + + * gui/calendar-config-keys.h: Added key for preview status + + * gui/calendar-config.[ch] (calendar_config_set_vpane_pos): Added + functions to get preview status. + + * gui/e-meeting-list-view.c (build_table): makes the invites + tab list view tabs resizable and reorderable. + + * gui/e-meeting-time-sel.c (e_meeting_time_selector_construct): Made + the recursive not show status and type. + + * gui/e-tasks.[ch] (setup_widgets) (e_tasks_new_task): made a provsion + to show/hide the preview. + + * gui/tasks-control.c (tasks_control_activate) + (tasks_control_forward_cmd): Added bonobo interface to show/hide + preview pane. + + * gui/dialogs/comp-editor.c (attachment_bar_changed_cb) (setup_widgets) + (comp_editor_append_page) (set_attachment_list): Added expander + for attachment bar. + + * gui/dialogs/event-editor.c (event_editor_construct) (event_editor_edit_comp) + (show_meeting): Added accelerators for the comp editor dialogs for + tasks, event, meeting etc. + + * gui/dialogs/event-page.glade: key accelerator for 'busy' + + * gui/dialogs/meeting-page.c (remove_clicked_cb) (client_changed_cb) + (popup_delete_cb) (button_press_event) (meeting_page_construct) + + * gui/dialogs/meeting-page.glade: key accelerators for dialog. + + * gui/dialogs/task-details-page.glade: key accelerators for dialog. + + * gui/dialogs/task-editor.c (task_editor_construct) (task_editor_edit_comp) + (show_assignment): Key accelerators for task tab + + * gui/dialogs/task-page.glade: key accelerators for task dialog + + 2005-10-02 Srinivasa Ragavan <sragavan@novell.com> Provides across calendars keyboard accelerators for popup menus diff --git a/calendar/calendar.error.xml b/calendar/calendar.error.xml index 231440c402..3fd7c71887 100644 --- a/calendar/calendar.error.xml +++ b/calendar/calendar.error.xml @@ -106,22 +106,22 @@ <button stock="gtk-delete" response="GTK_RESPONSE_YES"/> </error> - <error id="prompt-save-appointment" type="question" default="GTK_RESPONSE_YES"> + <error id="prompt-save-appointment" type="warning" default="GTK_RESPONSE_YES"> <title>Save Appointment</title> <_primary>Would you like to save your changes to this appointment?</_primary> - <_secondary>You have made changes to this appointment, but not yet saved them.</_secondary> - <button _label="Discard Changes" response="GTK_RESPONSE_NO"/> + <_secondary>You have changed this appointment, but not yet saved them.</_secondary> + <button _label="_Discard Changes" response="GTK_RESPONSE_NO"/> <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/> - <button _label="Save Changes" response="GTK_RESPONSE_YES"/> + <button _label="_Save Changes" response="GTK_RESPONSE_YES"/> </error> - <error id="prompt-save-task" type="question" default="GTK_RESPONSE_YES"> + <error id="prompt-save-task" type="warning" default="GTK_RESPONSE_YES"> <title>Save Task</title> <_primary>Would you like to save your changes to this task?</_primary> <_secondary>You have made changes to this task, but not yet saved them.</_secondary> - <button _label="Discard Changes" response="GTK_RESPONSE_NO"/> + <button _label="_Discard Changes" response="GTK_RESPONSE_NO"/> <button stock="gtk-cancel" response="GTK_RESPONSE_CANCEL"/> - <button _label="Save Changes" response="GTK_RESPONSE_YES"/> + <button _label="_Save Changes" response="GTK_RESPONSE_YES"/> </error> <error id="prompt-meeting-invite" type="question" default="GTK_RESPONSE_YES"> diff --git a/calendar/gui/apps_evolution_calendar.schemas.in.in b/calendar/gui/apps_evolution_calendar.schemas.in.in index 8348e47aab..052cd74809 100644 --- a/calendar/gui/apps_evolution_calendar.schemas.in.in +++ b/calendar/gui/apps_evolution_calendar.schemas.in.in @@ -148,6 +148,20 @@ </schema> <schema> + <key>/schemas/apps/evolution/calendar/display/show_task_preview</key> + <applyto>/apps/evolution/calendar/display/show_task_preview</applyto> + <owner>evolution-calendar</owner> + <type>bool</type> + <default>true</default> + <locale name="C"> + <short>Show the "Preview" pane</short> + <long> + Show the "Preview" pane. + </long> + </locale> + </schema> + + <schema> <key>/schemas/apps/evolution/calendar/display/task_vpane_position</key> <applyto>/apps/evolution/calendar/display/task_vpane_position</applyto> <owner>evolution-calendar</owner> diff --git a/calendar/gui/calendar-config-keys.h b/calendar/gui/calendar-config-keys.h index bb07640b2f..eea70cfbcc 100644 --- a/calendar/gui/calendar-config-keys.h +++ b/calendar/gui/calendar-config-keys.h @@ -47,6 +47,7 @@ G_BEGIN_DECLS #define CALENDAR_CONFIG_VPANE_POS CALENDAR_CONFIG_PREFIX "/display/vpane_position" #define CALENDAR_CONFIG_MONTH_HPANE_POS CALENDAR_CONFIG_PREFIX "/display/month_hpane_position" #define CALENDAR_CONFIG_MONTH_VPANE_POS CALENDAR_CONFIG_PREFIX "/display/month_vpane_position" +#define CALENDAR_CONFIG_TASK_PREVIEW CALENDAR_CONFIG_PREFIX "/display/show_task_preview" #define CALENDAR_CONFIG_TASK_VPANE_POS CALENDAR_CONFIG_PREFIX "/display/task_vpane_position" #define CALENDAR_CONFIG_COMPRESS_WEEKEND CALENDAR_CONFIG_PREFIX "/display/compress_weekend" #define CALENDAR_CONFIG_SHOW_EVENT_END CALENDAR_CONFIG_PREFIX "/display/show_event_end" diff --git a/calendar/gui/calendar-config.c b/calendar/gui/calendar-config.c index db57821c56..8a33f6084c 100644 --- a/calendar/gui/calendar-config.c +++ b/calendar/gui/calendar-config.c @@ -539,6 +539,22 @@ calendar_config_set_vpane_pos (gint vpane_pos) gconf_client_set_int (config, CALENDAR_CONFIG_VPANE_POS, vpane_pos, NULL); } +gboolean +calendar_config_get_preview_state (void) +{ + calendar_config_init (); + + return gconf_client_get_bool (config, CALENDAR_CONFIG_TASK_PREVIEW, NULL); +} + + +void +calendar_config_set_preview_state (gboolean state) +{ + calendar_config_init (); + + gconf_client_set_bool (config, CALENDAR_CONFIG_TASK_PREVIEW, state, NULL); +} gint calendar_config_get_month_hpane_pos (void) diff --git a/calendar/gui/calendar-config.h b/calendar/gui/calendar-config.h index 6135f08933..0a89b8a4fa 100644 --- a/calendar/gui/calendar-config.h +++ b/calendar/gui/calendar-config.h @@ -143,6 +143,9 @@ void calendar_config_set_hpane_pos (gint hpane_pos); gint calendar_config_get_vpane_pos (void); void calendar_config_set_vpane_pos (gint vpane_pos); +gboolean calendar_config_get_preview_state (void); +void calendar_config_set_preview_state (gboolean state); + gint calendar_config_get_month_hpane_pos (void); void calendar_config_set_month_hpane_pos (gint hpane_pos); diff --git a/calendar/gui/dialogs/comp-editor.c b/calendar/gui/dialogs/comp-editor.c index 6e4f15b315..4eb6d363a7 100644 --- a/calendar/gui/dialogs/comp-editor.c +++ b/calendar/gui/dialogs/comp-editor.c @@ -994,6 +994,22 @@ attachment_bar_changed_cb (EAttachmentBar *bar, } +static void +attachment_expander_activate_cb (EExpander *expander, + void *data) +{ + CompEditor *editor = COMP_EDITOR (data); + gboolean show = e_expander_get_expanded (expander); + + /* Update the expander label */ + if (show) + gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label), + _("Hide Attachment _Bar")); + else + gtk_label_set_text_with_mnemonic (GTK_LABEL (editor->priv->attachment_expander_label), + _("Show Attachment _Bar")); +} + static gboolean attachment_bar_icon_clicked_cb (EAttachmentBar *bar, GdkEvent *event, CompEditor *editor) { @@ -1220,7 +1236,7 @@ setup_widgets (CompEditor *editor) gtk_dialog_add_button (GTK_DIALOG (editor), GTK_STOCK_OK, GTK_RESPONSE_OK); gtk_dialog_add_button (GTK_DIALOG (editor), GTK_STOCK_HELP, GTK_RESPONSE_HELP); gtk_dialog_set_response_sensitive (GTK_DIALOG (editor), GTK_RESPONSE_OK, FALSE); - + g_signal_connect (editor, "response", G_CALLBACK (response_cb), editor); g_signal_connect (editor, "delete_event", G_CALLBACK (delete_event_cb), editor); @@ -1246,7 +1262,7 @@ setup_widgets (CompEditor *editor) g_signal_connect (GNOME_ICON_LIST (priv->attachment_bar), "event", G_CALLBACK (attachment_bar_icon_clicked_cb), editor); priv->attachment_expander_label = - gtk_label_new_with_mnemonic (_("_Attachment Bar (drop attachments here)")); + gtk_label_new_with_mnemonic (_("Show Attachment _Bar")); priv->attachment_expander_num = gtk_label_new (""); gtk_label_set_use_markup (GTK_LABEL (priv->attachment_expander_num), TRUE); gtk_misc_set_alignment (GTK_MISC (priv->attachment_expander_label), 0.0, 0.5); @@ -1264,18 +1280,20 @@ setup_widgets (CompEditor *editor) gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_icon, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (expander_hbox), priv->attachment_expander_num, - FALSE, TRUE, 0); + TRUE, TRUE, 0); gtk_widget_show_all (expander_hbox); gtk_widget_hide (priv->attachment_expander_icon); - gtk_box_pack_start (GTK_BOX (vbox), expander_hbox, - FALSE, FALSE, 0); - gtk_box_pack_start (GTK_BOX (vbox), priv->attachment_scrolled_window, FALSE, FALSE, GNOME_PAD_SMALL); - - gtk_widget_show (priv->attachment_scrolled_window); - gtk_widget_show (expander_hbox); + priv->attachment_expander = e_expander_new (""); + e_expander_set_label_widget (E_EXPANDER (priv->attachment_expander), expander_hbox); + atk_object_set_name (gtk_widget_get_accessible (priv->attachment_expander), _("Attachment Button: Press space key to toggle attachment bar")); + gtk_container_add (GTK_CONTAINER (priv->attachment_expander), priv->attachment_scrolled_window); - + gtk_box_pack_start (GTK_BOX (vbox), priv->attachment_expander, FALSE, FALSE, GNOME_PAD_SMALL); + gtk_widget_show (priv->attachment_expander); + e_expander_set_expanded (E_EXPANDER (priv->attachment_expander), FALSE); + g_signal_connect_after (priv->attachment_expander, "activate", + G_CALLBACK (attachment_expander_activate_cb), editor); } /* Object initialization function for the calendar component editor */ @@ -1691,7 +1709,7 @@ comp_editor_append_page (CompEditor *editor, page_widget = comp_editor_page_get_widget (page); g_assert (page_widget != NULL); - label_widget = gtk_label_new (label); + label_widget = gtk_label_new_with_mnemonic (label); is_first_page = (priv->pages == NULL); @@ -2089,6 +2107,7 @@ set_attachment_list (CompEditor *editor, GSList *attach_list) } e_attachment_bar_attach_mime_part ((EAttachmentBar *) editor->priv->attachment_bar, part); + e_expander_set_expanded (E_EXPANDER (editor->priv->attachment_expander), TRUE); camel_object_unref (part); } diff --git a/calendar/gui/dialogs/event-editor.c b/calendar/gui/dialogs/event-editor.c index 37e6be7929..a13e9bd6e1 100644 --- a/calendar/gui/dialogs/event-editor.c +++ b/calendar/gui/dialogs/event-editor.c @@ -138,7 +138,7 @@ event_editor_construct (EventEditor *ee, ECal *client) gtk_object_sink (GTK_OBJECT (priv->event_page)); comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->event_page), - _("Appointment")); + _("Appoint_ment")); g_signal_connect (G_OBJECT (priv->event_page), "client_changed", G_CALLBACK (client_changed_cb), ee); @@ -147,7 +147,7 @@ event_editor_construct (EventEditor *ee, ECal *client) gtk_object_sink (GTK_OBJECT (priv->recur_page)); comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->recur_page), - _("Recurrence")); + _("_Recurrence")); if (priv->is_meeting) { @@ -161,7 +161,7 @@ event_editor_construct (EventEditor *ee, ECal *client) gtk_object_sink (GTK_OBJECT (priv->sched_page)); comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->sched_page), - _("Scheduling")); + _("Schedulin_g")); } priv->meet_page = meeting_page_new (priv->model, client); @@ -171,11 +171,11 @@ event_editor_construct (EventEditor *ee, ECal *client) if (comp_editor_get_flags (COMP_EDITOR (ee)) & COMP_EDITOR_DELEGATE) { comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->meet_page), - _("Delegatees")); + _("_Delegatees")); } else comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->meet_page), - _("Attendees")); + _("_Attendees")); priv->meeting_shown=TRUE; } comp_editor_set_e_cal (COMP_EDITOR (ee), client); @@ -245,10 +245,10 @@ event_editor_edit_comp (CompEditor *editor, ECalComponent *comp) if (!priv->meeting_shown) { comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->sched_page), - _("Scheduling")); + _("Schedulin_g")); comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->meet_page), - _("Invitations")); + _("In_vitations")); } if (!(delegate && e_cal_get_static_capability (client, CAL_STATIC_CAPABILITY_DELEGATE_TO_MANY))) { @@ -419,10 +419,10 @@ show_meeting (EventEditor *ee) if (!priv->meeting_shown) { comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->sched_page), - _("Scheduling")); + _("Schedulin_g")); comp_editor_append_page (COMP_EDITOR (ee), COMP_EDITOR_PAGE (priv->meet_page), - _("Invitations")); + _("In_vitations")); priv->meeting_shown = TRUE; comp_editor_set_changed (COMP_EDITOR (ee), FALSE); diff --git a/calendar/gui/dialogs/event-page.glade b/calendar/gui/dialogs/event-page.glade index a7a63869b3..34c5a3847f 100644 --- a/calendar/gui/dialogs/event-page.glade +++ b/calendar/gui/dialogs/event-page.glade @@ -624,7 +624,7 @@ <widget class="GtkCheckButton" id="show-time-as-busy"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">Show time as _busy</property> + <property name="label" translatable="yes">Show time as bus_y</property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> @@ -646,7 +646,7 @@ <widget class="GtkCheckButton" id="alarm"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">_Alarm</property> + <property name="label" translatable="yes">Ala_rm</property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> diff --git a/calendar/gui/dialogs/meeting-page.c b/calendar/gui/dialogs/meeting-page.c index a272a20db5..0b31e474ab 100644 --- a/calendar/gui/dialogs/meeting-page.c +++ b/calendar/gui/dialogs/meeting-page.c @@ -32,6 +32,8 @@ #include <gtk/gtktogglebutton.h> #include <gtk/gtkvbox.h> #include <gtk/gtkwindow.h> +#include <gtk/gtktreeselection.h> +#include <gdk/gdkkeysyms.h> #include <libgnome/gnome-i18n.h> #include <glade/glade.h> #include <libgnomeui/gnome-stock-icons.h> @@ -747,41 +749,54 @@ remove_clicked_cb (GtkButton *btn, MeetingPage *mpage) MeetingPagePrivate *priv; EMeetingAttendee *ia; GtkTreeSelection *selection; + GList *paths = NULL, *tmp; GtkTreeIter iter; - GtkTreePath *path; + GtkTreePath *path = NULL; gboolean valid_iter; char *address; priv = mpage->priv; selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->list_view)); - if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) { + if (!(paths = gtk_tree_selection_get_selected_rows (selection, &(priv->model)))) { g_warning ("Could not get a selection to delete."); return; } - path = gtk_tree_model_get_path (GTK_TREE_MODEL (priv->model), &iter); + paths = g_list_reverse (paths); - gtk_tree_model_get (GTK_TREE_MODEL (priv->model), &iter, E_MEETING_STORE_ADDRESS_COL, &address, -1); - ia = e_meeting_store_find_attendee (priv->model, address, NULL); - g_free (address); - if (!ia) - return; - else if (e_meeting_attendee_get_edit_level (ia) != E_MEETING_ATTENDEE_EDIT_FULL) - return; + for (tmp = paths; tmp; tmp=tmp->next) { + path = tmp->data; + + gtk_tree_model_get_iter (GTK_TREE_MODEL(priv->model), &iter, path); + + gtk_tree_model_get (GTK_TREE_MODEL (priv->model), &iter, E_MEETING_STORE_ADDRESS_COL, &address, -1); + ia = e_meeting_store_find_attendee (priv->model, address, NULL); + g_free (address); + if (!ia) { + g_warning ("Cannot delete attendee\n"); + continue; + } else if (e_meeting_attendee_get_edit_level (ia) != E_MEETING_ATTENDEE_EDIT_FULL) { + g_warning("Not enough rights to delete attendee: %s\n", e_meeting_attendee_get_address(ia)); + continue; + } + + remove_attendee (mpage, ia); + } - remove_attendee (mpage, ia); - /* Select closest item after removal */ valid_iter = gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->model), &iter, path); if (!valid_iter) { gtk_tree_path_prev (path); valid_iter = gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->model), &iter, path); } - - if (valid_iter) + + if (valid_iter) { + gtk_tree_selection_unselect_all (selection); gtk_tree_selection_select_iter (selection, &iter); - - gtk_tree_path_free (path); + } + + g_list_foreach (paths, gtk_tree_path_free, NULL); + g_list_free (paths); } /* Function called to invite more people */ @@ -864,6 +879,14 @@ client_changed_cb (CompEditorPage *page, ECal *client, gpointer user_data) } static void +popup_add_cb (EPopup *ep, EPopupItem *pitem, void *data) +{ + MeetingPage *mpage = data; + + add_clicked_cb (NULL, mpage); +} + +static void popup_delete_cb (EPopup *ep, EPopupItem *pitem, void *data) { MeetingPage *mpage = data; @@ -871,20 +894,19 @@ popup_delete_cb (EPopup *ep, EPopupItem *pitem, void *data) priv = mpage->priv; - remove_attendee_at_row (mpage, priv->row); + remove_clicked_cb (NULL, mpage); } enum { - CAN_DELEGATE = 2, - CAN_DELETE = 4 + ATTENDEE_CAN_DELEGATE = 1<<1, + ATTENDEE_CAN_DELETE = 1<<2, + ATTENDEE_CAN_ADD = 1<<3, + ATTENDEE_LAST = 1<<4, }; static EPopupItem context_menu_items[] = { -#if 0 - { E_POPUP_ITEM, "00.delegate", N_("_Delegate To..."), popup_delegate_cb, NULL, NULL, CAN_DELEGATE }, - { E_POPUP_BAR, "05.bar" }, -#endif - { E_POPUP_ITEM, "10.delete", N_("_Remove"), popup_delete_cb, NULL, GTK_STOCK_REMOVE, CAN_DELETE }, + { E_POPUP_ITEM, "10.delete", N_("_Remove"), popup_delete_cb, NULL, GTK_STOCK_REMOVE, ATTENDEE_CAN_DELETE }, + { E_POPUP_ITEM, "15.add", N_("_Add "), popup_add_cb, NULL, GTK_STOCK_ADD }, }; static void @@ -902,7 +924,7 @@ button_press_event (GtkWidget *widget, GdkEventButton *event, MeetingPage *mpage GtkTreePath *path; GtkTreeIter iter; char *address; - int disable_mask = 0; + guint32 disable_mask = ~0; GSList *menus = NULL; ECalPopup *ep; int i; @@ -914,24 +936,36 @@ button_press_event (GtkWidget *widget, GdkEventButton *event, MeetingPage *mpage return FALSE; /* only if we right-click on an attendee */ - if (!gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (priv->list_view), event->x, event->y, &path, NULL, NULL, NULL)) - return FALSE; - if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->model), &iter, path)) - return FALSE; - - gtk_tree_model_get (GTK_TREE_MODEL (priv->model), &iter, E_MEETING_STORE_ADDRESS_COL, &address, -1); - ia = e_meeting_store_find_attendee (priv->model, address, &priv->row); - g_free (address); - if (!ia) - return FALSE; - - if (e_meeting_attendee_get_edit_level (ia) != E_MEETING_ATTENDEE_EDIT_FULL) - disable_mask = CAN_DELETE; + if (gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (priv->list_view), event->x, event->y, &path, NULL, NULL, NULL)) { + GtkTreeSelection *selection; + + if (gtk_tree_model_get_iter (GTK_TREE_MODEL (priv->model), &iter, path)) { + + gtk_tree_model_get (GTK_TREE_MODEL (priv->model), &iter, E_MEETING_STORE_ADDRESS_COL, &address, -1); + ia = e_meeting_store_find_attendee (priv->model, address, &priv->row); + g_free (address); + + if (ia) { + selection = gtk_tree_view_get_selection (priv->list_view); + gtk_tree_selection_unselect_all (selection); + gtk_tree_selection_select_path (selection, path); + + if (e_meeting_attendee_get_edit_level (ia) == E_MEETING_ATTENDEE_EDIT_FULL) + disable_mask &= ~ATTENDEE_CAN_DELETE; + } + } + } + + if (GTK_WIDGET_IS_SENSITIVE(priv->add)) + disable_mask &= ~ATTENDEE_CAN_ADD; + else if (priv->user_org) + disable_mask &= ~ATTENDEE_CAN_ADD; ep = e_cal_popup_new("org.gnome.evolution.calendar.meeting.popup"); + for (i=0;i<sizeof(context_menu_items)/sizeof(context_menu_items[0]);i++) menus = g_slist_prepend(menus, &context_menu_items[i]); - + e_popup_add_items((EPopup *)ep, menus, NULL, context_popup_free, mpage); menu = e_popup_create_menu_once((EPopup *)ep, NULL, disable_mask); gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event->button, event->time); @@ -939,6 +973,47 @@ button_press_event (GtkWidget *widget, GdkEventButton *event, MeetingPage *mpage return TRUE; } +static gboolean +list_view_event (EMeetingListView *list_view, GdkEvent *event, MeetingPage *mpage) { + + MeetingPagePrivate *priv= mpage->priv; + + if (event->type == GDK_2BUTTON_PRESS && mpage->priv->user_org) { + EMeetingAttendee *attendee; + + attendee = e_meeting_store_add_attendee_with_defaults (priv->model); + + if (COMP_EDITOR_PAGE (mpage)->flags & COMP_EDITOR_PAGE_DELEGATE) { + e_meeting_attendee_set_delfrom (attendee, g_strdup_printf ("MAILTO:%s", mpage->priv->user_add)); + } + + e_meeting_list_view_edit (mpage->priv->list_view, attendee); + return TRUE; + } + + return FALSE; +} + + +static gboolean +list_key_press (EMeetingListView *list_view, GdkEventKey *event, MeetingPage *mpage) +{ + if (event->keyval == GDK_Delete) { + MeetingPagePrivate *priv; + + priv = mpage->priv; + remove_clicked_cb (NULL, mpage); + + return TRUE; + } else if (event->keyval == GDK_Insert) { + add_clicked_cb (NULL, mpage); + + return TRUE; + } + + return FALSE; +} + /** * meeting_page_construct: * @mpage: An task details page. @@ -959,6 +1034,7 @@ meeting_page_construct (MeetingPage *mpage, EMeetingStore *ems, GList *address_strings = NULL, *l; GtkWidget *sw; EAccount *a; + GtkTreeSelection *selection; priv = mpage->priv; @@ -1022,11 +1098,15 @@ meeting_page_construct (MeetingPage *mpage, EMeetingStore *ems, priv->model = ems; priv->list_view = e_meeting_list_view_new (priv->model); + selection = gtk_tree_view_get_selection (priv->list_view); + gtk_tree_selection_set_mode (selection, GTK_SELECTION_MULTIPLE); + g_signal_connect (G_OBJECT (priv->list_view), "button_press_event", G_CALLBACK (button_press_event), mpage); + g_signal_connect (G_OBJECT (priv->list_view), "event", G_CALLBACK (list_view_event), mpage); gtk_widget_show (GTK_WIDGET (priv->list_view)); sw = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS); + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw), GTK_SHADOW_IN); gtk_widget_show (sw); gtk_container_add (GTK_CONTAINER (sw), GTK_WIDGET (priv->list_view)); @@ -1040,6 +1120,7 @@ meeting_page_construct (MeetingPage *mpage, EMeetingStore *ems, g_signal_connect_after (G_OBJECT (mpage), "client_changed", G_CALLBACK (client_changed_cb), NULL); + g_signal_connect (priv->list_view, "key_press_event", list_key_press, mpage); return mpage; } diff --git a/calendar/gui/dialogs/meeting-page.glade b/calendar/gui/dialogs/meeting-page.glade index 254c0b0f1c..33c17f7732 100644 --- a/calendar/gui/dialogs/meeting-page.glade +++ b/calendar/gui/dialogs/meeting-page.glade @@ -329,7 +329,7 @@ <child> <widget class="GtkLabel" id="label2"> <property name="visible">True</property> - <property name="label" translatable="yes">Con_tacts...</property> + <property name="label" translatable="yes">Co_ntacts...</property> <property name="use_underline">True</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> diff --git a/calendar/gui/dialogs/task-details-page.glade b/calendar/gui/dialogs/task-details-page.glade index 7078f74d92..910f7835b2 100644 --- a/calendar/gui/dialogs/task-details-page.glade +++ b/calendar/gui/dialogs/task-details-page.glade @@ -83,7 +83,7 @@ <child> <widget class="GtkLabel" id="label17"> <property name="visible">True</property> - <property name="label" translatable="yes">_Status:</property> + <property name="label" translatable="yes">Stat_us:</property> <property name="use_underline">True</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_CENTER</property> diff --git a/calendar/gui/dialogs/task-editor.c b/calendar/gui/dialogs/task-editor.c index 85ddbabbc4..5cb865d5d2 100644 --- a/calendar/gui/dialogs/task-editor.c +++ b/calendar/gui/dialogs/task-editor.c @@ -134,7 +134,7 @@ task_editor_construct (TaskEditor *te, ECal *client) gtk_object_sink (GTK_OBJECT (priv->task_page)); comp_editor_append_page (COMP_EDITOR (te), COMP_EDITOR_PAGE (priv->task_page), - _("Task")); + _("_Task")); g_signal_connect (G_OBJECT (priv->task_page), "client_changed", G_CALLBACK (client_changed_cb), te); @@ -143,7 +143,7 @@ task_editor_construct (TaskEditor *te, ECal *client) gtk_object_sink (GTK_OBJECT (priv->task_details_page)); comp_editor_append_page (COMP_EDITOR (te), COMP_EDITOR_PAGE (priv->task_details_page), - _("Status")); + _("_Status")); if (!e_cal_is_read_only (client, &read_only, NULL)) read_only = TRUE; @@ -158,7 +158,7 @@ task_editor_construct (TaskEditor *te, ECal *client) gtk_object_sink (GTK_OBJECT (priv->meet_page)); comp_editor_append_page (COMP_EDITOR (te), COMP_EDITOR_PAGE (priv->meet_page), - _("Assignment")); + _("Assig_nment")); } comp_editor_set_e_cal (COMP_EDITOR (te), client); @@ -220,7 +220,7 @@ task_editor_edit_comp (CompEditor *editor, ECalComponent *comp) if (!priv->assignment_shown) comp_editor_append_page (COMP_EDITOR (te), COMP_EDITOR_PAGE (priv->meet_page), - _("Assignment")); + _("Assig_nment")); for (l = attendees; l != NULL; l = l->next) { ECalComponentAttendee *ca = l->data; @@ -377,7 +377,7 @@ show_assignment (TaskEditor *te) if (!priv->assignment_shown) { comp_editor_append_page (COMP_EDITOR (te), COMP_EDITOR_PAGE (priv->meet_page), - _("Assignment")); + _("Assig_nment")); priv->assignment_shown = TRUE; comp_editor_set_needs_send (COMP_EDITOR (te), priv->assignment_shown); diff --git a/calendar/gui/dialogs/task-page.glade b/calendar/gui/dialogs/task-page.glade index 3415672ec2..76156a3a1a 100644 --- a/calendar/gui/dialogs/task-page.glade +++ b/calendar/gui/dialogs/task-page.glade @@ -250,7 +250,7 @@ <widget class="GtkButton" id="categories-button"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="label" translatable="yes">Ca_tegories...</property> + <property name="label" translatable="yes">Categor_ies...</property> <property name="use_underline">True</property> <property name="relief">GTK_RELIEF_NORMAL</property> <property name="focus_on_click">True</property> diff --git a/calendar/gui/e-meeting-list-view.c b/calendar/gui/e-meeting-list-view.c index 101b6281a8..ab25919ee8 100644 --- a/calendar/gui/e-meeting-list-view.c +++ b/calendar/gui/e-meeting-list-view.c @@ -347,6 +347,8 @@ build_table (EMeetingListView *lview) GtkTreeView *view = GTK_TREE_VIEW (lview); EMeetingListViewPrivate *priv; GHashTable *edit_table; + GtkTreeViewColumn *col; + int pos; priv = lview->priv; edit_table = priv->renderers; @@ -355,45 +357,62 @@ build_table (EMeetingListView *lview) renderer = e_select_names_renderer_new (); g_object_set (G_OBJECT (renderer), "editable", TRUE, NULL); - gtk_tree_view_insert_column_with_attributes (view, -1, _("Attendee"), renderer, + /* The extra space is just a hack to occupy more space for Attendee */ + pos = gtk_tree_view_insert_column_with_attributes (view, -1, _("Attendee "), renderer, "text", E_MEETING_STORE_ATTENDEE_COL, "name", E_MEETING_STORE_CN_COL, "email", E_MEETING_STORE_ADDRESS_COL, "underline", E_MEETING_STORE_ATTENDEE_UNDERLINE_COL, NULL); + col = gtk_tree_view_get_column (view, pos -1); + gtk_tree_view_column_set_resizable (col, TRUE); + gtk_tree_view_column_set_reorderable(col, TRUE); + g_object_set (col, "width", 50, NULL); g_signal_connect (renderer, "cell_edited", G_CALLBACK (attendee_edited_cb), view); g_signal_connect (renderer, "editing-canceled", G_CALLBACK (attendee_editing_canceled_cb), view); g_hash_table_insert (edit_table, GINT_TO_POINTER (E_MEETING_STORE_ATTENDEE_COL), renderer); renderer = e_cell_renderer_combo_new (); g_object_set (G_OBJECT (renderer), "list", get_type_strings (), "editable", TRUE, NULL); - gtk_tree_view_insert_column_with_attributes (view, -1, _("Type"), renderer, + pos = gtk_tree_view_insert_column_with_attributes (view, -1, _("Type"), renderer, "text", E_MEETING_STORE_TYPE_COL, NULL); + col = gtk_tree_view_get_column (view, pos -1); + gtk_tree_view_column_set_resizable (col, TRUE); + gtk_tree_view_column_set_reorderable(col, TRUE); g_signal_connect (renderer, "edited", G_CALLBACK (type_edited_cb), view); g_hash_table_insert (edit_table, GINT_TO_POINTER (E_MEETING_STORE_TYPE_COL), renderer); renderer = e_cell_renderer_combo_new (); g_object_set (G_OBJECT (renderer), "list", get_role_strings (), "editable", TRUE, NULL); - gtk_tree_view_insert_column_with_attributes (view, -1, _("Role"), renderer, + pos = gtk_tree_view_insert_column_with_attributes (view, -1, _("Role"), renderer, "text", E_MEETING_STORE_ROLE_COL, NULL); + col = gtk_tree_view_get_column (view, pos -1); + gtk_tree_view_column_set_resizable (col, TRUE); + gtk_tree_view_column_set_reorderable(col, TRUE); g_signal_connect (renderer, "edited", G_CALLBACK (role_edited_cb), view); g_hash_table_insert (edit_table, GINT_TO_POINTER (E_MEETING_STORE_ROLE_COL), renderer); renderer = e_cell_renderer_combo_new (); g_object_set (G_OBJECT (renderer), "list", get_rsvp_strings (), "editable", TRUE, NULL); - gtk_tree_view_insert_column_with_attributes (view, -1, _("RSVP"), renderer, + pos = gtk_tree_view_insert_column_with_attributes (view, -1, _("RSVP"), renderer, "text", E_MEETING_STORE_RSVP_COL, NULL); + col = gtk_tree_view_get_column (view, pos -1); + gtk_tree_view_column_set_resizable (col, TRUE); + gtk_tree_view_column_set_reorderable(col, TRUE); g_signal_connect (renderer, "edited", G_CALLBACK (rsvp_edited_cb), view); g_hash_table_insert (edit_table, GINT_TO_POINTER (E_MEETING_STORE_RSVP_COL), renderer); renderer = e_cell_renderer_combo_new (); g_object_set (G_OBJECT (renderer), "list", get_status_strings (), "editable", TRUE, NULL); - gtk_tree_view_insert_column_with_attributes (view, -1, _("Status"), renderer, + pos = gtk_tree_view_insert_column_with_attributes (view, -1, _("Status"), renderer, "text", E_MEETING_STORE_STATUS_COL, NULL); + col = gtk_tree_view_get_column (view, pos -1); + gtk_tree_view_column_set_resizable (col, TRUE); + gtk_tree_view_column_set_reorderable(col, TRUE); g_signal_connect (renderer, "edited", G_CALLBACK (status_edited_cb), view); g_hash_table_insert (edit_table, GINT_TO_POINTER (E_MEETING_STORE_STATUS_COL), renderer); diff --git a/calendar/gui/e-meeting-time-sel.c b/calendar/gui/e-meeting-time-sel.c index 3a2682535e..0d9e93dc3e 100644 --- a/calendar/gui/e-meeting-time-sel.c +++ b/calendar/gui/e-meeting-time-sel.c @@ -333,6 +333,9 @@ e_meeting_time_selector_construct (EMeetingTimeSelector * mts, EMeetingStore *em mts->list_view = e_meeting_list_view_new (mts->model); e_meeting_list_view_column_set_visible (mts->list_view, "Role", FALSE); e_meeting_list_view_column_set_visible (mts->list_view, "RSVP", FALSE); + e_meeting_list_view_column_set_visible (mts->list_view, "Status", FALSE); + e_meeting_list_view_column_set_visible (mts->list_view, "Type", FALSE); + gtk_widget_show (GTK_WIDGET (mts->list_view)); diff --git a/calendar/gui/e-tasks.c b/calendar/gui/e-tasks.c index bf281e83d3..a64359ab56 100644 --- a/calendar/gui/e-tasks.c +++ b/calendar/gui/e-tasks.c @@ -518,6 +518,7 @@ setup_widgets (ETasks *tasks) ETasksPrivate *priv; ETable *etable; ECalModel *model; + gboolean state; priv = tasks->priv; @@ -586,7 +587,10 @@ setup_widgets (ETasks *tasks) priv->preview = e_cal_component_preview_new (); e_cal_component_preview_set_default_timezone (E_CAL_COMPONENT_PREVIEW (priv->preview), calendar_config_get_icaltimezone ()); gtk_paned_add2 (GTK_PANED (priv->paned), priv->preview); - gtk_widget_show (priv->preview); + state = calendar_config_get_preview_state (); + + if (state) + gtk_widget_show (priv->preview); model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); g_signal_connect (G_OBJECT (model), "model_row_changed", @@ -999,6 +1003,52 @@ e_tasks_new_task (ETasks *tasks) comp_editor_focus (COMP_EDITOR (tedit)); } +void +e_tasks_show_preview (ETasks *tasks, gboolean state) +{ + ETasksPrivate *priv; + + g_return_val_if_fail (tasks != NULL, FALSE); + g_return_val_if_fail (E_IS_TASKS (tasks), FALSE); + priv = tasks->priv; + + if (state) { + ECalModel *model; + ECalModelComponent *comp_data; + ECalComponent *comp; + ETable *etable; + const char *uid; + int n_selected; + + etable = e_table_scrolled_get_table (E_TABLE_SCROLLED (E_CALENDAR_TABLE (priv->tasks_view)->etable)); + n_selected = e_table_selected_count (etable); + + if (n_selected != 1) { + e_cal_component_preview_clear (E_CAL_COMPONENT_PREVIEW (priv->preview)); + } else { + model = e_calendar_table_get_model (E_CALENDAR_TABLE (priv->tasks_view)); + + comp_data = e_cal_model_get_component_at (model, e_table_get_cursor_row (etable)); + comp = e_cal_component_new (); + e_cal_component_set_icalcomponent (comp, icalcomponent_new_clone (comp_data->icalcomp)); + + e_cal_component_preview_display (E_CAL_COMPONENT_PREVIEW (priv->preview), comp_data->client, comp); + + e_cal_component_get_uid (comp, &uid); + if (priv->current_uid) + g_free (priv->current_uid); + priv->current_uid = g_strdup (uid); + + g_object_unref (comp); + } + gtk_widget_show (priv->preview); + + } else { + e_cal_component_preview_clear (E_CAL_COMPONENT_PREVIEW (priv->preview)); + gtk_widget_hide (priv->preview); + } +} + gboolean e_tasks_add_todo_source (ETasks *tasks, ESource *source) { diff --git a/calendar/gui/e-tasks.h b/calendar/gui/e-tasks.h index 3004d09972..e7ff9a8f96 100644 --- a/calendar/gui/e-tasks.h +++ b/calendar/gui/e-tasks.h @@ -78,7 +78,7 @@ void e_tasks_complete_selected (ETasks *tasks); void e_tasks_delete_selected (ETasks *tasks); void e_tasks_delete_completed (ETasks *tasks); - +void e_tasks_show_preview (ETasks *tasks, gboolean state); void e_tasks_setup_view_menus (ETasks *tasks, BonoboUIComponent *uic); void e_tasks_discard_view_menus (ETasks *tasks); diff --git a/calendar/gui/tasks-control.c b/calendar/gui/tasks-control.c index ccf09a87f2..33c55488d4 100644 --- a/calendar/gui/tasks-control.c +++ b/calendar/gui/tasks-control.c @@ -102,6 +102,11 @@ static void tasks_control_forward_cmd (BonoboUIComponent *uic, gpointer data, const char *path); +static void tasks_control_view_preview (BonoboUIComponent *uic, + const char *path, + Bonobo_UIComponent_EventType type, + const char *state, + void *data); BonoboControl * tasks_control_new (void) @@ -245,7 +250,7 @@ static BonoboUIVerb verbs [] = { BONOBO_UI_VERB ("TasksPrintPreview", tasks_control_print_preview_cmd), BONOBO_UI_VERB ("TasksAssign", tasks_control_assign_cmd), BONOBO_UI_VERB ("TasksForward", tasks_control_forward_cmd), - + BONOBO_UI_VERB ("ViewPreview", tasks_control_view_preview), BONOBO_UI_VERB_END }; @@ -257,6 +262,7 @@ tasks_control_activate (BonoboControl *control, ETasks *tasks) int n_selected; ECalendarTable *cal_table; ETable *etable; + gboolean state; uic = bonobo_control_get_ui_component (control); g_assert (uic != NULL); @@ -289,8 +295,12 @@ tasks_control_activate (BonoboControl *control, ETasks *tasks) tasks_control_sensitize_commands (control, tasks, n_selected); - bonobo_ui_component_thaw (uic, NULL); + state = calendar_config_get_preview_state(); + bonobo_ui_component_thaw (uic, NULL); + + bonobo_ui_component_add_listener(uic, "ViewPreview", tasks_control_view_preview, tasks); + bonobo_ui_component_set_prop(uic, "/commands/ViewPreview", "state", state?"1":"0", NULL); /* Show the dialog for setting the timezone if the user hasn't chosen a default timezone already. This is done in the startup wizard now, so we don't do it here. */ @@ -516,4 +526,18 @@ tasks_control_forward_cmd (BonoboUIComponent *uic, itip_send_comp (E_CAL_COMPONENT_METHOD_PUBLISH, comp, comp_data->client, NULL, NULL); g_object_unref (comp); } -} +} + +static void +tasks_control_view_preview (BonoboUIComponent *uic, const char *path, Bonobo_UIComponent_EventType type, const char *state, void *data) +{ + ETasks *tasks; + + if (type != Bonobo_UIComponent_STATE_CHANGED) + return; + + tasks = E_TASKS (data); + + calendar_config_set_preview_state (state[0] != '0'); + e_tasks_show_preview (tasks, state[0] != '0'); +} |