diff options
Diffstat (limited to '')
-rw-r--r-- | plugins/filebrowser/gedit-file-browser-messages.c | 1074 |
1 files changed, 1074 insertions, 0 deletions
diff --git a/plugins/filebrowser/gedit-file-browser-messages.c b/plugins/filebrowser/gedit-file-browser-messages.c new file mode 100644 index 0000000..7f25424 --- /dev/null +++ b/plugins/filebrowser/gedit-file-browser-messages.c @@ -0,0 +1,1074 @@ +/* + * gedit-file-browser-messages.c + * + * Copyright (C) 2006 - Jesse van den Kieboom <jesse@icecrew.nl> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see <http://www.gnu.org/licenses/>. + */ + +#include "gedit-file-browser-messages.h" +#include "gedit-file-browser-store.h" +#include "messages/messages.h" + +#include <gedit/gedit-message.h> + +#define MESSAGE_OBJECT_PATH "/plugins/filebrowser" +#define WINDOW_DATA_KEY "GeditFileBrowserMessagesWindowData" + +#define BUS_CONNECT(bus, name, data) gedit_message_bus_connect(bus, MESSAGE_OBJECT_PATH, #name, (GeditMessageCallback) message_##name##_cb, data, NULL) +#define BUS_DISCONNECT(bus, name, data) gedit_message_bus_disconnect_by_func(bus, MESSAGE_OBJECT_PATH, #name, (GeditMessageCallback) message_##name##_cb, data) + +typedef struct +{ + GeditWindow *window; + GeditMessage *message; +} MessageCacheData; + +typedef struct +{ + guint row_inserted_id; + guint before_row_deleted_id; + guint root_changed_id; + guint begin_loading_id; + guint end_loading_id; + + GeditMessageBus *bus; + GeditFileBrowserWidget *widget; + GHashTable *row_tracking; + + GHashTable *filters; +} WindowData; + +typedef struct +{ + gulong id; + + GeditWindow *window; + GeditMessage *message; +} FilterData; + +static WindowData * +window_data_new (GeditWindow *window, + GeditFileBrowserWidget *widget) +{ + WindowData *data = g_slice_new (WindowData); + + data->bus = gedit_window_get_message_bus (window); + data->widget = widget; + data->row_tracking = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify)g_free, + (GDestroyNotify)gtk_tree_row_reference_free); + + data->filters = g_hash_table_new_full (g_str_hash, + g_str_equal, + (GDestroyNotify)g_free, + NULL); + + g_object_set_data (G_OBJECT (window), WINDOW_DATA_KEY, data); + + return data; +} + +static WindowData * +get_window_data (GeditWindow *window) +{ + return (WindowData *) (g_object_get_data (G_OBJECT (window), WINDOW_DATA_KEY)); +} + +static void +window_data_free (GeditWindow *window) +{ + WindowData *data = get_window_data (window); + + g_hash_table_destroy (data->row_tracking); + g_hash_table_destroy (data->filters); + + g_slice_free (WindowData, data); + + g_object_set_data (G_OBJECT (window), WINDOW_DATA_KEY, NULL); +} + +static FilterData * +filter_data_new (GeditWindow *window, + GeditMessage *message) +{ + FilterData *data = g_slice_new (FilterData); + WindowData *wdata; + + data->window = window; + data->id = 0; + data->message = message; + + wdata = get_window_data (window); + + g_hash_table_insert (wdata->filters, + gedit_message_type_identifier (gedit_message_get_object_path (message), + gedit_message_get_method (message)), + data); + + return data; +} + +static void +filter_data_free (FilterData *data) +{ + WindowData *wdata = get_window_data (data->window); + gchar *identifier; + + identifier = gedit_message_type_identifier (gedit_message_get_object_path (data->message), + gedit_message_get_method (data->message)); + + g_hash_table_remove (wdata->filters, identifier); + g_free (identifier); + + g_object_unref (data->message); + g_slice_free (FilterData, data); +} + +static GtkTreePath * +track_row_lookup (WindowData *data, + const gchar *id) +{ + GtkTreeRowReference *ref; + + ref = (GtkTreeRowReference *)g_hash_table_lookup (data->row_tracking, id); + + if (!ref) + return NULL; + + return gtk_tree_row_reference_get_path (ref); +} + +static void +message_cache_data_free (MessageCacheData *data) +{ + g_object_unref (data->message); + g_slice_free (MessageCacheData, data); +} + +static MessageCacheData * +message_cache_data_new (GeditWindow *window, + GeditMessage *message) +{ + MessageCacheData *data = g_slice_new (MessageCacheData); + + data->window = window; + data->message = message; + + return data; +} + +static void +message_get_root_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + GeditFileBrowserStore *store; + GFile *location; + + store = gedit_file_browser_widget_get_browser_store (data->widget); + location = gedit_file_browser_store_get_virtual_root (store); + + if (location) + { + g_object_set (message, "location", location, NULL); + g_object_unref (location); + } +} + +static void +message_set_root_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + GFile *root; + GFile *virtual = NULL; + + g_object_get (message, "location", &root, NULL); + + if (!root) + { + return; + } + + g_object_get (message, "virtual", &virtual, NULL); + + if (virtual) + { + gedit_file_browser_widget_set_root_and_virtual_root (data->widget, root, virtual); + } + else + { + gedit_file_browser_widget_set_root (data->widget, root, TRUE); + } +} + +static void +message_set_emblem_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gchar *id = NULL; + gchar *emblem = NULL; + GtkTreePath *path; + GeditFileBrowserStore *store; + + g_object_get (message, "id", &id, "emblem", &emblem, NULL); + + if (!id) + { + g_free (id); + g_free (emblem); + + return; + } + + path = track_row_lookup (data, id); + + if (path != NULL) + { + GtkTreeIter iter; + GValue value = G_VALUE_INIT; + GdkPixbuf *pixbuf = NULL; + + if (emblem != NULL) + { + pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (), + emblem, + 10, + GTK_ICON_LOOKUP_FORCE_SIZE, + NULL); + } + + store = gedit_file_browser_widget_get_browser_store (data->widget); + + if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path)) + { + g_value_init (&value, GDK_TYPE_PIXBUF); + g_value_set_object (&value, pixbuf); + + gedit_file_browser_store_set_value (store, + &iter, + GEDIT_FILE_BROWSER_STORE_COLUMN_EMBLEM, + &value); + + g_value_unset (&value); + } + + if (pixbuf) + { + g_object_unref (pixbuf); + } + } + + g_free (id); + g_free (emblem); +} + +static void +message_set_markup_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gchar *id = NULL; + gchar *markup = NULL; + GtkTreePath *path; + GeditFileBrowserStore *store; + + g_object_get (message, "id", &id, "markup", &markup, NULL); + + if (!id) + { + g_free (id); + g_free (markup); + + return; + } + + path = track_row_lookup (data, id); + + if (path != NULL) + { + GtkTreeIter iter; + GValue value = G_VALUE_INIT; + + store = gedit_file_browser_widget_get_browser_store (data->widget); + + if (gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path)) + { + if (markup == NULL) + { + gchar *name; + + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + GEDIT_FILE_BROWSER_STORE_COLUMN_NAME, &name, + -1); + markup = g_markup_escape_text (name, -1); + + g_free (name); + } + + g_value_init (&value, G_TYPE_STRING); + g_value_set_string (&value, markup); + + gedit_file_browser_store_set_value (store, + &iter, + GEDIT_FILE_BROWSER_STORE_COLUMN_MARKUP, + &value); + + g_value_unset (&value); + } + + gtk_tree_path_free (path); + } + + g_free (id); + g_free (markup); +} + +static gchar * +item_id (const gchar *path, + GFile *location) +{ + gchar *uri; + gchar *id; + + uri = g_file_get_uri (location); + id = g_strconcat (path, "::", uri, NULL); + g_free (uri); + + return id; +} + +static gchar * +track_row (WindowData *data, + GeditFileBrowserStore *store, + GtkTreePath *path, + GFile *location) +{ + GtkTreeRowReference *ref; + gchar *id; + gchar *pathstr; + + pathstr = gtk_tree_path_to_string (path); + id = item_id (pathstr, location); + + ref = gtk_tree_row_reference_new (GTK_TREE_MODEL (store), path); + g_hash_table_insert (data->row_tracking, g_strdup (id), ref); + + g_free (pathstr); + + return id; +} + +static void +set_item_message (WindowData *data, + GtkTreeIter *iter, + GtkTreePath *path, + GeditMessage *message) +{ + GeditFileBrowserStore *store; + gchar *name; + GFile *location; + guint flags = 0; + + store = gedit_file_browser_widget_get_browser_store (data->widget); + gtk_tree_model_get (GTK_TREE_MODEL (store), iter, + GEDIT_FILE_BROWSER_STORE_COLUMN_NAME, &name, + GEDIT_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, + GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, + -1); + + if (location) + { + gchar *track_id; + + if (path && gtk_tree_path_get_depth (path) != 0) + { + track_id = track_row (data, store, path, location); + } + else + { + track_id = NULL; + } + + g_object_set (message, + "id", track_id, + "location", location, + NULL); + + if (gedit_message_has (message, "name")) + { + g_object_set (message, + "name", name, + NULL); + } + + if (gedit_message_has (message, "is_directory")) + { + g_object_set (message, + "is_directory", + FILE_IS_DIR (flags), + NULL); + } + + g_free (track_id); + g_object_unref (location); + } + + g_free (name); +} + +static gboolean +custom_message_filter_func (GeditFileBrowserWidget *widget, + GeditFileBrowserStore *store, + GtkTreeIter *iter, + FilterData *data) +{ + WindowData *wdata = get_window_data (data->window); + GFile *location; + guint flags = 0; + gboolean filter = FALSE; + GtkTreePath *path; + + gtk_tree_model_get (GTK_TREE_MODEL (store), iter, + GEDIT_FILE_BROWSER_STORE_COLUMN_LOCATION, &location, + GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, + -1); + + if (!location || FILE_IS_DUMMY (flags)) + return FALSE; + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter); + set_item_message (wdata, iter, path, data->message); + gtk_tree_path_free (path); + + g_object_set (data->message, "filter", filter, NULL); + + gedit_message_bus_send_message_sync (wdata->bus, data->message); + g_object_get (data->message, "filter", &filter, NULL); + + g_object_unref (location); + + return !filter; +} + +static void +message_add_filter_cb (GeditMessageBus *bus, + GeditMessage *message, + GeditWindow *window) +{ + const gchar *object_path = NULL; + const gchar *method = NULL; + gulong id; + GeditMessage *cbmessage; + FilterData *filter_data; + WindowData *data; + GType message_type; + + data = get_window_data (window); + + object_path = gedit_message_get_object_path (message); + method = gedit_message_get_method (message); + + message_type = gedit_message_bus_lookup (bus, object_path, method); + + if (message_type == G_TYPE_INVALID) + { + return; + } + + /* Check if the message type has the correct arguments */ + if (!gedit_message_type_check (message_type, "id", G_TYPE_STRING) || + !gedit_message_type_check (message_type, "location", G_TYPE_FILE) || + !gedit_message_type_check (message_type, "is-directory", G_TYPE_BOOLEAN) || + !gedit_message_type_check (message_type, "filter", G_TYPE_BOOLEAN)) + { + return; + } + + cbmessage = g_object_new (message_type, + "object-path", object_path, + "method", method, + "id", NULL, + "location", NULL, + "is-directory", FALSE, + "filter", FALSE, + NULL); + + /* Register the custom filter on the widget */ + filter_data = filter_data_new (window, cbmessage); + + id = gedit_file_browser_widget_add_filter (data->widget, + (GeditFileBrowserWidgetFilterFunc)custom_message_filter_func, + filter_data, + (GDestroyNotify)filter_data_free); + + filter_data->id = id; +} + +static void +message_remove_filter_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gulong id = 0; + + g_object_get (message, "id", &id, NULL); + + if (!id) + return; + + gedit_file_browser_widget_remove_filter (data->widget, id); +} + +static void +message_extend_context_menu_cb (GeditMessageBus *bus, + GeditMessage *message, + GeditWindow *window) +{ + WindowData *data; + GeditMenuExtension *ext; + + data = get_window_data (window); + + ext = gedit_file_browser_widget_extend_context_menu (data->widget); + + g_object_set (message, "extension", ext, NULL); + g_object_unref (ext); +} + +static void +message_up_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + GeditFileBrowserStore *store = gedit_file_browser_widget_get_browser_store (data->widget); + + gedit_file_browser_store_set_virtual_root_up (store); +} + +static void +message_history_back_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gedit_file_browser_widget_history_back (data->widget); +} + +static void +message_history_forward_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gedit_file_browser_widget_history_forward (data->widget); +} + +static void +message_refresh_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gedit_file_browser_widget_refresh (data->widget); +} + +static void +message_set_show_hidden_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gboolean active = FALSE; + GeditFileBrowserStore *store; + GeditFileBrowserStoreFilterMode mode; + + g_object_get (message, "active", &active, NULL); + + store = gedit_file_browser_widget_get_browser_store (data->widget); + mode = gedit_file_browser_store_get_filter_mode (store); + + if (active) + mode &= ~GEDIT_FILE_BROWSER_STORE_FILTER_MODE_HIDE_HIDDEN; + else + mode |= GEDIT_FILE_BROWSER_STORE_FILTER_MODE_HIDE_HIDDEN; + + gedit_file_browser_store_set_filter_mode (store, mode); +} + +static void +message_set_show_binary_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gboolean active = FALSE; + GeditFileBrowserStore *store; + GeditFileBrowserStoreFilterMode mode; + + g_object_get (message, "active", &active, NULL); + + store = gedit_file_browser_widget_get_browser_store (data->widget); + mode = gedit_file_browser_store_get_filter_mode (store); + + if (active) + mode &= ~GEDIT_FILE_BROWSER_STORE_FILTER_MODE_HIDE_BINARY; + else + mode |= GEDIT_FILE_BROWSER_STORE_FILTER_MODE_HIDE_BINARY; + + gedit_file_browser_store_set_filter_mode (store, mode); +} + +static void +message_show_bookmarks_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gedit_file_browser_widget_show_bookmarks (data->widget); +} + +static void +message_show_files_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + gedit_file_browser_widget_show_files (data->widget); +} + +static void +message_get_view_cb (GeditMessageBus *bus, + GeditMessage *message, + WindowData *data) +{ + GeditFileBrowserView *view; + view = gedit_file_browser_widget_get_browser_view (data->widget); + + g_object_set (message, "view", view, NULL); +} + +static void +register_methods (GeditWindow *window, + GeditFileBrowserWidget *widget) +{ + GeditMessageBus *bus = gedit_window_get_message_bus (window); + WindowData *data = get_window_data (window); + + /* Register method calls */ + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_GET_ROOT, + MESSAGE_OBJECT_PATH, + "get_root"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_SET_ROOT, + MESSAGE_OBJECT_PATH, + "set_root"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_SET_EMBLEM, + MESSAGE_OBJECT_PATH, + "set_emblem"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_SET_MARKUP, + MESSAGE_OBJECT_PATH, + "set_markup"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ADD_FILTER, + MESSAGE_OBJECT_PATH, + "add_filter"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID, + MESSAGE_OBJECT_PATH, + "remove_filter"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_EXTEND_CONTEXT_MENU, + MESSAGE_OBJECT_PATH, + "extend_context_menu"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_MESSAGE, + MESSAGE_OBJECT_PATH, + "up"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_MESSAGE, + MESSAGE_OBJECT_PATH, + "history_back"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_MESSAGE, + MESSAGE_OBJECT_PATH, + "history_forward"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_MESSAGE, + MESSAGE_OBJECT_PATH, + "refresh"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ACTIVATION, + MESSAGE_OBJECT_PATH, + "set_show_hidden"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ACTIVATION, + MESSAGE_OBJECT_PATH, + "set_show_binary"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_MESSAGE, + MESSAGE_OBJECT_PATH, + "show_bookmarks"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_MESSAGE, + MESSAGE_OBJECT_PATH, + "show_files"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_GET_VIEW, + MESSAGE_OBJECT_PATH, + "get_view"); + + BUS_CONNECT (bus, get_root, data); + BUS_CONNECT (bus, set_root, data); + BUS_CONNECT (bus, set_emblem, data); + BUS_CONNECT (bus, set_markup, data); + BUS_CONNECT (bus, add_filter, window); + BUS_CONNECT (bus, remove_filter, data); + BUS_CONNECT (bus, extend_context_menu, window); + + BUS_CONNECT (bus, up, data); + BUS_CONNECT (bus, history_back, data); + BUS_CONNECT (bus, history_forward, data); + + BUS_CONNECT (bus, refresh, data); + + BUS_CONNECT (bus, set_show_hidden, data); + BUS_CONNECT (bus, set_show_binary, data); + + BUS_CONNECT (bus, show_bookmarks, data); + BUS_CONNECT (bus, show_files, data); + + BUS_CONNECT (bus, get_view, data); +} + +static void +store_row_inserted (GeditFileBrowserStore *store, + GtkTreePath *path, + GtkTreeIter *iter, + MessageCacheData *data) +{ + guint flags = 0; + + gtk_tree_model_get (GTK_TREE_MODEL (store), iter, + GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, + -1); + + if (!FILE_IS_DUMMY (flags) && !FILE_IS_FILTERED (flags)) + { + WindowData *wdata = get_window_data (data->window); + + set_item_message (wdata, iter, path, data->message); + gedit_message_bus_send_message_sync (wdata->bus, data->message); + } +} + +static void +store_before_row_deleted (GeditFileBrowserStore *store, + GtkTreePath *path, + MessageCacheData *data) +{ + GtkTreeIter iter; + guint flags = 0; + + if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (store), &iter, path)) + return; + + gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, + GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags, + -1); + + if (!FILE_IS_DUMMY (flags) && !FILE_IS_FILTERED (flags)) + { + WindowData *wdata = get_window_data (data->window); + gchar *id; + + set_item_message (wdata, &iter, path, data->message); + + /* Must get the ID before the plugin can modify it */ + g_object_get (data->message, "id", &id, NULL); + + gedit_message_bus_send_message_sync (wdata->bus, data->message); + + g_hash_table_remove (wdata->row_tracking, id); + g_free (id); + } +} + +static void +store_virtual_root_changed (GeditFileBrowserStore *store, + GParamSpec *spec, + MessageCacheData *data) +{ + WindowData *wdata = get_window_data (data->window); + GFile *vroot; + + vroot = gedit_file_browser_store_get_virtual_root (store); + + if (!vroot) + { + return; + } + + g_object_set (data->message, + "location", vroot, + NULL); + + gedit_message_bus_send_message_sync (wdata->bus, data->message); + + g_object_unref (vroot); +} + +static void +store_begin_loading (GeditFileBrowserStore *store, + GtkTreeIter *iter, + MessageCacheData *data) +{ + GtkTreePath *path; + WindowData *wdata = get_window_data (data->window); + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter); + + set_item_message (wdata, iter, path, data->message); + + gedit_message_bus_send_message_sync (wdata->bus, data->message); + gtk_tree_path_free (path); +} + +static void +store_end_loading (GeditFileBrowserStore *store, + GtkTreeIter *iter, + MessageCacheData *data) +{ + GtkTreePath *path; + WindowData *wdata = get_window_data (data->window); + + path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), iter); + + set_item_message (wdata, iter, path, data->message); + + gedit_message_bus_send_message_sync (wdata->bus, data->message); + gtk_tree_path_free (path); +} + +static void +register_signals (GeditWindow *window, + GeditFileBrowserWidget *widget) +{ + GeditMessageBus *bus = gedit_window_get_message_bus (window); + GeditFileBrowserStore *store; + + GeditMessage *message; + WindowData *data; + + /* Register signals */ + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + MESSAGE_OBJECT_PATH, + "root_changed"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + MESSAGE_OBJECT_PATH, + "begin_loading"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + MESSAGE_OBJECT_PATH, + "end_loading"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + MESSAGE_OBJECT_PATH, + "inserted"); + + gedit_message_bus_register (bus, + GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + MESSAGE_OBJECT_PATH, + "deleted"); + + store = gedit_file_browser_widget_get_browser_store (widget); + + message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + "object-path", MESSAGE_OBJECT_PATH, + "method", "inserted", + NULL); + + data = get_window_data (window); + + data->row_inserted_id = + g_signal_connect_data (store, + "row-inserted", + G_CALLBACK (store_row_inserted), + message_cache_data_new (window, message), + (GClosureNotify)message_cache_data_free, + 0); + + message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + "object-path", MESSAGE_OBJECT_PATH, + "method", "deleted", + NULL); + + data->before_row_deleted_id = + g_signal_connect_data (store, + "before-row-deleted", + G_CALLBACK (store_before_row_deleted), + message_cache_data_new (window, message), + (GClosureNotify)message_cache_data_free, + 0); + + message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + "object-path", MESSAGE_OBJECT_PATH, + "method", "root_changed", + NULL); + + data->root_changed_id = + g_signal_connect_data (store, + "notify::virtual-root", + G_CALLBACK (store_virtual_root_changed), + message_cache_data_new (window, message), + (GClosureNotify)message_cache_data_free, + 0); + + message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + "object-path", MESSAGE_OBJECT_PATH, + "method", "begin_loading", + NULL); + + data->begin_loading_id = + g_signal_connect_data (store, + "begin_loading", + G_CALLBACK (store_begin_loading), + message_cache_data_new (window, message), + (GClosureNotify)message_cache_data_free, + 0); + + message = g_object_new (GEDIT_TYPE_FILE_BROWSER_MESSAGE_ID_LOCATION, + "object-path", MESSAGE_OBJECT_PATH, + "method", "end_loading", + NULL); + + data->end_loading_id = + g_signal_connect_data (store, + "end_loading", + G_CALLBACK (store_end_loading), + message_cache_data_new (window, message), + (GClosureNotify)message_cache_data_free, + 0); +} + +static void +message_unregistered (GeditMessageBus *bus, + const gchar *object_path, + const gchar *method, + GeditWindow *window) +{ + gchar *identifier; + FilterData *data; + WindowData *wdata; + + wdata = get_window_data (window); + + identifier = gedit_message_type_identifier (object_path, method); + + data = g_hash_table_lookup (wdata->filters, identifier); + + if (data) + { + gedit_file_browser_widget_remove_filter (wdata->widget, + data->id); + } + + g_free (identifier); +} + +void +gedit_file_browser_messages_register (GeditWindow *window, + GeditFileBrowserWidget *widget) +{ + window_data_new (window, widget); + + register_methods (window, widget); + register_signals (window, widget); + + g_signal_connect (gedit_window_get_message_bus (window), + "unregistered", + G_CALLBACK (message_unregistered), + window); +} + +static void +cleanup_signals (GeditWindow *window) +{ + WindowData *data = get_window_data (window); + GeditFileBrowserStore *store; + + store = gedit_file_browser_widget_get_browser_store (data->widget); + + g_signal_handler_disconnect (store, data->row_inserted_id); + g_signal_handler_disconnect (store, data->before_row_deleted_id); + g_signal_handler_disconnect (store, data->root_changed_id); + g_signal_handler_disconnect (store, data->begin_loading_id); + g_signal_handler_disconnect (store, data->end_loading_id); + + g_signal_handlers_disconnect_by_func (data->bus, message_unregistered, window); +} + +void +gedit_file_browser_messages_unregister (GeditWindow *window) +{ + GeditMessageBus *bus = gedit_window_get_message_bus (window); + WindowData *data = get_window_data (window); + + cleanup_signals (window); + + BUS_DISCONNECT (bus, get_root, data); + BUS_DISCONNECT (bus, set_root, data); + BUS_DISCONNECT (bus, set_emblem, data); + BUS_DISCONNECT (bus, set_markup, data); + BUS_DISCONNECT (bus, add_filter, window); + BUS_DISCONNECT (bus, remove_filter, data); + + BUS_DISCONNECT (bus, up, data); + BUS_DISCONNECT (bus, history_back, data); + BUS_DISCONNECT (bus, history_forward, data); + + BUS_DISCONNECT (bus, refresh, data); + + BUS_DISCONNECT (bus, set_show_hidden, data); + BUS_DISCONNECT (bus, set_show_binary, data); + + BUS_DISCONNECT (bus, show_bookmarks, data); + BUS_DISCONNECT (bus, show_files, data); + + BUS_DISCONNECT (bus, get_view, data); + + gedit_message_bus_unregister_all (bus, MESSAGE_OBJECT_PATH); + + window_data_free (window); +} +/* ex:set ts=8 noet: */ |