gedit r6751 - branches/message_system/plugins/filebrowser
- From: jessevdk svn gnome org
- To: svn-commits-list gnome org
- Subject: gedit r6751 - branches/message_system/plugins/filebrowser
- Date: Mon, 29 Dec 2008 15:43:40 +0000 (UTC)
Author: jessevdk
Date: Mon Dec 29 15:43:39 2008
New Revision: 6751
URL: http://svn.gnome.org/viewvc/gedit?rev=6751&view=rev
Log:
Implemented message bus support for the file browser plugin. It currently supports:
* set_root
* set_emblem
* add_filter
* remove_filter
* up
* history_back
* history_forward
* refresh
* set_show_hidden
* set_show_binary
* show_bookmarks
* show_files
* inserted
* deleted
* begin_loading
* end_loading
* root_changed
Added:
branches/message_system/plugins/filebrowser/gedit-file-browser-messages.c
branches/message_system/plugins/filebrowser/gedit-file-browser-messages.h
Modified:
branches/message_system/plugins/filebrowser/Makefile.am
branches/message_system/plugins/filebrowser/gedit-file-browser-plugin.c
branches/message_system/plugins/filebrowser/gedit-file-browser-store.c
branches/message_system/plugins/filebrowser/gedit-file-browser-widget.c
branches/message_system/plugins/filebrowser/gedit-file-browser-widget.h
Modified: branches/message_system/plugins/filebrowser/Makefile.am
==============================================================================
--- branches/message_system/plugins/filebrowser/Makefile.am (original)
+++ branches/message_system/plugins/filebrowser/Makefile.am Mon Dec 29 15:43:39 2008
@@ -25,7 +25,8 @@
gedit-file-browser-widget.h \
gedit-file-browser-error.h \
gedit-file-browser-utils.h \
- gedit-file-browser-plugin.h
+ gedit-file-browser-plugin.h \
+ gedit-file-browser-messages.h
libfilebrowser_la_SOURCES = \
$(BUILT_SOURCES) \
@@ -35,6 +36,7 @@
gedit-file-browser-widget.c \
gedit-file-browser-utils.c \
gedit-file-browser-plugin.c \
+ gedit-file-browser-messages.c \
$(NOINST_H_FILES)
libfilebrowser_la_LDFLAGS = $(PLUGIN_LIBTOOL_FLAGS)
Added: branches/message_system/plugins/filebrowser/gedit-file-browser-messages.c
==============================================================================
--- (empty file)
+++ branches/message_system/plugins/filebrowser/gedit-file-browser-messages.c Mon Dec 29 15:43:39 2008
@@ -0,0 +1,878 @@
+#include "gedit-file-browser-messages.h"
+#include "gedit-file-browser-store.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)
+
+typedef struct
+{
+ GeditWindow *window;
+ GeditMessage *message;
+} MessageCacheData;
+
+typedef struct
+{
+ guint row_inserted_id;
+ guint 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_set_root_cb (GeditMessageBus *bus,
+ GeditMessage *message,
+ WindowData *data)
+{
+ gchar *root = NULL;
+ gchar *virtual = NULL;
+
+ gedit_message_get (message, "uri", &root, NULL);
+
+ if (!root)
+ return;
+
+ if (gedit_message_has_key (message, "virtual"))
+ gedit_message_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);
+
+ g_free (root);
+ g_free (virtual);
+}
+
+static void
+message_set_emblem_cb (GeditMessageBus *bus,
+ GeditMessage *message,
+ WindowData *data)
+{
+ gchar *id = NULL;
+ gchar *emblem = NULL;
+ GtkTreePath *path;
+ GeditFileBrowserStore *store;
+
+ gedit_message_get (message, "id", &id, "emblem", &emblem, NULL);
+
+ if (!id || !emblem)
+ {
+ g_free (id);
+ g_free (emblem);
+
+ return;
+ }
+
+ path = track_row_lookup (data, id);
+
+ if (path != NULL)
+ {
+ GError *error = NULL;
+ GdkPixbuf *pixbuf;
+
+ pixbuf = gtk_icon_theme_load_icon (gtk_icon_theme_get_default (),
+ emblem,
+ 10,
+ 0,
+ &error);
+
+ if (pixbuf)
+ {
+ GValue value = { 0, };
+ GtkTreeIter iter;
+
+ 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);
+ }
+
+ g_object_unref (pixbuf);
+ }
+
+ if (error)
+ g_error_free (error);
+ }
+
+ g_free (id);
+ g_free (emblem);
+}
+
+static gchar *
+item_id (const gchar *path,
+ const gchar *uri)
+{
+ return g_strconcat (path, "::", uri, NULL);
+}
+
+static gchar *
+track_row (WindowData *data,
+ GeditFileBrowserStore *store,
+ GtkTreePath *path,
+ const gchar *uri)
+{
+ GtkTreeRowReference *ref;
+ gchar *id;
+ gchar *pathstr;
+
+ pathstr = gtk_tree_path_to_string (path);
+ id = item_id (pathstr, uri);
+
+ 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 *uri = NULL;
+ guint flags = 0;
+ gchar *track_id;
+
+ store = gedit_file_browser_widget_get_browser_store (data->widget);
+
+ gtk_tree_model_get (GTK_TREE_MODEL (store), iter,
+ GEDIT_FILE_BROWSER_STORE_COLUMN_URI, &uri,
+ GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags,
+ -1);
+
+ if (!uri)
+ return;
+
+ if (path && gtk_tree_path_get_depth (path) != 0)
+ track_id = track_row (data, store, path, uri);
+ else
+ track_id = NULL;
+
+ gedit_message_set (message,
+ "id", track_id,
+ "uri", uri,
+ NULL);
+
+ if (gedit_message_has_key (message, "is_directory"))
+ {
+ gedit_message_set (message,
+ "is_directory", FILE_IS_DIR (flags),
+ NULL);
+ }
+
+ g_free (uri);
+ g_free (track_id);
+}
+
+static gboolean
+custom_message_filter_func (GeditFileBrowserWidget *widget,
+ GeditFileBrowserStore *store,
+ GtkTreeIter *iter,
+ FilterData *data)
+{
+ WindowData *wdata = get_window_data (data->window);
+ gchar *uri = NULL;
+ guint flags = 0;
+ gboolean filter = FALSE;
+ GtkTreePath *path;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (store), iter,
+ GEDIT_FILE_BROWSER_STORE_COLUMN_URI, &uri,
+ GEDIT_FILE_BROWSER_STORE_COLUMN_FLAGS, &flags,
+ -1);
+
+ if (!uri || FILE_IS_DUMMY (flags))
+ {
+ g_free (uri);
+ 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);
+
+ gedit_message_set (data->message, "filter", filter, NULL);
+
+ gedit_message_bus_send_message_sync (wdata->bus, data->message);
+ gedit_message_get (data->message, "filter", &filter, NULL);
+
+ return filter;
+}
+
+static void
+message_add_filter_cb (GeditMessageBus *bus,
+ GeditMessage *message,
+ GeditWindow *window)
+{
+ gchar *object_path = NULL;
+ gchar *method = NULL;
+ gulong id;
+ GeditMessageType *message_type;
+ GeditMessage *cbmessage;
+ FilterData *filter_data;
+ WindowData *data = get_window_data (window);
+
+ gedit_message_get (message,
+ "object_path", &object_path,
+ "method", &method,
+ NULL);
+
+ // Check if there exists such a 'callback' message
+ if (!object_path || !method)
+ {
+ g_free (object_path);
+ g_free (method);
+
+ return;
+ }
+
+ message_type = gedit_message_bus_lookup (bus, object_path, method);
+
+ if (!message_type)
+ {
+ g_free (object_path);
+ g_free (method);
+
+ return;
+ }
+
+ // Check if the message type has the correct arguments
+ if (gedit_message_type_lookup (message_type, "id") != G_TYPE_STRING ||
+ gedit_message_type_lookup (message_type, "uri") != G_TYPE_STRING ||
+ gedit_message_type_lookup (message_type, "is_directory") != G_TYPE_BOOLEAN ||
+ gedit_message_type_lookup (message_type, "filter") != G_TYPE_BOOLEAN)
+ {
+ return;
+ }
+
+ cbmessage = gedit_message_type_instantiate (message_type,
+ "id", NULL,
+ "uri", 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;
+
+ gedit_message_get (message, "id", &id, NULL);
+
+ if (!id)
+ return;
+
+ gedit_file_browser_widget_remove_filter (data->widget, id);
+}
+
+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;
+
+ gedit_message_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;
+
+ gedit_message_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
+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,
+ MESSAGE_OBJECT_PATH, "set_root",
+ 1,
+ "uri", G_TYPE_STRING,
+ "virtual", G_TYPE_STRING,
+ NULL);
+
+ gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "set_emblem",
+ 0,
+ "id", G_TYPE_STRING,
+ "emblem", G_TYPE_STRING,
+ NULL);
+
+ gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "add_filter",
+ 1,
+ "object_path", G_TYPE_STRING,
+ "method", G_TYPE_STRING,
+ "id", G_TYPE_ULONG,
+ NULL);
+
+ gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "remove_filter",
+ 0,
+ "id", G_TYPE_ULONG,
+ NULL);
+
+ gedit_message_bus_register (bus, MESSAGE_OBJECT_PATH, "up", 0, NULL);
+
+ gedit_message_bus_register (bus, MESSAGE_OBJECT_PATH, "history_back", 0, NULL);
+ gedit_message_bus_register (bus, MESSAGE_OBJECT_PATH, "history_forward", 0, NULL);
+
+ gedit_message_bus_register (bus, MESSAGE_OBJECT_PATH, "refresh", 0, NULL);
+
+ gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "set_show_hidden",
+ 0,
+ "active", G_TYPE_BOOLEAN,
+ NULL);
+ gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "set_show_binary",
+ 0,
+ "active", G_TYPE_BOOLEAN,
+ NULL);
+
+ gedit_message_bus_register (bus, MESSAGE_OBJECT_PATH, "show_bookmarks", 0, NULL);
+ gedit_message_bus_register (bus, MESSAGE_OBJECT_PATH, "show_files", 0, NULL);
+
+ BUS_CONNECT (bus, set_root, data);
+ BUS_CONNECT (bus, set_emblem, data);
+ BUS_CONNECT (bus, add_filter, window);
+ BUS_CONNECT (bus, remove_filter, data);
+
+ 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);
+}
+
+static void
+store_row_inserted (GeditFileBrowserStore *store,
+ GtkTreePath *path,
+ GtkTreeIter *iter,
+ MessageCacheData *data)
+{
+ gchar *uri = NULL;
+ guint flags = 0;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (store), iter,
+ GEDIT_FILE_BROWSER_STORE_COLUMN_URI, &uri,
+ 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);
+ }
+
+ g_free (uri);
+}
+
+static void
+store_row_deleted (GeditFileBrowserStore *store,
+ GtkTreePath *path,
+ MessageCacheData *data)
+{
+ GtkTreeIter iter;
+ gchar *uri = NULL;
+ 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_URI, &uri,
+ 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);
+ }
+
+ g_free (uri);
+}
+
+static void
+store_virtual_root_changed (GeditFileBrowserStore *store,
+ GParamSpec *spec,
+ MessageCacheData *data)
+{
+ WindowData *wdata = get_window_data (data->window);
+ gchar *uri;
+
+ uri = gedit_file_browser_store_get_virtual_root (store);
+
+ if (!uri)
+ return;
+
+ gedit_message_set (data->message,
+ "uri", uri,
+ NULL);
+
+ gedit_message_bus_send_message_sync (wdata->bus, data->message);
+
+ g_free (uri);
+}
+
+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;
+ GeditMessageType *inserted_type;
+ GeditMessageType *deleted_type;
+ GeditMessageType *begin_loading_type;
+ GeditMessageType *end_loading_type;
+ GeditMessageType *root_changed_type;
+
+ GeditMessage *message;
+ WindowData *data;
+
+ /* Register signals */
+ root_changed_type = gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "root_changed",
+ 0,
+ "id", G_TYPE_STRING,
+ "uri", G_TYPE_STRING,
+ NULL);
+
+ begin_loading_type = gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "begin_loading",
+ 0,
+ "id", G_TYPE_STRING,
+ "uri", G_TYPE_STRING,
+ NULL);
+
+ end_loading_type = gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "end_loading",
+ 0,
+ "id", G_TYPE_STRING,
+ "uri", G_TYPE_STRING,
+ NULL);
+
+ inserted_type = gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "inserted",
+ 0,
+ "id", G_TYPE_STRING,
+ "uri", G_TYPE_STRING,
+ "is_directory", G_TYPE_BOOLEAN,
+ NULL);
+
+ deleted_type = gedit_message_bus_register (bus,
+ MESSAGE_OBJECT_PATH, "deleted",
+ 0,
+ "id", G_TYPE_STRING,
+ "uri", G_TYPE_STRING,
+ "is_directory", G_TYPE_BOOLEAN,
+ NULL);
+
+ store = gedit_file_browser_widget_get_browser_store (widget);
+
+ message = gedit_message_type_instantiate (inserted_type,
+ "id", NULL,
+ "uri", NULL,
+ "is_directory", FALSE,
+ 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 = gedit_message_type_instantiate (deleted_type,
+ "id", NULL,
+ "uri", NULL,
+ "is_directory", FALSE,
+ NULL);
+ data->row_deleted_id =
+ g_signal_connect_data (store,
+ "row-deleted",
+ G_CALLBACK (store_row_deleted),
+ message_cache_data_new (window, message),
+ (GClosureNotify)message_cache_data_free,
+ 0);
+
+ message = gedit_message_type_instantiate (root_changed_type,
+ "id", NULL,
+ "uri", NULL,
+ 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 = gedit_message_type_instantiate (begin_loading_type,
+ "id", NULL,
+ "uri", NULL,
+ 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 = gedit_message_type_instantiate (end_loading_type,
+ "id", NULL,
+ "uri", NULL,
+ 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,
+ GeditMessageType *message_type,
+ GeditWindow *window)
+{
+ gchar *identifier = gedit_message_type_identifier (gedit_message_type_get_object_path (message_type),
+ gedit_message_type_get_method (message_type));
+ FilterData *data;
+ WindowData *wdata = get_window_data (window);
+
+ 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->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, "unregistered", window);
+}
+
+void
+gedit_file_browser_messages_unregister (GeditWindow *window)
+{
+ GeditMessageBus *bus = gedit_window_get_message_bus (window);
+
+ cleanup_signals (window);
+ gedit_message_bus_unregister_all (bus, MESSAGE_OBJECT_PATH);
+
+ window_data_free (window);
+}
Added: branches/message_system/plugins/filebrowser/gedit-file-browser-messages.h
==============================================================================
--- (empty file)
+++ branches/message_system/plugins/filebrowser/gedit-file-browser-messages.h Mon Dec 29 15:43:39 2008
@@ -0,0 +1,35 @@
+/*
+ * gedit-file-browser-messages.h - Gedit plugin providing easy file access
+ * from the sidepanel
+ *
+ * Copyright (C) 2008 - 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, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GEDIT_FILE_BROWSER_MESSAGES_H__
+#define __GEDIT_FILE_BROWSER_MESSAGES_H__
+
+#include <gedit/gedit-window.h>
+#include <gedit/gedit-message-bus.h>
+#include "gedit-file-browser-widget.h"
+
+void gedit_file_browser_messages_register (GeditWindow *window,
+ GeditFileBrowserWidget *widget);
+void gedit_file_browser_messages_unregister (GeditWindow *window);
+
+#endif /* __GEDIT_FILE_BROWSER_MESSAGES_H__ */
+
+// ex:ts=8:noet:
Modified: branches/message_system/plugins/filebrowser/gedit-file-browser-plugin.c
==============================================================================
--- branches/message_system/plugins/filebrowser/gedit-file-browser-plugin.c (original)
+++ branches/message_system/plugins/filebrowser/gedit-file-browser-plugin.c Mon Dec 29 15:43:39 2008
@@ -37,6 +37,7 @@
#include "gedit-file-browser-utils.h"
#include "gedit-file-browser-error.h"
#include "gedit-file-browser-widget.h"
+#include "gedit-file-browser-messages.h"
#define WINDOW_DATA_KEY "GeditFileBrowserPluginWindowData"
#define FILE_BROWSER_BASE_KEY "/apps/gedit-2/plugins/filebrowser"
@@ -45,6 +46,7 @@
#define NAUTILUS_ENABLE_DELETE_KEY "enable_delete"
#define NAUTILUS_CONFIRM_TRASH_KEY "confirm_trash"
#define TERMINAL_EXEC_KEY "/desktop/gnome/applications/terminal/exec"
+#define MESSAGE_OBJECT_PATH "/plugins/filebrowser"
#define GEDIT_FILE_BROWSER_PLUGIN_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), GEDIT_TYPE_FILE_BROWSER_PLUGIN, GeditFileBrowserPluginPrivate))
@@ -775,7 +777,10 @@
"tab-added",
G_CALLBACK (on_tab_added_cb),
data);
-
+
+ /* Register messages on the bus */
+ gedit_file_browser_messages_register (window, data->tree_widget);
+
impl_updateui (plugin, window);
}
@@ -788,6 +793,9 @@
data = get_plugin_data (window);
+ /* Unregister messages from the bus */
+ gedit_file_browser_messages_unregister (window);
+
/* Disconnect signals */
g_signal_handlers_disconnect_by_func (window,
G_CALLBACK (on_tab_added_cb),
Modified: branches/message_system/plugins/filebrowser/gedit-file-browser-store.c
==============================================================================
--- branches/message_system/plugins/filebrowser/gedit-file-browser-store.c (original)
+++ branches/message_system/plugins/filebrowser/gedit-file-browser-store.c Mon Dec 29 15:43:39 2008
@@ -2230,10 +2230,14 @@
G_FILE_MONITOR_NONE,
NULL,
NULL);
- g_signal_connect (dir->monitor,
- "changed",
- G_CALLBACK (on_directory_monitor_event),
- parent);
+
+ if (dir->monitor != NULL)
+ {
+ g_signal_connect (dir->monitor,
+ "changed",
+ G_CALLBACK (on_directory_monitor_event),
+ parent);
+ }
}
model_check_dummy (dir->model, parent);
Modified: branches/message_system/plugins/filebrowser/gedit-file-browser-widget.c
==============================================================================
--- branches/message_system/plugins/filebrowser/gedit-file-browser-widget.c (original)
+++ branches/message_system/plugins/filebrowser/gedit-file-browser-widget.c Mon Dec 29 15:43:39 2008
@@ -99,6 +99,7 @@
gulong id;
GeditFileBrowserWidgetFilterFunc func;
gpointer user_data;
+ GDestroyNotify destroy_notify;
} FilterFunc;
typedef struct
@@ -249,7 +250,8 @@
static FilterFunc *
filter_func_new (GeditFileBrowserWidget * obj,
GeditFileBrowserWidgetFilterFunc func,
- gpointer user_data)
+ gpointer user_data,
+ GDestroyNotify notify)
{
FilterFunc *result;
@@ -258,7 +260,7 @@
result->id = ++obj->priv->filter_id;
result->func = func;
result->user_data = user_data;
-
+ result->destroy_notify = notify;
return result;
}
@@ -1643,6 +1645,7 @@
obj->priv->glob_filter_id =
gedit_file_browser_widget_add_filter (obj,
filter_glob,
+ NULL,
NULL);
}
@@ -1695,16 +1698,32 @@
bookmarks_store));
}
+static void
+show_files_real (GeditFileBrowserWidget *obj,
+ gboolean do_root_changed)
+{
+ gedit_file_browser_view_set_model (obj->priv->treeview,
+ GTK_TREE_MODEL (obj->priv->
+ file_store));
+
+ if (do_root_changed)
+ on_virtual_root_changed (obj->priv->file_store, NULL, obj);
+}
+
+void
+gedit_file_browser_widget_show_files (GeditFileBrowserWidget * obj)
+{
+ show_files_real (obj, TRUE);
+}
+
void
gedit_file_browser_widget_set_root_and_virtual_root (GeditFileBrowserWidget *obj,
gchar const *root,
gchar const *virtual_root)
{
GeditFileBrowserStoreResult result;
-
- gedit_file_browser_view_set_model (obj->priv->treeview,
- GTK_TREE_MODEL (obj->priv->
- file_store));
+
+ show_files_real (obj, FALSE);
if (!virtual_root)
result =
@@ -1715,8 +1734,7 @@
gedit_file_browser_store_set_root_and_virtual_root
(obj->priv->file_store, root, virtual_root);
- if (result == GEDIT_FILE_BROWSER_STORE_RESULT_NO_CHANGE)
- on_virtual_root_changed (obj->priv->file_store, NULL, obj);
+ show_files_real (obj, result == GEDIT_FILE_BROWSER_STORE_RESULT_NO_CHANGE);
}
void
@@ -1783,14 +1801,15 @@
gulong
gedit_file_browser_widget_add_filter (GeditFileBrowserWidget * obj,
- GeditFileBrowserWidgetFilterFunc
- func, gpointer user_data)
+ GeditFileBrowserWidgetFilterFunc func,
+ gpointer user_data,
+ GDestroyNotify notify)
{
FilterFunc *f;
GtkTreeModel *model =
gtk_tree_view_get_model (GTK_TREE_VIEW (obj->priv->treeview));
- f = filter_func_new (obj, func, user_data);
+ f = filter_func_new (obj, func, user_data, notify);
obj->priv->filter_funcs =
g_slist_append (obj->priv->filter_funcs, f);
@@ -1808,10 +1827,15 @@
GSList *item;
FilterFunc *func;
- for (item = obj->priv->filter_funcs; item; item = item->next) {
+ for (item = obj->priv->filter_funcs; item; item = item->next)
+ {
func = (FilterFunc *) (item->data);
- if (func->id == id) {
+ if (func->id == id)
+ {
+ if (func->destroy_notify)
+ func->destroy_notify (func->user_data);
+
obj->priv->filter_funcs =
g_slist_remove_link (obj->priv->filter_funcs,
item);
@@ -2168,6 +2192,46 @@
g_object_unref (volume);
}
+void
+gedit_file_browser_widget_refresh (GeditFileBrowserWidget *obj)
+{
+ GtkTreeModel *model =
+ gtk_tree_view_get_model (GTK_TREE_VIEW (obj->priv->treeview));
+
+ if (GEDIT_IS_FILE_BROWSER_STORE (model))
+ gedit_file_browser_store_refresh (GEDIT_FILE_BROWSER_STORE
+ (model));
+ else if (GEDIT_IS_FILE_BOOKMARKS_STORE (model)) {
+ g_hash_table_ref (obj->priv->bookmarks_hash);
+ g_hash_table_destroy (obj->priv->bookmarks_hash);
+
+ gedit_file_bookmarks_store_refresh
+ (GEDIT_FILE_BOOKMARKS_STORE (model));
+ }
+}
+
+void
+gedit_file_browser_widget_history_back (GeditFileBrowserWidget *obj)
+{
+ if (obj->priv->locations) {
+ if (obj->priv->current_location)
+ jump_to_location (obj,
+ obj->priv->current_location->
+ next, TRUE);
+ else {
+ jump_to_location (obj, obj->priv->locations, TRUE);
+ }
+ }
+}
+
+void
+gedit_file_browser_widget_history_forward (GeditFileBrowserWidget *obj)
+{
+ if (obj->priv->locations)
+ jump_to_location (obj, obj->priv->current_location->prev,
+ FALSE);
+}
+
/* Callbacks */
static void
on_bookmark_activated (GeditFileBrowserView *tree_view,
@@ -2702,24 +2766,14 @@
static void
on_action_directory_next (GtkAction * action, GeditFileBrowserWidget * obj)
{
- if (obj->priv->locations)
- jump_to_location (obj, obj->priv->current_location->prev,
- FALSE);
+ gedit_file_browser_widget_history_forward (obj);
}
static void
on_action_directory_previous (GtkAction * action,
GeditFileBrowserWidget * obj)
{
- if (obj->priv->locations) {
- if (obj->priv->current_location)
- jump_to_location (obj,
- obj->priv->current_location->
- next, TRUE);
- else {
- jump_to_location (obj, obj->priv->locations, TRUE);
- }
- }
+ gedit_file_browser_widget_history_back (obj);
}
static void
@@ -2800,19 +2854,7 @@
on_action_directory_refresh (GtkAction * action,
GeditFileBrowserWidget * obj)
{
- GtkTreeModel *model =
- gtk_tree_view_get_model (GTK_TREE_VIEW (obj->priv->treeview));
-
- if (GEDIT_IS_FILE_BROWSER_STORE (model))
- gedit_file_browser_store_refresh (GEDIT_FILE_BROWSER_STORE
- (model));
- else if (GEDIT_IS_FILE_BOOKMARKS_STORE (model)) {
- g_hash_table_ref (obj->priv->bookmarks_hash);
- g_hash_table_destroy (obj->priv->bookmarks_hash);
-
- gedit_file_bookmarks_store_refresh
- (GEDIT_FILE_BOOKMARKS_STORE (model));
- }
+ gedit_file_browser_widget_refresh (obj);
}
static gboolean
Modified: branches/message_system/plugins/filebrowser/gedit-file-browser-widget.h
==============================================================================
--- branches/message_system/plugins/filebrowser/gedit-file-browser-widget.h (original)
+++ branches/message_system/plugins/filebrowser/gedit-file-browser-widget.h Mon Dec 29 15:43:39 2008
@@ -76,6 +76,8 @@
GtkWidget *gedit_file_browser_widget_new (void);
void gedit_file_browser_widget_show_bookmarks (GeditFileBrowserWidget * obj);
+void gedit_file_browser_widget_show_files (GeditFileBrowserWidget * obj);
+
void gedit_file_browser_widget_set_root (GeditFileBrowserWidget * obj,
gchar const *root,
gboolean virtual_root);
@@ -104,13 +106,18 @@
gulong gedit_file_browser_widget_add_filter (GeditFileBrowserWidget * obj,
GeditFileBrowserWidgetFilterFunc func,
- gpointer user_data);
+ gpointer user_data,
+ GDestroyNotify notify);
void gedit_file_browser_widget_remove_filter (GeditFileBrowserWidget * obj,
gulong id);
void gedit_file_browser_widget_set_filter_pattern (GeditFileBrowserWidget * obj,
gchar const *pattern);
+void gedit_file_browser_widget_refresh (GeditFileBrowserWidget * obj);
+void gedit_file_browser_widget_history_back (GeditFileBrowserWidget * obj);
+void gedit_file_browser_widget_history_forward (GeditFileBrowserWidget * obj);
+
G_END_DECLS
-#endif /* __GEDIT_FILE_BROWSER_WIDGET_H__ */
+#endif /* __GEDIT_FILE_BROWSER_WIDGET_H__ */
// ex:ts=8:noet:
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]