From 7841714fe56cf575af6df31b30015a781630b7c1 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 19 Apr 2010 12:37:29 +0200 Subject: Bug #615331 - Message list/Folder tree focus policy has changed --- mail/em-folder-tree.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) (limited to 'mail/em-folder-tree.c') diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index bbb9ec379b..b1f204df4b 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -54,6 +54,8 @@ #include "e-util/e-alert-dialog.h" #include "e-util/e-util.h" +#include "misc/e-selectable.h" + #include "em-vfolder-rule.h" #include "mail-mt.h" @@ -110,6 +112,8 @@ struct _EMFolderTreePrivate { GtkCellRenderer *text_renderer; + GtkWidget *selectable; /* an ESelectable, where to pass selectable calls */ + /* Signal handler IDs */ gulong selection_changed_handler_id; }; @@ -1160,6 +1164,8 @@ folder_tree_new (EMFolderTree *folder_tree) tree = GTK_WIDGET (folder_tree); GTK_WIDGET_SET_FLAGS(tree, GTK_CAN_FOCUS); + folder_tree->priv->selectable = NULL; + column = gtk_tree_view_column_new (); gtk_tree_view_append_column ((GtkTreeView *) tree, column); @@ -1292,6 +1298,80 @@ folder_tree_init (EMFolderTree *folder_tree) em_folder_tree_construct (folder_tree); } +/* Sets a selectable widget, which will be used for update-actions and select-all + selectable interface functions. This can be NULL, then nothing can be selected + and calling selectable function does nothing. */ +void +em_folder_tree_set_selectable_widget (EMFolderTree *folder_tree, GtkWidget *selectable) +{ + if (selectable) + g_return_if_fail (E_IS_SELECTABLE (selectable)); + + folder_tree->priv->selectable = selectable; +} + +static void +folder_tree_selectable_update_actions (ESelectable *selectable, + EFocusTracker *focus_tracker, + GdkAtom *clipboard_targets, + gint n_clipboard_targets) +{ + EMFolderTree *folder_tree; + + folder_tree = EM_FOLDER_TREE (selectable); + g_return_if_fail (folder_tree != NULL); + + if (folder_tree->priv->selectable) { + ESelectableInterface *iface = E_SELECTABLE_GET_INTERFACE (folder_tree->priv->selectable); + + g_return_if_fail (iface != NULL); + g_return_if_fail (iface->update_actions != NULL); + + iface->update_actions (E_SELECTABLE (folder_tree->priv->selectable), focus_tracker, clipboard_targets, n_clipboard_targets); + } +} + +#define folder_tree_selectable_func(_func) \ +static void \ +folder_tree_selectable_ ## _func (ESelectable *selectable) \ +{ \ + EMFolderTree *folder_tree; \ + \ + folder_tree = EM_FOLDER_TREE (selectable); \ + g_return_if_fail (folder_tree != NULL); \ + \ + if (folder_tree->priv->selectable) { \ + ESelectableInterface *iface = E_SELECTABLE_GET_INTERFACE (folder_tree->priv->selectable); \ + \ + g_return_if_fail (iface != NULL); \ + if (iface-> _func ) { \ + if (gtk_widget_get_can_focus (folder_tree->priv->selectable) && \ + !gtk_widget_has_focus (folder_tree->priv->selectable)) \ + gtk_widget_grab_focus (folder_tree->priv->selectable); \ + iface-> _func (E_SELECTABLE (folder_tree->priv->selectable)); \ + } \ + } \ +} + +folder_tree_selectable_func (cut_clipboard); +folder_tree_selectable_func (copy_clipboard); +folder_tree_selectable_func (paste_clipboard); +folder_tree_selectable_func (delete_selection); +folder_tree_selectable_func (select_all); + +#undef folder_tree_selectable_func + +static void +folder_tree_selectable_init (ESelectableInterface *interface) +{ + interface->update_actions = folder_tree_selectable_update_actions; + interface->cut_clipboard = folder_tree_selectable_cut_clipboard; + interface->copy_clipboard = folder_tree_selectable_copy_clipboard; + interface->paste_clipboard = folder_tree_selectable_paste_clipboard; + interface->delete_selection = folder_tree_selectable_delete_selection; + interface->select_all = folder_tree_selectable_select_all; +} + GType em_folder_tree_get_type (void) { @@ -1311,8 +1391,17 @@ em_folder_tree_get_type (void) NULL /* value_table */ }; + static const GInterfaceInfo selectable_info = { + (GInterfaceInitFunc) folder_tree_selectable_init, + (GInterfaceFinalizeFunc) NULL, + NULL /* interface_data */ + }; + type = g_type_register_static ( GTK_TYPE_TREE_VIEW, "EMFolderTree", &type_info, 0); + + g_type_add_interface_static ( + type, E_TYPE_SELECTABLE, &selectable_info); } return type; -- cgit v1.2.3 From ae66b7f97a6b6d3009aea4b905066b417833fe96 Mon Sep 17 00:00:00 2001 From: Milan Crha Date: Mon, 10 May 2010 19:06:07 +0200 Subject: Bug #616823 - Evolution allows moving IMAP Inbox to other folders --- mail/em-folder-tree.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'mail/em-folder-tree.c') diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index b1f204df4b..fdd1b88ee0 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -1786,11 +1786,14 @@ folder_tree_drop_target(EMFolderTree *folder_tree, GdkDragContext *context, GtkT GtkTreePath *src_path = gtk_tree_row_reference_get_path(p->drag_row); if (src_path) { + guint32 src_flags = 0; + if (gtk_tree_model_get_iter (model, &iter, src_path)) gtk_tree_model_get ( model, &iter, COL_POINTER_CAMEL_STORE, &sstore, - COL_STRING_URI, &src_uri, -1); + COL_STRING_URI, &src_uri, + COL_UINT_FLAGS, &src_flags, -1); /* can't dnd onto itself or below itself - bad things happen, no point dragging to where we were either */ @@ -1803,6 +1806,26 @@ folder_tree_drop_target(EMFolderTree *folder_tree, GdkDragContext *context, GtkT } gtk_tree_path_free(src_path); + + if ((src_flags & CAMEL_FOLDER_TYPE_MASK) == CAMEL_FOLDER_TYPE_INBOX || (src_flags & CAMEL_FOLDER_SYSTEM) != 0) { + /* allow only copy of the Inbox and other system folders */ + GdkAtom xfolder; + + /* TODO: not sure if this is legal, but it works, force copy for special local folders */ + context->suggested_action = GDK_ACTION_COPY; + context->actions = GDK_ACTION_COPY; + xfolder = drop_atoms[DND_DROP_TYPE_FOLDER]; + while (targets != NULL) { + if (targets->data == (gpointer) xfolder) { + atom = xfolder; + goto done; + } + + targets = targets->next; + } + + goto done; + } } } @@ -1824,6 +1847,7 @@ folder_tree_drop_target(EMFolderTree *folder_tree, GdkDragContext *context, GtkT /* TODO: not sure if this is legal, but it works, force copy for special local folders */ context->suggested_action = GDK_ACTION_COPY; + context->actions = GDK_ACTION_COPY; xfolder = drop_atoms[DND_DROP_TYPE_FOLDER]; while (targets != NULL) { if (targets->data == (gpointer) xfolder) { -- cgit v1.2.3 From 96538878911586a9e9ca26b81e1916c04e538980 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Tue, 25 May 2010 10:15:32 -0400 Subject: Coding style and whitespace cleanup. --- mail/em-folder-tree.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'mail/em-folder-tree.c') diff --git a/mail/em-folder-tree.c b/mail/em-folder-tree.c index fdd1b88ee0..371d764d74 100644 --- a/mail/em-folder-tree.c +++ b/mail/em-folder-tree.c @@ -2834,22 +2834,22 @@ em_folder_tree_restore_state (EMFolderTree *folder_tree, goto next; group_name = g_strdup_printf ("Store %s", uri); - + if (e_shell_get_express_mode (shell)) { gboolean system = FALSE; if (strncmp (uri, "vfolder", 7) == 0 || strncmp(uri, "mbox", 4) == 0) system = TRUE; - + if (!system && !g_key_file_has_key (key_file, group_name, key, NULL)) { GtkTreePath *path; - + path = gtk_tree_model_get_path (tree_model, &iter); gtk_tree_view_expand_row (tree_view, path, FALSE); gtk_tree_path_free (path); } - + } else if (!g_key_file_has_key (key_file, group_name, key, NULL)) { GtkTreePath *path; -- cgit v1.2.3