gedit r6751 - branches/message_system/plugins/filebrowser



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]