[gnome-notes] window: Rename from window-base



commit f5145fda13a48565bed0550b4fdd40a18f92153d
Author: Mohammed Sadiq <sadiq sadiqpk org>
Date:   Tue May 18 10:11:21 2021 +0530

    window: Rename from window-base
    
    Also, always use window for detached notes too.  If the main window is
    closed, any one of the detached window should be set as main window,
    which means that all note windows (regardless of whether they are detached
    or not) should be a main window.

 data/bjb.gresource.xml                             |   2 +-
 .../{bjb-window-base.ui => bjb-window.ui}          |   3 +-
 src/bjb-application.c                              |  51 +-
 src/bjb-controller.c                               |  46 +-
 src/bjb-detached-window.c                          |  15 +-
 src/bjb-detached-window.h                          |  12 +-
 src/bjb-editor-toolbar.c                           |   4 +-
 src/bjb-note-view.c                                |   1 -
 src/bjb-organize-dialog.c                          |   8 +-
 src/bjb-search-toolbar.c                           |   2 +-
 src/bjb-window-base.h                              |  37 --
 src/{bjb-window-base.c => bjb-window.c}            | 599 +++++++++++----------
 src/bjb-window.h                                   |  59 ++
 src/meson.build                                    |   2 +-
 14 files changed, 457 insertions(+), 384 deletions(-)
---
diff --git a/data/bjb.gresource.xml b/data/bjb.gresource.xml
index f7d7641d..16d40a64 100644
--- a/data/bjb.gresource.xml
+++ b/data/bjb.gresource.xml
@@ -15,7 +15,7 @@
     
   <gresource prefix="/org/gnome/Notes/ui">
     <file alias="bjb-detached-window.ui" preprocess="xml-stripblanks">resources/bjb-detached-window.ui</file>
-    <file alias="bjb-window-base.ui"     preprocess="xml-stripblanks">resources/bjb-window-base.ui</file>
+    <file alias="bjb-window.ui"          preprocess="xml-stripblanks">resources/bjb-window.ui</file>
     <file alias="empty-results-box.ui"   preprocess="xml-stripblanks">resources/empty-results-box.ui</file>
     <file alias="import-dialog.ui"       preprocess="xml-stripblanks">resources/import-dialog.ui</file>
     <file alias="list-view.ui"           preprocess="xml-stripblanks">resources/list-view.ui</file>
diff --git a/data/resources/bjb-window-base.ui b/data/resources/bjb-window.ui
similarity index 99%
rename from data/resources/bjb-window-base.ui
rename to data/resources/bjb-window.ui
index 1e3fe9ab..4e29d2c0 100644
--- a/data/resources/bjb-window-base.ui
+++ b/data/resources/bjb-window.ui
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <template class="BjbWindowBase" parent="HdyApplicationWindow">
+  <template class="BjbWindow" parent="HdyApplicationWindow">
     <child>
       <object class="HdyLeaflet" id="main_leaflet">
         <property name="can-swipe-back">True</property>
@@ -9,6 +9,7 @@
           <object class="GtkBox" id="sidebar_box">
             <property name="visible">True</property>
             <property name="hexpand">False</property>
+            <property name="no-show-all">True</property>
             <property name="orientation">vertical</property>
             <child>
               <object class="HdyHeaderBar" id="headerbar">
diff --git a/src/bjb-application.c b/src/bjb-application.c
index d2226e7e..4ac702a0 100644
--- a/src/bjb-application.c
+++ b/src/bjb-application.c
@@ -29,7 +29,7 @@
 #include "bjb-application.h"
 #include "bjb-settings.h"
 #include "bjb-note-view.h"
-#include "bjb-window-base.h"
+#include "bjb-window.h"
 #include "bjb-import-dialog.h"
 #include "bjb-log.h"
 
@@ -55,7 +55,7 @@ static void     bijiben_new_window_internal (BjbApplication *self,
                                              BijiNoteObj   *note);
 static gboolean bijiben_open_path           (BjbApplication *self,
                                              gchar          *path,
-                                             BjbWindowBase *window);
+                                             BjbWindow      *window);
 
 void            on_import_notes_cb          (GSimpleAction      *action,
                                              GVariant           *parameter,
@@ -93,7 +93,7 @@ cmd_verbose_cb (const char  *option_name,
 }
 
 static void
-on_window_activated_cb (BjbWindowBase  *window,
+on_window_activated_cb (BjbWindow      *window,
                         gboolean        available,
                         BjbApplication *self)
 {
@@ -132,16 +132,20 @@ static void
 bijiben_new_window_internal (BjbApplication *self,
                              BijiNoteObj    *note)
 {
-  BjbWindowBase *window;
-  GList         *windows;
-  gboolean       not_first_window;
+  BjbWindow *window;
+  GList *windows;
+  gboolean not_first_window;
 
   windows = gtk_application_get_windows (GTK_APPLICATION (self));
   not_first_window = (gboolean) g_list_length (windows);
 
-  window = BJB_WINDOW_BASE (bjb_window_base_new (note));
+  window = BJB_WINDOW (bjb_window_new ());
+  if (!note)
+    bjb_window_set_is_main (window, TRUE);
+
   g_signal_connect (window, "activated",
                     G_CALLBACK (on_window_activated_cb), self);
+  bjb_window_set_note (window, note);
 
   gtk_widget_show (GTK_WIDGET (window));
 
@@ -160,7 +164,7 @@ bijiben_new_window_internal (BjbApplication *self,
 static gboolean
 bijiben_open_path (BjbApplication *self,
                    gchar          *path,
-                   BjbWindowBase  *window)
+                   BjbWindow      *window)
 {
   BijiItem *item;
 
@@ -172,7 +176,7 @@ bijiben_open_path (BjbApplication *self,
   if (!window)
     bijiben_new_window_internal (self, BIJI_NOTE_OBJ (item));
   else
-    bjb_window_base_load_note_item (window, item);
+    bjb_window_set_note (window, BIJI_NOTE_OBJ (item));
 
   return TRUE;
 }
@@ -184,6 +188,32 @@ bijiben_new_window_for_note (GApplication *app,
   bijiben_new_window_internal (BJB_APPLICATION (app), note);
 }
 
+static void
+bjb_application_window_removed (GtkApplication *app,
+                                GtkWindow      *window)
+{
+  if (BJB_IS_WINDOW (window) &&
+      bjb_window_get_is_main (BJB_WINDOW (window)))
+    {
+      GList *windows;
+
+      windows = gtk_application_get_windows (app);
+
+      for (GList *node = windows; node; node = node->next)
+        {
+          if (BJB_IS_WINDOW (node->data) &&
+              window != node->data)
+            {
+              bjb_window_set_is_main (node->data, TRUE);
+              gtk_window_present (node->data);
+              break;
+            }
+        }
+    }
+
+  GTK_APPLICATION_CLASS (bjb_application_parent_class)->window_removed (app, window);
+}
+
 static int
 bijiben_handle_local_options (GApplication *application,
                               GVariantDict *options)
@@ -483,9 +513,12 @@ bijiben_finalize (GObject *object)
 static void
 bjb_application_class_init (BjbApplicationClass *klass)
 {
+  GtkApplicationClass *app_class = GTK_APPLICATION_CLASS (klass);
   GApplicationClass *aclass = G_APPLICATION_CLASS (klass);
   GObjectClass *oclass = G_OBJECT_CLASS (klass);
 
+  app_class->window_removed = bjb_application_window_removed;
+
   aclass->handle_local_options = bijiben_handle_local_options;
   aclass->activate = bijiben_activate;
   aclass->open = bijiben_open;
diff --git a/src/bjb-controller.c b/src/bjb-controller.c
index d8e6547d..ad122f00 100644
--- a/src/bjb-controller.c
+++ b/src/bjb-controller.c
@@ -25,7 +25,7 @@
 
 #include "bjb-application.h"
 #include "bjb-controller.h"
-#include "bjb-window-base.h"
+#include "bjb-window.h"
 
 /*
  * The start-up number of items to show,
@@ -46,7 +46,7 @@ struct _BjbController
   BijiItemsGroup  group;
   GtkTreeModel   *model;
 
-  BjbWindowBase  *window;
+  BjbWindow      *window;
   BjbSettings    *settings;
 
   GList          *items_to_show;
@@ -368,12 +368,12 @@ void
 bjb_controller_update_view (BjbController *self)
 {
   GList *l;
-  BjbWindowViewType type;
+  BjbWindowView view;
 
   /* Do not update if nothing to show */
-  type = bjb_window_base_get_view_type (self->window);
-  if (! (type == BJB_WINDOW_BASE_MAIN_VIEW
-         || type == BJB_WINDOW_BASE_ARCHIVE_VIEW))
+  view = bjb_window_get_view (self->window);
+  if (!(view == BJB_WINDOW_MAIN_VIEW ||
+        view == BJB_WINDOW_ARCHIVE_VIEW))
     return;
 
   free_items_store (self);
@@ -409,18 +409,18 @@ notify_displayed_notebooks_changed (BjbController *self)
 static void
 update (BjbController *self)
 {
-  BjbWindowViewType type;
+  BjbWindowView view;
 
   /* If the user already edits a note, he does not want the view
    * to go back */
-  if (bjb_window_base_get_view_type (self->window) != BJB_WINDOW_BASE_NOTE_VIEW)
+  if (bjb_window_get_view (self->window) != BJB_WINDOW_NOTE_VIEW)
   {
     if (self->group == BIJI_LIVING_ITEMS)
-      type = BJB_WINDOW_BASE_MAIN_VIEW;
+      view = BJB_WINDOW_MAIN_VIEW;
     else
-      type = BJB_WINDOW_BASE_ARCHIVE_VIEW;
+      view = BJB_WINDOW_ARCHIVE_VIEW;
 
-    bjb_window_base_switch_to (self->window, type);
+    bjb_window_set_view (self->window, view);
   }
 
 
@@ -476,7 +476,7 @@ update_controller_callback (GList *result,
 
   if (!result)
   {
-    bjb_window_base_switch_to (self->window, BJB_WINDOW_BASE_NO_RESULT);
+    bjb_window_set_view (self->window, BJB_WINDOW_NO_RESULT);
     return;
   }
 
@@ -509,7 +509,7 @@ update_controller_callback (GList *result,
   switch (self->group)
   {
     case BIJI_ARCHIVED_ITEMS:
-      bjb_window_base_switch_to (self->window, BJB_WINDOW_BASE_ARCHIVE_VIEW);
+      bjb_window_set_view (self->window, BJB_WINDOW_ARCHIVE_VIEW);
       break;
     case BIJI_LIVING_ITEMS:
     default:
@@ -535,9 +535,9 @@ bjb_controller_apply_needle (BjbController *self)
     if (result == NULL)
       {
         if (!self->notebook && self->group == BIJI_LIVING_ITEMS)
-          bjb_window_base_switch_to (self->window, BJB_WINDOW_BASE_NO_NOTE);
+          bjb_window_set_view (self->window, BJB_WINDOW_NO_NOTE);
         else
-          bjb_window_base_switch_to (self->window, BJB_WINDOW_BASE_NO_RESULT);
+          bjb_window_set_view (self->window, BJB_WINDOW_NO_RESULT);
       }
     else
       update_controller_callback (result, self);
@@ -563,7 +563,7 @@ on_needle_changed (BjbController *self)
 static gboolean
 bjb_controller_set_window_active (BjbController *self)
 {
-  bjb_window_base_set_active (self->window, TRUE);
+  bjb_window_set_active (self->window, TRUE);
   return FALSE;
 }
 
@@ -596,7 +596,7 @@ on_manager_changed (BijiManager            *manager,
     case BIJI_MANAGER_MASS_CHANGE:
       bjb_controller_apply_needle (self);
       /* This flag is only used when the provider changes so we should close the note. */
-      bjb_window_base_load_note_item (self->window, NULL);
+      bjb_window_set_note (self->window, NULL);
       g_timeout_add (1, (GSourceFunc) bjb_controller_set_window_active, self);
       break;
 
@@ -645,9 +645,9 @@ on_manager_changed (BijiManager            *manager,
       if (self->items_to_show == NULL)
         {
           if (!self->notebook && group == BIJI_LIVING_ITEMS)
-            bjb_window_base_switch_to (self->window, BJB_WINDOW_BASE_NO_NOTE);
+            bjb_window_set_view (self->window, BJB_WINDOW_NO_NOTE);
           else
-            bjb_window_base_switch_to (self->window, BJB_WINDOW_BASE_NO_RESULT);
+            bjb_window_set_view (self->window, BJB_WINDOW_NO_RESULT);
         }
       else
       {
@@ -758,8 +758,8 @@ bjb_controller_class_init (BjbControllerClass *klass)
 
   properties[PROP_WINDOW] = g_param_spec_object ("window",
                                                  "GtkWindow",
-                                                 "BjbWindowBase",
-                                                 BJB_TYPE_WINDOW_BASE,
+                                                 "BjbWindow",
+                                                 BJB_TYPE_WINDOW,
                                                  G_PARAM_READWRITE |
                                                  G_PARAM_CONSTRUCT |
                                                  G_PARAM_STATIC_STRINGS);
@@ -851,14 +851,14 @@ bjb_controller_set_notebook (BjbController *self,
     if (!self->notebook)
       return;
 
-    bjb_window_base_switch_to (self->window, BJB_WINDOW_BASE_SPINNER_VIEW);
+    bjb_window_set_view (self->window, BJB_WINDOW_SPINNER_VIEW);
     self->notebook = NULL;
     bjb_controller_apply_needle (self);
     return;
   }
 
   /* Opening an __existing__ notebook */
-  bjb_window_base_switch_to (self->window, BJB_WINDOW_BASE_SPINNER_VIEW);
+  bjb_window_set_view (self->window, BJB_WINDOW_SPINNER_VIEW);
   g_clear_pointer (&self->items_to_show, g_list_free);
   g_clear_pointer (&self->needle, g_free);
 
diff --git a/src/bjb-detached-window.c b/src/bjb-detached-window.c
index a1837aeb..12a651ee 100644
--- a/src/bjb-detached-window.c
+++ b/src/bjb-detached-window.c
@@ -20,7 +20,6 @@
 #include "bjb-note-view.h"
 #include "bjb-organize-dialog.h"
 #include "bjb-share.h"
-#include "bjb-window-base.h"
 
 enum
 {
@@ -41,7 +40,7 @@ struct _BjbDetachedWindow
   int            height;
   BijiNoteObj   *note;
   BjbNoteView   *note_view;
-  BjbWindowBase *main_win;
+  BjbWindow     *main_win;
 
   GtkWidget *headerbar;
   GtkWidget *main_box;
@@ -387,7 +386,7 @@ bjb_detached_window_class_init (BjbDetachedWindowClass *klass)
   properties[PROP_MAIN_WIN] = g_param_spec_object ("window-base",
                                                    "Main window",
                                                    "The main note window",
-                                                   BJB_TYPE_WINDOW_BASE,
+                                                   BJB_TYPE_WINDOW,
                                                    G_PARAM_READWRITE |
                                                    G_PARAM_CONSTRUCT |
                                                    G_PARAM_STATIC_STRINGS);
@@ -409,11 +408,11 @@ bjb_detached_window_init (BjbDetachedWindow *self)
 }
 
 BjbDetachedWindow *
-bjb_detached_window_new (BjbNoteView   *note_view,
-                         BijiNoteObj   *note,
-                         int            width,
-                         int            height,
-                         BjbWindowBase *main_win)
+bjb_detached_window_new (BjbNoteView *note_view,
+                         BijiNoteObj *note,
+                         int          width,
+                         int          height,
+                         BjbWindow   *main_win)
 {
   return g_object_new (BJB_TYPE_DETACHED_WINDOW,
                        "application", g_application_get_default (),
diff --git a/src/bjb-detached-window.h b/src/bjb-detached-window.h
index a8b127bb..c43c4e00 100644
--- a/src/bjb-detached-window.h
+++ b/src/bjb-detached-window.h
@@ -23,7 +23,7 @@
 #include <libbiji/libbiji.h>
 
 #include "bjb-note-view.h"
-#include "bjb-window-base.h"
+#include "bjb-window.h"
 
 G_BEGIN_DECLS
 
@@ -31,10 +31,10 @@ G_BEGIN_DECLS
 
 G_DECLARE_FINAL_TYPE (BjbDetachedWindow, bjb_detached_window, BJB, DETACHED_WINDOW, HdyApplicationWindow)
 
-BjbDetachedWindow *bjb_detached_window_new (BjbNoteView   *note_view,
-                                            BijiNoteObj   *note,
-                                            int            width,
-                                            int            height,
-                                            BjbWindowBase *main_win);
+BjbDetachedWindow *bjb_detached_window_new (BjbNoteView *note_view,
+                                            BijiNoteObj *note,
+                                            int          width,
+                                            int          height,
+                                            BjbWindow   *main_win);
 
 G_END_DECLS
diff --git a/src/bjb-editor-toolbar.c b/src/bjb-editor-toolbar.c
index a95b8016..42b87f25 100644
--- a/src/bjb-editor-toolbar.c
+++ b/src/bjb-editor-toolbar.c
@@ -26,7 +26,7 @@
 
 #include "bjb-application.h"
 #include "bjb-editor-toolbar.h"
-#include "bjb-window-base.h"
+#include "bjb-window.h"
 
 enum
 {
@@ -125,7 +125,7 @@ on_link_clicked (GtkButton        *button,
     return;
 
   window = bjb_note_view_get_base_window (self->view);
-  manager = bjb_window_base_get_manager(window);
+  manager = bjb_window_get_manager (window);
 
   settings = bjb_app_get_settings (g_application_get_default ());
   result = biji_manager_note_new (manager,
diff --git a/src/bjb-note-view.c b/src/bjb-note-view.c
index 07c1ef88..64a4ec36 100644
--- a/src/bjb-note-view.c
+++ b/src/bjb-note-view.c
@@ -23,7 +23,6 @@
 #include "bjb-application.h"
 #include "bjb-editor-toolbar.h"
 #include "bjb-note-view.h"
-#include "bjb-window-base.h"
 
 enum
 {
diff --git a/src/bjb-organize-dialog.c b/src/bjb-organize-dialog.c
index f5ba34e9..cc9d2a39 100644
--- a/src/bjb-organize-dialog.c
+++ b/src/bjb-organize-dialog.c
@@ -19,7 +19,7 @@
 #include <glib/gi18n.h>
 
 #include "bjb-organize-dialog.h"
-#include "bjb-window-base.h"
+#include "bjb-window.h"
 
 /* Model for tree view */
 enum {
@@ -188,7 +188,7 @@ update_notebooks_model_async (BjbOrganizeDialog *self)
 {
   BijiManager *manager;
 
-  manager = bjb_window_base_get_manager (GTK_WIDGET (self->window));
+  manager = bjb_window_get_manager (GTK_WIDGET (self->window));
   gtk_list_store_clear (self->notebook_store);
   biji_get_all_notebooks_async (manager,
                                 bjb_organize_dialog_handle_tags, NULL, self);
@@ -230,7 +230,7 @@ on_tag_toggled (GtkCellRendererToggle *cell,
   gtk_tree_model_get (model, &iter, COL_URN, &tag, -1);
 
   self->toggled_notebook = tag;
-  manager = bjb_window_base_get_manager (GTK_WIDGET (self->window));
+  manager = bjb_window_get_manager (GTK_WIDGET (self->window));
   notebook = biji_manager_get_item_at_path (manager, tag);
 
   if (BIJI_IS_NOTEBOOK (notebook))
@@ -275,7 +275,7 @@ on_new_notebook_created_cb (BijiItem *coll, gpointer user_data)
 static void
 add_new_tag (BjbOrganizeDialog *self)
 {
-  BijiManager *manager = bjb_window_base_get_manager (GTK_WIDGET (self->window));
+  BijiManager *manager = bjb_window_get_manager (GTK_WIDGET (self->window));
   const gchar *title = gtk_entry_get_text (GTK_ENTRY (self->entry));
 
   if (title && title[0])
diff --git a/src/bjb-search-toolbar.c b/src/bjb-search-toolbar.c
index 01086f7f..e085a370 100644
--- a/src/bjb-search-toolbar.c
+++ b/src/bjb-search-toolbar.c
@@ -31,7 +31,7 @@
 
 #include "bjb-controller.h"
 #include "bjb-search-toolbar.h"
-#include "bjb-window-base.h"
+#include "bjb-window.h"
 
 struct _BjbSearchToolbar
 {
diff --git a/src/bjb-window-base.c b/src/bjb-window.c
similarity index 59%
rename from src/bjb-window-base.c
rename to src/bjb-window.c
index b404aa6e..92984226 100644
--- a/src/bjb-window-base.c
+++ b/src/bjb-window.c
@@ -1,3 +1,31 @@
+/* bjb-window.c
+ *
+ * Copyright 2012, 2013 Pierre-Yves Luyten <py luyten fr>
+ * Copyright 2020 Jonathan Kang <jonathankang gnome org>
+ * Copyright 2021 Mohammed Sadiq <sadiq sadiqpk org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+
+#define G_LOG_DOMAIN "bjb-window"
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
 
 #include <glib/gi18n.h>
 #include <glib/gprintf.h>
@@ -6,38 +34,18 @@
 #include <libbiji/libbiji.h>
 
 #include "bjb-application.h"
-#include "bjb-detached-window.h"
 #include "bjb-empty-results-box.h"
-#include "bjb-window-base.h"
 #include "bjb-list-view.h"
 #include "bjb-list-view-row.h"
 #include "bjb-note-view.h"
 #include "bjb-organize-dialog.h"
 #include "bjb-search-toolbar.h"
 #include "bjb-share.h"
+#include "bjb-window.h"
 
 #define BIJIBEN_MAIN_WIN_TITLE N_("Notes")
-#define SAVE_GEOMETRY_ID_TIMEOUT 100 /* ms */
 
-enum {
-  PROP_0,
-  PROP_NOTE,
-  NUM_PROPERTIES
-};
-
-static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
-
-
-enum {
-  BJB_WIN_BASE_VIEW_CHANGED,
-  BJB_WIN_BASE_ACTIVATED,
-  BJB_WIN_BASE_SIGNALS
-};
-
-static guint bjb_win_base_signals [BJB_WIN_BASE_SIGNALS] = { 0 };
-
-
-struct _BjbWindowBase
+struct _BjbWindow
 {
   HdyApplicationWindow  parent_instance;
 
@@ -49,7 +57,7 @@ struct _BjbWindowBase
   gulong                note_trashed;
 
   GtkStack             *stack;
-  BjbWindowViewType     current_view;
+  BjbWindowView         current_view;
   BjbListView          *note_list;
   BjbNoteView          *note_view;
   GtkWidget            *spinner;
@@ -78,19 +86,29 @@ struct _BjbWindowBase
   GtkWidget            *sidebar_box;
   GtkWidget            *search_bar;
   GtkWidget            *title_entry;
+  GtkWidget            *new_window_item;
   GtkWidget            *last_update_item;
+
+  gboolean              is_main;
 };
 
-/* Gobject */
-G_DEFINE_TYPE (BjbWindowBase, bjb_window_base, HDY_TYPE_APPLICATION_WINDOW)
+G_DEFINE_TYPE (BjbWindow, bjb_window, HDY_TYPE_APPLICATION_WINDOW)
+
+enum {
+  VIEW_CHANGED,
+  ACTIVATED,
+  N_SIGNALS
+};
+
+static guint signals[N_SIGNALS];
 
 static void get_all_notebooks_cb (GList   *notebooks,
                                   gpointer user_data);
 
 static void
-destroy_note_if_needed (BjbWindowBase *self)
+destroy_note_if_needed (BjbWindow *self)
 {
-  self->note = NULL;
+  g_clear_object (&self->note);
 
   if (self->note_view && GTK_IS_WIDGET (self->note_view))
     gtk_widget_destroy (GTK_WIDGET (self->note_view));
@@ -102,7 +120,7 @@ destroy_note_if_needed (BjbWindowBase *self)
 
 static void
 on_note_renamed (BijiItem      *note,
-                 BjbWindowBase *self)
+                 BjbWindow *self)
 {
   const char *str;
 
@@ -123,12 +141,25 @@ on_note_list_row_activated (GtkListBox    *box,
   const char *note_uuid;
   BijiItem *to_open;
   BijiManager *manager;
-  BjbWindowBase *self = BJB_WINDOW_BASE (user_data);
+  BjbWindow *self = BJB_WINDOW (user_data);
+  GList *windows;
 
-  manager = bjb_window_base_get_manager (GTK_WIDGET (self));
+  windows = gtk_application_get_windows (gtk_window_get_application (GTK_WINDOW (self)));
+  manager = bjb_window_get_manager (GTK_WIDGET (self));
   note_uuid = bjb_list_view_row_get_uuid (BJB_LIST_VIEW_ROW (row));
   to_open = biji_manager_get_item_at_path (manager, note_uuid);
 
+  for (GList *node = windows; BIJI_IS_NOTE_OBJ (to_open) && node; node = node->next)
+    {
+      if (BJB_IS_WINDOW (node->data) &&
+          self != node->data &&
+          bjb_window_get_note (node->data) == BIJI_NOTE_OBJ (to_open))
+        {
+          gtk_window_present (node->data);
+          return;
+        }
+    }
+
   if (to_open && BIJI_IS_NOTE_OBJ (to_open))
     {
       hdy_leaflet_navigate (self->main_leaflet, HDY_NAVIGATION_DIRECTION_FORWARD);
@@ -136,7 +167,7 @@ on_note_list_row_activated (GtkListBox    *box,
       /* Only open the note if it's not already opened. */
       if (!biji_note_obj_is_opened (BIJI_NOTE_OBJ (to_open)))
         {
-          bjb_window_base_load_note_item (self, to_open);
+          bjb_window_set_note (self, BIJI_NOTE_OBJ (to_open));
         }
     }
   else if (to_open && BIJI_IS_NOTEBOOK (to_open))
@@ -146,32 +177,32 @@ on_note_list_row_activated (GtkListBox    *box,
 }
 
 static void
-on_back_button_clicked (BjbWindowBase *self)
+on_back_button_clicked (BjbWindow *self)
 {
   hdy_leaflet_navigate (self->main_leaflet, HDY_NAVIGATION_DIRECTION_BACK);
 }
 
 static void
-on_new_note_clicked (BjbWindowBase *self)
+on_new_note_clicked (BjbWindow *self)
 {
   BijiNoteObj *result;
   BijiManager *manager;
 
-  g_assert (BJB_IS_WINDOW_BASE (self));
+  g_assert (BJB_IS_WINDOW (self));
 
   /* append note to notebook */
-  manager = bjb_window_base_get_manager (GTK_WIDGET (self));
+  manager = bjb_window_get_manager (GTK_WIDGET (self));
   result = biji_manager_note_new (manager,
                                   NULL,
                                   bjb_settings_get_default_location (self->settings));
 
   /* Go to that note */
   hdy_leaflet_navigate (self->main_leaflet, HDY_NAVIGATION_DIRECTION_FORWARD);
-  bjb_window_base_load_note_item (self, BIJI_ITEM (result));
+  bjb_window_set_note (self, result);
 }
 
 static void
-on_title_changed (BjbWindowBase *self,
+on_title_changed (BjbWindow *self,
                   GtkEntry      *title)
 {
   const char *str = gtk_entry_get_text (title);
@@ -184,85 +215,45 @@ static void
 on_display_notebooks_changed (BjbController *controller,
                               gboolean       items_to_show,
                               gboolean       remaining_items,
-                              BjbWindowBase *self)
+                              BjbWindow     *self)
 {
   BijiManager *manager;
 
   gtk_container_foreach (GTK_CONTAINER (self->notebooks_box),
                          (GtkCallback) gtk_widget_destroy, NULL);
 
-  manager = bjb_window_base_get_manager (GTK_WIDGET (self));
+  manager = bjb_window_get_manager (GTK_WIDGET (self));
   biji_get_all_notebooks_async (manager, NULL, get_all_notebooks_cb, self);
 }
 
 static void
-bjb_window_base_finalize (GObject *object)
+bjb_window_finalize (GObject *object)
 {
-  BjbWindowBase *self = BJB_WINDOW_BASE (object);
+  BjbWindow *self = BJB_WINDOW (object);
   GSettings *settings = G_SETTINGS (self->settings);
+  BjbNoteView *note_view;
 
   if (self->note != NULL)
   {
     g_settings_set_string (settings, "last-opened-item", biji_note_obj_get_path (self->note));
 
-    if (self->note_deleted != 0)
-      g_signal_handler_disconnect (self->note, self->note_deleted);
-    if (self->note_trashed != 0)
-      g_signal_handler_disconnect (self->note, self->note_trashed);
+    g_clear_signal_handler (&self->note_deleted, self->note);
+    g_clear_signal_handler (&self->note_trashed, self->note);
   }
 
-  if (self->display_notebooks_changed != 0)
-    g_signal_handler_disconnect (self->controller, self->display_notebooks_changed);
+  note_view = g_object_get_data (object, "note-view");
+  if (note_view)
+    bjb_note_view_set_detached (note_view, FALSE);
 
+  g_clear_signal_handler (&self->display_notebooks_changed, self->controller);
   g_clear_object (&self->controller);
+  g_clear_object (&self->note);
 
-  G_OBJECT_CLASS (bjb_window_base_parent_class)->finalize (object);
-}
-
-
-
-
-static void
-bjb_window_base_get_property (GObject  *object,
-                              guint     property_id,
-                              GValue   *value,
-                              GParamSpec *pspec)
-{
-  BjbWindowBase *self = BJB_WINDOW_BASE (object);
-
-  switch (property_id)
-  {
-  case PROP_NOTE:
-    g_value_set_object (value, self->note);
-    break;
-  default:
-    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-    break;
-  }
-}
-
-
-static void
-bjb_window_base_set_property (GObject  *object,
-                              guint     property_id,
-                              const GValue *value,
-                              GParamSpec *pspec)
-{
-  BjbWindowBase *self = BJB_WINDOW_BASE (object);
-
-  switch (property_id)
-  {
-  case PROP_NOTE:
-    self->note = g_value_get_object (value);
-    break;
-  default:
-    G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
-    break;
-  }
+  G_OBJECT_CLASS (bjb_window_parent_class)->finalize (object);
 }
 
 static void
-clear_text_in_search_entry (BjbWindowBase *self)
+clear_text_in_search_entry (BjbWindow *self)
 {
   GtkEntry *search_entry;
 
@@ -272,15 +263,15 @@ clear_text_in_search_entry (BjbWindowBase *self)
 }
 
 static gboolean
-on_key_pressed_cb (BjbWindowBase *self, GdkEvent *event)
+on_key_pressed_cb (BjbWindow *self, GdkEvent *event)
 {
   GApplication *app = g_application_get_default ();
   GdkModifierType modifiers = gtk_accelerator_get_default_mod_mask ();
 
   if ((event->key.state & modifiers) == GDK_MOD1_MASK &&
       event->key.keyval == GDK_KEY_Left &&
-      (self->current_view == BJB_WINDOW_BASE_MAIN_VIEW ||
-       self->current_view == BJB_WINDOW_BASE_ARCHIVE_VIEW))
+      (self->current_view == BJB_WINDOW_MAIN_VIEW ||
+       self->current_view == BJB_WINDOW_ARCHIVE_VIEW))
   {
     BijiItemsGroup items;
 
@@ -309,7 +300,7 @@ on_key_pressed_cb (BjbWindowBase *self, GdkEvent *event)
     case GDK_KEY_F10:
       if ((event->key.state & modifiers) != GDK_CONTROL_MASK)
         {
-          /* FIXME: Port this to BjbWindowBase. */
+          /* FIXME: Port this to BjbWindow. */
           /* bjb_main_toolbar_open_menu (self->main_toolbar); */
           return TRUE;
         }
@@ -341,15 +332,23 @@ on_key_pressed_cb (BjbWindowBase *self, GdkEvent *event)
   return FALSE;
 }
 
+static void
+note_view_destroyed (BjbWindow *self)
+{
+  g_assert (BJB_IS_WINDOW (self));
+
+  g_object_set_data (G_OBJECT (self), "note-view", NULL);
+}
+
 static void
 on_detach_window_cb (GSimpleAction *action,
                      GVariant      *parameter,
                      gpointer       user_data)
 {
   int width, height;
-  BjbDetachedWindow *detached_window;
-  BjbWindowBase *self = BJB_WINDOW_BASE (user_data);
-  BijiNoteObj   *note = bjb_window_base_get_note (self);
+  BjbWindow *detached_window;
+  BjbWindow *self = BJB_WINDOW (user_data);
+  BijiNoteObj *note = self->note;
 
   if (!note)
     return;
@@ -359,14 +358,26 @@ on_detach_window_cb (GSimpleAction *action,
   gtk_window_get_size (GTK_WINDOW (self), NULL, &height);
 
   if (biji_note_obj_is_trashed (note))
-    bjb_window_base_switch_to (self, BJB_WINDOW_BASE_ARCHIVE_VIEW);
+    bjb_window_set_view (self, BJB_WINDOW_ARCHIVE_VIEW);
   else
-    bjb_window_base_switch_to (self, BJB_WINDOW_BASE_MAIN_VIEW);
+    bjb_window_set_view (self, BJB_WINDOW_MAIN_VIEW);
 
   bjb_note_view_set_detached (self->note_view, TRUE);
 
-  detached_window = bjb_detached_window_new (self->note_view, note, width, height, self);
-  gtk_widget_show_all (GTK_WIDGET (detached_window));
+  detached_window = BJB_WINDOW (bjb_window_new ());
+  gtk_window_set_default_size (GTK_WINDOW (detached_window), width, height);
+  g_object_set_data_full (G_OBJECT (detached_window), "note-view",
+                          g_object_ref (self->note_view), g_object_unref);
+  g_signal_connect_object (self->note_view, "destroy",
+                           G_CALLBACK (note_view_destroyed), detached_window,
+                           G_CONNECT_SWAPPED);
+
+  detached_window->controller = g_object_ref (self->controller);
+
+  bjb_window_set_view (detached_window, self->current_view);
+  bjb_window_set_is_main (detached_window, FALSE);
+  bjb_window_set_note (detached_window, note);
+  gtk_window_present (GTK_WINDOW (detached_window));
 }
 
 static void
@@ -374,12 +385,10 @@ on_paste_cb (GSimpleAction *action,
              GVariant      *parameter,
              gpointer       user_data)
 {
-  BijiNoteObj *note = bjb_window_base_get_note (BJB_WINDOW_BASE (user_data));
-
-  if (!note)
-    return;
+  BjbWindow *self = user_data;
 
-  biji_webkit_editor_paste (BIJI_WEBKIT_EDITOR (biji_note_obj_get_editor (note)));
+  if (self->note)
+    biji_webkit_editor_paste (BIJI_WEBKIT_EDITOR (biji_note_obj_get_editor (self->note)));
 }
 
 static void
@@ -387,12 +396,10 @@ on_undo_cb (GSimpleAction *action,
             GVariant      *parameter,
             gpointer       user_data)
 {
-  BijiNoteObj *note = bjb_window_base_get_note (BJB_WINDOW_BASE (user_data));
+  BjbWindow *self = user_data;
 
-  if (!note)
-    return;
-
-  biji_webkit_editor_undo (BIJI_WEBKIT_EDITOR (biji_note_obj_get_editor (note)));
+  if (self->note)
+    biji_webkit_editor_undo (BIJI_WEBKIT_EDITOR (biji_note_obj_get_editor (self->note)));
 }
 
 static void
@@ -400,12 +407,10 @@ on_redo_cb (GSimpleAction *action,
             GVariant      *parameter,
             gpointer       user_data)
 {
-  BijiNoteObj *note = bjb_window_base_get_note (BJB_WINDOW_BASE (user_data));
-
-  if (!note)
-    return;
+  BjbWindow *self = user_data;
 
-  biji_webkit_editor_redo (BIJI_WEBKIT_EDITOR (biji_note_obj_get_editor (note)));
+  if (self->note)
+    biji_webkit_editor_redo (BIJI_WEBKIT_EDITOR (biji_note_obj_get_editor (self->note)));
 }
 
 static void
@@ -413,8 +418,8 @@ on_view_notebooks_cb (GSimpleAction *action,
                       GVariant      *parameter,
                       gpointer       user_data)
 {
-  BjbWindowBase *self = BJB_WINDOW_BASE (user_data);
-  BijiNoteObj *note = bjb_window_base_get_note (self);
+  BjbWindow *self = BJB_WINDOW (user_data);
+  BijiNoteObj *note = self->note;
   g_autoptr (GList) list = NULL;
 
   if (!note)
@@ -429,16 +434,14 @@ on_email_cb (GSimpleAction *action,
              GVariant      *parameter,
              gpointer       user_data)
 {
-  BijiNoteObj *note = bjb_window_base_get_note (BJB_WINDOW_BASE (user_data));
+  BjbWindow *self = user_data;
 
-  if (!note)
-    return;
-
-  on_email_note_callback (note);
+  if (self->note)
+    on_email_note_callback (self->note);
 }
 
 static void
-show_all_notes (BjbWindowBase *self)
+show_all_notes (BjbWindow *self)
 {
   clear_text_in_search_entry (self);
 
@@ -451,7 +454,7 @@ show_all_notes (BjbWindowBase *self)
 }
 
 static void
-show_trash (BjbWindowBase *self)
+show_trash (BjbWindow *self)
 {
   clear_text_in_search_entry (self);
 
@@ -466,7 +469,7 @@ on_show_notebook_cb (GSimpleAction *action,
 {
   const char *note_uuid;
   const char *title;
-  BjbWindowBase *self = BJB_WINDOW_BASE (user_data);
+  BjbWindow *self = BJB_WINDOW (user_data);
   BijiItem *notebook;
   BijiManager *manager;
 
@@ -479,7 +482,7 @@ on_show_notebook_cb (GSimpleAction *action,
     show_trash (self);
   else
   {
-    manager = bjb_window_base_get_manager (GTK_WIDGET (self));
+    manager = bjb_window_get_manager (GTK_WIDGET (self));
     notebook = biji_manager_get_item_at_path (manager, note_uuid);
     bjb_controller_set_notebook (self->controller, BIJI_NOTEBOOK (notebook));
 
@@ -496,8 +499,8 @@ on_trash_cb (GSimpleAction *action,
              GVariant      *parameter,
              gpointer       user_data)
 {
-  BjbWindowBase *self = BJB_WINDOW_BASE (user_data);
-  BijiNoteObj *note = bjb_window_base_get_note (self);
+  BjbWindow *self = BJB_WINDOW (user_data);
+  BijiNoteObj *note = self->note;
 
   if (!note)
     return;
@@ -507,7 +510,10 @@ on_trash_cb (GSimpleAction *action,
   biji_item_trash (BIJI_ITEM (note));
 
   destroy_note_if_needed (self);
-  bjb_window_base_switch_to (self, BJB_WINDOW_BASE_MAIN_VIEW);
+  bjb_window_set_view (self, BJB_WINDOW_MAIN_VIEW);
+
+  if (!bjb_window_get_is_main (self))
+    gtk_window_close (GTK_WINDOW (self));
 }
 
 static void
@@ -531,7 +537,7 @@ on_action_radio (GSimpleAction *action,
 }
 
 static void
-bjb_window_base_save_geometry (BjbWindowBase *self)
+bjb_window_save_geometry (BjbWindow *self)
 {
   GSettings *settings = G_SETTINGS (self->settings);
 
@@ -541,7 +547,7 @@ bjb_window_base_save_geometry (BjbWindowBase *self)
 }
 
 static void
-bjb_window_base_load_geometry (BjbWindowBase *self)
+bjb_window_load_geometry (BjbWindow *self)
 {
   GSettings *settings = G_SETTINGS (self->settings);
 
@@ -553,19 +559,19 @@ bjb_window_base_load_geometry (BjbWindowBase *self)
 /* Just disconnect to avoid crash, the finalize does the real
  * job */
 static void
-bjb_window_base_destroy (gpointer a, BjbWindowBase * self)
+bjb_window_destroy (gpointer a, BjbWindow * self)
 {
   bjb_controller_disconnect (self->controller);
-  bjb_window_base_save_geometry (self);
+  bjb_window_save_geometry (self);
 }
 
 static gboolean
-bjb_window_base_configure_event (GtkWidget         *widget,
-                                 GdkEventConfigure *event)
+bjb_window_configure_event (GtkWidget         *widget,
+                            GdkEventConfigure *event)
 {
-  BjbWindowBase *self;
+  BjbWindow *self;
 
-  self = BJB_WINDOW_BASE (widget);
+  self = BJB_WINDOW (widget);
 
   self->is_maximized = gtk_window_is_maximized (GTK_WINDOW (self));
   if (!self->is_maximized)
@@ -574,13 +580,13 @@ bjb_window_base_configure_event (GtkWidget         *widget,
       gtk_window_get_position (GTK_WINDOW (self), &self->pos_x, &self->pos_y);
     }
 
-  return GTK_WIDGET_CLASS (bjb_window_base_parent_class)->configure_event (widget,
+  return GTK_WIDGET_CLASS (bjb_window_parent_class)->configure_event (widget,
                                                                            event);
 }
 
 static void
 append_notebook (BijiItem      *notebook,
-                 BjbWindowBase *self)
+                 BjbWindow *self)
 {
   const char *note_uuid;
   const char *title;
@@ -625,7 +631,7 @@ static void
 get_all_notebooks_cb (GList   *notebooks,
                       gpointer user_data)
 {
-  BjbWindowBase *self = BJB_WINDOW_BASE (user_data);
+  BjbWindow *self = BJB_WINDOW (user_data);
 
   notebooks = g_list_sort (notebooks, compare_notebook);
   g_list_foreach (notebooks, (GFunc) append_notebook, self);
@@ -643,16 +649,14 @@ static GActionEntry win_entries[] = {
   { "close", on_close },
 };
 
-/* Gobj */
 static void
-bjb_window_base_constructed (GObject *obj)
+bjb_window_constructed (GObject *obj)
 {
   BijiManager *manager;
-  BjbSearchToolbar *search_bar;
-  BjbWindowBase *self = BJB_WINDOW_BASE (obj);
+  BjbWindow *self = BJB_WINDOW (obj);
   GtkListBox *list_box;
 
-  G_OBJECT_CLASS (bjb_window_base_parent_class)->constructed (obj);
+  G_OBJECT_CLASS (bjb_window_parent_class)->constructed (obj);
 
   g_action_map_add_action_entries (G_ACTION_MAP (self),
                                    win_entries,
@@ -664,7 +668,7 @@ bjb_window_base_constructed (GObject *obj)
   gtk_window_set_position (GTK_WINDOW (self), GTK_WIN_POS_CENTER);
   gtk_window_set_title (GTK_WINDOW (self), _(BIJIBEN_MAIN_WIN_TITLE));
 
-  bjb_window_base_load_geometry (self);
+  bjb_window_load_geometry (self);
   gtk_window_set_default_size (GTK_WINDOW (self), self->width, self->height);
 
   if (self->is_maximized)
@@ -672,22 +676,12 @@ bjb_window_base_constructed (GObject *obj)
   else if (self->pos_x >= 0)
     gtk_window_move (GTK_WINDOW (self), self->pos_x, self->pos_y);
 
-  self->controller = bjb_controller_new
-    (bijiben_get_manager (BJB_APPLICATION(g_application_get_default())),
-     GTK_WINDOW (obj),
-     NULL);
-
   self->note_list = bjb_list_view_new ();
-  bjb_list_view_setup (self->note_list, self->controller);
 
   list_box = bjb_list_view_get_list_box (self->note_list);
   g_signal_connect (list_box, "row-activated",
                     G_CALLBACK (on_note_list_row_activated), self);
 
-  /* Search entry toolbar */
-  search_bar = BJB_SEARCH_TOOLBAR (self->search_bar);
-  bjb_search_toolbar_setup (search_bar, GTK_WIDGET(obj), self->controller);
-
   self->spinner = gtk_spinner_new ();
   gtk_stack_add_named (self->main_stack, self->spinner, "spinner");
   gtk_stack_set_visible_child_name (self->main_stack, "spinner");
@@ -701,20 +695,13 @@ bjb_window_base_constructed (GObject *obj)
   gtk_widget_show (GTK_WIDGET (self->main_stack));
 
   /* Populate the filter menu model. */
-  manager = bjb_window_base_get_manager (GTK_WIDGET (self));
+  manager = bjb_window_get_manager (GTK_WIDGET (self));
   biji_get_all_notebooks_async (manager, NULL, get_all_notebooks_cb, self);
 
-  if (self->display_notebooks_changed != 0)
-    g_signal_handler_disconnect (self->controller, self->display_notebooks_changed);
-  self->display_notebooks_changed = g_signal_connect (self->controller,
-                                                      "display-notebooks-changed",
-                                                      G_CALLBACK (on_display_notebooks_changed),
-                                                      self);
-
   /* Connection to window signals */
   g_signal_connect (GTK_WIDGET (self),
                     "destroy",
-                    G_CALLBACK (bjb_window_base_destroy),
+                    G_CALLBACK (bjb_window_destroy),
                     self);
 
   /* Keys */
@@ -728,103 +715,138 @@ bjb_window_base_constructed (GObject *obj)
    * This is a specific type of window not associated with any view */
   if (self->note != NULL)
   {
-    bjb_window_base_load_note_item (self, BIJI_ITEM (self->note));
+    bjb_window_set_note (self, self->note);
   }
 }
 
 
 static void
-bjb_window_base_init (BjbWindowBase *self)
+bjb_window_init (BjbWindow *self)
 {
   gtk_widget_init_template (GTK_WIDGET (self));
 }
 
 static void
-bjb_window_base_class_init (BjbWindowBaseClass *klass)
+bjb_window_class_init (BjbWindowClass *klass)
 {
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GObjectClass   *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  gobject_class->constructed = bjb_window_base_constructed;
-  gobject_class->finalize = bjb_window_base_finalize ;
-  gobject_class->get_property = bjb_window_base_get_property;
-  gobject_class->set_property = bjb_window_base_set_property;
-
-  widget_class->configure_event = bjb_window_base_configure_event;
-
-  bjb_win_base_signals[BJB_WIN_BASE_VIEW_CHANGED] = g_signal_new ("view-changed" ,
-                                                    G_OBJECT_CLASS_TYPE (klass),
-                                                    G_SIGNAL_RUN_LAST,
-                                                    0,
-                                                    NULL,
-                                                    NULL,
-                                                    g_cclosure_marshal_VOID__VOID,
-                                                    G_TYPE_NONE,
-                                                    0);
-
-  bjb_win_base_signals[BJB_WIN_BASE_ACTIVATED] =    g_signal_new ("activated" ,
-                                                    G_OBJECT_CLASS_TYPE (klass),
-                                                    G_SIGNAL_RUN_LAST,
-                                                    0,
-                                                    NULL,
-                                                    NULL,
-                                                    g_cclosure_marshal_VOID__BOOLEAN,
-                                                    G_TYPE_NONE,
-                                                    1,
-                                                    G_TYPE_BOOLEAN);
-
-  properties[PROP_NOTE] = g_param_spec_object ("note",
-                                               "NoteObj",
-                                               "Currently opened note",
-                                               BIJI_TYPE_NOTE_OBJ,
-                                               G_PARAM_READWRITE |
-                                               G_PARAM_CONSTRUCT |
-                                               G_PARAM_STATIC_STRINGS);
-
-  g_object_class_install_properties (gobject_class, NUM_PROPERTIES, properties);
-
-  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Notes/ui/bjb-window-base.ui");
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, main_leaflet);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, header_group);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, main_stack);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, back_button);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, headerbar);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, filter_label);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, filter_menu_button);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, note_box);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, note_headerbar);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, notebooks_box);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, sidebar_box);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, search_bar);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, title_entry);
-  gtk_widget_class_bind_template_child (widget_class, BjbWindowBase, last_update_item);
+  object_class->constructed = bjb_window_constructed;
+  object_class->finalize = bjb_window_finalize;
+
+  widget_class->configure_event = bjb_window_configure_event;
+
+  signals[VIEW_CHANGED] = g_signal_new ("view-changed",
+                                        G_OBJECT_CLASS_TYPE (klass),
+                                        G_SIGNAL_RUN_LAST,
+                                        0,
+                                        NULL,
+                                        NULL,
+                                        g_cclosure_marshal_VOID__VOID,
+                                        G_TYPE_NONE,
+                                        0);
+
+  signals[ACTIVATED] = g_signal_new ("activated",
+                                     G_OBJECT_CLASS_TYPE (klass),
+                                     G_SIGNAL_RUN_LAST,
+                                     0,
+                                     NULL,
+                                     NULL,
+                                     g_cclosure_marshal_VOID__BOOLEAN,
+                                     G_TYPE_NONE,
+                                     1,
+                                     G_TYPE_BOOLEAN);
+
+  gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/Notes/ui/bjb-window.ui");
+
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, main_leaflet);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, header_group);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, main_stack);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, back_button);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, headerbar);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, filter_label);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, filter_menu_button);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, note_box);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, note_headerbar);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, notebooks_box);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, sidebar_box);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, search_bar);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, title_entry);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, new_window_item);
+  gtk_widget_class_bind_template_child (widget_class, BjbWindow, last_update_item);
+
   gtk_widget_class_bind_template_callback (widget_class, on_back_button_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_new_note_clicked);
   gtk_widget_class_bind_template_callback (widget_class, on_title_changed);
 }
 
-
-GtkWindow *
-bjb_window_base_new                    (BijiNoteObj *note)
+GtkWidget *
+bjb_window_new (void)
 {
-  return g_object_new (BJB_TYPE_WINDOW_BASE,
+  return g_object_new (BJB_TYPE_WINDOW,
                        "application", g_application_get_default(),
-                       "note", note,
                        NULL);
 }
 
-BijiNoteObj *
-bjb_window_base_get_note (BjbWindowBase *self)
+gboolean
+bjb_window_get_is_main (BjbWindow *self)
 {
-  g_return_val_if_fail (BJB_IS_WINDOW_BASE (self), NULL);
+  g_return_val_if_fail (BJB_IS_WINDOW (self), FALSE);
 
-  return self->note;
+  return self->is_main;
 }
 
 void
-bjb_window_base_switch_to (BjbWindowBase *self, BjbWindowViewType type)
+bjb_window_set_is_main (BjbWindow *self,
+                        gboolean   is_main)
 {
-  switch (type)
+  g_return_if_fail (BJB_IS_WINDOW (self));
+
+  if (is_main)
+    {
+      if (!self->controller)
+        self->controller = bjb_controller_new (bijiben_get_manager (BJB_APPLICATION 
(g_application_get_default())),
+                                               GTK_WINDOW (self), NULL);
+      if (!self->display_notebooks_changed)
+        {
+          BjbSearchToolbar *search_bar;
+
+          search_bar = BJB_SEARCH_TOOLBAR (self->search_bar);
+          bjb_list_view_setup (self->note_list, self->controller);
+          bjb_search_toolbar_setup (search_bar, GTK_WIDGET (self), self->controller);
+        }
+
+      g_clear_signal_handler (&self->display_notebooks_changed, self->controller);
+      self->display_notebooks_changed = g_signal_connect (self->controller,
+                                                          "display-notebooks-changed",
+                                                          G_CALLBACK (on_display_notebooks_changed),
+                                                          self);
+    }
+
+  if (!is_main)
+    hdy_leaflet_navigate (self->main_leaflet, HDY_NAVIGATION_DIRECTION_FORWARD);
+  gtk_widget_set_visible (self->sidebar_box, is_main);
+  gtk_widget_set_visible (self->new_window_item, is_main);
+  gtk_widget_set_visible (self->back_button, is_main);
+  self->is_main = !!is_main;
+}
+
+BjbWindowView
+bjb_window_get_view (BjbWindow *self)
+{
+  g_return_val_if_fail (BJB_IS_WINDOW (self), BJB_WINDOW_MAIN_VIEW);
+
+  return self->current_view;
+}
+
+void
+bjb_window_set_view (BjbWindow     *self,
+                     BjbWindowView  view)
+{
+  g_return_if_fail (BJB_IS_WINDOW (self));
+
+  switch (view)
   {
 
     /* Precise the window does not display any specific note
@@ -834,24 +856,24 @@ bjb_window_base_switch_to (BjbWindowBase *self, BjbWindowViewType type)
      * main view & archive view are the same widget
      */
 
-    case BJB_WINDOW_BASE_MAIN_VIEW:
+    case BJB_WINDOW_MAIN_VIEW:
       hdy_leaflet_navigate (self->main_leaflet, HDY_NAVIGATION_DIRECTION_BACK);
       gtk_widget_show (GTK_WIDGET (self->search_bar));
       gtk_stack_set_visible_child_name (self->main_stack, "main-view");
       break;
 
-   case BJB_WINDOW_BASE_ARCHIVE_VIEW:
+   case BJB_WINDOW_ARCHIVE_VIEW:
       gtk_widget_show (GTK_WIDGET (self->search_bar));
       gtk_stack_set_visible_child_name (self->main_stack, "main-view");
       break;
 
-    case BJB_WINDOW_BASE_SPINNER_VIEW:
+    case BJB_WINDOW_SPINNER_VIEW:
       gtk_widget_hide (GTK_WIDGET (self->search_bar));
       gtk_stack_set_visible_child_name (self->main_stack, "spinner");
       break;
 
 
-    case BJB_WINDOW_BASE_NO_NOTE:
+    case BJB_WINDOW_NO_NOTE:
       bjb_empty_results_box_set_type (BJB_EMPTY_RESULTS_BOX (self->no_note),
                                       BJB_EMPTY_RESULTS_NO_NOTE);
       gtk_widget_show (self->no_note);
@@ -860,7 +882,7 @@ bjb_window_base_switch_to (BjbWindowBase *self, BjbWindowViewType type)
       break;
 
 
-    case BJB_WINDOW_BASE_NO_RESULT:
+    case BJB_WINDOW_NO_RESULT:
       bjb_empty_results_box_set_type (BJB_EMPTY_RESULTS_BOX (self->no_note),
                                       BJB_EMPTY_RESULTS_NO_RESULTS);
       gtk_widget_show (self->no_note);
@@ -868,7 +890,7 @@ bjb_window_base_switch_to (BjbWindowBase *self, BjbWindowViewType type)
       break;
 
 
-    case BJB_WINDOW_BASE_ERROR_TRACKER:
+    case BJB_WINDOW_ERROR_TRACKER:
       bjb_empty_results_box_set_type (BJB_EMPTY_RESULTS_BOX (self->no_note),
                                       BJB_EMPTY_RESULTS_TRACKER);
       gtk_widget_show_all (self->no_note);
@@ -877,23 +899,23 @@ bjb_window_base_switch_to (BjbWindowBase *self, BjbWindowViewType type)
       break;
 
 
-    case BJB_WINDOW_BASE_NOTE_VIEW:
+    case BJB_WINDOW_NOTE_VIEW:
       break;
 
 
-    case BJB_WINDOW_BASE_NO_VIEW:
+    case BJB_WINDOW_NO_VIEW:
     default:
       return;
   }
 
-  self->current_view = type;
+  self->current_view = view;
 
-  g_signal_emit (G_OBJECT (self), bjb_win_base_signals[BJB_WIN_BASE_VIEW_CHANGED],0);
+  g_signal_emit (G_OBJECT (self), signals[VIEW_CHANGED], 0);
 }
 
 static void
-on_last_updated_cb (BijiItem      *note,
-                    BjbWindowBase *self)
+on_last_updated_cb (BijiItem  *note,
+                    BjbWindow *self)
 {
   g_autofree char *label = NULL;
   g_autofree char *time_str = NULL;
@@ -909,7 +931,7 @@ on_last_updated_cb (BijiItem      *note,
 }
 
 static void
-populate_headerbar_for_note_view (BjbWindowBase *self)
+populate_headerbar_for_note_view (BjbWindow *self)
 {
   on_note_renamed (BIJI_ITEM (self->note), self);
   g_signal_connect (self->note, "renamed", G_CALLBACK (on_note_renamed), self);
@@ -922,76 +944,73 @@ static gboolean
 on_note_trashed (BijiNoteObj *note,
                  gpointer     user_data)
 {
-  BjbWindowBase *self = BJB_WINDOW_BASE (user_data);
+  BjbWindow *self = BJB_WINDOW (user_data);
 
   destroy_note_if_needed (self);
-  bjb_window_base_switch_to (self, BJB_WINDOW_BASE_MAIN_VIEW);
+  bjb_window_set_view (self, BJB_WINDOW_MAIN_VIEW);
 
   return TRUE;
 }
 
+BijiNoteObj *
+bjb_window_get_note (BjbWindow *self)
+{
+  g_return_val_if_fail (BJB_IS_WINDOW (self), NULL);
+
+  return self->note;
+}
+
 void
-bjb_window_base_load_note_item (BjbWindowBase *self, BijiItem *item)
+bjb_window_set_note (BjbWindow   *self,
+                     BijiNoteObj *note)
 {
   GtkWidget *w = GTK_WIDGET (self);
 
+  g_return_if_fail (BJB_IS_WINDOW (self));
+  g_return_if_fail (!note || BIJI_IS_NOTE_OBJ (note));
+
   /* Disconnect these two callbacks for previously opened note item. */
-  if (self->note_deleted != 0)
-  {
-    g_signal_handler_disconnect (self->note, self->note_deleted);
-    self->note_deleted = 0;
-  }
-  if (self->note_trashed != 0)
-  {
-    g_signal_handler_disconnect (self->note, self->note_trashed);
-    self->note_trashed = 0;
-  }
+  if (self->note)
+    {
+      g_clear_signal_handler (&self->note_deleted, self->note);
+      g_clear_signal_handler (&self->note_trashed, self->note);
+    }
 
   destroy_note_if_needed (self);
 
-  if (BIJI_IS_NOTE_OBJ (item))
-  {
-    BijiNoteObj *note = BIJI_NOTE_OBJ (item);
+  if (!note)
+    return;
 
-    self->note = note;
-    self->note_view = bjb_note_view_new (w, note);
-    gtk_box_pack_end (GTK_BOX (self->note_box), GTK_WIDGET (self->note_view), TRUE, TRUE, 0);
-    gtk_widget_show (GTK_WIDGET (self->note_view));
-    bjb_note_view_grab_focus (self->note_view);
+  self->note = g_object_ref (note);
+  self->note_view = bjb_note_view_new (w, note);
+  gtk_box_pack_end (GTK_BOX (self->note_box), GTK_WIDGET (self->note_view), TRUE, TRUE, 0);
+  gtk_widget_show (GTK_WIDGET (self->note_view));
+  bjb_note_view_grab_focus (self->note_view);
 
-    self->note_deleted = g_signal_connect (self->note, "deleted",
-                                           G_CALLBACK (on_note_trashed), self);
-    self->note_trashed = g_signal_connect (self->note, "trashed",
-                                           G_CALLBACK (on_note_trashed), self);
+  self->note_deleted = g_signal_connect (self->note, "deleted",
+                                         G_CALLBACK (on_note_trashed), self);
+  self->note_trashed = g_signal_connect (self->note, "trashed",
+                                         G_CALLBACK (on_note_trashed), self);
 
-    populate_headerbar_for_note_view (self);
-  }
-}
-
-BjbWindowViewType
-bjb_window_base_get_view_type (BjbWindowBase *self)
-{
-  return self->current_view;
+  populate_headerbar_for_note_view (self);
 }
 
 BijiManager *
-bjb_window_base_get_manager(GtkWidget * win)
+bjb_window_get_manager (GtkWidget *win)
 {
   return bijiben_get_manager (BJB_APPLICATION (g_application_get_default()));
 }
 
 void
-bjb_window_base_set_active (BjbWindowBase *self, gboolean active)
+bjb_window_set_active (BjbWindow *self,
+                       gboolean   active)
 {
   gboolean available;
 
-  available = (self->current_view == BJB_WINDOW_BASE_MAIN_VIEW);
+  g_return_if_fail (BJB_IS_WINDOW (self));
+
+  available = (self->current_view == BJB_WINDOW_MAIN_VIEW);
 
   if (active == TRUE)
-  {
-    g_signal_emit (self,
-                   bjb_win_base_signals[BJB_WIN_BASE_ACTIVATED],
-                   0,
-                   available);
-  }
+    g_signal_emit (self, signals[ACTIVATED], 0, available);
 }
diff --git a/src/bjb-window.h b/src/bjb-window.h
new file mode 100644
index 00000000..10c04fba
--- /dev/null
+++ b/src/bjb-window.h
@@ -0,0 +1,59 @@
+/* bjb-window.h
+ *
+ * Copyright 2012, 2013 Pierre-Yves Luyten <py luyten fr>
+ * Copyright 2020 Jonathan Kang <jonathankang gnome org>
+ * Copyright 2021 Mohammed Sadiq <sadiq sadiqpk org>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ * SPDX-License-Identifier: GPL-3.0-or-later
+ */
+
+
+#pragma once
+
+#include <gtk/gtk.h>
+#include <handy.h>
+#include <libbiji/libbiji.h>
+
+#include "bjb-controller.h"
+
+#define BJB_TYPE_WINDOW (bjb_window_get_type ())
+
+G_DECLARE_FINAL_TYPE (BjbWindow, bjb_window, BJB, WINDOW, HdyApplicationWindow)
+
+typedef enum {
+  BJB_WINDOW_MAIN_VIEW,
+  BJB_WINDOW_ARCHIVE_VIEW,
+  BJB_WINDOW_SPINNER_VIEW,
+  BJB_WINDOW_NOTE_VIEW,
+  BJB_WINDOW_NO_NOTE,
+  BJB_WINDOW_NO_RESULT,
+  BJB_WINDOW_ERROR_TRACKER,
+  BJB_WINDOW_NO_VIEW
+} BjbWindowView;
+
+GtkWidget       *bjb_window_new            (void);
+gboolean         bjb_window_get_is_main    (BjbWindow     *self);
+void             bjb_window_set_is_main    (BjbWindow     *self,
+                                            gboolean       is_main);
+BjbWindowView    bjb_window_get_view       (BjbWindow     *self);
+void             bjb_window_set_view       (BjbWindow     *self,
+                                            BjbWindowView  view);
+BijiNoteObj     *bjb_window_get_note       (BjbWindow     *self);
+void             bjb_window_set_note       (BjbWindow     *self,
+                                            BijiNoteObj   *note);
+BijiManager     *bjb_window_get_manager    (GtkWidget     *win);
+void             bjb_window_set_active     (BjbWindow     *self,
+                                            gboolean      active);
diff --git a/src/meson.build b/src/meson.build
index 4961f9d0..c3e26fd7 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -24,7 +24,7 @@ sources = files(
   'bjb-settings.c',
   'bjb-settings-dialog.c',
   'bjb-share.c',
-  'bjb-window-base.c'
+  'bjb-window.c'
 )
 
 sources += gnome.compile_resources(


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