[gnome-builder/wip/chergert/perspective] libide: use IdeWorkbenchAddin instead of IdeLoader



commit fcead9faadb955d48ed059ca3fb9bd2edbe395f2
Author: Christian Hergert <christian hergert me>
Date:   Sat Nov 14 14:48:39 2015 -0800

    libide: use IdeWorkbenchAddin instead of IdeLoader
    
    This reduces the number of interfaces we have, which could get out of
    hand pretty easily.

 libide/Makefile.am           |    2 -
 libide/ide-loader.c          |   89 ------------------------------------------
 libide/ide-loader.h          |   57 ---------------------------
 libide/ide-workbench-addin.c |   80 +++++++++++++++++++++++++++++++++++++
 libide/ide-workbench-addin.h |   44 +++++++++++++++++----
 libide/ide-workbench.h       |    5 --
 6 files changed, 116 insertions(+), 161 deletions(-)
---
diff --git a/libide/Makefile.am b/libide/Makefile.am
index 020bbbd..e1e830a 100644
--- a/libide/Makefile.am
+++ b/libide/Makefile.am
@@ -105,8 +105,6 @@ libide_1_0_la_public_sources = \
        ide-layout-stack-private.h \
        ide-layout-view.c \
        ide-layout-view.h \
-       ide-loader.c \
-       ide-loader.h \
        ide-log.c \
        ide-log.h \
        ide-macros.h \
diff --git a/libide/ide-workbench-addin.c b/libide/ide-workbench-addin.c
index 1cf1d61..8dfd408 100644
--- a/libide/ide-workbench-addin.c
+++ b/libide/ide-workbench-addin.c
@@ -34,11 +34,22 @@ ide_workbench_addin_real_unload (IdeWorkbenchAddin *self,
 {
 }
 
+static gboolean
+ide_workbench_addin_real_can_open (IdeWorkbenchAddin *self,
+                                   IdeUri            *uri,
+                                   const gchar       *content_type,
+                                   gint              *priority)
+{
+  *priority = 0;
+  return FALSE;
+}
+
 static void
 ide_workbench_addin_default_init (IdeWorkbenchAddinInterface *iface)
 {
   iface->load = ide_workbench_addin_real_load;
   iface->unload = ide_workbench_addin_real_unload;
+  iface->can_open = ide_workbench_addin_real_can_open;
 }
 
 /**
@@ -81,3 +92,72 @@ ide_workbench_addin_unload (IdeWorkbenchAddin *self,
 
   IDE_WORKBENCH_ADDIN_GET_IFACE (self)->unload (self, workbench);
 }
+
+/**
+ * ide_workbench_addin_can_open:
+ * @self: An #IdeWorkbenchAddin.
+ * @uri: An #IdeUri.
+ * @content_type: (nullable): A content-type or %NULL.
+ * @priority: (out): the priority at which this loader should be used.
+ *
+ * This interface method indicates if the workbench addin can load the content
+ * found at @uri. If so, @priority should be set to an integer priority
+ * indicating how important it is for this addin to load @uri.
+ *
+ * The lowest integer value wins. However, a load fails, the next addin which
+ * returned %TRUE from this method will be consulted.
+ *
+ * Returns: %TRUE if @self and open @uri.
+ */
+gboolean
+ide_workbench_addin_can_open (IdeWorkbenchAddin *self,
+                              IdeUri            *uri,
+                              const gchar       *content_type,
+                              gint              *priority)
+{
+  g_return_val_if_fail (IDE_IS_WORKBENCH_ADDIN (self), FALSE);
+  g_return_val_if_fail (uri != NULL, FALSE);
+  g_return_val_if_fail (priority != NULL, FALSE);
+
+  return IDE_WORKBENCH_ADDIN_GET_IFACE (self)->can_open (self, uri, content_type, priority);
+}
+
+void
+ide_workbench_addin_open_async (IdeWorkbenchAddin   *self,
+                                IdeUri              *uri,
+                                const gchar         *content_type,
+                                GCancellable        *cancellable,
+                                GAsyncReadyCallback  callback,
+                                gpointer             user_data)
+{
+  g_return_if_fail (IDE_IS_WORKBENCH_ADDIN (self));
+  g_return_if_fail (uri != NULL);
+  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+  if ((IDE_WORKBENCH_ADDIN_GET_IFACE (self)->open_async == NULL) ||
+      (IDE_WORKBENCH_ADDIN_GET_IFACE (self)->open_finish == NULL))
+    g_return_if_reached ();
+
+  IDE_WORKBENCH_ADDIN_GET_IFACE (self)->open_async (self, uri, content_type, cancellable, callback, 
user_data);
+}
+
+gboolean
+ide_workbench_addin_open_finish (IdeWorkbenchAddin  *self,
+                                 GAsyncResult       *result,
+                                 GError            **error)
+{
+  g_return_val_if_fail (IDE_IS_WORKBENCH_ADDIN (self), FALSE);
+  g_return_val_if_fail (G_IS_ASYNC_RESULT (result), FALSE);
+
+  if (IDE_WORKBENCH_ADDIN_GET_IFACE (self)->open_finish == NULL)
+    {
+      g_set_error (error,
+                   G_IO_ERROR,
+                   G_IO_ERROR_INVAL,
+                   "%s does not contain open_finish",
+                   G_OBJECT_TYPE_NAME (self));
+      return FALSE;
+    }
+
+  return IDE_WORKBENCH_ADDIN_GET_IFACE (self)->open_finish (self, result, error);
+}
diff --git a/libide/ide-workbench-addin.h b/libide/ide-workbench-addin.h
index 9897d2b..95471c2 100644
--- a/libide/ide-workbench-addin.h
+++ b/libide/ide-workbench-addin.h
@@ -19,6 +19,7 @@
 #ifndef IDE_WORKBENCH_ADDIN_H
 #define IDE_WORKBENCH_ADDIN_H
 
+#include "ide-uri.h"
 #include "ide-workbench.h"
 
 G_BEGIN_DECLS
@@ -31,16 +32,43 @@ struct _IdeWorkbenchAddinInterface
 {
   GTypeInterface parent;
 
-  void (*load)   (IdeWorkbenchAddin *self,
-                  IdeWorkbench      *workbench);
-  void (*unload) (IdeWorkbenchAddin *self,
-                  IdeWorkbench      *workbench);
+  void     (*load)        (IdeWorkbenchAddin    *self,
+                           IdeWorkbench         *workbench);
+  void     (*unload)      (IdeWorkbenchAddin    *self,
+                           IdeWorkbench         *workbench);
+  gboolean (*can_open)    (IdeWorkbenchAddin    *self,
+                           IdeUri               *uri,
+                           const gchar          *content_type,
+                           gint                 *priority);
+  void     (*open_async)  (IdeWorkbenchAddin    *self,
+                           IdeUri               *uri,
+                           const gchar          *content_type,
+                           GCancellable         *cancellable,
+                           GAsyncReadyCallback   callback,
+                           gpointer              user_data);
+  gboolean (*open_finish) (IdeWorkbenchAddin    *self,
+                           GAsyncResult         *result,
+                           GError              **error);
+
 };
 
-void ide_workbench_addin_load   (IdeWorkbenchAddin *self,
-                                 IdeWorkbench      *workbench);
-void ide_workbench_addin_unload (IdeWorkbenchAddin *self,
-                                 IdeWorkbench      *workbench);
+void     ide_workbench_addin_load        (IdeWorkbenchAddin    *self,
+                                          IdeWorkbench         *workbench);
+void     ide_workbench_addin_unload      (IdeWorkbenchAddin    *self,
+                                          IdeWorkbench         *workbench);
+gboolean ide_workbench_addin_can_open    (IdeWorkbenchAddin    *self,
+                                          IdeUri               *uri,
+                                          const gchar          *content_type,
+                                          gint                 *priority);
+void     ide_workbench_addin_open_async  (IdeWorkbenchAddin    *self,
+                                          IdeUri               *uri,
+                                          const gchar          *content_type,
+                                          GCancellable         *cancellable,
+                                          GAsyncReadyCallback   callback,
+                                          gpointer              user_data);
+gboolean ide_workbench_addin_open_finish (IdeWorkbenchAddin    *self,
+                                          GAsyncResult         *result,
+                                          GError              **error);
 
 G_END_DECLS
 
diff --git a/libide/ide-workbench.h b/libide/ide-workbench.h
index 164d5c8..007afe6 100644
--- a/libide/ide-workbench.h
+++ b/libide/ide-workbench.h
@@ -22,7 +22,6 @@
 #include <gtk/gtk.h>
 
 #include "ide-context.h"
-#include "ide-loader.h"
 #include "ide-perspective.h"
 
 G_BEGIN_DECLS
@@ -51,10 +50,6 @@ void            ide_workbench_focus                        (IdeWorkbench
                                                             GtkWidget            *widget);
 void            ide_workbench_close                        (IdeWorkbench         *self);
 IdeContext     *ide_workbench_get_context                  (IdeWorkbench         *self);
-void            ide_workbench_add_loader                   (IdeWorkbench         *self,
-                                                            IdeLoader            *loader);
-void            ide_workbench_remove_loader                (IdeWorkbench         *self,
-                                                            IdeLoader            *loader);
 void            ide_workbench_add_perspective              (IdeWorkbench         *self,
                                                             IdePerspective       *perspective);
 void            ide_workbench_remove_perspective           (IdeWorkbench         *self,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]