/* folder view */
g_signal_connect (G_OBJECT(priv->folder_view), "folder_selection_changed",
G_CALLBACK(modest_ui_actions_on_folder_selection_changed), self);
- g_signal_connect (G_OBJECT(priv->folder_view), "folder_moved",
- G_CALLBACK(modest_ui_actions_on_folder_moved), NULL);
+ g_signal_connect (G_OBJECT(priv->folder_view), "folder_xfer",
+ G_CALLBACK(modest_ui_actions_on_folder_xfer), NULL);
g_signal_connect (G_OBJECT(priv->folder_view), "button-press-event",
G_CALLBACK (on_folder_view_button_press_event),self);
g_signal_connect (priv->folder_view,"popup-menu",
G_CALLBACK(modest_ui_actions_on_msg_attachment_clicked), self);
/* Account store */
- g_signal_connect (G_OBJECT (modest_runtime_get_account_store()), "accounts_reloaded",
- G_CALLBACK (modest_ui_actions_on_accounts_reloaded), self);
g_signal_connect (G_OBJECT (modest_runtime_get_account_store()), "password_requested",
G_CALLBACK (modest_ui_actions_on_password_requested), self);
gtk_paned_add1 (GTK_PANED(priv->msg_paned), header_win);
gtk_paned_add2 (GTK_PANED(priv->msg_paned), GTK_WIDGET(priv->msg_preview));
- gtk_widget_show (GTK_WIDGET(priv->header_view));
-
/* status bar / progress */
status_hbox = gtk_hbox_new (FALSE, 0);
gtk_box_pack_start (GTK_BOX(status_hbox), priv->folder_info_label, FALSE,FALSE, 6);
#include <tny-account-store.h>
#include <tny-simple-list.h>
#include <modest-tny-msg.h>
+#include "modest-icon-names.h"
+#include "modest-ui-actions.h"
+#include <modest-widget-memory.h>
+#include <modest-runtime.h>
#include <widgets/modest-msg-view-window.h>
-#include "modest-main-window-ui.h"
#include <widgets/modest-window-priv.h>
+#include "widgets/modest-msg-view.h"
-#include <modest-widget-memory.h>
-#include <modest-runtime.h>
static void modest_msg_view_window_class_init (ModestMsgViewWindowClass *klass);
static void modest_msg_view_window_init (ModestMsgViewWindow *obj);
/* globals */
static GtkWindowClass *parent_class = NULL;
-/* uncomment the following if you have defined any signals */
-/* static guint signals[LAST_SIGNAL] = {0}; */
+/* Action entries */
+static const GtkActionEntry modest_action_entries [] = {
+
+ /* Toplevel menus */
+ { "Edit", NULL, N_("_Edit") },
+ { "Actions", NULL, N_("_Actions") },
+ { "Help", NULL, N_("_Help") },
+
+ /* EDIT */
+ { "EditUndo", GTK_STOCK_UNDO, N_("_Undo"), "<CTRL>Z", N_("Undo last action"), NULL },
+ { "EditRedo", GTK_STOCK_REDO, N_("_Redo"), "<shift><CTRL>Z", N_("Redo previous action"), NULL },
+ { "EditCut", GTK_STOCK_CUT, N_("Cut"), "<CTRL>X", N_("_Cut"), NULL },
+ { "EditCopy", GTK_STOCK_COPY, N_("Copy"), "<CTRL>C", N_("Copy"), NULL },
+ { "EditPaste", GTK_STOCK_PASTE, N_("Paste"), "<CTRL>V", N_("Paste"), NULL },
+ { "EditDelete", GTK_STOCK_DELETE, N_("_Delete"), "<CTRL>Q", N_("Delete"), NULL },
+ { "EditSelectAll", NULL, N_("Select all"), "<CTRL>A", N_("Select all"), NULL },
+ { "EditDeselectAll", NULL, N_("Deselect all"), "<Shift><CTRL>A", N_("Deselect all"), NULL },
+
+ /* ACTIONS */
+ { "ActionsReply", MODEST_STOCK_REPLY, N_("_Reply"), NULL, N_("Reply to a message"), G_CALLBACK (modest_ui_actions_on_reply) },
+ { "ActionsReplyAll", MODEST_STOCK_REPLY_ALL, N_("Reply to all"), NULL, N_("Reply to all"), G_CALLBACK (modest_ui_actions_on_reply_all) },
+ { "ActionsForward", MODEST_STOCK_FORWARD, N_("_Forward"), NULL, N_("Forward a message"), G_CALLBACK (modest_ui_actions_on_forward) },
+ { "ActionsBounce", NULL, N_("_Bounce"), NULL, N_("Bounce a message"), NULL },
+ { "ActionsSendReceive", MODEST_STOCK_SEND_RECEIVE, N_("Send/Receive"), NULL, N_("Send and receive messages"), NULL },
+ { "ActionsDelete", MODEST_STOCK_DELETE, N_("Delete message"), NULL, N_("Delete messages"), G_CALLBACK (modest_ui_actions_on_delete) },
+
+ /* HELP */
+ { "HelpAbout", GTK_STOCK_ABOUT, N_("About"), NULL, N_("About Modest"), G_CALLBACK (modest_ui_actions_on_about) },
+};
+
GType
modest_msg_view_window_get_type (void)
<menuitem name="ActionsReplyMenu" action="ActionsReply"/>
<menuitem name="ActionsReplyAllMenu" action="ActionsReplyAll"/>
<menuitem name="ActionsForwardMenu" action="ActionsForward"/>
- <separator/>
- <menuitem name="ActionsFolderNewMenu" action="ActionsFolderNew"/>
- <menuitem name="ActionsFolderDeleteMenu" action="ActionsFolderDelete"/>
- <menuitem name="ActionsFolderRenameMenu" action="ActionsFolderRename"/>
- <menuitem name="ActionsFolderMoveToTrashMenu" action="ActionsFolderMoveToTrash"/>
</menu>
</menubar>
/* folder view */
g_signal_connect (G_OBJECT(priv->folder_view), "folder_selection_changed",
G_CALLBACK(modest_ui_actions_on_folder_selection_changed), self);
- g_signal_connect (G_OBJECT(priv->folder_view), "folder_moved",
- G_CALLBACK(modest_ui_actions_on_folder_moved), NULL);
+ g_signal_connect (G_OBJECT(priv->folder_view), "folder_xfer",
+ G_CALLBACK(modest_ui_actions_on_folder_xfer), NULL);
// g_signal_connect (G_OBJECT(self->folder_view), "button-press-event",
// G_CALLBACK (on_folder_view_button_press_event),self);
// g_signal_connect (self->folder_view,"popup-menu",
// g_signal_connect (G_OBJECT(self->header_view),"popup-menu",0
// G_CALLBACK (on_header_view_button_press_event), self);
- /* Account store */
- g_signal_connect (G_OBJECT (modest_runtime_get_account_store()), "accounts_reloaded",
- G_CALLBACK (modest_ui_actions_on_accounts_reloaded), self);
-
/* window */
g_signal_connect (G_OBJECT(self), "destroy", G_CALLBACK(on_destroy), NULL);
g_signal_connect (G_OBJECT(self), "delete-event", G_CALLBACK(on_delete_event), self);
{
ModestConfPrivate *priv;
GConfValueType gconf_type;
- GSList *retval = NULL;
g_return_val_if_fail (self, NULL);
g_return_val_if_fail (key, NULL);
gconf_type = modest_conf_type_to_gconf_type (list_type, err);
- if (!err)
- retval = gconf_client_get_list (priv->gconf_client, key, gconf_type, err);
-
- return retval;
+ return gconf_client_get_list (priv->gconf_client, key, gconf_type, err);
}
static void add_attachments (TnyMsg *msg,
GList *attachments_list);
-static void modest_mail_operation_xfer_folder (ModestMailOperation *self,
- TnyFolder *folder,
- TnyFolderStore *parent,
- gboolean delete_original);
-
-static gboolean modest_mail_operation_xfer_msg (ModestMailOperation *self,
- TnyHeader *header,
- TnyFolder *folder,
- gboolean delete_original);
-
enum _ModestMailOperationSignals
{
PROGRESS_CHANGED_SIGNAL,
void
modest_mail_operation_remove_folder (ModestMailOperation *self,
- TnyFolder *folder,
- gboolean remove_to_trash)
+ TnyFolder *folder,
+ gboolean remove_to_trash)
{
- TnyFolderStore *folder_store;
+ TnyFolderStore *parent;
+ TnyAccount *account;
ModestMailOperationPrivate *priv;
g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
- /* Get folder store */
- folder_store = TNY_FOLDER_STORE (tny_folder_get_account (folder));
+ /* Get the account */
+ account = tny_folder_get_account (folder);
/* Delete folder or move to trash */
if (remove_to_trash) {
- TnyFolder *trash_folder;
- trash_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT(folder_store),
+ TnyFolder *trash_folder, *new_folder;
+ trash_folder = modest_tny_account_get_special_folder (account,
TNY_FOLDER_TYPE_TRASH);
/* TODO: error_handling */
- modest_mail_operation_move_folder (self, folder,
- TNY_FOLDER_STORE (trash_folder));
+ new_folder = modest_mail_operation_xfer_folder (self, folder,
+ TNY_FOLDER_STORE (trash_folder), TRUE);
+ g_object_unref (G_OBJECT (new_folder));
} else {
- tny_folder_store_remove_folder (folder_store, folder, &(priv->error));
+ parent = tny_folder_get_folder_store (folder);
+
+ tny_folder_store_remove_folder (parent, folder, &(priv->error));
CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, );
- g_object_unref (G_OBJECT (folder));
+ if (parent) g_object_unref (G_OBJECT (parent));
}
-
- /* Free instances */
- g_object_unref (G_OBJECT (folder_store));
+ g_object_unref (G_OBJECT (account));
}
void
CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, return);
}
-void
-modest_mail_operation_move_folder (ModestMailOperation *self,
- TnyFolder *folder,
- TnyFolderStore *parent)
-{
- g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
- g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
- g_return_if_fail (TNY_IS_FOLDER (folder));
-
- modest_mail_operation_xfer_folder (self, folder, parent, TRUE);
-}
-
-void
-modest_mail_operation_copy_folder (ModestMailOperation *self,
- TnyFolder *folder,
- TnyFolderStore *parent)
-{
- g_return_if_fail (MODEST_IS_MAIL_OPERATION (self));
- g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
- g_return_if_fail (TNY_IS_FOLDER (folder));
-
- modest_mail_operation_xfer_folder (self, folder, parent, FALSE);
-}
-
-static void
+TnyFolder *
modest_mail_operation_xfer_folder (ModestMailOperation *self,
TnyFolder *folder,
TnyFolderStore *parent,
gboolean delete_original)
{
ModestMailOperationPrivate *priv;
- const gchar *folder_name;
- TnyFolder *dest_folder = NULL, *child = NULL;
- TnyIterator *iter = NULL;
- TnyList *folders = NULL, *headers = NULL;
- g_return_if_fail (TNY_IS_FOLDER (folder));
- g_return_if_fail (TNY_IS_FOLDER_STORE (parent));
+ g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), NULL);
+ g_return_val_if_fail (TNY_IS_FOLDER_STORE (parent), NULL);
+ g_return_val_if_fail (TNY_IS_FOLDER (folder), NULL);
priv = MODEST_MAIL_OPERATION_GET_PRIVATE (self);
- /* Create the destination folder */
- folder_name = tny_folder_get_name (folder);
- dest_folder = modest_mail_operation_create_folder (self, parent, folder_name);
- CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, goto clean);
-
- /* Transfer messages */
- headers = TNY_LIST (tny_simple_list_new ());
- tny_folder_get_headers (folder, headers, FALSE, &(priv->error));
- CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, goto clean);
-
- tny_folder_transfer_msgs (folder, headers, dest_folder, delete_original, &(priv->error));
- CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, goto clean);
-
- /* Recurse children */
- folders = TNY_LIST (tny_simple_list_new ());
- tny_folder_store_get_folders (TNY_FOLDER_STORE (folder), folders, NULL, &(priv->error));
- CHECK_EXCEPTION (priv, MODEST_MAIL_OPERATION_STATUS_FAILED, goto clean);
-
- iter = tny_list_create_iterator (folders);
- while (!tny_iterator_is_done (iter)) {
- child = TNY_FOLDER (tny_iterator_get_current (iter));
- modest_mail_operation_xfer_folder (self, child, TNY_FOLDER_STORE (dest_folder),
- delete_original);
- tny_iterator_next (iter);
- g_object_unref (G_OBJECT(child));
- }
-
- /* Delete source folder (if needed) */
- if (delete_original)
- modest_mail_operation_remove_folder (self, folder, FALSE);
-
- /* Clean up */
- clean:
- if (dest_folder)
- g_object_unref (G_OBJECT (dest_folder));
- if (headers)
- g_object_unref (G_OBJECT (headers));
- if (folders)
- g_object_unref (G_OBJECT (folders));
- if (iter)
- g_object_unref (G_OBJECT (iter));
+ return tny_folder_copy (folder,
+ parent,
+ tny_folder_get_name (folder),
+ delete_original,
+ &(priv->error));
}
/* ************************** MSG ACTIONS ************************* */
/* ******************************************************************* */
-gboolean
-modest_mail_operation_copy_msg (ModestMailOperation *self,
- TnyHeader *header,
- TnyFolder *folder)
-{
- g_return_val_if_fail (TNY_IS_HEADER (header), FALSE);
- g_return_val_if_fail (TNY_IS_FOLDER (folder), FALSE);
-
- return modest_mail_operation_xfer_msg (self, header, folder, FALSE);
-}
-
-gboolean
-modest_mail_operation_move_msg (ModestMailOperation *self,
- TnyHeader *header,
- TnyFolder *folder)
-{
- g_return_val_if_fail (TNY_IS_HEADER (header), FALSE);
- g_return_val_if_fail (TNY_IS_FOLDER (folder), FALSE);
-
- return modest_mail_operation_xfer_msg (self, header, folder, TRUE);
-}
-
void
modest_mail_operation_remove_msg (ModestMailOperation *self,
TnyHeader *header,
trash_folder = modest_tny_account_get_special_folder (TNY_ACCOUNT(store_account),
TNY_FOLDER_TYPE_TRASH);
if (trash_folder) {
- modest_mail_operation_move_msg (self, header, trash_folder);
+ modest_mail_operation_xfer_msg (self, header, trash_folder, TRUE);
/* g_object_unref (trash_folder); */
} else {
ModestMailOperationPrivate *priv;
g_signal_emit (G_OBJECT (user_data), signals[PROGRESS_CHANGED_SIGNAL], 0, NULL);
}
-static gboolean
+gboolean
modest_mail_operation_xfer_msg (ModestMailOperation *self,
TnyHeader *header,
TnyFolder *folder,
TnyFolder *src_folder;
TnyList *headers;
+ g_return_val_if_fail (MODEST_IS_MAIL_OPERATION (self), FALSE);
+ g_return_val_if_fail (TNY_IS_HEADER (header), FALSE);
+ g_return_val_if_fail (TNY_IS_FOLDER (folder), FALSE);
+
src_folder = tny_header_get_folder (header);
headers = tny_simple_list_new ();
const gchar *name);
/**
- * modest_mail_operation_move_folder:
+ * modest_mail_operation_xfer_folder:
* @self: a #ModestMailOperation
* @folder: a #TnyFolder
* @parent: the new parent of the folder as #TnyFolderStore
+ * @delete_original: wheter or not delete the original folder
*
* Sets the given @folder as child of a provided #TnyFolderStore. This
- * operation moves also all the messages contained in the folder and
- * all of his children folders with their messages as well. This
+ * operation also transfers all the messages contained in the folder
+ * and all of his children folders with their messages as well. This
* operation is synchronous, so the #ModestMailOperation should not be
- * added to any #ModestMailOperationQueue
+ * added to any #ModestMailOperationQueue.
+ *
+ * If @delete_original is TRUE this function moves the original
+ * folder, if it is FALSE the it just copies it
+ *
+ * Returns: the newly transfered folder
**/
-void modest_mail_operation_move_folder (ModestMailOperation *self,
+TnyFolder* modest_mail_operation_xfer_folder (ModestMailOperation *self,
TnyFolder *folder,
- TnyFolderStore *parent);
+ TnyFolderStore *parent,
+ gboolean delete_original);
-/**
- * modest_mail_operation_copy_folder:
- * @self: a #ModestMailOperation
- * @folder: a #TnyFolder
- * @parent: a #TnyFolderStore that will be the parent of the copied folder
- *
- * Sets a copy of the given @folder as child of a provided
- * #TnyFolderStore. This operation copies also all the messages
- * contained in the folder and all of his children folders with their
- * messages as well. This operation is synchronous, so the
- * #ModestMailOperation should not be added to any
- * #ModestMailOperationQueue
- **/
-void modest_mail_operation_copy_folder (ModestMailOperation *self,
- TnyFolder *folder,
- TnyFolderStore *parent);
/* Functions that performs msg operations */
/**
- * modest_mail_operation_copy_msg:
- * @self: a #ModestMailOperation
- * @header: the #TnyHeader of the message to copy
- * @folder: the #TnyFolder where the message will be copied
- *
- * Asynchronously copies a message from its current folder to another
- * one. The caller should add the #ModestMailOperation to a
- * #ModestMailOperationQueue and then free it. The caller will be
- * notified by the "progress_changed" when the operation is completed.
- *
- * Example
- * <informalexample><programlisting>
- * queue = modest_tny_platform_factory_get_modest_mail_operation_queue_instance (fact);
- * mail_op = modest_mail_operation_new ();
- * if (modest_mail_operation_copy_msg (mail_op, account))
- * {
- * g_signal_connect (G_OBJECT (mail_op), "progress_changed", G_CALLBACK(on_progress_changed), queue);
- * modest_mail_operation_queue_add (queue, mail_op);
- * }
- * g_object_unref (G_OBJECT (mail_op));
- * </programlisting></informalexample>
- *
- * Returns: TRUE if the mail operation could be started, or FALSE otherwise
- **/
-gboolean modest_mail_operation_copy_msg (ModestMailOperation *self,
- TnyHeader *header,
- TnyFolder *folder);
-
-/**
- * modest_mail_operation_move_msg:
+ * modest_mail_operation_xfer_msg:
* @self: a #ModestMailOperation
* @header: the #TnyHeader of the message to move
* @folder: the #TnyFolder where the message will be moved
+ * @delete_original: whether or not delete the source message
*
- * Asynchronously moves a message from its current folder to another
- * one. The caller should add the #ModestMailOperation to a
+ * Asynchronously transfers a message from its current folder to
+ * another one. The caller should add the #ModestMailOperation to a
* #ModestMailOperationQueue and then free it. The caller will be
* notified by the "progress_changed" when the operation is completed.
+ *
+ * If the @delete_original paramter is TRUE then this function moves
+ * the message between folders, otherwise it copies it.
*
* Example
* <informalexample><programlisting>
* queue = modest_tny_platform_factory_get_modest_mail_operation_queue_instance (fact);
* mail_op = modest_mail_operation_new ();
- * if (modest_mail_operation_move_msg (mail_op, account))
+ * if (modest_mail_operation_xfer_msg (mail_op, header, folder, TRUE))
* {
* g_signal_connect (G_OBJECT (mail_op), "progress_changed", G_CALLBACK(on_progress_changed), queue);
* modest_mail_operation_queue_add (queue, mail_op);
*
* Returns: TRUE if the mail operation could be started, or FALSE otherwise
**/
-gboolean modest_mail_operation_move_msg (ModestMailOperation *self,
+gboolean modest_mail_operation_xfer_msg (ModestMailOperation *self,
TnyHeader *header,
- TnyFolder *folder);
+ TnyFolder *folder,
+ gboolean delete_original);
/**
* modest_mail_operation_remove_msg:
VOID:POINTER,POINTER
VOID:POINTER,POINTER,POINTER
+VOID:POINTER,POINTER,BOOL,POINTER
VOID:STRING,POINTER,POINTER,POINTER
VOID:POINTER,BOOL
VOID:STRING,INT
typedef struct _GetMsgAsyncHelper {
- ModestMainWindow *main_window;
+ ModestWindow *window;
TnyIterator *iter;
GFunc func;
gpointer user_data;
} else
return NULL;
-
}
+
void
modest_ui_actions_on_delete (GtkWidget *widget, ModestWindow *win)
{
g_free (rf_helper->account_name);
g_slice_free (ReplyForwardHelper, rf_helper);
}
-
/*
* Common code for the reply and forward actions
*/
g_return_if_fail (MODEST_IS_WINDOW(win));
- header_list = get_selected_headers (win);
+ header_list = get_selected_headers (win);
if (!header_list)
return;
rf_helper->account_name = modest_account_mgr_get_default_account (modest_runtime_get_account_mgr());
helper = g_slice_new0 (GetMsgAsyncHelper);
- //helper->main_window = NULL;
+ helper->window = win;
helper->func = reply_forward_func;
helper->iter = tny_list_create_iterator (header_list);
helper->user_data = rf_helper;
msg = TNY_MSG (data);
helper = (GetMsgAsyncHelper *) user_data;
- msg_preview = modest_main_window_get_child_widget (helper->main_window,
+ msg_preview = modest_main_window_get_child_widget (MODEST_MAIN_WINDOW (helper->window),
MODEST_WIDGET_TYPE_MSG_PREVIEW);
if (!msg_preview)
return;
helper = (GetMsgAsyncHelper *) user_data;
if ((*err && ((*err)->code == TNY_FOLDER_ERROR_GET_MSG)) || !msg) {
- GtkWidget *header_view =
- modest_main_window_get_child_widget(helper->main_window,
- MODEST_WIDGET_TYPE_HEADER_VIEW);
- if (header_view)
- modest_ui_actions_on_item_not_found (MODEST_HEADER_VIEW(header_view),
- MODEST_ITEM_TYPE_MESSAGE,
- MODEST_WINDOW(helper->main_window));
+ modest_ui_actions_on_item_not_found (NULL,
+ MODEST_ITEM_TYPE_MESSAGE,
+ helper->window);
return;
}
/* Fill helper data */
helper = g_slice_new0 (GetMsgAsyncHelper);
- helper->main_window = main_window;
+ helper->window = MODEST_WINDOW (main_window);
helper->iter = tny_list_create_iterator (list);
helper->func = read_msg_func;
if (folder)
g_object_unref (G_OBJECT (folder));
if (msg)
- g_object_unref (G_OBJECT (folder));
+ g_object_unref (G_OBJECT (msg));
}
/* TODO: tinymail should do this.
Update view */
modest_folder_view_rename (MODEST_FOLDER_VIEW(folder_view));
-
- /* TODO: else ? notify error ? */
+ else
+ /* TODO: notify error ? */
+ g_warning ("Could not rename a folder: %s\n", error->message);
g_object_unref (mail_op);
}
TnyFolder *folder;
ModestMailOperation *mail_op;
GtkWidget *folder_view;
+ const GError *error;
g_return_if_fail (MODEST_IS_MAIN_WINDOW(main_window));
mail_op = modest_mail_operation_new ();
modest_mail_operation_remove_folder (mail_op, folder, move_to_trash);
+
+ error = modest_mail_operation_get_error (mail_op);
+ if (error)
+ g_warning ("%s\n", error->message);
+
g_object_unref (mail_op);
}
delete_folder (main_window, TRUE);
}
-void
-modest_ui_actions_on_accounts_reloaded (TnyAccountStore *store, gpointer user_data)
-{
- /* FIXME */
- /* ModestFolderView *folder_view; */
-
-/* folder_view = modest_widget_factory_get_folder_view (modest_runtime_get_widget_factory()); */
-/* modest_folder_view_update_model (folder_view, store); */
-}
-
void
-modest_ui_actions_on_folder_moved (ModestFolderView *folder_view, TnyFolder *folder,
- TnyFolderStore *parent, gboolean *done,
- gpointer user_data)
+modest_ui_actions_on_folder_xfer (ModestFolderView *folder_view,
+ TnyFolder *folder,
+ TnyFolderStore *parent,
+ gboolean delete_source,
+ TnyFolder **new_folder,
+ gpointer user_data)
{
ModestMailOperation *mail_op;
const GError *error;
- *done = TRUE;
-
- /* Try to move the folder */
+ /* Try to move the folder */
mail_op = modest_mail_operation_new ();
- modest_mail_operation_move_folder (mail_op, folder, parent);
+ *new_folder = modest_mail_operation_xfer_folder (mail_op, folder, parent, delete_source);
error = modest_mail_operation_get_error (mail_op);
if (error)
- *done = FALSE;
+ g_warning ("Error transferring folder: %s\n", error->message);
g_object_unref (G_OBJECT (mail_op));
}
void modest_ui_actions_on_connection_changed (TnyDevice *device, gboolean online,
ModestMainWindow *main_window);
-
-void modest_ui_actions_on_accounts_reloaded (TnyAccountStore *store,
- gpointer user_data);
-
-void modest_ui_actions_on_folder_moved (ModestFolderView *folder_view,
+void modest_ui_actions_on_folder_xfer (ModestFolderView *folder_view,
TnyFolder *folder,
TnyFolderStore *parent,
- gboolean *done,
+ gboolean delete_source,
+ TnyFolder **new_folder,
gpointer user_data);
void modest_ui_actions_on_password_requested (TnyAccountStore *account_store,
const gchar *account,
gpointer user_data);
+static void on_accounts_reloaded (TnyAccountStore *store,
+ gpointer user_data);
+
static gint cmp_rows (GtkTreeModel *tree_model,
GtkTreeIter *iter1,
GtkTreeIter *iter2,
enum {
FOLDER_SELECTION_CHANGED_SIGNAL,
- FOLDER_MOVED_SIGNAL,
+ FOLDER_XFER_SIGNAL,
LAST_SIGNAL
};
TnyFolder *cur_folder;
GtkTreeRowReference *cur_row;
- gulong sig1, sig2;
+ gulong account_update_signal;
+ gulong changed_signal;
+ gulong accounts_reloaded_signal;
GMutex *lock;
GtkTreeSelection *cur_selection;
parent_class = g_type_class_peek_parent (klass);
gobject_class->finalize = modest_folder_view_finalize;
-
- klass->update_model = modest_folder_view_update_model;
g_type_class_add_private (gobject_class,
sizeof(ModestFolderViewPrivate));
* Emitted when a the user wants to move a folder through a
* drag and drop action
*/
- signals[FOLDER_MOVED_SIGNAL] =
- g_signal_new ("folder_moved",
+ signals[FOLDER_XFER_SIGNAL] =
+ g_signal_new ("folder_xfer",
G_TYPE_FROM_CLASS (gobject_class),
G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (ModestFolderViewClass, folder_moved),
+ G_STRUCT_OFFSET (ModestFolderViewClass, folder_xfer),
NULL, NULL,
- modest_marshal_VOID__POINTER_POINTER_POINTER,
- G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
+ modest_marshal_VOID__POINTER_POINTER_BOOL_POINTER,
+ G_TYPE_NONE, 4,
+ G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_BOOLEAN, G_TYPE_POINTER);
}
GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
{
GObject *rendobj;
- gchar *fname;
+ gchar *fname = NULL;
gint unread;
TnyFolderType type;
- TnyFolder *folder;
+ TnyFolder *folder = NULL;
g_return_if_fail (column);
g_return_if_fail (tree_model);
TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder,
-1);
rendobj = G_OBJECT(renderer);
-
+
if (!fname)
return;
g_object_set (rendobj,"text", fname, "weight", 400, NULL);
g_free (fname);
- if (folder)
- g_object_unref (G_OBJECT(folder));
-
+ if (folder) g_object_unref (G_OBJECT (folder));
}
gtk_tree_model_get (tree_model, iter,
TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN, &type,
TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN, &fname,
- TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread, -1);
+ TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN, &unread,
+ -1);
rendobj = G_OBJECT(renderer);
if (type == TNY_FOLDER_TYPE_NORMAL || type == TNY_FOLDER_TYPE_UNKNOWN) {
if (priv->account_store) {
g_signal_handler_disconnect (G_OBJECT(priv->account_store),
- priv->sig1);
+ priv->account_update_signal);
+ g_signal_handler_disconnect (G_OBJECT(priv->account_store),
+ priv->accounts_reloaded_signal);
g_object_unref (G_OBJECT(priv->account_store));
priv->account_store = NULL;
}
sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(obj));
if (sel)
- g_signal_handler_disconnect (G_OBJECT(sel), priv->sig2);
+ g_signal_handler_disconnect (G_OBJECT(sel), priv->changed_signal);
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
device = tny_account_store_get_device (account_store);
if (G_UNLIKELY (priv->account_store)) {
- TnyDevice *old_device;
-
- old_device = tny_account_store_get_device (priv->account_store);
- if (g_signal_handler_is_connected (G_OBJECT (old_device), priv->sig1))
- g_signal_handler_disconnect (G_OBJECT (old_device),
- priv->sig1);
+ if (g_signal_handler_is_connected (G_OBJECT (priv->account_store),
+ priv->account_update_signal))
+ g_signal_handler_disconnect (G_OBJECT (priv->account_store),
+ priv->account_update_signal);
+ if (g_signal_handler_is_connected (G_OBJECT (priv->account_store),
+ priv->accounts_reloaded_signal))
+ g_signal_handler_disconnect (G_OBJECT (priv->account_store),
+ priv->accounts_reloaded_signal);
g_object_unref (G_OBJECT (priv->account_store));
- g_object_unref (G_OBJECT (old_device));
}
priv->account_store = g_object_ref (G_OBJECT (account_store));
- priv->sig1 = g_signal_connect (G_OBJECT(account_store), "account_update",
- G_CALLBACK (on_account_update), self);
+ priv->account_update_signal =
+ g_signal_connect (G_OBJECT(account_store), "account_update",
+ G_CALLBACK (on_account_update), self);
+
+ priv->accounts_reloaded_signal =
+ g_signal_connect (G_OBJECT(account_store), "accounts_reloaded",
+ G_CALLBACK (on_accounts_reloaded), self);
if (!update_model (MODEST_FOLDER_VIEW (self),
MODEST_TNY_ACCOUNT_STORE (priv->account_store)))
account);
}
+static void
+on_accounts_reloaded (TnyAccountStore *account_store,
+ gpointer user_data)
+{
+ update_model (MODEST_FOLDER_VIEW (user_data),
+ MODEST_TNY_ACCOUNT_STORE(account_store));
+}
+
void
modest_folder_view_set_title (ModestFolderView *self, const gchar *title)
{
priv->query = g_object_ref (query);
sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
- priv->sig2 = g_signal_connect (sel, "changed",
- G_CALLBACK (on_selection_changed), self);
+ priv->changed_signal = g_signal_connect (sel, "changed",
+ G_CALLBACK (on_selection_changed), self);
return GTK_WIDGET(self);
}
g_object_unref (account_list);
}
- //if (model)
- // g_object_unref (model);
-
return TRUE;
}
/* folder was _un_selected if true */
if (!gtk_tree_selection_get_selected (sel, &model_sort, &iter_sort)) {
priv->cur_folder = NULL; /* FIXME: need this? */
- priv->cur_row = NULL; /* FIXME: need this? */
+ gtk_tree_row_reference_free (priv->cur_row);
+ priv->cur_row = NULL;
return;
}
TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, &folder,
-1);
- if (type == TNY_FOLDER_TYPE_ROOT)
+ if (type == TNY_FOLDER_TYPE_ROOT) {
+ g_object_unref (folder);
return;
+ }
- /* emit 2 signals: one for the unselection of the old one,
- * and one for the selection of the new on */
+ /* Current folder was unselected */
g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
priv->cur_folder, FALSE);
- if (priv->cur_folder) {
+ if (priv->cur_row) {
/* tny_folder_sync (priv->cur_folder, TRUE, NULL); /\* FIXME *\/ */
gtk_tree_row_reference_free (priv->cur_row);
}
- priv->cur_folder = folder;
- g_signal_emit (G_OBJECT(tree_view), signals[FOLDER_SELECTION_CHANGED_SIGNAL], 0,
- folder, TRUE);
-
+
+ /* New current references */
path = gtk_tree_model_get_path (model_sort, &iter_sort);
+ priv->cur_folder = folder;
priv->cur_row = gtk_tree_row_reference_new (model_sort, path);
- gtk_tree_path_free (path);
-}
-gboolean
-modest_folder_view_update_model (ModestFolderView *self, TnyAccountStore *account_store)
-{
- g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE);
+ /* Frees */
+ gtk_tree_path_free (path);
+ g_object_unref (G_OBJECT (folder));
- g_signal_emit (G_OBJECT(self), signals[FOLDER_SELECTION_CHANGED_SIGNAL],
- 0, NULL, TRUE);
-
- return update_model (self, MODEST_TNY_ACCOUNT_STORE(account_store)); /* ugly */
+ /* New folder has been selected */
+ g_signal_emit (G_OBJECT(tree_view),
+ signals[FOLDER_SELECTION_CHANGED_SIGNAL],
+ 0, folder, TRUE);
}
TnyFolder *
GtkTreeModel *model;
GtkTreeIter iter;
ModestFolderViewPrivate *priv;
- gchar *old_name;
g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE);
if (!get_model_iter (self, &model, &iter))
return FALSE;
- /* Remove old name */
- gtk_tree_model_get (model, &iter,
- TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,
- &old_name, -1);
- g_free (old_name);
-
/* Set new name */
gtk_tree_store_set (GTK_TREE_STORE (model), &iter,
TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,
/* Append a new child to the folder */
gtk_tree_store_append (GTK_TREE_STORE (model), &child, &iter);
gtk_tree_store_set (GTK_TREE_STORE (model), &child,
- TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,
+ TNY_GTK_FOLDER_STORE_TREE_MODEL_NAME_COLUMN,
tny_folder_get_name (TNY_FOLDER (folder)),
- TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN,
+ TNY_GTK_FOLDER_STORE_TREE_MODEL_UNREAD_COLUMN,
tny_folder_get_unread_count (TNY_FOLDER (folder)),
TNY_GTK_FOLDER_STORE_TREE_MODEL_TYPE_COLUMN,
tny_folder_get_folder_type (TNY_FOLDER (folder)),
gtk_tree_path_free (source_row);
}
+
+static void
+on_progress_changed (ModestMailOperation *mail_op, gpointer user_data)
+{
+ ModestMailOperationQueue *queue;
+
+ if (modest_mail_operation_get_status (mail_op) ==
+ MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
+ g_print ("Bien bien");
+ }
+ queue = modest_runtime_get_mail_operation_queue ();
+
+ modest_mail_operation_queue_remove (queue, mail_op);
+ g_object_unref (G_OBJECT (mail_op));
+}
+
/*
* This function receives the data set by the "drag-data-get" signal
* handler. This information comes within the #GtkSelectionData. This
child_dest_row =
gtk_tree_model_sort_convert_path_to_child_path (GTK_TREE_MODEL_SORT (model_sort),
dest_row);
- gtk_tree_path_free (dest_row);
/* Drags from the header view */
if ((target_type == TARGET_TREE_ROW) && (source_widget != widget)) {
+ TnyHeader *header;
+ TnyFolder *folder;
+ ModestMailOperationQueue *queue;
+ ModestMailOperation *mail_op;
+ gboolean started;
+ GtkTreeIter source_iter, dest_iter;
+
+ /* Get header */
+ gtk_tree_model_get_iter (source_model, &source_iter, source_row);
+ gtk_tree_model_get (source_model, &source_iter,
+ TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN,
+ &header, -1);
+
+ /* Get Folder */
+ gtk_tree_model_get_iter (dest_model, &dest_iter, dest_row);
+ gtk_tree_model_get (dest_model, &dest_iter,
+ TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,
+ &folder, -1);
- /* TODO: do the mail operation */
+ /* Transfer message */
+ queue = modest_runtime_get_mail_operation_queue ();
+ mail_op = modest_mail_operation_new ();
+ started = modest_mail_operation_xfer_msg (mail_op, header,
+ folder, delete_source);
+ if (started) {
+ g_signal_connect (G_OBJECT (mail_op), "progress_changed",
+ G_CALLBACK (on_progress_changed), queue);
+ modest_mail_operation_queue_add (queue, mail_op);
+ } else {
+ const GError *error;
+ error = modest_mail_operation_get_error (mail_op);
+ g_warning ("Error trying to transfer messages: %s\n",
+ error->message);
+ }
+ g_object_unref (G_OBJECT (mail_op));
+ g_object_unref (G_OBJECT (header));
+ g_object_unref (G_OBJECT (folder));
+ /* FIXME */
success = TRUE;
} else {
GtkTreeRowReference *source_row_reference;
GtkTreeIter parent_iter, iter;
- TnyFolder *folder;
+ TnyFolder *folder, *new_folder;
TnyFolderStore *parent_folder;
- gboolean done;
/* Check if the drag is possible */
if (!gtk_tree_path_compare (source_row, child_dest_row))
gtk_tree_model_get (source_model, &parent_iter,
TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,
&parent_folder, -1);
- gtk_tree_model_get (source_model, &iter,
- TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,
+ gtk_tree_model_get (source_model, &iter,
+ TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN,
&folder, -1);
- g_signal_emit (G_OBJECT (widget), signals[FOLDER_MOVED_SIGNAL], 0,
- folder, parent_folder, &done);
- if (!done)
+ g_signal_emit (G_OBJECT (widget), signals[FOLDER_XFER_SIGNAL], 0,
+ folder, parent_folder, delete_source, &new_folder);
+
+ g_object_unref (G_OBJECT (parent_folder));
+ g_object_unref (G_OBJECT (folder));
+
+ if (!new_folder)
goto out;
/* Get a row reference to the source path because the path
child_dest_row,
selection_data)) {
+ {
+ GtkTreeIter iter;
+
+ gtk_tree_model_get_iter (dest_model, &iter, child_dest_row);
+ gtk_tree_store_set (GTK_TREE_STORE (dest_model), &iter,
+ TNY_GTK_FOLDER_STORE_TREE_MODEL_INSTANCE_COLUMN, new_folder, -1);
+ g_object_unref (G_OBJECT (new_folder));
+ }
+
source_row = gtk_tree_row_reference_get_path (source_row_reference);
success = TRUE;
}
out:
+ gtk_tree_path_free (dest_row);
gtk_tree_path_free (child_dest_row);
/* Save the new path, will be used by the
drag-data-delete handler */
- if (success)
+ if (success && delete_source)
g_object_set_data (G_OBJECT (source_widget),
ROW_REF_DATA_NAME,
gtk_tree_path_copy (source_row));
+ /* Clean dest row */
+ gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
+ NULL,
+ GTK_TREE_VIEW_DROP_BEFORE);
+
finish:
gtk_drag_finish (context, success, (success && delete_source), time);
}
GtkTreePath *source_row;
GtkTreeModel *model_sort, *model;
- /* Clean dest row */
- gtk_tree_view_set_drag_dest_row (GTK_TREE_VIEW (widget),
- NULL,
- GTK_TREE_VIEW_DROP_BEFORE);
-
model_sort = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model_sort));
source_row = g_object_steal_data (G_OBJECT (widget), ROW_REF_DATA_NAME);
gboolean selected,
gpointer user_data);
- void (*folder_moved) (ModestFolderView *self,
+ void (*folder_xfer) (ModestFolderView *self,
TnyFolder *folder,
TnyFolderStore *parent,
- gboolean *done);
-
- gboolean (*update_model) (ModestFolderView *self,
- TnyAccountStore *account_store);
+ gboolean delete_original,
+ TnyFolder *new_folder);
};
/**
GdkEventButton *event,
gpointer user_data);
-static void on_selection_changed (GtkTreeSelection *sel,
- gpointer user_data);
-
static gint cmp_rows (GtkTreeModel *tree_model,
GtkTreeIter *iter1,
GtkTreeIter *iter2,
gpointer user_data);
+static void on_selection_changed (GtkTreeSelection *sel,
+ gpointer user_data);
+
static void setup_drag_and_drop (GtkTreeView *self);
+
typedef struct _ModestHeaderViewPrivate ModestHeaderViewPrivate;
struct _ModestHeaderViewPrivate {
TnyFolder *folder;
TnyList *headers;
- GMutex *lock;
ModestHeaderViewStyle style;
};
g_list_free (columns);
}
-
-
gboolean
modest_header_view_set_columns (ModestHeaderView *self, const GList *columns)
{
remove_all_columns (self);
- if (priv->headers)
- sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers));
- else
- sortable = NULL;
-
+ sortable = gtk_tree_view_get_model (GTK_TREE_VIEW (self));
+
+ /* Add new columns */
for (cursor = columns; cursor; cursor = g_list_next(cursor)) {
ModestHeaderViewColumn col =
(ModestHeaderViewColumn) GPOINTER_TO_INT(cursor->data);
self);
gtk_tree_view_append_column (GTK_TREE_VIEW(self), column);
}
+
return TRUE;
}
priv = MODEST_HEADER_VIEW_GET_PRIVATE(obj);
- priv->lock = g_mutex_new ();
priv->folder = NULL;
priv->headers = NULL;
self = MODEST_HEADER_VIEW(obj);
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
- if (priv->headers)
+ if (priv->headers) {
g_object_unref (G_OBJECT(priv->headers));
+ priv->headers = NULL;
+ }
- if (priv->lock) {
- g_mutex_free (priv->lock);
- priv->lock = NULL;
+ if (priv->folder) {
+ g_object_unref (G_OBJECT (priv->folder));
+ priv->folder = NULL;
}
-
- priv->headers = NULL;
- priv->folder = NULL;
G_OBJECT_CLASS(parent_class)->finalize (obj);
}
&header, -1);
/* Prepend to list */
tny_list_prepend (header_list, G_OBJECT (header));
+ g_object_unref (G_OBJECT (header));
+
tmp = g_list_next (tmp);
}
/* Clean up*/
static void
-on_refresh_folder (TnyFolder *folder, gboolean cancelled, GError **err,
- gpointer user_data)
+on_refresh_folder (TnyFolder *folder,
+ gboolean cancelled,
+ GError **error,
+ gpointer user_data)
{
GtkTreeModel *sortable;
ModestHeaderView *self;
ModestHeaderViewPrivate *priv;
- GError *error = NULL;
+ GList *cols, *cursor;
if (cancelled) {
GtkTreeSelection *selection;
self = MODEST_HEADER_VIEW(user_data);
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
- priv->folder = folder;
-
- if (folder) { /* it's a new one or a refresh */
- GList *cols, *cursor;
-
- if (priv->headers) {
- g_object_unref (priv->headers);
- modest_runtime_verify_object_death(priv->headers,"");
- }
- priv->headers = TNY_LIST(tny_gtk_header_list_model_new ());
- tny_folder_get_headers (folder, priv->headers, FALSE, &error); /* FIXME */
- if (error) {
- g_signal_emit (G_OBJECT(self), signals[ITEM_NOT_FOUND_SIGNAL],
- 0, MODEST_ITEM_TYPE_MESSAGE);
- g_print (error->message);
- g_error_free (error);
- return;
- }
+ if (priv->headers) {
+ g_object_unref (priv->headers);
+ modest_runtime_verify_object_death(priv->headers,"");
+ }
- tny_gtk_header_list_model_set_folder
- (TNY_GTK_HEADER_LIST_MODEL(priv->headers),folder, TRUE); /*async*/
+ priv->headers = TNY_LIST(tny_gtk_header_list_model_new ());
- sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers));
+ tny_gtk_header_list_model_set_folder (TNY_GTK_HEADER_LIST_MODEL(priv->headers),
+ folder, TRUE);
- /* install our special sorting functions */
- cursor = cols = gtk_tree_view_get_columns (GTK_TREE_VIEW(self));
- while (cursor) {
- gint col_id = GPOINTER_TO_INT (g_object_get_data(G_OBJECT(cursor->data),
- MODEST_HEADER_VIEW_COLUMN));
- gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable),
- col_id,
- (GtkTreeIterCompareFunc)cmp_rows,
- cursor->data, NULL);
- cursor = g_list_next(cursor);
- }
- g_list_free (cols);
- gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable);
+ sortable = gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL(priv->headers));
+
+ /* install our special sorting functions */
+ cursor = cols = gtk_tree_view_get_columns (GTK_TREE_VIEW(self));
+ while (cursor) {
+ gint col_id = GPOINTER_TO_INT (g_object_get_data(G_OBJECT(cursor->data),
+ MODEST_HEADER_VIEW_COLUMN));
+ gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(sortable),
+ col_id,
+ (GtkTreeIterCompareFunc)cmp_rows,
+ cursor->data, NULL);
+ cursor = g_list_next(cursor);
}
+ g_list_free (cols);
+
+ /* Set new model */
+ gtk_tree_view_set_model (GTK_TREE_VIEW (self), sortable);
+ g_object_unref (G_OBJECT (sortable));
}
ModestHeaderViewPrivate *priv;
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+ if (priv->folder)
+ g_object_ref (priv->folder);
+
return priv->folder;
}
ModestHeaderViewPrivate *priv;
priv = MODEST_HEADER_VIEW_GET_PRIVATE(self);
+ /* Unset the old one */
+ if (priv->folder)
+ g_object_unref (priv->folder);
+
priv->folder = folder;
if (folder) {
+ g_object_ref (priv->folder);
+
tny_folder_refresh_async (folder,
on_refresh_folder,
on_refresh_folder_status_update,
/* no message selected */
g_signal_emit (G_OBJECT(self), signals[HEADER_SELECTED_SIGNAL], 0,
NULL);
+ } else {
+ gtk_tree_view_set_model (GTK_TREE_VIEW (self), NULL);
+/* gtk_widget_show (GTK_WIDGET (self)); */
}
}
signals[HEADER_ACTIVATED_SIGNAL],
0, header);
+ /* Free */
+ g_object_unref (G_OBJECT (header));
+
return TRUE;
}
gtk_tree_path_free (source_row);
}
+static void
+drag_data_delete_cb (GtkWidget *widget,
+ GdkDragContext *context,
+ gpointer user_data)
+{
+ GtkTreeIter iter;
+ GtkTreePath *source_row;
+ GtkTreeModel *model_sort, *model;
+ TnyHeader *header;
+
+ model_sort = gtk_tree_view_get_model (GTK_TREE_VIEW (widget));
+ model = gtk_tree_model_sort_get_model (GTK_TREE_MODEL_SORT (model_sort));
+/* source_row = g_object_steal_data (G_OBJECT (widget), ROW_REF_DATA_NAME); */
+ source_row = g_object_steal_data (G_OBJECT (widget), "row-ref");
+
+ /* Delete the source row */
+ gtk_tree_model_get_iter (model, &iter, source_row);
+ gtk_tree_model_get (model, &iter,
+ TNY_GTK_HEADER_LIST_MODEL_INSTANCE_COLUMN, &header,
+ -1);
+ tny_list_remove (TNY_LIST (model), G_OBJECT (header));
+ g_object_unref (G_OBJECT (header));
+
+ gtk_tree_path_free (source_row);
+}
+
static void
setup_drag_and_drop (GtkTreeView *self)
{
gtk_drag_source_set (GTK_WIDGET (self),
- GDK_BUTTON1_MASK | GDK_BUTTON3_MASK,
+ GDK_BUTTON1_MASK,
drag_types,
G_N_ELEMENTS (drag_types),
- GDK_ACTION_MOVE);
+ GDK_ACTION_MOVE | GDK_ACTION_COPY);
gtk_signal_connect(GTK_OBJECT (self),
"drag_data_get",
GTK_SIGNAL_FUNC(drag_data_get_cb),
NULL);
+
+ gtk_signal_connect(GTK_OBJECT (self),
+ "drag_data_delete",
+ GTK_SIGNAL_FUNC(drag_data_delete_cb),
+ NULL);
}