From 8223eaf57016792a4fcbe90b8923eadb2cd87a45 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Thu, 26 Aug 2010 19:32:36 -0400 Subject: 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. --- widgets/misc/e-attachment-handler.c | 114 ++++++++++-------------------------- 1 file changed, 30 insertions(+), 84 deletions(-) (limited to 'widgets/misc/e-attachment-handler.c') 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 -- cgit v1.2.3