[gnome-builder] editor: add IdeEditorViewAddin::load_source_view and unload_source_view



commit 641cf886b5f50dcbaabca83723ff40f1ccd419d0
Author: Christian Hergert <chergert redhat com>
Date:   Tue Aug 30 17:44:14 2016 -0700

    editor: add IdeEditorViewAddin::load_source_view and unload_source_view
    
    These vfuncs allow editor view addins to manipulate the IdeSourceView as
    necessary when they are created/removed from the view. Such can happen
    when a new split occurs or the creation of the primary frame when the view
    is created.

 libide/editor/ide-editor-view-addin-private.h |   19 +++++---
 libide/editor/ide-editor-view-addin.c         |   42 +++++++++++++------
 libide/editor/ide-editor-view-addin.h         |   16 +++++---
 libide/editor/ide-editor-view.c               |   54 +++++++++++++++++++++++++
 4 files changed, 105 insertions(+), 26 deletions(-)
---
diff --git a/libide/editor/ide-editor-view-addin-private.h b/libide/editor/ide-editor-view-addin-private.h
index 967e985..c603641 100644
--- a/libide/editor/ide-editor-view-addin-private.h
+++ b/libide/editor/ide-editor-view-addin-private.h
@@ -19,16 +19,21 @@
 #ifndef IDE_EDITOR_VIEW_ADDIN_PRIVATE_H
 #define IDE_EDITOR_VIEW_ADDIN_PRIVATE_H
 
-#include "ide-editor-view-addin.h"
+#include "editor/ide-editor-view-addin.h"
+#include "sourceview/ide-source-view.h"
 
 G_BEGIN_DECLS
 
-void ide_editor_view_addin_language_changed (IdeEditorViewAddin *self,
-                                            const gchar       *language_id);
-void ide_editor_view_addin_load             (IdeEditorViewAddin *self,
-                                            IdeEditorView      *view);
-void ide_editor_view_addin_unload           (IdeEditorViewAddin *self,
-                                            IdeEditorView      *view);
+void ide_editor_view_addin_language_changed   (IdeEditorViewAddin *self,
+                                               const gchar        *language_id);
+void ide_editor_view_addin_load               (IdeEditorViewAddin *self,
+                                               IdeEditorView      *view);
+void ide_editor_view_addin_unload             (IdeEditorViewAddin *self,
+                                               IdeEditorView      *view);
+void ide_editor_view_addin_load_source_view   (IdeEditorViewAddin *self,
+                                               IdeSourceView      *source_view);
+void ide_editor_view_addin_unload_source_view (IdeEditorViewAddin *self,
+                                               IdeSourceView      *source_view);
 G_END_DECLS
 
 #endif /* IDE_EDITOR_VIEW_ADDIN_PRIVATE_H */
diff --git a/libide/editor/ide-editor-view-addin.c b/libide/editor/ide-editor-view-addin.c
index 98eb544..024f60d 100644
--- a/libide/editor/ide-editor-view-addin.c
+++ b/libide/editor/ide-editor-view-addin.c
@@ -21,44 +21,60 @@
 G_DEFINE_INTERFACE (IdeEditorViewAddin, ide_editor_view_addin, G_TYPE_OBJECT)
 
 static void
-dummy_vfunc (IdeEditorViewAddin *self,
-             IdeEditorView      *view)
-{
-}
-
-static void
 ide_editor_view_addin_default_init (IdeEditorViewAddinInterface *iface)
 {
-  iface->load = dummy_vfunc;
-  iface->unload = dummy_vfunc;
 }
 
 void
 ide_editor_view_addin_load (IdeEditorViewAddin *self,
-                           IdeEditorView      *view)
+                            IdeEditorView      *view)
 {
   g_return_if_fail (IDE_IS_EDITOR_VIEW_ADDIN (self));
   g_return_if_fail (IDE_IS_EDITOR_VIEW (view));
 
-  IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->load (self, view);
+  if (IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->load)
+    IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->load (self, view);
 }
 
 void
 ide_editor_view_addin_unload (IdeEditorViewAddin *self,
-                             IdeEditorView      *view)
+                              IdeEditorView      *view)
 {
   g_return_if_fail (IDE_IS_EDITOR_VIEW_ADDIN (self));
   g_return_if_fail (IDE_IS_EDITOR_VIEW (view));
 
-  IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->unload (self, view);
+  if (IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->unload)
+    IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->unload (self, view);
 }
 
 void
 ide_editor_view_addin_language_changed (IdeEditorViewAddin *self,
-                                       const gchar       *language_id)
+                                        const gchar        *language_id)
 {
   g_return_if_fail (IDE_IS_EDITOR_VIEW_ADDIN (self));
 
   if (IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->language_changed)
     IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->language_changed (self, language_id);
 }
+
+void
+ide_editor_view_addin_load_source_view (IdeEditorViewAddin *self,
+                                        IdeSourceView      *source_view)
+{
+  g_return_if_fail (IDE_IS_EDITOR_VIEW_ADDIN (self));
+  g_return_if_fail (IDE_IS_SOURCE_VIEW (source_view));
+
+  if (IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->load_source_view)
+    IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->load_source_view (self, source_view);
+}
+
+void
+ide_editor_view_addin_unload_source_view (IdeEditorViewAddin *self,
+                                          IdeSourceView      *source_view)
+{
+  g_return_if_fail (IDE_IS_EDITOR_VIEW_ADDIN (self));
+  g_return_if_fail (IDE_IS_SOURCE_VIEW (source_view));
+
+  if (IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->unload_source_view)
+    IDE_EDITOR_VIEW_ADDIN_GET_IFACE (self)->unload_source_view (self, source_view);
+}
diff --git a/libide/editor/ide-editor-view-addin.h b/libide/editor/ide-editor-view-addin.h
index 8622762..5593dfa 100644
--- a/libide/editor/ide-editor-view-addin.h
+++ b/libide/editor/ide-editor-view-addin.h
@@ -31,12 +31,16 @@ struct _IdeEditorViewAddinInterface
 {
   GTypeInterface parent;
 
-  void (*load)             (IdeEditorViewAddin *self,
-                            IdeEditorView      *view);
-  void (*unload)           (IdeEditorViewAddin *self,
-                            IdeEditorView      *view);
-  void (*language_changed) (IdeEditorViewAddin *self,
-                            const gchar       *language_id);
+  void (*load)               (IdeEditorViewAddin *self,
+                              IdeEditorView      *view);
+  void (*unload)             (IdeEditorViewAddin *self,
+                              IdeEditorView      *view);
+  void (*language_changed)   (IdeEditorViewAddin *self,
+                              const gchar        *language_id);
+  void (*load_source_view)   (IdeEditorViewAddin *self,
+                              IdeSourceView      *source_view);
+  void (*unload_source_view) (IdeEditorViewAddin *self,
+                              IdeSourceView      *source_view);
 };
 
 G_END_DECLS
diff --git a/libide/editor/ide-editor-view.c b/libide/editor/ide-editor-view.c
index 1365333..3bf80b2 100644
--- a/libide/editor/ide-editor-view.c
+++ b/libide/editor/ide-editor-view.c
@@ -431,6 +431,38 @@ ide_editor_view__focus_in_event (IdeEditorView  *self,
 }
 
 static void
+addin_load_source_view (PeasExtensionSet *set,
+                        PeasPluginInfo   *plugin_info,
+                        PeasExtension    *exten,
+                        gpointer          user_data)
+{
+  IdeSourceView *source_view = user_data;
+
+  g_assert (PEAS_IS_EXTENSION_SET (set));
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_EDITOR_VIEW_ADDIN (exten));
+  g_assert (IDE_IS_SOURCE_VIEW (source_view));
+
+  ide_editor_view_addin_load_source_view (IDE_EDITOR_VIEW_ADDIN (exten), source_view);
+}
+
+static void
+addin_unload_source_view (PeasExtensionSet *set,
+                          PeasPluginInfo   *plugin_info,
+                          PeasExtension    *exten,
+                          gpointer          user_data)
+{
+  IdeSourceView *source_view = user_data;
+
+  g_assert (PEAS_IS_EXTENSION_SET (set));
+  g_assert (plugin_info != NULL);
+  g_assert (IDE_IS_EDITOR_VIEW_ADDIN (exten));
+  g_assert (IDE_IS_SOURCE_VIEW (source_view));
+
+  ide_editor_view_addin_unload_source_view (IDE_EDITOR_VIEW_ADDIN (exten), source_view);
+}
+
+static void
 ide_editor_view_set_split_view (IdeLayoutView *view,
                                 gboolean       split_view)
 {
@@ -467,12 +499,21 @@ ide_editor_view_set_split_view (IdeLayoutView *view,
                                          "shrink", FALSE,
                                          "resize", TRUE,
                                          NULL);
+
+      peas_extension_set_foreach (self->extensions,
+                                  addin_load_source_view,
+                                  self->frame2->source_view);
+
       gtk_widget_grab_focus (GTK_WIDGET (self->frame2));
     }
   else
     {
       GtkWidget *copy = GTK_WIDGET (self->frame2);
 
+      peas_extension_set_foreach (self->extensions,
+                                  addin_unload_source_view,
+                                  self->frame2->source_view);
+
       self->frame2 = NULL;
       gtk_container_remove (GTK_CONTAINER (self->paned), copy);
       gtk_widget_grab_focus (GTK_WIDGET (self->frame1));
@@ -540,8 +581,15 @@ ide_editor_view__extension_added (PeasExtensionSet *set,
   g_assert (IDE_IS_EDITOR_VIEW_ADDIN (addin));
   g_assert (IDE_IS_EDITOR_VIEW (self));
 
+  /* Initialize the addin */
   ide_editor_view_addin_load (addin, self);
 
+  /* Allow the addin to track the source views */
+  ide_editor_view_addin_load_source_view (addin, self->frame1->source_view);
+  if (self->frame2)
+    ide_editor_view_addin_load_source_view (addin, self->frame2->source_view);
+
+  /* Notify the addin of the current language */
   if (self->document != NULL)
     {
       GtkSourceLanguage *language;
@@ -572,6 +620,12 @@ ide_editor_view__extension_removed (PeasExtensionSet *set,
   g_assert (IDE_IS_EDITOR_VIEW_ADDIN (addin));
   g_assert (IDE_IS_EDITOR_VIEW (self));
 
+  if (self->frame2 && self->frame2->source_view)
+    ide_editor_view_addin_unload_source_view (addin, self->frame2->source_view);
+
+  if (self->frame1 && self->frame1->source_view)
+    ide_editor_view_addin_unload_source_view (addin, self->frame1->source_view);
+
   ide_editor_view_addin_unload (addin, self);
 }
 


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