diff options
author | Matthew Barnes <mbarnes@redhat.com> | 2010-08-27 07:32:36 +0800 |
---|---|---|
committer | Matthew Barnes <mbarnes@redhat.com> | 2010-08-27 07:32:36 +0800 |
commit | 8223eaf57016792a4fcbe90b8923eadb2cd87a45 (patch) | |
tree | 5123bfa28050b5efec2b5c9e75681d37a24d08d0 | |
parent | 87a3fac95cfdcb3dde4e0b75718239de20d8812f (diff) | |
download | gsoc2013-evolution-8223eaf57016792a4fcbe90b8923eadb2cd87a45.tar gsoc2013-evolution-8223eaf57016792a4fcbe90b8923eadb2cd87a45.tar.gz gsoc2013-evolution-8223eaf57016792a4fcbe90b8923eadb2cd87a45.tar.bz2 gsoc2013-evolution-8223eaf57016792a4fcbe90b8923eadb2cd87a45.tar.lz gsoc2013-evolution-8223eaf57016792a4fcbe90b8923eadb2cd87a45.tar.xz gsoc2013-evolution-8223eaf57016792a4fcbe90b8923eadb2cd87a45.tar.zst gsoc2013-evolution-8223eaf57016792a4fcbe90b8923eadb2cd87a45.zip |
Convert EAttachmentHandler to an EExtension.
EAttachmentHandler predates EExtension, so this is really just a code
cleanup to use the extension framework. But this also demonstrates that
extensions can target interfaces as well as instantiable types, since
EAttachmentView is an interface.
What's also nice is EAttachmentView no longer has to directly interact
with attachment handlers. Instead of EAttachmentView having to query
each attachment handler for drag-and-drop info, each handler now pushes
its own drag-and-drop info to its EAttachmentView during initialization.
-rw-r--r-- | widgets/misc/e-attachment-handler.c | 114 | ||||
-rw-r--r-- | widgets/misc/e-attachment-handler.h | 5 | ||||
-rw-r--r-- | widgets/misc/e-attachment-icon-view.c | 7 | ||||
-rw-r--r-- | widgets/misc/e-attachment-tree-view.c | 5 | ||||
-rw-r--r-- | widgets/misc/e-attachment-view.c | 47 | ||||
-rw-r--r-- | widgets/misc/e-attachment-view.h | 6 |
6 files changed, 61 insertions, 123 deletions
diff --git a/widgets/misc/e-attachment-handler.c b/widgets/misc/e-attachment-handler.c index 947ae666d9..0b9c057b65 100644 --- a/widgets/misc/e-attachment-handler.c +++ b/widgets/misc/e-attachment-handler.c @@ -26,113 +26,53 @@ ((obj), E_TYPE_ATTACHMENT_HANDLER, EAttachmentHandlerPrivate)) struct _EAttachmentHandlerPrivate { - gpointer view; /* weak pointer */ -}; - -enum { - PROP_0, - PROP_VIEW + gpointer placeholder; }; G_DEFINE_TYPE ( EAttachmentHandler, e_attachment_handler, - G_TYPE_OBJECT) - -static void -attachment_handler_set_view (EAttachmentHandler *handler, - EAttachmentView *view) -{ - g_return_if_fail (handler->priv->view == NULL); - - handler->priv->view = view; - - g_object_add_weak_pointer ( - G_OBJECT (view), &handler->priv->view); -} - -static void -attachment_handler_set_property (GObject *object, - guint property_id, - const GValue *value, - GParamSpec *pspec) -{ - switch (property_id) { - case PROP_VIEW: - attachment_handler_set_view ( - E_ATTACHMENT_HANDLER (object), - g_value_get_object (value)); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} - -static void -attachment_handler_get_property (GObject *object, - guint property_id, - GValue *value, - GParamSpec *pspec) -{ - switch (property_id) { - case PROP_VIEW: - g_value_set_object ( - value, e_attachment_handler_get_view ( - E_ATTACHMENT_HANDLER (object))); - return; - } - - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -} + E_TYPE_EXTENSION) static void attachment_handler_constructed (GObject *object) { - /* This allows subclasses to chain up safely since GObject - * does not implement this method, and we might want to do - * something here in the future. */ -} + EAttachmentView *view; + EAttachmentHandler *handler; + GdkDragAction drag_actions; + GtkTargetList *target_list; + const GtkTargetEntry *targets; + guint n_targets; -static void -attachment_handler_dispose (GObject *object) -{ - EAttachmentHandlerPrivate *priv; + handler = E_ATTACHMENT_HANDLER (object); + drag_actions = e_attachment_handler_get_drag_actions (handler); + targets = e_attachment_handler_get_target_table (handler, &n_targets); + + view = e_attachment_handler_get_view (handler); - priv = E_ATTACHMENT_HANDLER_GET_PRIVATE (object); + target_list = e_attachment_view_get_target_list (view); + gtk_target_list_add_table (target_list, targets, n_targets); - if (priv->view != NULL) { - g_object_remove_weak_pointer ( - G_OBJECT (priv->view), &priv->view); - priv->view = NULL; - } + e_attachment_view_add_drag_actions (view, drag_actions); - /* Chain up to parent's dispose() method. */ - G_OBJECT_CLASS (e_attachment_handler_parent_class)->dispose (object); + /* Chain up to parent's constructed() method. */ + G_OBJECT_CLASS (e_attachment_handler_parent_class)-> + constructed (object); } static void e_attachment_handler_class_init (EAttachmentHandlerClass *class) { GObjectClass *object_class; + EExtensionClass *extension_class; g_type_class_add_private (class, sizeof (EAttachmentHandlerPrivate)); object_class = G_OBJECT_CLASS (class); - object_class->set_property = attachment_handler_set_property; - object_class->get_property = attachment_handler_get_property; object_class->constructed = attachment_handler_constructed; - object_class->dispose = attachment_handler_dispose; - - g_object_class_install_property ( - object_class, - PROP_VIEW, - g_param_spec_object ( - "view", - "View", - NULL, - E_TYPE_ATTACHMENT_VIEW, - G_PARAM_READWRITE | - G_PARAM_CONSTRUCT_ONLY)); + + extension_class = E_EXTENSION_CLASS (class); + extension_class->extensible_type = E_TYPE_ATTACHMENT_VIEW; } static void @@ -144,9 +84,15 @@ e_attachment_handler_init (EAttachmentHandler *handler) EAttachmentView * e_attachment_handler_get_view (EAttachmentHandler *handler) { + EExtensible *extensible; + + /* This is purely a convenience function. */ + g_return_val_if_fail (E_IS_ATTACHMENT_HANDLER (handler), NULL); - return E_ATTACHMENT_VIEW (handler->priv->view); + extensible = e_extension_get_extensible (E_EXTENSION (handler)); + + return E_ATTACHMENT_VIEW (extensible); } GdkDragAction diff --git a/widgets/misc/e-attachment-handler.h b/widgets/misc/e-attachment-handler.h index e7e52c8c18..e85cd9b2ee 100644 --- a/widgets/misc/e-attachment-handler.h +++ b/widgets/misc/e-attachment-handler.h @@ -22,6 +22,7 @@ #ifndef E_ATTACHMENT_HANDLER_H #define E_ATTACHMENT_HANDLER_H +#include <e-util/e-extension.h> #include <misc/e-attachment-view.h> /* Standard GObject macros */ @@ -50,12 +51,12 @@ typedef struct _EAttachmentHandlerClass EAttachmentHandlerClass; typedef struct _EAttachmentHandlerPrivate EAttachmentHandlerPrivate; struct _EAttachmentHandler { - GObject parent; + EExtension parent; EAttachmentHandlerPrivate *priv; }; struct _EAttachmentHandlerClass { - GObjectClass parent_class; + EExtensionClass parent_class; GdkDragAction (*get_drag_actions) (EAttachmentHandler *handler); const GtkTargetEntry * diff --git a/widgets/misc/e-attachment-icon-view.c b/widgets/misc/e-attachment-icon-view.c index 5c874f8bca..9ec8fce83d 100644 --- a/widgets/misc/e-attachment-icon-view.c +++ b/widgets/misc/e-attachment-icon-view.c @@ -22,6 +22,7 @@ #include "e-attachment-icon-view.h" #include <glib/gi18n.h> +#include <e-util/e-extensible.h> #include "e-attachment.h" #include "e-attachment-store.h" @@ -53,7 +54,9 @@ G_DEFINE_TYPE_WITH_CODE ( GTK_TYPE_ICON_VIEW, G_IMPLEMENT_INTERFACE ( E_TYPE_ATTACHMENT_VIEW, - e_attachment_icon_view_interface_init)) + e_attachment_icon_view_interface_init) + G_IMPLEMENT_INTERFACE ( + E_TYPE_EXTENSIBLE, NULL)) void e_attachment_icon_view_set_default_icon_size (gint size) @@ -522,6 +525,8 @@ e_attachment_icon_view_init (EAttachmentIconView *icon_view) gtk_cell_layout_add_attribute ( cell_layout, renderer, "visible", E_ATTACHMENT_STORE_COLUMN_SAVING); + + e_extensible_load_extensions (E_EXTENSIBLE (icon_view)); } static void diff --git a/widgets/misc/e-attachment-tree-view.c b/widgets/misc/e-attachment-tree-view.c index c404920d33..a2210db5a6 100644 --- a/widgets/misc/e-attachment-tree-view.c +++ b/widgets/misc/e-attachment-tree-view.c @@ -22,6 +22,7 @@ #include "e-attachment-tree-view.h" #include <glib/gi18n.h> +#include <e-util/e-extensible.h> #include "e-attachment.h" #include "e-attachment-store.h" @@ -51,7 +52,9 @@ G_DEFINE_TYPE_WITH_CODE ( GTK_TYPE_TREE_VIEW, G_IMPLEMENT_INTERFACE ( E_TYPE_ATTACHMENT_VIEW, - e_attachment_tree_view_interface_init)) + e_attachment_tree_view_interface_init) + G_IMPLEMENT_INTERFACE ( + E_TYPE_EXTENSIBLE, NULL)) static void attachment_tree_view_set_property (GObject *object, diff --git a/widgets/misc/e-attachment-view.c b/widgets/misc/e-attachment-view.c index 06ec2e5d2c..a80fe32ec0 100644 --- a/widgets/misc/e-attachment-view.c +++ b/widgets/misc/e-attachment-view.c @@ -778,27 +778,7 @@ attachment_view_update_actions (EAttachmentView *view) } static void -attachment_view_add_handler (GType type, - EAttachmentView *view) -{ - EAttachmentViewPrivate *priv; - EAttachmentHandler *handler; - const GtkTargetEntry *targets; - guint n_targets; - - priv = e_attachment_view_get_private (view); - - handler = g_object_new (type, "view", view, NULL); - - targets = e_attachment_handler_get_target_table (handler, &n_targets); - gtk_target_list_add_table (priv->target_list, targets, n_targets); - priv->drag_actions |= e_attachment_handler_get_drag_actions (handler); - - g_ptr_array_add (priv->handlers, handler); -} - -static void -attachment_view_init_handlers (EAttachmentView *view) +attachment_view_init_drag_dest (EAttachmentView *view) { EAttachmentViewPrivate *priv; GtkTargetList *target_list; @@ -812,13 +792,8 @@ attachment_view_init_handlers (EAttachmentView *view) e_target_list_add_calendar_targets (target_list, 0); e_target_list_add_directory_targets (target_list, 0); - priv->handlers = g_ptr_array_new (); priv->target_list = target_list; priv->drag_actions = GDK_ACTION_COPY; - - e_type_traverse ( - E_TYPE_ATTACHMENT_HANDLER, (ETypeFunc) - attachment_view_add_handler, view); } static void @@ -904,7 +879,7 @@ e_attachment_view_init (EAttachmentView *view) if (error != NULL) g_error ("%s", error->message); - attachment_view_init_handlers (view); + attachment_view_init_drag_dest (view); e_attachment_view_drag_source_set (view); @@ -934,9 +909,6 @@ e_attachment_view_dispose (EAttachmentView *view) priv = e_attachment_view_get_private (view); - g_ptr_array_foreach (priv->handlers, (GFunc) g_object_unref, NULL); - g_ptr_array_set_size (priv->handlers, 0); - if (priv->target_list != NULL) { gtk_target_list_unref (priv->target_list); priv->target_list = NULL; @@ -955,8 +927,6 @@ e_attachment_view_finalize (EAttachmentView *view) priv = e_attachment_view_get_private (view); - g_ptr_array_free (priv->handlers, TRUE); - g_list_foreach (priv->event_list, (GFunc) gdk_event_free, NULL); g_list_free (priv->event_list); @@ -1073,6 +1043,19 @@ e_attachment_view_get_drag_actions (EAttachmentView *view) return priv->drag_actions; } +void +e_attachment_view_add_drag_actions (EAttachmentView *view, + GdkDragAction drag_actions) +{ + EAttachmentViewPrivate *priv; + + g_return_if_fail (E_IS_ATTACHMENT_VIEW (view)); + + priv = e_attachment_view_get_private (view); + + priv->drag_actions |= drag_actions; +} + GList * e_attachment_view_get_selected_attachments (EAttachmentView *view) { diff --git a/widgets/misc/e-attachment-view.h b/widgets/misc/e-attachment-view.h index b95c84bb5b..164413221c 100644 --- a/widgets/misc/e-attachment-view.h +++ b/widgets/misc/e-attachment-view.h @@ -92,9 +92,6 @@ struct _EAttachmentViewInterface { struct _EAttachmentViewPrivate { - /* Attachment Handlers */ - GPtrArray *handlers; - /* Drag Destination */ GtkTargetList *target_list; GdkDragAction drag_actions; @@ -133,6 +130,9 @@ GtkTargetList * e_attachment_view_get_target_list (EAttachmentView *view); GdkDragAction e_attachment_view_get_drag_actions (EAttachmentView *view); +void e_attachment_view_add_drag_actions + (EAttachmentView *view, + GdkDragAction drag_actions); GList * e_attachment_view_get_selected_attachments (EAttachmentView *view); void e_attachment_view_open_path (EAttachmentView *view, |