[gnome-builder/wip/slaf/spellcheck-sidebar: 10/33] spellchecker: integrate PnlOverLay to IdeEditorPerspective



commit daf9e300f619f2da0f5d6e73ce7ee928e04e2b1f
Author: Sébastien Lafargue <slafargue gnome org>
Date:   Sun Jan 1 17:59:46 2017 +0100

    spellchecker: integrate PnlOverLay to IdeEditorPerspective

 contrib/pnl/Makefile.am                            |    2 +-
 contrib/pnl/pnl-dock-bin-edge-private.h            |    1 -
 contrib/pnl/pnl-dock-bin-edge.h                    |    2 +
 contrib/pnl/pnl-dock-overlay-edge-private.h        |   39 ---
 contrib/pnl/pnl-dock-overlay-edge.c                |    2 +-
 contrib/pnl/pnl-dock-overlay.c                     |   70 +++++-
 contrib/pnl/pnl-dock-overlay.h                     |   11 +-
 libide/editor/ide-editor-frame-actions.c           |   34 +--
 libide/editor/ide-editor-frame-private.h           |    5 -
 libide/editor/ide-editor-frame.c                   |   19 --
 libide/editor/ide-editor-perspective.c             |  266 +++++++++++++++++++-
 libide/editor/ide-editor-perspective.h             |   25 ++-
 libide/editor/ide-editor-perspective.ui            |   95 ++++----
 plugins/build-tools/gbp-build-workbench-addin.c    |    4 +-
 .../color-picker/gb-color-picker-workbench-addin.c |   10 +-
 plugins/devhelp/gbp-devhelp-panel.c                |    2 +-
 plugins/devhelp/gbp-devhelp-workbench-addin.c      |    8 +-
 plugins/project-tree/gb-project-tree-addin.c       |    4 +-
 plugins/symbol-tree/symbol-tree-panel.c            |    2 +-
 plugins/symbol-tree/symbol-tree.c                  |   12 +-
 plugins/sysmon/gb-sysmon-addin.c                   |    4 +-
 plugins/terminal/gb-terminal-workbench-addin.c     |    8 +-
 22 files changed, 438 insertions(+), 187 deletions(-)
---
diff --git a/contrib/pnl/Makefile.am b/contrib/pnl/Makefile.am
index a6b64e5..98e0ef4 100644
--- a/contrib/pnl/Makefile.am
+++ b/contrib/pnl/Makefile.am
@@ -14,6 +14,7 @@ headers_DATA = \
        pnl-dock-item.h \
        pnl-dock-manager.h \
        pnl-dock-overlay.h \
+       pnl-dock-overlay-edge.h \
        pnl-dock-paned.h \
        pnl-dock-revealer.h \
        pnl-dock-stack.h \
@@ -37,7 +38,6 @@ libpanel_gtk_la_SOURCES = \
        pnl-dock-bin.c \
        pnl-dock-item.c \
        pnl-dock-manager.c \
-       pnl-dock-overlay-edge-private.h \
        pnl-dock-overlay-edge.c \
        pnl-dock-overlay.c \
        pnl-dock-paned-private.h \
diff --git a/contrib/pnl/pnl-dock-bin-edge-private.h b/contrib/pnl/pnl-dock-bin-edge-private.h
index cf79307..e45e4e2 100644
--- a/contrib/pnl/pnl-dock-bin-edge-private.h
+++ b/contrib/pnl/pnl-dock-bin-edge-private.h
@@ -23,7 +23,6 @@
 
 G_BEGIN_DECLS
 
-GtkPositionType pnl_dock_bin_edge_get_edge (PnlDockBinEdge  *self);
 void            pnl_dock_bin_edge_set_edge (PnlDockBinEdge  *self,
                                             GtkPositionType  bin_edge);
 
diff --git a/contrib/pnl/pnl-dock-bin-edge.h b/contrib/pnl/pnl-dock-bin-edge.h
index 65dee0b..c5496fa 100644
--- a/contrib/pnl/pnl-dock-bin-edge.h
+++ b/contrib/pnl/pnl-dock-bin-edge.h
@@ -43,6 +43,8 @@ struct _PnlDockBinEdgeClass
   void (*padding8) (void);
 };
 
+GtkPositionType pnl_dock_bin_edge_get_edge (PnlDockBinEdge  *self);
+
 G_END_DECLS
 
 #endif /* PNL_DOCK_BIN_EDGE_H */
diff --git a/contrib/pnl/pnl-dock-overlay-edge.c b/contrib/pnl/pnl-dock-overlay-edge.c
index e85f69e..6a07fc1 100644
--- a/contrib/pnl/pnl-dock-overlay-edge.c
+++ b/contrib/pnl/pnl-dock-overlay-edge.c
@@ -17,7 +17,7 @@
  */
 
 #include "pnl-dock-item.h"
-#include "pnl-dock-overlay-edge-private.h"
+#include "pnl-dock-overlay-edge.h"
 #include "pnl-dock-paned.h"
 #include "pnl-dock-paned-private.h"
 #include "pnl-dock-stack.h"
diff --git a/contrib/pnl/pnl-dock-overlay.c b/contrib/pnl/pnl-dock-overlay.c
index 167d1e7..6ff8272 100644
--- a/contrib/pnl/pnl-dock-overlay.c
+++ b/contrib/pnl/pnl-dock-overlay.c
@@ -17,7 +17,7 @@
  */
 
 #include "pnl-animation.h"
-#include "pnl-dock-overlay-edge-private.h"
+#include "pnl-dock-overlay-edge.h"
 #include "pnl-dock-item.h"
 #include "pnl-dock-overlay.h"
 #include "pnl-tab.h"
@@ -204,11 +204,12 @@ pnl_dock_overlay_add (GtkContainer *container,
                       GtkWidget    *widget)
 {
   PnlDockOverlay *self = (PnlDockOverlay *)container;
+  PnlDockOverlayPrivate *priv = pnl_dock_overlay_get_instance_private (self);
 
   g_assert (PNL_IS_DOCK_OVERLAY (self));
   g_assert (GTK_IS_WIDGET (widget));
 
-  GTK_CONTAINER_CLASS (pnl_dock_overlay_parent_class)->add (container, widget);
+  gtk_container_add (GTK_CONTAINER (priv->overlay), widget);
 
   pnl_dock_overlay_update_focus_chain (self);
 
@@ -609,17 +610,17 @@ pnl_dock_overlay_new (void)
 }
 
 static void
-pnl_dock_overlay_add_child (GtkBuildable *buildable,
-                            GtkBuilder   *builder,
-                            GObject      *child,
-                            const gchar  *type)
+pnl_dock_overlay_real_add_child (GtkBuildable *buildable,
+                                 GtkBuilder   *builder,
+                                 GObject      *child,
+                                 const gchar  *type)
 {
   PnlDockOverlay *self = (PnlDockOverlay *)buildable;
   PnlDockOverlayPrivate *priv = pnl_dock_overlay_get_instance_private (self);
   PnlDockOverlayEdge *parent = NULL;
 
   g_assert (PNL_IS_DOCK_OVERLAY (self));
-  g_assert (GTK_IS_BUILDER (builder));
+  g_assert (builder == NULL || GTK_IS_BUILDER (builder));
   g_assert (G_IS_OBJECT (child));
 
   if (!GTK_IS_WIDGET (child))
@@ -654,7 +655,24 @@ adopt:
 static void
 pnl_dock_overlay_init_buildable_iface (GtkBuildableIface *iface)
 {
-  iface->add_child = pnl_dock_overlay_add_child;
+  iface->add_child = pnl_dock_overlay_real_add_child;
+}
+
+/**
+ * pnl_dock_overlay_add_child:
+ * self: a #PnlDockOverlay.
+ * child: a #GtkWidget.
+ * type: the type of the child to add (center, left, right, top, bottom).
+ *
+ */
+void
+pnl_overlay_add_child (PnlDockOverlay *self,
+                       GtkWidget      *child,
+                       const gchar    *type)
+{
+  g_assert (PNL_IS_DOCK_OVERLAY (self));
+
+  pnl_dock_overlay_real_add_child (GTK_BUILDABLE (self), NULL, G_OBJECT (child), type);
 }
 
 static void
@@ -702,3 +720,39 @@ pnl_dock_overlay_init_dock_item_iface (PnlDockItemInterface *iface)
   iface->present_child = pnl_dock_overlay_present_child;
   iface->update_visibility = pnl_dock_overlay_update_visibility;
 }
+
+/**
+ * pnl_dock_overlay_get_edge:
+ * self: An #PnlDockOverlay.
+ * position: the edge position.
+ *
+ * Returns: (transfer none): The corresponding #PnlDockOverlayEdge.
+ */
+PnlDockOverlayEdge *
+pnl_dock_overlay_get_edge (PnlDockOverlay  *self,
+                           GtkPositionType  position)
+{
+  PnlDockOverlayPrivate *priv = pnl_dock_overlay_get_instance_private (self);
+
+  g_return_val_if_fail (PNL_IS_DOCK_OVERLAY (self), NULL);
+
+  return priv->edges [position];
+}
+
+/**
+ * pnl_dock_overlay_get_edge_adjustment:
+ * self: An #PnlDockOverlay.
+ * position: the edge position.
+ *
+ * Returns: (transfer none): The corresponding #GtkAdjustment.
+ */
+GtkAdjustment *
+pnl_dock_overlay_get_edge_adjustment (PnlDockOverlay  *self,
+                                      GtkPositionType  position)
+{
+  PnlDockOverlayPrivate *priv = pnl_dock_overlay_get_instance_private (self);
+
+  g_return_val_if_fail (PNL_IS_DOCK_OVERLAY (self), NULL);
+
+  return priv->edge_adj [position];
+}
diff --git a/contrib/pnl/pnl-dock-overlay.h b/contrib/pnl/pnl-dock-overlay.h
index 5038456..e5c69b0 100644
--- a/contrib/pnl/pnl-dock-overlay.h
+++ b/contrib/pnl/pnl-dock-overlay.h
@@ -24,6 +24,7 @@
 #define PNL_DOCK_OVERLAY_H
 
 #include "pnl-dock.h"
+#include "pnl-dock-overlay-edge.h"
 
 G_BEGIN_DECLS
 
@@ -43,8 +44,14 @@ struct _PnlDockOverlayClass
   void (*padding8) (void);
 };
 
-GtkWidget *pnl_dock_overlay_new (void);
-
+GtkWidget              *pnl_dock_overlay_new                   (void);
+void                    pnl_overlay_add_child                  (PnlDockOverlay  *self,
+                                                                GtkWidget       *child,
+                                                                const gchar     *type);
+PnlDockOverlayEdge     *pnl_dock_overlay_get_edge              (PnlDockOverlay  *self,
+                                                                GtkPositionType  position);
+GtkAdjustment          *pnl_dock_overlay_get_edge_adjustment   (PnlDockOverlay  *self,
+                                                                GtkPositionType  position);
 G_END_DECLS
 
 #endif /* PNL_DOCK_OVERLAY_H */
diff --git a/libide/editor/ide-editor-frame-actions.c b/libide/editor/ide-editor-frame-actions.c
index 5c0cf42..fd2a166 100644
--- a/libide/editor/ide-editor-frame-actions.c
+++ b/libide/editor/ide-editor-frame-actions.c
@@ -20,6 +20,7 @@
 
 #include "ide-editor-frame-actions.h"
 #include "ide-editor-frame-private.h"
+#include "editor/ide-editor-perspective.h"
 #include "ide-editor-spell-widget.h"
 #include "util/ide-gtk.h"
 
@@ -29,36 +30,15 @@ ide_editor_frame_actions_spellcheck (GSimpleAction *action,
                                      gpointer       user_data)
 {
   IdeEditorFrame *self = user_data;
-  GtkWidget *spell_widget;
-  GtkWidget *entry;
+  IdeWorkbench *workbench;
+  IdePerspective *editor;
 
   g_assert (IDE_IS_EDITOR_FRAME (self));
 
   if (IDE_IS_SOURCE_VIEW (self->source_view) &&
-      !self->spellchecker_opened)
-    {
-      g_assert (gtk_bin_get_child (GTK_BIN (self->spell_revealer)) == NULL);
-
-      self->spellchecker_opened = TRUE;
-
-      spell_widget = ide_editor_spell_widget_new (self->source_view);
-      gtk_widget_show (spell_widget);
-      gtk_container_add (GTK_CONTAINER (self->spell_revealer), spell_widget);
-
-      gtk_revealer_set_reveal_child (self->spell_revealer, TRUE);
-      entry = ide_editor_spell_widget_get_entry (IDE_EDITOR_SPELL_WIDGET (spell_widget));
-
-      /* We need the widget to be realized before the grab to avoid:
-       * gtk_widget_event: assertion 'WIDGET_REALIZED_FOR_EVENT (widget, event)' failed
-       */
-      gtk_widget_realize (entry);
-      gtk_widget_grab_focus (entry);
-      g_signal_connect_object (spell_widget,
-                               "unmap",
-                               G_CALLBACK (ide_editor_frame_spell_widget_unmapped_cb),
-                               self,
-                               G_CONNECT_SWAPPED | G_CONNECT_AFTER);
-    }
+      NULL != (workbench = ide_widget_get_workbench (GTK_WIDGET (self))) &&
+      NULL != (editor = ide_workbench_get_perspective_by_name (workbench, "editor")))
+    ide_editor_perspective_show_spellchecker (IDE_EDITOR_PERSPECTIVE (editor), self->source_view);
 }
 
 static void
@@ -520,6 +500,6 @@ ide_editor_frame_actions_init (IdeEditorFrame *self)
   g_action_map_add_action_entries (G_ACTION_MAP (group), IdeEditorFrameSpellActions,
                                    G_N_ELEMENTS (IdeEditorFrameSpellActions), self);
 
-  gtk_widget_insert_action_group (GTK_WIDGET (self->spell_revealer), "spell-entry", G_ACTION_GROUP (group));
+  //gtk_widget_insert_action_group (GTK_WIDGET (self->spell_revealer), "spell-entry", G_ACTION_GROUP 
(group));
   g_object_unref (group);
 }
diff --git a/libide/editor/ide-editor-frame-private.h b/libide/editor/ide-editor-frame-private.h
index 2b07937..4f47962 100644
--- a/libide/editor/ide-editor-frame-private.h
+++ b/libide/editor/ide-editor-frame-private.h
@@ -43,7 +43,6 @@ struct _IdeEditorFrame
   GtkLabel            *overwrite_label;
   GtkScrolledWindow   *scrolled_window;
   GtkRevealer         *search_revealer;
-  GtkRevealer         *spell_revealer;
   GtkFrame            *search_frame;
   GdTaggedEntry       *search_entry;
   GtkSearchEntry      *replace_entry;
@@ -61,12 +60,8 @@ struct _IdeEditorFrame
   guint                pending_replace_confirm;
   guint                auto_hide_map : 1;
   guint                show_ruler : 1;
-  guint                spellchecker_opened : 1;
 };
 
-void      ide_editor_frame_spell_widget_unmapped_cb      (IdeEditorFrame       *self,
-                                                          IdeEditorSpellWidget *spell_widget);
-
 G_END_DECLS
 
 #endif /* IDE_EDITOR_FRAME_PRIVATE_H */
diff --git a/libide/editor/ide-editor-frame.c b/libide/editor/ide-editor-frame.c
index 75b288c..b76a7ad 100644
--- a/libide/editor/ide-editor-frame.c
+++ b/libide/editor/ide-editor-frame.c
@@ -29,7 +29,6 @@
 #include "editor/ide-editor-frame.h"
 #include "editor/ide-editor-map-bin.h"
 #include "editor/ide-editor-perspective.h"
-#include "editor/ide-editor-spell-widget.h"
 #include "history/ide-back-forward-list.h"
 #include "util/ide-dnd.h"
 #include "util/ide-gtk.h"
@@ -57,22 +56,6 @@ enum {
 
 static GParamSpec *properties [LAST_PROP];
 
-void
-ide_editor_frame_spell_widget_unmapped_cb (IdeEditorFrame       *self,
-                                           IdeEditorSpellWidget *spell_widget)
-{
-  GtkWidget *child;
-
-  g_assert (IDE_IS_EDITOR_FRAME (self));
-  g_assert (IDE_IS_EDITOR_SPELL_WIDGET (spell_widget));
-
-  if (NULL != (child = gtk_bin_get_child (GTK_BIN (self->spell_revealer))))
-    {
-      gtk_container_remove (GTK_CONTAINER (self->spell_revealer), child);
-      self->spellchecker_opened = FALSE;
-    }
-}
-
 static void
 update_replace_actions_sensitivity (IdeEditorFrame *self)
 {
@@ -862,7 +845,6 @@ ide_editor_frame__source_view_focus_in_event (IdeEditorFrame *self,
   g_assert (IDE_IS_SOURCE_VIEW (source_view));
 
   gtk_revealer_set_reveal_child (self->search_revealer, FALSE);
-  gtk_revealer_set_reveal_child (self->spell_revealer, FALSE);
 
   buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (source_view));
 
@@ -1219,7 +1201,6 @@ ide_editor_frame_class_init (IdeEditorFrameClass *klass)
   gtk_widget_class_bind_template_child (widget_class, IdeEditorFrame, replace_all_button);
   gtk_widget_class_bind_template_child (widget_class, IdeEditorFrame, search_options);
   gtk_widget_class_bind_template_child (widget_class, IdeEditorFrame, search_revealer);
-  gtk_widget_class_bind_template_child (widget_class, IdeEditorFrame, spell_revealer);
   gtk_widget_class_bind_template_child (widget_class, IdeEditorFrame, source_map_container);
   gtk_widget_class_bind_template_child (widget_class, IdeEditorFrame, source_overlay);
   gtk_widget_class_bind_template_child (widget_class, IdeEditorFrame, source_view);
diff --git a/libide/editor/ide-editor-perspective.c b/libide/editor/ide-editor-perspective.c
index b7a53b9..0b418a3 100644
--- a/libide/editor/ide-editor-perspective.c
+++ b/libide/editor/ide-editor-perspective.c
@@ -27,20 +27,28 @@
 #include "buffers/ide-buffer-manager.h"
 #include "buffers/ide-buffer.h"
 #include "editor/ide-editor-perspective.h"
+#include "editor/ide-editor-spell-widget.h"
 #include "editor/ide-editor-view.h"
 #include "util/ide-gtk.h"
 #include "workbench/ide-layout-grid.h"
+#include "workbench/ide-layout-pane.h"
 #include "workbench/ide-workbench.h"
 #include "workbench/ide-workbench-header-bar.h"
 
 struct _IdeEditorPerspective
 {
-  IdeLayout              parent_instance;
+  PnlDockOverlay         parent_instance;
 
+  GtkWidget             *active_view;
+  IdeLayout             *layout;
   IdeLayoutGrid         *grid;
   GSimpleActionGroup    *actions;
 
   EggSignalGroup        *buffer_manager_signals;
+
+  GtkAdjustment         *spellchecker_edge_adj;
+
+  guint                  spellchecker_opened : 1;
 };
 
 typedef struct
@@ -56,10 +64,18 @@ static void ide_editor_perspective_focus_location_full (IdeEditorPerspective
                                                         IdeSourceLocation       *location,
                                                         gboolean                 open_if_not_found);
 
-G_DEFINE_TYPE_EXTENDED (IdeEditorPerspective, ide_editor_perspective, IDE_TYPE_LAYOUT, 0,
+G_DEFINE_TYPE_EXTENDED (IdeEditorPerspective, ide_editor_perspective, PNL_TYPE_DOCK_OVERLAY, 0,
                         G_IMPLEMENT_INTERFACE (IDE_TYPE_PERSPECTIVE, ide_perspective_iface_init))
 
 enum {
+  PROP_0,
+  PROP_ACTIVE_VIEW,
+  LAST_PROP
+};
+
+static GParamSpec *properties [LAST_PROP];
+
+enum {
   VIEW_ADDED,
   VIEW_REMOVED,
   LAST_SIGNAL
@@ -79,19 +95,19 @@ ide_editor_perspective_restore_panel_state (IdeEditorPerspective *self)
 
   settings = g_settings_new ("org.gnome.builder.workbench");
 
-  pane = pnl_dock_bin_get_left_edge (PNL_DOCK_BIN (self));
+  pane = pnl_dock_bin_get_left_edge (PNL_DOCK_BIN (self->layout));
   reveal = g_settings_get_boolean (settings, "left-visible");
   position = g_settings_get_int (settings, "left-position");
   pnl_dock_revealer_set_reveal_child (PNL_DOCK_REVEALER (pane), reveal);
   pnl_dock_revealer_set_position (PNL_DOCK_REVEALER (pane), position);
 
-  pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (self));
+  pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (self->layout));
   reveal = g_settings_get_boolean (settings, "right-visible");
   position = g_settings_get_int (settings, "right-position");
   pnl_dock_revealer_set_reveal_child (PNL_DOCK_REVEALER (pane), reveal);
   pnl_dock_revealer_set_position (PNL_DOCK_REVEALER (pane), position);
 
-  pane = pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (self));
+  pane = pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (self->layout));
   reveal = g_settings_get_boolean (settings, "bottom-visible");
   position = g_settings_get_int (settings, "bottom-position");
   pnl_dock_revealer_set_reveal_child (PNL_DOCK_REVEALER (pane), reveal);
@@ -110,19 +126,19 @@ ide_editor_perspective_save_panel_state (IdeEditorPerspective *self)
 
   settings = g_settings_new ("org.gnome.builder.workbench");
 
-  pane = pnl_dock_bin_get_left_edge (PNL_DOCK_BIN (self));
+  pane = pnl_dock_bin_get_left_edge (PNL_DOCK_BIN (self->layout));
   position = pnl_dock_revealer_get_position (PNL_DOCK_REVEALER (pane));
   reveal = pnl_dock_revealer_get_reveal_child (PNL_DOCK_REVEALER (pane));
   g_settings_set_boolean (settings, "left-visible", reveal);
   g_settings_set_int (settings, "left-position", position);
 
-  pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (self));
+  pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (self->layout));
   position = pnl_dock_revealer_get_position (PNL_DOCK_REVEALER (pane));
   reveal = pnl_dock_revealer_get_reveal_child (PNL_DOCK_REVEALER (pane));
   g_settings_set_boolean (settings, "right-visible", reveal);
   g_settings_set_int (settings, "right-position", position);
 
-  pane = pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (self));
+  pane = pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (self->layout));
   position = pnl_dock_revealer_get_position (PNL_DOCK_REVEALER (pane));
   reveal = pnl_dock_revealer_get_reveal_child (PNL_DOCK_REVEALER (pane));
   g_settings_set_boolean (settings, "bottom-visible", reveal);
@@ -358,20 +374,50 @@ ide_editor_perspective_grid_empty (IdeEditorPerspective *self,
 }
 
 static void
+ide_editor_perspective_get_property (GObject    *object,
+                                     guint       prop_id,
+                                     GValue     *value,
+                                     GParamSpec *pspec)
+{
+  IdeEditorPerspective *self = IDE_EDITOR_PERSPECTIVE (object);
+
+  switch (prop_id)
+    {
+    case PROP_ACTIVE_VIEW:
+      g_value_set_object (value, ide_editor_perspective_get_active_view (self));
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+    }
+}
+
+static void
 ide_editor_perspective_class_init (IdeEditorPerspectiveClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
   GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
 
+  object_class->get_property = ide_editor_perspective_get_property;
   object_class->finalize = ide_editor_perspective_finalize;
 
   container_class->add = ide_editor_perspective_add;
 
   gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/builder/ui/ide-editor-perspective.ui");
+  gtk_widget_class_bind_template_child (widget_class, IdeEditorPerspective, layout);
   gtk_widget_class_bind_template_child (widget_class, IdeEditorPerspective, actions);
   gtk_widget_class_bind_template_child (widget_class, IdeEditorPerspective, grid);
 
+  properties [PROP_ACTIVE_VIEW] =
+    g_param_spec_object ("active-view",
+                         "Active View",
+                         "Active View",
+                         GTK_TYPE_WIDGET,
+                         (G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_properties (object_class, LAST_PROP, properties);
+
   signals[VIEW_ADDED] =
     g_signal_new ("view-added",
                   G_TYPE_FROM_CLASS (klass),
@@ -394,6 +440,18 @@ ide_editor_perspective_class_init (IdeEditorPerspectiveClass *klass)
 }
 
 static void
+ide_editor_perspective_active_view_notify_cb (IdeEditorPerspective *self,
+                                              GParamSpec           *pspec,
+                                              IdeLayout            *layout)
+{
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (self));
+  g_assert (IDE_IS_LAYOUT (layout));
+
+  self->active_view = ide_layout_get_active_view (layout);
+  g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_ACTIVE_VIEW]);
+}
+
+static void
 ide_editor_perspective_init (IdeEditorPerspective *self)
 {
   static const gchar *proxy_actions[] = {
@@ -434,7 +492,7 @@ ide_editor_perspective_init (IdeEditorPerspective *self)
   g_action_map_add_action_entries (G_ACTION_MAP (self->actions), entries,
                                    G_N_ELEMENTS (entries), self);
 
-  actions = gtk_widget_get_action_group (GTK_WIDGET (self), "dockbin");
+  actions = gtk_widget_get_action_group (GTK_WIDGET (self->layout), "dockbin");
 
   for (i = 0; proxy_actions[i]; i++)
     {
@@ -448,6 +506,13 @@ ide_editor_perspective_init (IdeEditorPerspective *self)
 
   ide_widget_set_context_handler (GTK_WIDGET (self),
                                   ide_editor_perspective_context_set);
+
+  g_signal_connect_swapped (self->layout,
+                            "notify::active-view",
+                            G_CALLBACK (ide_editor_perspective_active_view_notify_cb),
+                            self);
+
+  ide_editor_perspective_active_view_notify_cb (self, NULL, self->layout);
 }
 
 static gchar *
@@ -645,3 +710,186 @@ ide_editor_perspective_focus_location (IdeEditorPerspective *self,
 {
   ide_editor_perspective_focus_location_full (self, location, TRUE);
 }
+
+/**
+ * ide_editor_perspective_get_layout:
+ * @self: A #IdeEditorPerspective
+ *
+ * Gets the #IdeLayout widget for the editor perspective.
+ *
+ * Returns: (transfer none) (nullable): A #IdeLayout or %NULL.
+ */
+IdeLayout *
+ide_editor_perspective_get_layout (IdeEditorPerspective *self)
+{
+  g_return_val_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self), NULL);
+
+  return self->layout;
+}
+
+/**
+ * ide_editor_perspective_get_active_view:
+ *
+ * Returns: (transfer none) (nullable): An #IdeLayoutView or %NULL.
+ */
+GtkWidget *
+ide_editor_perspective_get_active_view (IdeEditorPerspective *self)
+{
+
+  g_return_val_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self), NULL);
+
+  return self->active_view;
+}
+
+/**
+ * ide_editor_perspective_get_center_widget:
+ * @self: A #IdeEditorPerspective
+ *
+ * Gets the center widget for the editor perspective.
+ *
+ * Returns: (transfer none) (nullable): A #GtkWidget or %NULL.
+ */
+GtkWidget *
+ide_editor_perspective_get_center_widget (IdeEditorPerspective *self)
+{
+  g_return_val_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self), NULL);
+
+  return pnl_dock_bin_get_center_widget (PNL_DOCK_BIN (self->layout));
+}
+
+/**
+ * ide_editor_perspective_get_top_edge:
+ * Returns: (transfer none): A #GtkWidget
+ */
+GtkWidget *
+ide_editor_perspective_get_top_edge (IdeEditorPerspective *self)
+{
+  g_return_val_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self), NULL);
+
+  return pnl_dock_bin_get_top_edge (PNL_DOCK_BIN (self->layout));
+}
+
+/**
+ * ide_editor_perspective_get_left_edge:
+ * Returns: (transfer none): A #GtkWidget
+ */
+GtkWidget *
+ide_editor_perspective_get_left_edge (IdeEditorPerspective *self)
+{
+  g_return_val_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self), NULL);
+
+  return pnl_dock_bin_get_left_edge (PNL_DOCK_BIN (self->layout));
+}
+
+/**
+ * ide_editor_perspective_get_bottom_edge:
+ * Returns: (transfer none): A #GtkWidget
+ */
+GtkWidget *
+ide_editor_perspective_get_bottom_edge (IdeEditorPerspective *self)
+{
+  g_return_val_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self), NULL);
+
+  return pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (self->layout));
+}
+
+/**
+ * ide_editor_perspective_get_right_edge:
+ * Returns: (transfer none): A #GtkWidget
+ */
+GtkWidget *
+ide_editor_perspective_get_right_edge (IdeEditorPerspective *self)
+{
+  g_return_val_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self), NULL);
+
+  return pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (self->layout));
+}
+
+/**
+ * ide_editor_perspective_get_overlay_edge:
+ * self: an #IdeEditorPerspective.
+ * position: a #GtkPositionType.
+ *
+ * Returns: (transfer none): A #PnlDockOverlayEdge
+ */
+PnlDockOverlayEdge *
+ide_editor_perspective_get_overlay_edge (IdeEditorPerspective *self,
+                                         GtkPositionType       position)
+{
+  g_return_val_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self), NULL);
+
+  return pnl_dock_overlay_get_edge (PNL_DOCK_OVERLAY (self), position);
+}
+
+static void
+ide_editor_perspective_edge_adj_changed_cb (IdeEditorPerspective *self,
+                                            GtkAdjustment        *edge_adj)
+{
+  PnlDockOverlayEdge *edge;
+  GtkWidget *child;
+  gdouble value;
+
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (self));
+
+  value = gtk_adjustment_get_value (edge_adj);
+  if (value == 1.0)
+    {
+      edge = ide_editor_perspective_get_overlay_edge (self, GTK_POS_RIGHT);
+      child = gtk_bin_get_child (GTK_BIN (edge));
+      gtk_container_remove (GTK_CONTAINER (edge), child);
+      self->spellchecker_opened = FALSE;
+
+      g_signal_handlers_disconnect_by_func (self->spellchecker_edge_adj,
+                                            ide_editor_perspective_edge_adj_changed_cb,
+                                            self);
+      self->spellchecker_edge_adj = NULL;
+    }
+}
+
+void
+ide_editor_perspective_show_spellchecker (IdeEditorPerspective *self,
+                                          IdeSourceView        *source_view)
+{
+  GtkWidget *box;
+  GtkWidget *scroll_window;
+  GtkWidget *spell_widget;
+  PnlDockOverlayEdge *edge;
+
+  g_return_if_fail (IDE_IS_EDITOR_PERSPECTIVE (self));
+
+  if (!self->spellchecker_opened)
+    {
+      self->spellchecker_opened = TRUE;
+
+      box = g_object_new (GTK_TYPE_BOX,
+                          "visible", TRUE,
+                          "expand", TRUE,
+                          NULL);
+      scroll_window = g_object_new (GTK_TYPE_SCROLLED_WINDOW,
+                                    "visible", TRUE,
+                                    "expand", TRUE,
+                                    "width-request", 500,
+                                    "propagate-natural-width", TRUE,
+                                    NULL);
+      spell_widget = ide_editor_spell_widget_new (source_view);
+      gtk_box_pack_start (GTK_BOX (box), scroll_window, TRUE, TRUE, 0);
+      gtk_container_add (GTK_CONTAINER (scroll_window), spell_widget);
+      gtk_widget_show_all (box);
+
+      pnl_overlay_add_child (PNL_DOCK_OVERLAY (self), box, "right");
+      edge = ide_editor_perspective_get_overlay_edge (self, GTK_POS_RIGHT);
+      self->spellchecker_edge_adj = pnl_dock_overlay_get_edge_adjustment (PNL_DOCK_OVERLAY (self),
+                                                                          GTK_POS_RIGHT);
+      gtk_widget_set_child_visible (GTK_WIDGET (edge), TRUE);
+      //pnl_dock_overlay_edge_set_position (PNL_DOCK_OVERLAY_EDGE (edge), 100);
+
+      gtk_container_child_set (GTK_CONTAINER (self), GTK_WIDGET (edge),
+                               "reveal", TRUE,
+                               NULL);
+
+      g_signal_connect_swapped (self->spellchecker_edge_adj,
+                                "value-changed",
+                                G_CALLBACK (ide_editor_perspective_edge_adj_changed_cb),
+                                self);
+    }
+}
diff --git a/libide/editor/ide-editor-perspective.h b/libide/editor/ide-editor-perspective.h
index 751327f..ed8e7f4 100644
--- a/libide/editor/ide-editor-perspective.h
+++ b/libide/editor/ide-editor-perspective.h
@@ -20,8 +20,10 @@
 #define IDE_EDITOR_PERSPECTIVE_H
 
 #include <gtk/gtk.h>
+#include <pnl.h>
 
 #include "diagnostics/ide-source-location.h"
+#include "sourceview/ide-source-view.h"
 #include "workbench/ide-layout.h"
 #include "workbench/ide-perspective.h"
 
@@ -29,13 +31,26 @@ G_BEGIN_DECLS
 
 #define IDE_TYPE_EDITOR_PERSPECTIVE (ide_editor_perspective_get_type())
 
-G_DECLARE_FINAL_TYPE (IdeEditorPerspective, ide_editor_perspective, IDE, EDITOR_PERSPECTIVE, IdeLayout)
+G_DECLARE_FINAL_TYPE (IdeEditorPerspective, ide_editor_perspective, IDE, EDITOR_PERSPECTIVE, PnlDockOverlay)
 
-void ide_editor_perspective_focus_location                (IdeEditorPerspective *self,
-                                                           IdeSourceLocation    *location);
-void ide_editor_perspective_focus_buffer_in_current_stack (IdeEditorPerspective *self,
-                                                           IdeBuffer            *buffer);
+void                 ide_editor_perspective_focus_location                 (IdeEditorPerspective   *self,
+                                                                            IdeSourceLocation      
*location);
+void                 ide_editor_perspective_focus_buffer_in_current_stack  (IdeEditorPerspective   *self,
+                                                                            IdeBuffer              *buffer);
+GtkWidget           *ide_editor_perspective_get_active_view                (IdeEditorPerspective   *self);
+IdeLayout           *ide_editor_perspective_get_layout                     (IdeEditorPerspective   *self);
 
+GtkWidget           *ide_editor_perspective_get_center_widget              (IdeEditorPerspective   *self);
+GtkWidget           *ide_editor_perspective_get_top_edge                   (IdeEditorPerspective   *self);
+GtkWidget           *ide_editor_perspective_get_left_edge                  (IdeEditorPerspective   *self);
+GtkWidget           *ide_editor_perspective_get_bottom_edge                (IdeEditorPerspective   *self);
+GtkWidget           *ide_editor_perspective_get_right_edge                 (IdeEditorPerspective   *self);
+
+PnlDockOverlayEdge  *ide_editor_perspective_get_overlay_edge               (IdeEditorPerspective   *self,
+                                                                            GtkPositionType         
position);
+
+void                 ide_editor_perspective_show_spellchecker              (IdeEditorPerspective   *self,
+                                                                            IdeSourceView          
*source_view);
 G_END_DECLS
 
 #endif /* IDE_EDITOR_PERSPECTIVE_H */
diff --git a/libide/editor/ide-editor-perspective.ui b/libide/editor/ide-editor-perspective.ui
index e506ae5..cad54cf 100644
--- a/libide/editor/ide-editor-perspective.ui
+++ b/libide/editor/ide-editor-perspective.ui
@@ -1,62 +1,67 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <!-- interface-requires gtk+ 3.18 -->
-  <template class="IdeEditorPerspective" parent="IdeLayout">
-    <child type="center">
-      <object class="GtkStack" id="content_stack">
+  <template class="IdeEditorPerspective" parent="PnlDockOverlay">
+    <child>
+      <object class="IdeLayout" id="layout">
         <property name="visible">true</property>
-        <child>
-          <object class="GtkBox">
-            <property name="halign">center</property>
-            <property name="valign">center</property>
-            <property name="orientation">vertical</property>
-            <property name="spacing">12</property>
+        <child type="center">
+          <object class="GtkStack" id="content_stack">
             <property name="visible">true</property>
             <child>
-              <object class="GtkImage">
-                <property name="icon-name">text-editor-symbolic</property>
-                <property name="pixel-size">128</property>
+              <object class="GtkBox">
+                <property name="halign">center</property>
+                <property name="valign">center</property>
+                <property name="orientation">vertical</property>
+                <property name="spacing">12</property>
                 <property name="visible">true</property>
-                <style>
-                  <class name="dim-label"/>
-                </style>
+                <child>
+                  <object class="GtkImage">
+                    <property name="icon-name">text-editor-symbolic</property>
+                    <property name="pixel-size">128</property>
+                    <property name="visible">true</property>
+                    <style>
+                      <class name="dim-label"/>
+                    </style>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="label" translatable="yes">No open files</property>
+                    <property name="visible">true</property>
+                    <style>
+                      <class name="dim-label"/>
+                    </style>
+                    <attributes>
+                      <attribute name="scale" value="2.0"/>
+                      <attribute name="weight" value="bold"/>
+                    </attributes>
+                  </object>
+                </child>
+                <child>
+                  <object class="GtkLabel">
+                    <property name="label" translatable="yes">Try opening a file by typing in the search box 
at the top</property>
+                    <property name="wrap">true</property>
+                    <property name="visible">true</property>
+                    <style>
+                      <class name="dim-label"/>
+                    </style>
+                  </object>
+                </child>
               </object>
+              <packing>
+                <property name="name">empty_state</property>
+              </packing>
             </child>
             <child>
-              <object class="GtkLabel">
-                <property name="label" translatable="yes">No open files</property>
+              <object class="IdeLayoutGrid" id="grid">
                 <property name="visible">true</property>
-                <style>
-                  <class name="dim-label"/>
-                </style>
-                <attributes>
-                  <attribute name="scale" value="2.0"/>
-                  <attribute name="weight" value="bold"/>
-                </attributes>
               </object>
+              <packing>
+                <property name="name">grid</property>
+              </packing>
             </child>
-            <child>
-              <object class="GtkLabel">
-                <property name="label" translatable="yes">Try opening a file by typing in the search box at 
the top</property>
-                <property name="wrap">true</property>
-                <property name="visible">true</property>
-                <style>
-                  <class name="dim-label"/>
-                </style>
-              </object>
-            </child>
-          </object>
-          <packing>
-            <property name="name">empty_state</property>
-          </packing>
-        </child>
-        <child>
-          <object class="IdeLayoutGrid" id="grid">
-            <property name="visible">true</property>
           </object>
-          <packing>
-            <property name="name">grid</property>
-          </packing>
         </child>
       </object>
     </child>
diff --git a/plugins/build-tools/gbp-build-workbench-addin.c b/plugins/build-tools/gbp-build-workbench-addin.c
index 80fbe4b..8dae6b4 100644
--- a/plugins/build-tools/gbp-build-workbench-addin.c
+++ b/plugins/build-tools/gbp-build-workbench-addin.c
@@ -145,13 +145,13 @@ gbp_build_workbench_addin_load (IdeWorkbenchAddin *addin,
   configuration = ide_configuration_manager_get_current (configuration_manager);
 
   editor = ide_workbench_get_perspective_by_name (workbench, "editor");
-  pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (editor));
+  pane = ide_editor_perspective_get_right_edge (IDE_EDITOR_PERSPECTIVE (editor));
   self->panel = g_object_new (GBP_TYPE_BUILD_PANEL,
                               "visible", TRUE,
                               NULL);
   gtk_container_add (GTK_CONTAINER (pane), GTK_WIDGET (self->panel));
 
-  pane = pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (editor));
+  pane = ide_editor_perspective_get_bottom_edge (IDE_EDITOR_PERSPECTIVE (editor));
   self->build_log_panel = g_object_new (GBP_TYPE_BUILD_LOG_PANEL, NULL);
   gtk_container_add (GTK_CONTAINER (pane), GTK_WIDGET (self->build_log_panel));
 
diff --git a/plugins/color-picker/gb-color-picker-workbench-addin.c 
b/plugins/color-picker/gb-color-picker-workbench-addin.c
index a9c4644..e624098 100644
--- a/plugins/color-picker/gb-color-picker-workbench-addin.c
+++ b/plugins/color-picker/gb-color-picker-workbench-addin.c
@@ -190,7 +190,7 @@ init_dock (GbColorPickerWorkbenchAddin *self)
 
   init_palettes (self);
 
-  panel = (pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (self->editor)));
+  panel = ide_editor_perspective_get_right_edge (IDE_EDITOR_PERSPECTIVE (self->editor));
   gtk_container_add (GTK_CONTAINER (panel), GTK_WIDGET (self->dock));
   gtk_container_add (GTK_CONTAINER (self->dock), self->color_panel);
 
@@ -443,7 +443,7 @@ active_view_changed_cb (GbColorPickerWorkbenchAddin *self,
 
   g_assert (GB_IS_COLOR_PICKER_WORKBENCH_ADDIN (self));
 
-  self->active_view = ide_layout_get_active_view (IDE_LAYOUT (self->editor));
+  self->active_view = ide_editor_perspective_get_active_view (self->editor);
   if (self->active_view != NULL && IDE_IS_EDITOR_VIEW (self->active_view))
     {
       state = get_menu_action_state (self, IDE_EDITOR_VIEW (self->active_view));
@@ -460,15 +460,17 @@ gb_color_picker_workbench_addin_load (IdeWorkbenchAddin *addin,
                                       IdeWorkbench      *workbench)
 {
   GbColorPickerWorkbenchAddin *self = (GbColorPickerWorkbenchAddin *)addin;
+  IdeLayout *layout;
 
   g_assert (GB_IS_COLOR_PICKER_WORKBENCH_ADDIN (addin));
   g_assert (IDE_IS_WORKBENCH (workbench));
 
   ide_set_weak_pointer (&self->workbench, workbench);
   self->editor = IDE_EDITOR_PERSPECTIVE (ide_workbench_get_perspective_by_name (workbench, "editor"));
+  layout = ide_editor_perspective_get_layout (self->editor);
 
   ide_perspective_views_foreach (IDE_PERSPECTIVE (self->editor), (GtkCallback)setup_view_cb, self);
-  self->active_view = ide_layout_get_active_view (IDE_LAYOUT (self->editor));
+  self->active_view = ide_editor_perspective_get_active_view (self->editor);
 
   g_signal_connect_object (self->editor,
                            "view-added",
@@ -480,7 +482,7 @@ gb_color_picker_workbench_addin_load (IdeWorkbenchAddin *addin,
                            G_CALLBACK (view_removed_cb),
                            self,
                            G_CONNECT_SWAPPED);
-  g_signal_connect_object (IDE_LAYOUT (self->editor),
+  g_signal_connect_object (layout,
                            "notify::active-view",
                            G_CALLBACK (active_view_changed_cb),
                            self,
diff --git a/plugins/devhelp/gbp-devhelp-panel.c b/plugins/devhelp/gbp-devhelp-panel.c
index 7c33707..3340797 100644
--- a/plugins/devhelp/gbp-devhelp-panel.c
+++ b/plugins/devhelp/gbp-devhelp-panel.c
@@ -76,7 +76,7 @@ gbp_devhelp_panel_link_selected (GbpDevhelpPanel *self,
   g_assert (IDE_IS_WORKBENCH (workbench));
 
   perspective = ide_workbench_get_perspective_by_name (workbench, "editor");
-  g_assert (IDE_IS_LAYOUT (perspective));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
 
   ide_perspective_views_foreach (perspective, gbp_devhelp_panel_find_view, &view);
 
diff --git a/plugins/devhelp/gbp-devhelp-workbench-addin.c b/plugins/devhelp/gbp-devhelp-workbench-addin.c
index f21ffc8..0cf8ff1 100644
--- a/plugins/devhelp/gbp-devhelp-workbench-addin.c
+++ b/plugins/devhelp/gbp-devhelp-workbench-addin.c
@@ -77,9 +77,9 @@ gbp_devhelp_workbench_addin_load (IdeWorkbenchAddin *addin,
   dh_book_manager_populate (self->books);
 
   perspective = ide_workbench_get_perspective_by_name (workbench, "editor");
-  g_assert (IDE_IS_LAYOUT (perspective));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
 
-  pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (perspective));
+  pane = ide_editor_perspective_get_right_edge (IDE_EDITOR_PERSPECTIVE (perspective));
   g_assert (IDE_IS_LAYOUT_PANE (pane));
 
   self->panel = g_object_new (GBP_TYPE_DEVHELP_PANEL,
@@ -112,9 +112,9 @@ gbp_devhelp_workbench_addin_unload (IdeWorkbenchAddin *addin,
   g_clear_object (&self->books);
 
   perspective = ide_workbench_get_perspective_by_name (workbench, "editor");
-  g_assert (IDE_IS_LAYOUT (perspective));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
 
-  pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (perspective));
+  pane = ide_editor_perspective_get_right_edge (IDE_EDITOR_PERSPECTIVE (perspective));
   g_assert (IDE_IS_LAYOUT_PANE (pane));
 
   gtk_widget_destroy (GTK_WIDGET (self->panel));
diff --git a/plugins/project-tree/gb-project-tree-addin.c b/plugins/project-tree/gb-project-tree-addin.c
index 87a9177..d54189e 100644
--- a/plugins/project-tree/gb-project-tree-addin.c
+++ b/plugins/project-tree/gb-project-tree-addin.c
@@ -75,10 +75,10 @@ gb_project_tree_addin_load (IdeWorkbenchAddin *addin,
   editor = ide_workbench_get_perspective_by_name (workbench, "editor");
   g_assert (editor != NULL);
 
-  pane = pnl_dock_bin_get_left_edge (PNL_DOCK_BIN (editor));
+  pane = ide_editor_perspective_get_left_edge (IDE_EDITOR_PERSPECTIVE (editor));
   g_assert (pane != NULL);
 
-  content = pnl_dock_bin_get_center_widget (PNL_DOCK_BIN (editor));
+  content = ide_editor_perspective_get_center_widget (IDE_EDITOR_PERSPECTIVE (editor));
   g_assert (content != NULL);
 
   grid = ide_widget_find_child_typed (content, IDE_TYPE_LAYOUT_GRID);
diff --git a/plugins/symbol-tree/symbol-tree-panel.c b/plugins/symbol-tree/symbol-tree-panel.c
index 2f03e13..b64500b 100644
--- a/plugins/symbol-tree/symbol-tree-panel.c
+++ b/plugins/symbol-tree/symbol-tree-panel.c
@@ -152,7 +152,7 @@ refresh_tree (SymbolTreePanel *self)
   perspective = ide_workbench_get_perspective_by_name (workbench, "editor");
   g_assert (perspective != NULL);
 
-  if ((active_view = ide_layout_get_active_view (IDE_LAYOUT (perspective))) &&
+  if ((active_view = ide_editor_perspective_get_active_view (IDE_EDITOR_PERSPECTIVE (perspective))) &&
       IDE_IS_EDITOR_VIEW (active_view))
     {
       document = ide_editor_view_get_document (IDE_EDITOR_VIEW  (active_view));
diff --git a/plugins/symbol-tree/symbol-tree.c b/plugins/symbol-tree/symbol-tree.c
index 785521a..ec22aae 100644
--- a/plugins/symbol-tree/symbol-tree.c
+++ b/plugins/symbol-tree/symbol-tree.c
@@ -59,6 +59,7 @@ symbol_tree_load (IdeWorkbenchAddin *addin,
 {
   SymbolTree *self = (SymbolTree *)addin;
   IdePerspective *perspective;
+  IdeLayout *layout;
   GtkWidget *right_pane;
 
   g_assert (SYMBOL_IS_TREE (self));
@@ -66,15 +67,16 @@ symbol_tree_load (IdeWorkbenchAddin *addin,
 
   perspective = ide_workbench_get_perspective_by_name (workbench, "editor");
   g_assert (perspective != NULL);
-  g_assert (IDE_IS_LAYOUT (perspective));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
 
-  g_signal_connect_object (perspective,
+  layout = ide_editor_perspective_get_layout (IDE_EDITOR_PERSPECTIVE (perspective));
+  g_signal_connect_object (layout,
                            "notify::active-view",
                            G_CALLBACK (notify_active_view_cb),
                            self,
                            G_CONNECT_SWAPPED);
 
-  right_pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (perspective));
+  right_pane = ide_editor_perspective_get_right_edge (IDE_EDITOR_PERSPECTIVE (perspective));
   g_assert (right_pane != NULL);
 
   self->panel = g_object_new (SYMBOL_TYPE_TREE_PANEL,
@@ -102,9 +104,9 @@ symbol_tree_unload (IdeWorkbenchAddin *addin,
   g_assert (IDE_IS_WORKBENCH (workbench));
 
   perspective = ide_workbench_get_perspective_by_name (workbench, "editor");
-  g_assert (IDE_IS_LAYOUT (perspective));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
 
-  pane = pnl_dock_bin_get_right_edge (PNL_DOCK_BIN (perspective));
+  pane = ide_editor_perspective_get_right_edge (IDE_EDITOR_PERSPECTIVE (perspective));
   g_assert (IDE_IS_LAYOUT_PANE (pane));
 
   gtk_widget_destroy (GTK_WIDGET (self->panel));
diff --git a/plugins/sysmon/gb-sysmon-addin.c b/plugins/sysmon/gb-sysmon-addin.c
index b41710e..b436d4b 100644
--- a/plugins/sysmon/gb-sysmon-addin.c
+++ b/plugins/sysmon/gb-sysmon-addin.c
@@ -51,9 +51,9 @@ gb_sysmon_addin_load (IdeWorkbenchAddin *addin,
   editor = ide_workbench_get_perspective_by_name (workbench, "editor");
 
   g_assert (editor != NULL);
-  g_assert (IDE_IS_LAYOUT (editor));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (editor));
 
-  pane = pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (editor));
+  pane = ide_editor_perspective_get_bottom_edge (IDE_EDITOR_PERSPECTIVE (editor));
   panel = g_object_new (GB_TYPE_SYSMON_PANEL,
                         "expand", TRUE,
                         "visible", TRUE,
diff --git a/plugins/terminal/gb-terminal-workbench-addin.c b/plugins/terminal/gb-terminal-workbench-addin.c
index c970857..efcb4c3 100644
--- a/plugins/terminal/gb-terminal-workbench-addin.c
+++ b/plugins/terminal/gb-terminal-workbench-addin.c
@@ -123,9 +123,9 @@ on_run_manager_run (GbTerminalWorkbenchAddin *self,
       ide_set_weak_pointer (&self->run_panel, panel);
 
       perspective = ide_workbench_get_perspective_by_name (self->workbench, "editor");
-      g_assert (IDE_IS_LAYOUT (perspective));
+      g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
 
-      bottom_pane = pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (perspective));
+      bottom_pane = ide_editor_perspective_get_bottom_edge (IDE_EDITOR_PERSPECTIVE (perspective));
       gtk_container_add (GTK_CONTAINER (bottom_pane), GTK_WIDGET (self->run_panel));
     }
   else
@@ -196,9 +196,9 @@ gb_terminal_workbench_addin_load (IdeWorkbenchAddin *addin,
     }
 
   perspective = ide_workbench_get_perspective_by_name (workbench, "editor");
-  g_assert (IDE_IS_LAYOUT (perspective));
+  g_assert (IDE_IS_EDITOR_PERSPECTIVE (perspective));
 
-  bottom_pane = pnl_dock_bin_get_bottom_edge (PNL_DOCK_BIN (perspective));
+  bottom_pane = ide_editor_perspective_get_bottom_edge (IDE_EDITOR_PERSPECTIVE (perspective));
   gtk_container_add (GTK_CONTAINER (bottom_pane), GTK_WIDGET (self->panel_dock_widget));
 
   run_manager = ide_context_get_run_manager (context);



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