aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui
diff options
context:
space:
mode:
authorSrinivasa Ragavan <sragavan@novell.com>2005-10-07 02:21:52 +0800
committerSrinivasa Ragavan <sragavan@src.gnome.org>2005-10-07 02:21:52 +0800
commit1e5c74f855dca5c1d1a017a7abbce39768e9efef (patch)
tree160a0738b7a58ff4d6a64decd54d0fcaf685743c /calendar/gui
parent11f58b12100ae5177675ef31d16340b9e435e00a (diff)
downloadgsoc2013-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/gui')
-rw-r--r--calendar/gui/apps_evolution_calendar.schemas.in.in14
-rw-r--r--calendar/gui/calendar-config-keys.h1
-rw-r--r--calendar/gui/calendar-config.c16
-rw-r--r--calendar/gui/calendar-config.h3
-rw-r--r--calendar/gui/dialogs/comp-editor.c41
-rw-r--r--calendar/gui/dialogs/event-editor.c18
-rw-r--r--calendar/gui/dialogs/event-page.glade4
-rw-r--r--calendar/gui/dialogs/meeting-page.c161
-rw-r--r--calendar/gui/dialogs/meeting-page.glade2
-rw-r--r--calendar/gui/dialogs/task-details-page.glade2
-rw-r--r--calendar/gui/dialogs/task-editor.c10
-rw-r--r--calendar/gui/dialogs/task-page.glade2
-rw-r--r--calendar/gui/e-meeting-list-view.c29
-rw-r--r--calendar/gui/e-meeting-time-sel.c3
-rw-r--r--calendar/gui/e-tasks.c52
-rw-r--r--calendar/gui/e-tasks.h2
-rw-r--r--calendar/gui/tasks-control.c30
17 files changed, 310 insertions, 80 deletions
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');
+}