| @@ -30,20 +30,31 @@ | ||||
| #include <string.h> | ||||
| #include <glib/gi18n-lib.h> | ||||
| #include <gmodule.h> | ||||
| #include <libpeas/peas-activatable.h> | ||||
|  | ||||
| #include <xed/xed-window.h> | ||||
| #include <xed/xed-debug.h> | ||||
| #include <xed/xed-utils.h> | ||||
| #include <xed/xed-help.h> | ||||
|  | ||||
| #define XED_SORT_PLUGIN_GET_PRIVATE(object)(G_TYPE_INSTANCE_GET_PRIVATE ((object), XED_TYPE_SORT_PLUGIN, XedSortPluginPrivate)) | ||||
|  | ||||
| /* Key in case the plugin ever needs any settings. */ | ||||
| #define SORT_BASE_KEY "/apps/xed/plugins/sort" | ||||
|  | ||||
| #define WINDOW_DATA_KEY "XedSortPluginWindowData" | ||||
| #define MENU_PATH "/MenuBar/EditMenu/EditOps_6" | ||||
|  | ||||
| XED_PLUGIN_REGISTER_TYPE(XedSortPlugin, xed_sort_plugin) | ||||
| static void peas_activatable_iface_init (PeasActivatableInterface *iface); | ||||
|  | ||||
| G_DEFINE_DYNAMIC_TYPE_EXTENDED (XedSortPlugin, | ||||
|                                 xed_sort_plugin, | ||||
|                                 PEAS_TYPE_EXTENSION_BASE, | ||||
|                                 0, | ||||
|                                 G_IMPLEMENT_INTERFACE_DYNAMIC (PEAS_TYPE_ACTIVATABLE, | ||||
|                                                                peas_activatable_iface_init)) | ||||
|  | ||||
| enum | ||||
| { | ||||
|     PROP_0, | ||||
|     PROP_OBJECT | ||||
| }; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
| @@ -58,17 +69,13 @@ typedef struct | ||||
| 	GtkTextIter start, end; /* selection */ | ||||
| } SortDialog; | ||||
|  | ||||
| typedef struct | ||||
| struct _XedSortPluginPrivate | ||||
| { | ||||
|     GtkWidget *window; | ||||
|  | ||||
| 	GtkActionGroup *ui_action_group; | ||||
| 	guint ui_id; | ||||
| } WindowData; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
| 	XedPlugin *plugin; | ||||
| 	XedWindow *window; | ||||
| } ActionData; | ||||
| }; | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
| @@ -78,7 +85,7 @@ typedef struct | ||||
| 	gint starting_column; | ||||
| } SortInfo; | ||||
|  | ||||
| static void sort_cb (GtkAction *action, ActionData *action_data); | ||||
| static void sort_cb (GtkAction *action, XedSortPlugin *plugin); | ||||
| static void sort_real (SortDialog *dialog); | ||||
|  | ||||
| static const GtkActionEntry action_entries[] = | ||||
| @@ -92,7 +99,7 @@ static const GtkActionEntry action_entries[] = | ||||
| }; | ||||
|  | ||||
| static void | ||||
| sort_dialog_dispose (GObject *obj, | ||||
| sort_dialog_destroy (GObject *obj, | ||||
| 		     gpointer  dialog_pointer) | ||||
| { | ||||
| 	xed_debug (DEBUG_PLUGINS); | ||||
| @@ -150,8 +157,9 @@ get_current_selection (XedWindow *window, SortDialog *dialog) | ||||
| } | ||||
|  | ||||
| static SortDialog * | ||||
| get_sort_dialog (ActionData *action_data) | ||||
| get_sort_dialog (XedSortPlugin *plugin) | ||||
| { | ||||
|     XedWindow *window; | ||||
| 	SortDialog *dialog; | ||||
| 	GtkWidget *error_widget; | ||||
| 	gboolean ret; | ||||
| @@ -160,9 +168,11 @@ get_sort_dialog (ActionData *action_data) | ||||
|  | ||||
| 	xed_debug (DEBUG_PLUGINS); | ||||
|  | ||||
|     window = XED_WINDOW (plugin->priv->window); | ||||
|  | ||||
| 	dialog = g_slice_new (SortDialog); | ||||
|  | ||||
| 	data_dir = xed_plugin_get_data_dir (action_data->plugin); | ||||
| 	data_dir = peas_extension_base_get_data_dir (PEAS_EXTENSION_BASE (plugin)); | ||||
| 	ui_file = g_build_filename (data_dir, "sort.ui", NULL); | ||||
| 	g_free (data_dir); | ||||
| 	ret = xed_utils_get_ui_objects (ui_file, | ||||
| @@ -181,7 +191,7 @@ get_sort_dialog (ActionData *action_data) | ||||
| 		const gchar *err_message; | ||||
|  | ||||
| 		err_message = gtk_label_get_label (GTK_LABEL (error_widget)); | ||||
| 		xed_warning (GTK_WINDOW (action_data->window), | ||||
| 		xed_warning (GTK_WINDOW (window), | ||||
| 			       "%s", err_message); | ||||
|  | ||||
| 		g_slice_free (SortDialog, dialog); | ||||
| @@ -194,8 +204,8 @@ get_sort_dialog (ActionData *action_data) | ||||
| 					 GTK_RESPONSE_OK); | ||||
|  | ||||
| 	g_signal_connect (dialog->dialog, | ||||
| 			  "dispose", | ||||
| 			  G_CALLBACK (sort_dialog_dispose), | ||||
| 			  "destroy", | ||||
| 			  G_CALLBACK (sort_dialog_destroy), | ||||
| 			  dialog); | ||||
|  | ||||
| 	g_signal_connect (dialog->dialog, | ||||
| @@ -203,35 +213,38 @@ get_sort_dialog (ActionData *action_data) | ||||
| 			  G_CALLBACK (sort_dialog_response_handler), | ||||
| 			  dialog); | ||||
|  | ||||
| 	get_current_selection (action_data->window, dialog); | ||||
| 	get_current_selection (window, dialog); | ||||
|  | ||||
| 	return dialog; | ||||
| } | ||||
|  | ||||
| static void | ||||
| sort_cb (GtkAction  *action, | ||||
| 	 ActionData *action_data) | ||||
| 	 XedSortPlugin *plugin) | ||||
| { | ||||
|     XedWindow *window; | ||||
| 	XedDocument *doc; | ||||
| 	GtkWindowGroup *wg; | ||||
| 	SortDialog *dialog; | ||||
|  | ||||
| 	xed_debug (DEBUG_PLUGINS); | ||||
|  | ||||
| 	doc = xed_window_get_active_document (action_data->window); | ||||
| 	window = XED_WINDOW (plugin->priv->window); | ||||
|  | ||||
|     doc = xed_window_get_active_document (window); | ||||
| 	g_return_if_fail (doc != NULL); | ||||
|  | ||||
| 	dialog = get_sort_dialog (action_data); | ||||
| 	dialog = get_sort_dialog (plugin); | ||||
| 	g_return_if_fail (dialog != NULL); | ||||
|  | ||||
| 	wg = xed_window_get_group (action_data->window); | ||||
| 	wg = xed_window_get_group (window); | ||||
| 	gtk_window_group_add_window (wg, | ||||
| 				     GTK_WINDOW (dialog->dialog)); | ||||
|  | ||||
| 	dialog->doc = doc; | ||||
|  | ||||
| 	gtk_window_set_transient_for (GTK_WINDOW (dialog->dialog), | ||||
| 				      GTK_WINDOW (action_data->window)); | ||||
| 				      GTK_WINDOW (window)); | ||||
|  | ||||
| 	gtk_window_set_modal (GTK_WINDOW (dialog->dialog), | ||||
| 			      TRUE); | ||||
| @@ -439,30 +452,52 @@ sort_real (SortDialog *dialog) | ||||
| } | ||||
|  | ||||
| static void | ||||
| free_window_data (WindowData *data) | ||||
| xed_sort_plugin_set_property (GObject      *object, | ||||
|                               guint         prop_id, | ||||
|                               const GValue *value, | ||||
|                               GParamSpec   *pspec) | ||||
| { | ||||
| 	g_return_if_fail (data != NULL); | ||||
| 	XedSortPlugin *plugin = XED_SORT_PLUGIN (object); | ||||
|  | ||||
| 	g_object_unref (data->ui_action_group); | ||||
| 	g_slice_free (WindowData, data); | ||||
| 	switch (prop_id) | ||||
|     { | ||||
|         case PROP_OBJECT: | ||||
|             plugin->priv->window = GTK_WIDGET (g_value_dup_object (value)); | ||||
|             break; | ||||
|         default: | ||||
|             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|             break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| free_action_data (ActionData *data) | ||||
| xed_sort_plugin_get_property (GObject    *object, | ||||
|                               guint       prop_id, | ||||
|                               GValue     *value, | ||||
|                               GParamSpec *pspec) | ||||
| { | ||||
| 	g_return_if_fail (data != NULL); | ||||
| 	XedSortPlugin *plugin = XED_SORT_PLUGIN (object); | ||||
|  | ||||
| 	g_slice_free (ActionData, data); | ||||
| 	switch (prop_id) | ||||
|     { | ||||
|         case PROP_OBJECT: | ||||
|             g_value_set_object (value, plugin->priv->window); | ||||
|             break; | ||||
|         default: | ||||
|             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|             break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_ui_real (XedWindow  *window, | ||||
| 		WindowData   *data) | ||||
| update_ui (XedSortPluginPrivate *data) | ||||
| { | ||||
|     XedWindow *window; | ||||
| 	XedView *view; | ||||
|  | ||||
| 	xed_debug (DEBUG_PLUGINS); | ||||
|  | ||||
|     window = XED_WINDOW (data->window); | ||||
| 	view = xed_window_get_active_view (window); | ||||
|  | ||||
| 	gtk_action_group_set_sensitive (data->ui_action_group, | ||||
| @@ -471,30 +506,28 @@ update_ui_real (XedWindow  *window, | ||||
| } | ||||
|  | ||||
| static void | ||||
| impl_activate (XedPlugin *plugin, | ||||
| 	       XedWindow *window) | ||||
| xed_sort_plugin_activate (PeasActivatable *activatable) | ||||
| { | ||||
|     XedSortPlugin *plugin; | ||||
|     XedSortPluginPrivate *data; | ||||
|     XedWindow *window; | ||||
| 	GtkUIManager *manager; | ||||
| 	WindowData *data; | ||||
| 	ActionData *action_data; | ||||
|  | ||||
| 	xed_debug (DEBUG_PLUGINS); | ||||
|  | ||||
| 	data = g_slice_new (WindowData); | ||||
| 	action_data = g_slice_new (ActionData); | ||||
| 	action_data->window = window; | ||||
| 	action_data->plugin = plugin; | ||||
| 	plugin = XED_SORT_PLUGIN (activatable); | ||||
|     data = plugin->priv; | ||||
|     window = XED_WINDOW (data->window); | ||||
|  | ||||
| 	manager = xed_window_get_ui_manager (window); | ||||
|  | ||||
| 	data->ui_action_group = gtk_action_group_new ("XedSortPluginActions"); | ||||
| 	gtk_action_group_set_translation_domain (data->ui_action_group, | ||||
| 						 GETTEXT_PACKAGE); | ||||
| 	gtk_action_group_add_actions_full (data->ui_action_group, | ||||
| 	gtk_action_group_add_actions (data->ui_action_group, | ||||
| 					   action_entries, | ||||
| 					   G_N_ELEMENTS (action_entries), | ||||
| 					   action_data, | ||||
| 					   (GDestroyNotify) free_action_data); | ||||
| 					   plugin); | ||||
|  | ||||
| 	gtk_ui_manager_insert_action_group (manager, | ||||
| 					    data->ui_action_group, | ||||
| @@ -502,11 +535,6 @@ impl_activate (XedPlugin *plugin, | ||||
|  | ||||
| 	data->ui_id = gtk_ui_manager_new_merge_id (manager); | ||||
|  | ||||
| 	g_object_set_data_full (G_OBJECT (window), | ||||
| 				WINDOW_DATA_KEY, | ||||
| 				data, | ||||
| 				(GDestroyNotify) free_window_data); | ||||
|  | ||||
| 	gtk_ui_manager_add_ui (manager, | ||||
| 			       data->ui_id, | ||||
| 			       MENU_PATH, | ||||
| @@ -515,74 +543,101 @@ impl_activate (XedPlugin *plugin, | ||||
| 			       GTK_UI_MANAGER_MENUITEM, | ||||
| 			       FALSE); | ||||
|  | ||||
| 	update_ui_real (window, | ||||
| 			data); | ||||
| 	update_ui (data); | ||||
| } | ||||
|  | ||||
| static void | ||||
| impl_deactivate	(XedPlugin *plugin, | ||||
| 		 XedWindow *window) | ||||
| xed_sort_plugin_deactivate (PeasActivatable *activatable) | ||||
| { | ||||
|     XedSortPluginPrivate *data; | ||||
|     XedWindow *window; | ||||
| 	GtkUIManager *manager; | ||||
| 	WindowData *data; | ||||
|  | ||||
| 	xed_debug (DEBUG_PLUGINS); | ||||
|  | ||||
| 	manager = xed_window_get_ui_manager (window); | ||||
| 	data = XED_SORT_PLUGIN (activatable)->priv; | ||||
|     window = XED_WINDOW (data->window); | ||||
|  | ||||
| 	data = (WindowData *) g_object_get_data (G_OBJECT (window), | ||||
| 						 WINDOW_DATA_KEY); | ||||
| 	g_return_if_fail (data != NULL); | ||||
| 	manager = xed_window_get_ui_manager (window); | ||||
|  | ||||
| 	gtk_ui_manager_remove_ui (manager, | ||||
| 				  data->ui_id); | ||||
| 	gtk_ui_manager_remove_action_group (manager, | ||||
| 					    data->ui_action_group); | ||||
|  | ||||
| 	g_object_set_data (G_OBJECT (window), | ||||
| 			   WINDOW_DATA_KEY, | ||||
| 			   NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| impl_update_ui (XedPlugin *plugin, | ||||
| 		XedWindow *window) | ||||
| xed_sort_plugin_update_state (PeasActivatable *activatable) | ||||
| { | ||||
| 	WindowData *data; | ||||
|  | ||||
| 	xed_debug (DEBUG_PLUGINS); | ||||
|  | ||||
| 	data = (WindowData *) g_object_get_data (G_OBJECT (window), | ||||
| 						 WINDOW_DATA_KEY); | ||||
| 	g_return_if_fail (data != NULL); | ||||
|  | ||||
| 	update_ui_real (window, | ||||
| 			data); | ||||
| 	update_ui (XED_SORT_PLUGIN (activatable)->priv); | ||||
| } | ||||
|  | ||||
| static void | ||||
| xed_sort_plugin_init (XedSortPlugin *plugin) | ||||
| { | ||||
| 	xed_debug_message (DEBUG_PLUGINS, "XedSortPlugin initializing"); | ||||
|  | ||||
|     plugin->priv = XED_SORT_PLUGIN_GET_PRIVATE (plugin); | ||||
| } | ||||
|  | ||||
| static void | ||||
| xed_sort_plugin_finalize (GObject *object) | ||||
| xed_sort_plugin_dispose (GObject *object) | ||||
| { | ||||
| 	xed_debug_message (DEBUG_PLUGINS, "XedSortPlugin finalizing"); | ||||
| 	XedSortPlugin *plugin = XED_SORT_PLUGIN (object); | ||||
|  | ||||
| 	G_OBJECT_CLASS (xed_sort_plugin_parent_class)->finalize (object); | ||||
|     xed_debug_message (DEBUG_PLUGINS, "XedSortPlugin disposing"); | ||||
|  | ||||
|     if (plugin->priv->window != NULL) | ||||
|     { | ||||
|         g_object_unref (plugin->priv->window); | ||||
|         plugin->priv->window = NULL; | ||||
|     } | ||||
|  | ||||
|     if (plugin->priv->ui_action_group) | ||||
|     { | ||||
|         g_object_unref (plugin->priv->ui_action_group); | ||||
|         plugin->priv->ui_action_group = NULL; | ||||
|     } | ||||
|  | ||||
| 	G_OBJECT_CLASS (xed_sort_plugin_parent_class)->dispose (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| xed_sort_plugin_class_init (XedSortPluginClass *klass) | ||||
| { | ||||
| 	GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
| 	XedPluginClass *plugin_class = XED_PLUGIN_CLASS (klass); | ||||
|  | ||||
| 	object_class->finalize = xed_sort_plugin_finalize; | ||||
| 	object_class->dispose = xed_sort_plugin_dispose; | ||||
|     object_class->set_property = xed_sort_plugin_set_property; | ||||
|     object_class->get_property = xed_sort_plugin_get_property; | ||||
|  | ||||
| 	plugin_class->activate = impl_activate; | ||||
| 	plugin_class->deactivate = impl_deactivate; | ||||
| 	plugin_class->update_ui = impl_update_ui; | ||||
|     g_object_class_override_property (object_class, PROP_OBJECT, "object"); | ||||
|  | ||||
|     g_type_class_add_private (klass, sizeof (XedSortPluginPrivate)); | ||||
| } | ||||
|  | ||||
| static void | ||||
| xed_sort_plugin_class_finalize (XedSortPluginClass *klass) | ||||
| { | ||||
|     /* dummy function - used by G_DEFINE_DYNAMIC_TYPE_EXTENDED */ | ||||
| } | ||||
|  | ||||
| static void | ||||
| peas_activatable_iface_init (PeasActivatableInterface *iface) | ||||
| { | ||||
|     iface->activate = xed_sort_plugin_activate; | ||||
|     iface->deactivate = xed_sort_plugin_deactivate; | ||||
|     iface->update_state = xed_sort_plugin_update_state; | ||||
| } | ||||
|  | ||||
| G_MODULE_EXPORT void | ||||
| peas_register_types (PeasObjectModule *module) | ||||
| { | ||||
|     xed_sort_plugin_register_type (G_TYPE_MODULE (module)); | ||||
|  | ||||
| 	peas_object_module_register_extension_type (module, | ||||
|                                                 PEAS_TYPE_ACTIVATABLE, | ||||
|                                                 XED_TYPE_SORT_PLUGIN); | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* | ||||
|  * xed-sort-plugin.h | ||||
|  *  | ||||
|  * | ||||
|  * 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) | ||||
| @@ -23,50 +23,54 @@ | ||||
|  | ||||
| #include <glib.h> | ||||
| #include <glib-object.h> | ||||
| #include <xed/xed-plugin.h> | ||||
| #include <libpeas/peas-extension-base.h> | ||||
| #include <libpeas/peas-object-module.h> | ||||
|  | ||||
| G_BEGIN_DECLS | ||||
|  | ||||
| /* | ||||
|  * Type checking and casting macros | ||||
|  */ | ||||
| #define XED_TYPE_SORT_PLUGIN		(xed_sort_plugin_get_type ()) | ||||
| #define XED_SORT_PLUGIN(o)		(G_TYPE_CHECK_INSTANCE_CAST ((o), XED_TYPE_SORT_PLUGIN, XedSortPlugin)) | ||||
| #define XED_SORT_PLUGIN_CLASS(k)	(G_TYPE_CHECK_CLASS_CAST((k), XED_TYPE_SORT_PLUGIN, XedSortPluginClass)) | ||||
| #define XED_IS_SORT_PLUGIN(o)		(G_TYPE_CHECK_INSTANCE_TYPE ((o), XED_TYPE_SORT_PLUGIN)) | ||||
| #define XED_IS_SORT_PLUGIN_CLASS(k)	(G_TYPE_CHECK_CLASS_TYPE ((k), XED_TYPE_SORT_PLUGIN)) | ||||
| #define XED_SORT_PLUGIN_GET_CLASS(o)	(G_TYPE_INSTANCE_GET_CLASS ((o), XED_TYPE_SORT_PLUGIN, XedSortPluginClass)) | ||||
| #define XED_TYPE_SORT_PLUGIN        (xed_sort_plugin_get_type ()) | ||||
| #define XED_SORT_PLUGIN(o)      (G_TYPE_CHECK_INSTANCE_CAST ((o), XED_TYPE_SORT_PLUGIN, XedSortPlugin)) | ||||
| #define XED_SORT_PLUGIN_CLASS(k)    (G_TYPE_CHECK_CLASS_CAST((k), XED_TYPE_SORT_PLUGIN, XedSortPluginClass)) | ||||
| #define XED_IS_SORT_PLUGIN(o)       (G_TYPE_CHECK_INSTANCE_TYPE ((o), XED_TYPE_SORT_PLUGIN)) | ||||
| #define XED_IS_SORT_PLUGIN_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), XED_TYPE_SORT_PLUGIN)) | ||||
| #define XED_SORT_PLUGIN_GET_CLASS(o)    (G_TYPE_INSTANCE_GET_CLASS ((o), XED_TYPE_SORT_PLUGIN, XedSortPluginClass)) | ||||
|  | ||||
| /* Private structure type */ | ||||
| typedef struct _XedSortPluginPrivate	XedSortPluginPrivate; | ||||
| typedef struct _XedSortPluginPrivate    XedSortPluginPrivate; | ||||
|  | ||||
| /* | ||||
|  * Main object structure | ||||
|  */ | ||||
| typedef struct _XedSortPlugin		XedSortPlugin; | ||||
| typedef struct _XedSortPlugin       XedSortPlugin; | ||||
|  | ||||
| struct _XedSortPlugin | ||||
| { | ||||
| 	XedPlugin parent_instance; | ||||
|     PeasExtensionBase parent_instance; | ||||
|  | ||||
|     /*< private >*/ | ||||
|     XedSortPluginPrivate *priv; | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Class definition | ||||
|  */ | ||||
| typedef struct _XedSortPluginClass	XedSortPluginClass; | ||||
| typedef struct _XedSortPluginClass  XedSortPluginClass; | ||||
|  | ||||
| struct _XedSortPluginClass | ||||
| { | ||||
| 	XedPluginClass parent_class; | ||||
|     PeasExtensionBaseClass parent_class; | ||||
| }; | ||||
|  | ||||
| /* | ||||
|  * Public methods | ||||
|  */ | ||||
| GType	xed_sort_plugin_get_type		(void) G_GNUC_CONST; | ||||
| GType   xed_sort_plugin_get_type        (void) G_GNUC_CONST; | ||||
|  | ||||
| /* All the plugins must implement this function */ | ||||
| G_MODULE_EXPORT GType register_xed_plugin (GTypeModule *module); | ||||
| G_MODULE_EXPORT void peas_register_types (PeasObjectModule *module); | ||||
|  | ||||
| G_END_DECLS | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user