[bijiben] noteView : use mainToolbar rather own toolbar



commit 6a721f0249ee5886bd34457a365a78c2f96bd808
Author: Pierre-Yves Luyten <py luyten fr>
Date:   Wed Apr 24 00:19:37 2013 +0200

    noteView : use mainToolbar rather own toolbar
    
    Change MainToolbar implementation to handle also note view.
    This is a bit more simple

 src/bjb-app-menu.c     |    2 +-
 src/bjb-bijiben.c      |    2 +-
 src/bjb-main-toolbar.c |  490 ++++++++++++++++++++++++++++++++++++++----------
 src/bjb-main-toolbar.h |   10 +-
 src/bjb-main-view.c    |  102 +++++++++--
 src/bjb-main-view.h    |   13 ++
 src/bjb-note-view.c    |  298 +----------------------------
 src/bjb-window-base.c  |   81 ++++++---
 src/bjb-window-base.h  |   10 +-
 9 files changed, 568 insertions(+), 440 deletions(-)
---
diff --git a/src/bjb-app-menu.c b/src/bjb-app-menu.c
index 2faf4dc..72163a5 100644
--- a/src/bjb-app-menu.c
+++ b/src/bjb-app-menu.c
@@ -49,7 +49,7 @@ new_activated (GSimpleAction *action,
   BjbWindowBase *win;
 
   win = BJB_WINDOW_BASE (bjb_window_base_new());
-  bjb_window_base_switch_to (win, BJB_MAIN_VIEW);
+  bjb_window_base_switch_to (win, BJB_WINDOW_BASE_MAIN_VIEW);
 }
 
 /* Import external data - TODO : BJB_TYPE_IMPORT_DIALOG.c */
diff --git a/src/bjb-bijiben.c b/src/bjb-bijiben.c
index a989318..95fca66 100644
--- a/src/bjb-bijiben.c
+++ b/src/bjb-bijiben.c
@@ -61,7 +61,7 @@ bijiben_new_window_internal (GApplication *app,
 
   else
   {
-    bjb_window_base_switch_to (BJB_WINDOW_BASE (win), BJB_MAIN_VIEW);
+    bjb_window_base_switch_to (BJB_WINDOW_BASE (win), BJB_WINDOW_BASE_MAIN_VIEW);
     gtk_widget_show_all (GTK_WIDGET (win)); // FIXME not here
   }
 }
diff --git a/src/bjb-main-toolbar.c b/src/bjb-main-toolbar.c
index 39ce019..8e53521 100644
--- a/src/bjb-main-toolbar.c
+++ b/src/bjb-main-toolbar.c
@@ -17,47 +17,59 @@
 
 #include <glib/gi18n.h>
 
+#include "bjb-bijiben.h"
+#include "bjb-color-button.h"
 #include "bjb-main-toolbar.h"
+#include "bjb-note-tag-dialog.h"
 #include "bjb-rename-note.h"
+#include "bjb-share.h"
 #include "bjb-window-base.h"
+#include "utils/bjb-icons-colors.h"
 
-/* select_mode + two different standard mode */
+/* All needed toolbars */
 typedef enum
 {
   BJB_TOOLBAR_0,
   BJB_TOOLBAR_STD_LIST,
   BJB_TOOLBAR_STD_ICON,
   BJB_TOOLBAR_SELECT,
+  BJB_TOOLBAR_NOTE_VIEW,
   BJB_TOOLBAR_NUM
-} BjbToolbarType ;
+} BjbToolbarType;
+
+/* Color Button */
+#define COLOR_SIZE 24
 
 struct _BjbMainToolbarPrivate
 {
   /* Controllers */
-  GdMainView     *view;
-  BjbToolbarType  type;
-  BjbMainView    *parent;
-  BjbController  *controller;
-
-  /* Buttons */
-  GtkWidget      *new;  
-  GtkWidget      *list;
-  GtkWidget      *grid;
-  GtkWidget      *select;
-  GtkWidget      *search;
-
-  /* Signal Handlers */
-  gulong         finish_sig;
-  gulong         update_selection;
-  gulong         search_handler;
-  gulong         display_notes;
+  BjbToolbarType    type;
+  BjbMainView      *parent;
+  BjbController    *controller;
+  GtkWindow        *window;
+
+  /* Main View */
+  GtkWidget        *new;
+  GtkWidget        *list;
+  GtkWidget        *grid;
+  GtkWidget        *select;
+  GtkWidget        *search;
+  gulong            finish_sig;
+  gulong            update_selection;
+  gulong            search_handler;
+  gulong            display_notes;
+
+  /* When note view */
+  BijiNoteObj      *note;
+  gulong            note_renamed;
+  gulong            note_color_changed;
+  GtkAccelGroup    *accel;
 };
 
 /* GObject properties */
 
 enum {
   PROP_0,
-  PROP_VIEW,
   PROP_PARENT,
   PROP_CONTROLLER,
   NUM_PROPERTIES
@@ -78,7 +90,7 @@ on_new_note_clicked (GtkWidget *but, BjbMainView *view)
   BijiNoteBook *book ;
 
   /* append note to collection */
-  book = bjb_window_base_get_book(bjb_main_view_get_window(view));
+  book = bjb_window_base_get_book (bjb_main_view_get_window (view));
   result = biji_note_book_get_new_note_from_string (book, "");
 
   /* Go to that note */
@@ -87,53 +99,77 @@ on_new_note_clicked (GtkWidget *but, BjbMainView *view)
 
 static void populate_main_toolbar(BjbMainToolbar *self);
 
+static gboolean
+update_selection_label (BjbMainToolbar *self)
+{
+  GList *selected;
+  gint length;
+  gchar *label;
+
+  selected = bjb_main_view_get_selection (self->priv->parent);
+  length = g_list_length (selected);
+  g_list_free (selected);
+
+  if (length == 0)
+    label = g_strdup(_("Click on items to select them"));
+  else
+    label = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%d selected", "%d selected", length),length);
+
+  gd_main_toolbar_set_labels (GD_MAIN_TOOLBAR (self), NULL, label);
+  g_free (label);
+
+  return TRUE;
+}
+
 void
-on_selection_mode_changed (BjbMainToolbar *self)
+on_view_selection_changed_cb (BjbMainToolbar *self)
 {
   GtkStyleContext *context;
-  GdMainView *view = self->priv->view;
-  GtkWidget *widget = GTK_WIDGET(self);
+  GtkWidget *widget = GTK_WIDGET (self);
   context = gtk_widget_get_style_context (widget);
 
-  if (!gd_main_view_get_selection_mode (view))
+  g_return_if_fail (BJB_IS_MAIN_TOOLBAR (self));
+
+  if (!bjb_main_view_get_selection_mode (self->priv->parent))
     gtk_style_context_remove_class (context, "selection-mode");
 
   else
     gtk_style_context_add_class (context, "selection-mode");
 
   gtk_widget_reset_style (widget);
-  populate_main_toolbar(self);
-  return ;
+  populate_main_toolbar (self);
+
+  if (self->priv->type == BJB_TOOLBAR_SELECT)
+    update_selection_label (self);
+
+  return;
 }
 
 static void
 on_selection_mode_clicked (GtkWidget *button, BjbMainToolbar *self)
 {
-  if (gd_main_view_get_selection_mode (self->priv->view))
-    gd_main_view_set_selection_mode (self->priv->view, FALSE);
+  if (bjb_main_view_get_selection_mode (self->priv->parent))
+    bjb_main_view_set_selection_mode (self->priv->parent, FALSE);
 
   else
-    gd_main_view_set_selection_mode (self->priv->view, TRUE);
-
-  on_selection_mode_changed (self);
+    bjb_main_view_set_selection_mode (self->priv->parent, TRUE);
 }
 
 static gboolean
 on_view_mode_clicked (GtkWidget *button, BjbMainToolbar *self)
 {
-  GdMainView *view = self->priv->view ;
-  GdMainViewType current = gd_main_view_get_view_type(view);
+  GdMainViewType current = bjb_main_view_get_view_type (self->priv->parent);
     
   switch ( current )
   {
     case GD_MAIN_VIEW_ICON :
-      gd_main_view_set_view_type ( view ,GD_MAIN_VIEW_LIST );
+      bjb_main_view_set_view_type (self->priv->parent ,GD_MAIN_VIEW_LIST );
       break ;
     case GD_MAIN_VIEW_LIST :
-      gd_main_view_set_view_type ( view ,GD_MAIN_VIEW_ICON );
+      bjb_main_view_set_view_type (self->priv->parent, GD_MAIN_VIEW_ICON );
       break ;
     default:
-      gd_main_view_set_view_type ( view ,GD_MAIN_VIEW_ICON );
+      bjb_main_view_set_view_type (self->priv->parent, GD_MAIN_VIEW_ICON );
   }
 
   bjb_main_view_update_model (self->priv->parent);
@@ -207,28 +243,6 @@ update_selection_buttons (BjbMainToolbarPrivate *priv)
   gtk_widget_set_sensitive (priv->select, some_note_is_visible);
 }
 
-static gboolean
-update_selection_label (GdMainView *view, BjbMainToolbar *self)
-{
-  GList *selected;
-  gint length;
-  gchar *label;
-
-  selected = gd_main_view_get_selection(view);
-  length = g_list_length (selected);
-  g_list_free (selected);
-
-  if (length == 0)
-    label = g_strdup(_("Click on items to select them"));
-  else
-    label = g_strdup_printf (g_dngettext (GETTEXT_PACKAGE, "%d selected", "%d selected", length),length);
-
-  gd_main_toolbar_set_labels (GD_MAIN_TOOLBAR (self), NULL, label);
-  g_free (label);
-
-  return TRUE;
-}
-
 static void
 populate_bar_for_selection (BjbMainToolbar *self)
 {
@@ -248,12 +262,7 @@ populate_bar_for_selection (BjbMainToolbar *self)
   g_signal_connect (priv->select, "clicked",
                     G_CALLBACK (on_selection_mode_clicked), self);
 
-  priv->update_selection = g_signal_connect(priv->view,
-                                            "view-selection-changed",
-                                            G_CALLBACK(update_selection_label),
-                                            self);
-
-  update_selection_label(priv->view,self);
+  update_selection_label (self);
 }
 
 static void
@@ -353,6 +362,283 @@ populate_bar_for_list_view(BjbMainToolbar *self)
   populate_bar_for_standard(self);
 }
 
+
+static void
+disconnect_note_handlers (BjbMainToolbarPrivate *priv)
+{
+  if (priv->accel)
+    gtk_window_remove_accel_group (priv->window, priv->accel);
+
+  if (priv->note_renamed != 0)
+  {
+    g_signal_handler_disconnect (priv->note, priv->note_renamed);
+    priv->note_renamed = 0;
+  }
+
+  if (priv->note_color_changed != 0)
+  {
+    g_signal_handler_disconnect (priv->note, priv->note_color_changed);
+    priv->note_color_changed = 0;
+  }
+
+  priv->note = NULL;
+}
+
+static void
+just_switch_to_main_view (BjbMainToolbar *self)
+{
+  disconnect_note_handlers (self->priv);
+  bjb_window_base_switch_to (BJB_WINDOW_BASE (self->priv->window),
+                             BJB_WINDOW_BASE_MAIN_VIEW);
+}
+
+static void
+on_note_renamed (BijiNoteObj *note,
+                 BjbMainToolbar *self)
+{
+  gd_main_toolbar_set_labels (
+            GD_MAIN_TOOLBAR (self),
+            biji_note_obj_get_title (note),
+            NULL);
+}
+
+static void
+on_color_button_clicked (GtkColorButton *button,
+                         BjbMainToolbar *bar)
+{
+  GdkRGBA color;
+
+  if (!bar->priv->note)
+    return;
+
+  gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color);
+  biji_note_obj_set_rgba (bar->priv->note, &color);
+}
+
+static void
+on_note_color_changed (BijiNoteObj *note, GtkColorButton *button)
+{
+  GdkRGBA color;
+
+  if (biji_note_obj_get_rgba (note, &color))
+    gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (button), &color);
+}
+
+static void
+bjb_toggle_bullets (BijiWebkitEditor *editor)
+{
+  biji_webkit_editor_apply_format (editor, BIJI_BULLET_LIST);
+}
+
+static void
+bjb_toggle_list (BijiWebkitEditor *editor)
+{
+  biji_webkit_editor_apply_format (editor, BIJI_ORDER_LIST);
+}
+
+static void
+action_view_tags_callback (GtkWidget *item, gpointer user_data)
+{
+  BjbMainToolbar *self = BJB_MAIN_TOOLBAR (user_data);
+  GList *list = NULL;
+
+  list = g_list_append (list, self->priv->note);
+  bjb_note_tag_dialog_new (self->priv->window, list);
+  g_list_free (list);
+}
+
+static void
+delete_item_callback (GtkWidget *item, gpointer user_data)
+{
+  BjbMainToolbar *self = BJB_MAIN_TOOLBAR (user_data);
+
+  /* Delete the note from collection
+   * The deleted note will emit a signal. */
+  biji_note_book_remove_note (
+          bjb_window_base_get_book (GTK_WIDGET (self->priv->window)),
+          self->priv->note);
+}
+
+static void
+action_rename_note_callback (GtkWidget *item, gpointer user_data)
+{
+  BjbMainToolbar        *bar;
+  BjbMainToolbarPrivate *priv;
+  gchar                 *title;
+
+  bar = BJB_MAIN_TOOLBAR (user_data);
+  priv = bar->priv;
+
+  title = note_title_dialog (priv->window,
+                             _("Rename Note"),
+                             biji_note_obj_get_title (priv->note));
+
+  if (!title)
+    return;
+
+  biji_note_obj_set_title (priv->note, title);
+  biji_note_obj_save_note (priv->note); //FIXME libbiji needs to to this auto
+}
+
+GtkWidget *
+bjb_note_menu_new (BjbMainToolbar *self)
+{
+  BjbMainToolbarPrivate *priv = self->priv;
+  GtkWidget             *result, *item;
+  BijiWebkitEditor      *editor;
+
+  result = gtk_menu_new();
+  editor = BIJI_WEBKIT_EDITOR (biji_note_obj_get_editor (priv->note));
+
+  /* Undo Redo separator */
+  item = gtk_menu_item_new_with_label (_("Undo"));
+  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
+  g_signal_connect_swapped (item, "activate",
+                            G_CALLBACK (webkit_web_view_undo), editor);
+  gtk_widget_add_accelerator (item, "activate", priv->accel, GDK_KEY_u,
+                             GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+  gtk_widget_show (item);
+
+  item = gtk_menu_item_new_with_label (_("Redo"));
+  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
+  g_signal_connect_swapped (item, "activate",
+                            G_CALLBACK (webkit_web_view_redo), editor);
+  gtk_widget_add_accelerator (item, "activate", priv->accel, GDK_KEY_r,
+                             GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+  gtk_widget_show (item);
+
+  item = gtk_separator_menu_item_new ();
+  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
+  gtk_widget_show (item);
+
+  /* Bullets, ordered list, separator */
+  /* Bullets : unordered list format */
+  item = gtk_menu_item_new_with_label (_("Bullets"));
+  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
+  g_signal_connect_swapped (item, "activate",
+                            G_CALLBACK (bjb_toggle_bullets), editor);
+  gtk_widget_show (item);
+
+  /* Ordered list as 1.mouse 2.cats 3.dogs */
+  item = gtk_menu_item_new_with_label (_("List"));
+  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
+  g_signal_connect_swapped (item, "activate",
+                            G_CALLBACK (bjb_toggle_list), editor);
+  gtk_widget_show(item);
+
+  item = gtk_separator_menu_item_new ();
+  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
+  gtk_widget_show (item);
+
+  /* Rename, view tags, separtor */
+  item = gtk_menu_item_new_with_label(_("Rename"));
+  gtk_menu_shell_append(GTK_MENU_SHELL(result),item);
+  g_signal_connect(item,"activate",
+                   G_CALLBACK(action_rename_note_callback),self);
+  gtk_widget_show(item);
+
+  item = gtk_menu_item_new_with_label(_("Tags"));
+  gtk_menu_shell_append(GTK_MENU_SHELL(result),item);
+  g_signal_connect(item,"activate",
+                   G_CALLBACK(action_view_tags_callback),self);
+  gtk_widget_show(item);
+
+  item = gtk_separator_menu_item_new ();
+  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
+  gtk_widget_show (item);
+
+  /* Delete Note */
+  item = gtk_menu_item_new_with_label(_("Delete this Note"));
+  gtk_menu_shell_append(GTK_MENU_SHELL(result),item);
+  g_signal_connect(item,"activate",
+                   G_CALLBACK(delete_item_callback),self);
+  gtk_widget_show(item);
+
+  return result;
+}
+
+static void
+populate_bar_for_note_view (BjbMainToolbar *self)
+{
+  BjbMainToolbarPrivate *priv = self->priv;
+  GdMainToolbar         *bar = GD_MAIN_TOOLBAR (self);
+  BjbSettings           *settings;
+  GtkWidget             *grid, *notes_icon, *notes_label, *button;
+  GdkRGBA                color;
+
+  priv->note = bjb_window_base_get_note (BJB_WINDOW_BASE (self->priv->window));
+
+  if (!priv->note) /* no reason this would happen */
+    return;
+
+  settings = bjb_app_get_settings (g_application_get_default());
+  priv->accel = gtk_accel_group_new ();
+  gtk_window_add_accel_group (priv->window, priv->accel);
+
+  /* Go to main view basically means closing note */
+  grid = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 2);
+  notes_icon = get_icon ("go-previous-symbolic");
+  gtk_box_pack_start (GTK_BOX (grid), notes_icon, TRUE, TRUE, TRUE);
+
+  notes_label = gtk_label_new (_("Notes"));
+  gtk_box_pack_start (GTK_BOX (grid), notes_label, TRUE, TRUE, TRUE);
+
+  button = gd_main_toolbar_add_button (bar, NULL, NULL, TRUE);
+
+  gtk_container_add (GTK_CONTAINER (button), grid);
+
+  g_signal_connect_swapped (button, "clicked",
+                            G_CALLBACK (just_switch_to_main_view), self);
+  gtk_widget_add_accelerator (button, "activate", self->priv->accel,
+                              GDK_KEY_w, GDK_CONTROL_MASK, GTK_ACCEL_MASK);
+
+  /* Note Title */
+  gd_main_toolbar_set_labels (bar, biji_note_obj_get_title (priv->note), NULL);
+
+  self->priv->note_renamed = g_signal_connect (priv->note,"renamed",
+                                    G_CALLBACK (on_note_renamed), self);
+
+
+  /* Note Color */
+  if (!biji_note_obj_get_rgba (priv->note, &color))
+  {
+    gchar *default_color;
+
+    g_object_get (G_OBJECT(settings),"color", &default_color, NULL);
+    gdk_rgba_parse (&color, default_color);
+    g_free (default_color);
+  }
+
+  button = bjb_color_button_new ();
+  gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (button), &color);
+
+  gd_main_toolbar_add_widget (bar, button, FALSE);
+  gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (button)),
+                               COLOR_SIZE, COLOR_SIZE);
+  gtk_widget_show (button);
+
+  g_signal_connect (button, "color-set",
+                    G_CALLBACK (on_color_button_clicked), self);
+  priv->note_color_changed = g_signal_connect (priv->note, "color-changed",
+                             G_CALLBACK (on_note_color_changed), button);
+
+  /* Sharing */
+  button = gd_main_toolbar_add_button (bar, "send-to-symbolic",
+                                       NULL, FALSE);
+
+  g_signal_connect (button, "clicked",
+                    G_CALLBACK (on_email_note_callback), priv->note);
+
+  /* Menu */
+  button = gd_main_toolbar_add_menu (bar,
+                                     "emblem-system-symbolic",
+                                     NULL,
+                                     FALSE);
+
+  gtk_menu_button_set_popup (GTK_MENU_BUTTON (button),
+                             bjb_note_menu_new (self));
+}
+
 static void
 populate_bar_switch(BjbMainToolbar *self)
 {
@@ -374,8 +660,12 @@ populate_bar_switch(BjbMainToolbar *self)
       update_selection_buttons (self->priv);
       break;
 
+    case BJB_TOOLBAR_NOTE_VIEW:
+      populate_bar_for_note_view (self);
+      break;
+
     default:
-      g_warning("Main Toolbar implementation is erroneous.\
+      g_warning ("Main Toolbar implementation is erroneous.\
                  Please fill in a bug report");
   }
 
@@ -387,19 +677,29 @@ populate_main_toolbar(BjbMainToolbar *self)
 {
   BjbMainToolbarPrivate *priv = self->priv;
   BjbToolbarType to_be = BJB_TOOLBAR_0 ;
+  BjbWindowViewType view_type;
+
+  view_type = bjb_window_base_get_view_type (BJB_WINDOW_BASE (priv->window));
+
+  if (view_type == BJB_WINDOW_BASE_NOTE_VIEW)
+    to_be = BJB_TOOLBAR_NOTE_VIEW;
 
-  if (gd_main_view_get_selection_mode(priv->view) == TRUE)
+  else if (bjb_main_view_get_selection_mode (priv->parent) == TRUE)
     to_be = BJB_TOOLBAR_SELECT;
 
-  else if (gd_main_view_get_view_type(priv->view) == GD_MAIN_VIEW_ICON)
+  else if (bjb_main_view_get_view_type (priv->parent) == GD_MAIN_VIEW_ICON)
     to_be = BJB_TOOLBAR_STD_ICON;
 
-  else if (gd_main_view_get_view_type(priv->view) == GD_MAIN_VIEW_LIST)
+  else if (bjb_main_view_get_view_type (priv->parent) == GD_MAIN_VIEW_LIST)
     to_be = BJB_TOOLBAR_STD_LIST;
-  
+
   /* Simply clear then populate */
   if (to_be != priv->type)
   {
+    /* If we leave a note view */
+    if (priv->type == BJB_TOOLBAR_NOTE_VIEW)
+      disconnect_note_handlers (priv);
+
     priv->type = to_be;
     gd_main_toolbar_clear (GD_MAIN_TOOLBAR (self));
 
@@ -422,6 +722,14 @@ populate_main_toolbar(BjbMainToolbar *self)
 static void
 bjb_main_toolbar_constructed (GObject *obj)
 {
+  BjbMainToolbar *self = BJB_MAIN_TOOLBAR (obj);
+
+  g_signal_connect_swapped (self->priv->window, "view-changed",
+                            G_CALLBACK (populate_main_toolbar), self);
+
+  g_signal_connect_swapped (self->priv->parent, "view-selection-changed",
+                            G_CALLBACK (on_view_selection_changed_cb), self);
+
   G_OBJECT_CLASS(bjb_main_toolbar_parent_class)->constructed(obj);
 }
 
@@ -432,9 +740,17 @@ bjb_main_toolbar_init (BjbMainToolbar *self)
   BjbMainToolbarPrivate *priv = self->priv;
 
   priv->type = BJB_TOOLBAR_0 ;
+
   priv->grid = NULL;
   priv->list = NULL;
   priv->search = NULL;
+  priv->search_handler = 0;
+  priv->display_notes = 0;
+
+  priv->accel = NULL;
+  priv->note = NULL;
+  priv->note_renamed = 0;
+  priv->note_color_changed = 0;
 
   g_signal_connect (self, "button-press-event", G_CALLBACK (on_button_press), NULL);
 }
@@ -464,16 +780,13 @@ bjb_main_toolbar_get_property (GObject     *object,
   BjbMainToolbar *self = BJB_MAIN_TOOLBAR (object);
 
   switch (property_id)
-    {
-    case PROP_VIEW:
-      g_value_set_object (value, self->priv->view);
-      break;
+  {
     case PROP_PARENT:
       g_value_set_object (value, self->priv->parent);
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
-    }
+  }
 }
 
 static void
@@ -485,12 +798,11 @@ bjb_main_toolbar_set_property (GObject      *object,
   BjbMainToolbar *self = BJB_MAIN_TOOLBAR (object);
 
   switch (property_id)
-    {
-    case PROP_VIEW:
-      bjb_main_toolbar_set_view(self,g_value_get_object(value));
-      break;
+  {
     case PROP_PARENT:
       self->priv->parent = g_value_get_object(value);
+      self->priv->window = GTK_WINDOW (
+                       bjb_main_view_get_window (self->priv->parent));
       break;
     case PROP_CONTROLLER:
       self->priv->controller = g_value_get_object (value);
@@ -498,7 +810,7 @@ bjb_main_toolbar_set_property (GObject      *object,
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
       break;
-    }
+  }
 }
 
 static void
@@ -513,14 +825,6 @@ bjb_main_toolbar_class_init (BjbMainToolbarClass *klass)
   object_class->constructed = bjb_main_toolbar_constructed;
   object_class->finalize = bjb_main_toolbar_finalize;
 
-  properties[PROP_VIEW] = g_param_spec_object ("view",
-                                               "View",
-                                               "View",
-                                               GD_TYPE_MAIN_VIEW,
-                                               G_PARAM_READWRITE |
-                                               G_PARAM_CONSTRUCT |
-                                               G_PARAM_STATIC_STRINGS);
-
   properties[PROP_PARENT] = g_param_spec_object ("parent",
                                                  "Parent",
                                                  "Parent",
@@ -541,8 +845,7 @@ bjb_main_toolbar_class_init (BjbMainToolbarClass *klass)
 }
 
 BjbMainToolbar *
-bjb_main_toolbar_new (GdMainView *view,
-                      BjbMainView *parent,
+bjb_main_toolbar_new (BjbMainView *parent,
                       BjbController *controller)
 {
   /* Since heriting GdMainToolbar, we populate bar _after_ construct */
@@ -551,7 +854,6 @@ bjb_main_toolbar_new (GdMainView *view,
   self = BJB_MAIN_TOOLBAR (g_object_new (BJB_TYPE_MAIN_TOOLBAR,
                                          "controller", controller,
                                          "parent", parent,
-                                         "view", view,
                                          NULL));
 
   populate_main_toolbar(self);
@@ -559,12 +861,6 @@ bjb_main_toolbar_new (GdMainView *view,
 }
 
 void
-bjb_main_toolbar_set_view (BjbMainToolbar *self, GdMainView *view)
-{
-  self->priv->view = view ;
-}
-
-void
 bjb_main_toolbar_set_search_toggle_state (BjbMainToolbar *self,
                                           gboolean active)
 {
diff --git a/src/bjb-main-toolbar.h b/src/bjb-main-toolbar.h
index f77a512..7437af7 100644
--- a/src/bjb-main-toolbar.h
+++ b/src/bjb-main-toolbar.h
@@ -1,6 +1,6 @@
 /*
  * bijiben
- * Copyright (C) Pierre-Yves Luyten 2012 <py luyten fr>
+ * Copyright (C) Pierre-Yves Luyten 2012, 2013 <py luyten fr>
  * 
 bijiben is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
@@ -51,13 +51,7 @@ struct _BjbMainToolbar
 
 GType bjb_main_toolbar_get_type (void) G_GNUC_CONST;
 
-BjbMainToolbar * bjb_main_toolbar_new (GdMainView    *view,
-                                       BjbMainView   *parent,
-                                       BjbController *controller);
-
-void on_selection_mode_changed (BjbMainToolbar *self);
-
-void bjb_main_toolbar_set_view (BjbMainToolbar *self, GdMainView *view);
+BjbMainToolbar *bjb_main_toolbar_new (BjbMainView *parent, BjbController *controller);
 
 void bjb_main_toolbar_set_search_toggle_state (BjbMainToolbar *self, gboolean active);
 
diff --git a/src/bjb-main-view.c b/src/bjb-main-view.c
index e7d3b50..3ffb5f7 100644
--- a/src/bjb-main-view.c
+++ b/src/bjb-main-view.c
@@ -46,6 +46,13 @@ enum
 
 static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
 
+enum {
+  VIEW_SELECTION_CHANGED,
+  BJB_MAIN_VIEW_SIGNALS
+};
+
+static guint bjb_main_view_signals [BJB_MAIN_VIEW_SIGNALS] = { 0 };
+
 /************************** Gobject ***************************/
 
 struct _BjbMainViewPriv {  
@@ -70,6 +77,7 @@ struct _BjbMainViewPriv {
   gulong button;
   gulong activated;
   gulong data;
+  gulong view_selection_changed;
 };
 
 G_DEFINE_TYPE (BjbMainView, bjb_main_view, GTK_TYPE_BOX);
@@ -79,6 +87,12 @@ bjb_main_view_init (BjbMainView *object)
 {
   object->priv = 
   G_TYPE_INSTANCE_GET_PRIVATE(object,BJB_TYPE_MAIN_VIEW,BjbMainViewPriv);
+
+  object->priv->key = 0;
+  object->priv->button = 0;
+  object->priv->activated = 0;
+  object->priv->data = 0;
+  object->priv->view_selection_changed =0;
 }
 
 static void
@@ -96,6 +110,13 @@ bjb_main_view_disconnect_handlers (BjbMainView *self)
   g_signal_handler_disconnect (priv->view, priv->button);
   g_signal_handler_disconnect (priv->view, priv->activated);
   g_signal_handler_disconnect (priv->view, priv->data);
+  g_signal_handler_disconnect (priv->view, priv->view_selection_changed);
+
+  priv->key = 0;
+  priv->button = 0;
+  priv->activated = 0;
+  priv->data = 0;
+  priv->view_selection_changed =0;
 }
 
 static void
@@ -317,6 +338,14 @@ action_delete_selected_notes(GtkWidget *w,BjbMainView *view)
   g_list_free (notes);
 }
 
+/* Just tell */
+static void
+on_selection_mode_changed_cb (BjbMainView *self)
+{
+  g_signal_emit (G_OBJECT (self),
+                 bjb_main_view_signals[VIEW_SELECTION_CHANGED],0);
+}
+
 /* Select all, escape */
 static gboolean
 on_key_press_event_cb (GtkWidget *widget,
@@ -341,7 +370,6 @@ on_key_press_event_cb (GtkWidget *widget,
       if (gd_main_view_get_selection_mode (priv->view))
       {
         gd_main_view_set_selection_mode (priv->view, FALSE);
-        on_selection_mode_changed (priv->main_toolbar);
         return TRUE;
       }
 
@@ -366,11 +394,7 @@ on_button_press_event_cb (GtkWidget *widget,
     /* Right click */
     case 3:
       if (!gd_main_view_get_selection_mode (priv->view))
-      {
         gd_main_view_set_selection_mode (priv->view, TRUE);
-        on_selection_mode_changed (priv->main_toolbar);
-      }
-
       return TRUE;
 
     default:
@@ -452,13 +476,27 @@ bjb_main_view_connect_signals (BjbMainView *self)
   bjb_controller_connect (priv->controller);
   bjb_search_toolbar_connect (priv->search_bar);
 
-  priv->key = g_signal_connect (priv->window, "key-press-event",
+  if (priv->view_selection_changed == 0)
+    priv->view_selection_changed = g_signal_connect_swapped
+                                  (priv->view,
+                                   "view-selection-changed",
+                                   G_CALLBACK (on_selection_mode_changed_cb),
+                                   self);
+
+  if (priv->key == 0)
+    priv->key = g_signal_connect (priv->window, "key-press-event",
                               G_CALLBACK (on_key_press_event_cb), self);
-  priv->button = g_signal_connect (priv->view, "button-press-event",
+
+  if (priv->button == 0)
+    priv->button = g_signal_connect (priv->view, "button-press-event",
                            G_CALLBACK (on_button_press_event_cb), self);
-  priv->activated = g_signal_connect(priv->view,"item-activated",
+
+  if (priv->activated == 0)
+    priv->activated = g_signal_connect(priv->view,"item-activated",
                                     G_CALLBACK(on_item_activated),self);
-  priv->data = g_signal_connect (priv->view, "drag-data-received",
+
+  if (priv->data == 0)
+    priv->data = g_signal_connect (priv->view, "drag-data-received",
                               G_CALLBACK (on_drag_data_received), self);
 }
 
@@ -484,10 +522,6 @@ bjb_main_view_constructed(GObject *o)
   priv->view = gd_main_view_new (DEFAULT_VIEW);
   bjb_controller_set_main_view (priv->controller, priv->view);
 
-  /* main Toolbar */
-  priv->main_toolbar = bjb_main_toolbar_new (priv->view, self, priv->controller);
-  gtk_box_pack_start (vbox, GTK_WIDGET (priv->main_toolbar), FALSE, FALSE, 0);
-
   /* Search entry toolbar */
   priv->search_bar = bjb_search_toolbar_new (priv->window, priv->controller);
   revealer = bjb_search_toolbar_get_revealer (priv->search_bar);
@@ -544,6 +578,17 @@ bjb_main_view_class_init (BjbMainViewClass *klass)
                                                          G_PARAM_STATIC_STRINGS);
 
   g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
+
+  bjb_main_view_signals[VIEW_SELECTION_CHANGED] = g_signal_new ( "view-selection-changed" ,
+                                                  G_OBJECT_CLASS_TYPE (klass),
+                                                  G_SIGNAL_RUN_LAST,
+                                                  0,
+                                                  NULL,
+                                                  NULL,
+                                                  g_cclosure_marshal_VOID__VOID,
+                                                  G_TYPE_NONE,
+                                                  0);
+
 }
 
 BjbMainView *
@@ -586,3 +631,34 @@ bjb_main_view_get_main_toolbar (BjbMainView *view)
 
   return (gpointer) view->priv->main_toolbar;
 }
+
+/* interface for notes view (GdMainView) */
+gboolean
+bjb_main_view_get_selection_mode (BjbMainView *self)
+{
+  return gd_main_view_get_selection_mode (self->priv->view);
+}
+
+void
+bjb_main_view_set_selection_mode (BjbMainView *self, gboolean mode)
+{
+  gd_main_view_set_selection_mode (self->priv->view, mode);
+}
+
+GdMainViewType
+bjb_main_view_get_view_type (BjbMainView *view)
+{
+  return gd_main_view_get_view_type (view->priv->view);
+}
+
+void
+bjb_main_view_set_view_type (BjbMainView *view, GdMainViewType type)
+{
+  gd_main_view_set_view_type (view->priv->view, type);
+}
+
+GList *
+bjb_main_view_get_selection (BjbMainView *view)
+{
+  return gd_main_view_get_selection (view->priv->view);
+}
diff --git a/src/bjb-main-view.h b/src/bjb-main-view.h
index bc8fcca..e4a3889 100644
--- a/src/bjb-main-view.h
+++ b/src/bjb-main-view.h
@@ -86,6 +86,19 @@ BjbSearchToolbar *bjb_main_view_get_search_toolbar (BjbMainView *view);
 
 gpointer bjb_main_view_get_main_toolbar (BjbMainView *view);
 
+/* bridge for notes view (GdMainView)
+ * TODO : get rid of this it's a bit idiot */
+
+gboolean bjb_main_view_get_selection_mode (BjbMainView *view);
+
+void bjb_main_view_set_selection_mode (BjbMainView *view, gboolean mode);
+
+GdMainViewType bjb_main_view_get_view_type (BjbMainView *view);
+
+void bjb_main_view_set_view_type (BjbMainView *view, GdMainViewType type);
+
+GList *bjb_main_view_get_selection (BjbMainView *view);
+
 G_END_DECLS
 
 #endif /* _MAIN_VIEW_H_ */
diff --git a/src/bjb-note-view.c b/src/bjb-note-view.c
index a4d35a6..14a4e26 100644
--- a/src/bjb-note-view.c
+++ b/src/bjb-note-view.c
@@ -20,15 +20,9 @@
 #include <libbiji/libbiji.h>
 #include <libgd/gd.h>
 
-#include "utils/bjb-icons-colors.h"
-
 #include "bjb-bijiben.h"
-#include "bjb-color-button.h"
 #include "bjb-editor-toolbar.h"
-#include "bjb-rename-note.h"
-#include "bjb-share.h"
 #include "bjb-main-view.h"
-#include "bjb-note-tag-dialog.h"
 #include "bjb-note-view.h"
 #include "bjb-window-base.h"
 
@@ -69,7 +63,6 @@ struct _BjbNoteViewPrivate {
 
   /* Signals */
   gulong    destroy ;
-  gulong    renamed ;
   gulong    deleted ;
   gulong    color;
 };
@@ -77,9 +70,6 @@ struct _BjbNoteViewPrivate {
 static void
 bjb_note_view_disconnect (BjbNoteViewPrivate *priv)
 {
-  if (priv->renamed != 0)
-    g_signal_handler_disconnect (priv->note, priv->renamed);
-
   if (priv->destroy != 0)
     g_signal_handler_disconnect (priv->window, priv->destroy);
 
@@ -89,7 +79,6 @@ bjb_note_view_disconnect (BjbNoteViewPrivate *priv)
   if (priv->color != 0)
     g_signal_handler_disconnect (priv->note, priv->color);
 
-  priv->renamed =0;
   priv->destroy = 0,
   priv->deleted = 0;
   priv->color =0;
@@ -104,7 +93,6 @@ bjb_note_view_finalize(GObject *object)
   bjb_note_view_disconnect (priv);
 
   g_clear_object (&priv->view);
-  g_clear_object (&priv->accel);
   g_clear_object (&priv->edit_bar);
   clutter_color_free (priv->last_date_bckgrd_clr);
 
@@ -191,267 +179,8 @@ just_switch_to_main_view(BjbNoteView *self)
   bjb_note_view_disconnect (self->priv);
 
   window = GTK_WINDOW(self->priv->window);
-  gtk_window_remove_accel_group (window, self->priv->accel);
-
-  bjb_window_base_switch_to (BJB_WINDOW_BASE (window), BJB_MAIN_VIEW);
-}
-
-static void
-action_view_tags_callback (GtkWidget *item, gpointer user_data)
-{
-  BjbNoteView *self = BJB_NOTE_VIEW (user_data);
-  GtkWindow *window = GTK_WINDOW (self->priv->window);
-
-  GList *note = NULL;
-  note = g_list_append (note, self->priv->note);
-
-  bjb_note_tag_dialog_new (window, note);
-  g_list_free (note);
-}
-
-static void
-action_rename_note_callback (GtkWidget *item, gpointer user_data)
-{
-  BjbNoteView        *view;
-  BjbNoteViewPrivate *priv;
-  gchar              *title;
-  
-  view = BJB_NOTE_VIEW (user_data);
-  priv = view->priv;
-
-  title = note_title_dialog(GTK_WINDOW(priv->window), _("Rename Note"),
-                            biji_note_obj_get_title(priv->note));
-
-  if (!title)
-    return ;
-
-  biji_note_obj_set_title (priv->note,title);
-  biji_note_obj_save_note (priv->note);
-}
-
-static void
-delete_item_callback (GtkWidget *item, gpointer user_data)
-{
-  BjbNoteView *view = BJB_NOTE_VIEW (user_data);
-
-  /* Delete the note from collection
-   * The deleted note will emit a signal. */
-  biji_note_book_remove_note(bjb_window_base_get_book(view->priv->window),
-                             view->priv->note);
-}
-
-static void
-on_color_set(GtkColorButton *button,
-             BjbNoteView *view)
-{
-  GdkRGBA color;
-
-  gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color);
-  biji_note_obj_set_rgba (view->priv->note,&color) ;
-}
-
-/* just a bridge between note menu & webkit func */
-static void
-bjb_toggle_bullets (BijiWebkitEditor *editor)
-{
-  biji_webkit_editor_apply_format (editor, BIJI_BULLET_LIST);
-}
-
-static void
-bjb_toggle_list (BijiWebkitEditor *editor)
-{
-  biji_webkit_editor_apply_format (editor, BIJI_ORDER_LIST);
-}
-
-
-GtkWidget *
-bjb_note_menu_new (BjbNoteView *self)
-{
-  BjbNoteViewPrivate *priv = self->priv;
-  GtkWidget   *result, *item;
-
-  result = gtk_menu_new();
-  priv->editor = BIJI_WEBKIT_EDITOR (biji_note_obj_get_editor (priv->note));
-
-  /* Undo Redo separator */
-  item = gtk_menu_item_new_with_label (_("Undo"));
-  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
-  g_signal_connect_swapped (item, "activate",
-                            G_CALLBACK (webkit_web_view_undo), priv->editor);
-  gtk_widget_add_accelerator (item, "activate", priv->accel, GDK_KEY_u,
-                             GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
-  gtk_widget_show (item);
-
-  item = gtk_menu_item_new_with_label (_("Redo"));
-  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
-  g_signal_connect_swapped (item, "activate",
-                            G_CALLBACK (webkit_web_view_redo), priv->editor);
-  gtk_widget_add_accelerator (item, "activate", priv->accel, GDK_KEY_r,
-                             GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
-  gtk_widget_show (item);
-
-  item = gtk_separator_menu_item_new ();
-  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
-  gtk_widget_show (item);
-
-  /* Bullets, ordered list, separator */
-  /* Bullets : unordered list format */
-  item = gtk_menu_item_new_with_label (_("Bullets"));
-  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
-  g_signal_connect_swapped (item, "activate",
-                            G_CALLBACK (bjb_toggle_bullets), priv->editor);
-  gtk_widget_show(item);
-
-  /* Ordered list as 1.mouse 2.cats 3.dogs */
-  item = gtk_menu_item_new_with_label (_("List"));
-  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
-  g_signal_connect_swapped (item, "activate",
-                            G_CALLBACK (bjb_toggle_list), priv->editor);
-  gtk_widget_show(item);
-
-  item = gtk_separator_menu_item_new ();
-  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
-  gtk_widget_show (item);
-
-  /* Rename, view tags, separtor */
-  item = gtk_menu_item_new_with_label(_("Rename"));
-  gtk_menu_shell_append(GTK_MENU_SHELL(result),item);
-  g_signal_connect(item,"activate",
-                   G_CALLBACK(action_rename_note_callback),self); 
-  gtk_widget_show(item);
-
-  item = gtk_menu_item_new_with_label(_("Tags"));
-  gtk_menu_shell_append(GTK_MENU_SHELL(result),item);
-  g_signal_connect(item,"activate",
-                   G_CALLBACK(action_view_tags_callback),self);
-  gtk_widget_show(item);
-
-  item = gtk_separator_menu_item_new ();
-  gtk_menu_shell_append (GTK_MENU_SHELL (result), item);
-  gtk_widget_show (item);
-
-  /* Delete Note */
-  item = gtk_menu_item_new_with_label(_("Delete this Note"));
-  gtk_menu_shell_append(GTK_MENU_SHELL(result),item);
-  g_signal_connect(item,"activate",
-                   G_CALLBACK(delete_item_callback),self);
-  gtk_widget_show(item);
-
-  return result;
-}
-
-#define COLOR_SIZE 24
-
-static void
-on_note_renamed (BijiNoteObj *note, GdMainToolbar *bar)
-{
-  gd_main_toolbar_set_labels (bar, biji_note_obj_get_title (note), NULL);
-}
-
-/* Just makes toolbar draggable */
-static gboolean
-on_button_press (GtkWidget* widget,
-                 GdkEventButton * event,
-                 GdkWindowEdge edge)
-{
-  if (event->type == GDK_BUTTON_PRESS)
-  {
-    if (event->button == 1) {
-      gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
-                                  event->button,
-                                  event->x_root,
-                                  event->y_root,
-                                  event->time);
-    }
-  }
-
-  return FALSE;
-}
-
-static ClutterActor *
-bjb_note_main_toolbar_new (BjbNoteView *self,
-                           ClutterActor *parent,
-                           BijiNoteObj *note)
-{
-  GdMainToolbar    *gd;
-  ClutterActor     *result;
-  GtkWidget        *w,*button;
-  
-  GtkWidget        *grid,*notes_label,*notes_icon;
-
-  GtkWidget        *color_button;
-  GdkRGBA           color;
-  BjbSettings      *settings;
-
-  w = gd_main_toolbar_new();
-  gd = GD_MAIN_TOOLBAR(w);
-
-  settings = bjb_app_get_settings (g_application_get_default());
-
-  result = gtk_clutter_actor_new_with_contents(w);
-  clutter_actor_add_child(parent,result);
-  gtk_widget_show_all(w);
-  clutter_actor_set_x_expand(result,TRUE);
-
-  /* Go to main view basically means closing note */
-  grid = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,2);
-  notes_icon = get_icon("go-previous-symbolic");
-  gtk_box_pack_start(GTK_BOX(grid),notes_icon,TRUE,TRUE,TRUE);
-  /* Button to go back to main view */
-  notes_label = gtk_label_new (_("Notes"));
-  gtk_box_pack_start(GTK_BOX(grid),notes_label,TRUE,TRUE,TRUE);
-
-  button = gd_main_toolbar_add_button (gd, NULL, NULL, TRUE);
-
-  gtk_container_add(GTK_CONTAINER(button),grid);
-  gtk_widget_show_all(button);
-  gtk_widget_set_vexpand (button, TRUE);
-  g_signal_connect_swapped (button, "clicked",
-                            G_CALLBACK(just_switch_to_main_view),self);
-  gtk_widget_add_accelerator (button, "activate", self->priv->accel,
-                              GDK_KEY_w, GDK_CONTROL_MASK, GTK_ACCEL_MASK);
-
-  /* Note title */
-  gd_main_toolbar_set_labels (gd,biji_note_obj_get_title(note),NULL);
-
-  self->priv->renamed = g_signal_connect(note,"renamed",
-                                        G_CALLBACK(on_note_renamed), w);
-
-  /* Note Color */
-  if (!biji_note_obj_get_rgba (note, &color))
-  {
-    gchar *default_color;
-    g_object_get (G_OBJECT(settings),"color", &default_color, NULL);
-    gdk_rgba_parse (&color, default_color);
-    g_free (default_color);
-  }
-
-  color_button = bjb_color_button_new ();
-  gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (color_button), &color);
-
-  gd_main_toolbar_add_widget (gd, color_button, FALSE);
-  gtk_widget_set_size_request (gtk_bin_get_child (GTK_BIN (color_button)),
-                               COLOR_SIZE, COLOR_SIZE);
-  gtk_widget_show (color_button);
-
-  g_signal_connect (color_button,"color-set",
-                    G_CALLBACK(on_color_set),self);
-
-  /* Sharing */
-  button = gd_main_toolbar_add_button (gd, "send-to-symbolic",
-                                       NULL, FALSE);
-
-  g_signal_connect(button,"clicked",
-                   G_CALLBACK(on_email_note_callback),note);
-
-  /* Menu */
-  button = gd_main_toolbar_add_menu(gd,"emblem-system-symbolic",NULL,FALSE);
-
-  gtk_menu_button_set_popup (GTK_MENU_BUTTON (button),
-                             bjb_note_menu_new (self));
-
-  g_signal_connect (w, "button-press-event", G_CALLBACK (on_button_press), NULL);
-  return result;
+  bjb_window_base_switch_to (BJB_WINDOW_BASE (window),
+                             BJB_WINDOW_BASE_MAIN_VIEW);
 }
 
 static gboolean
@@ -522,9 +251,9 @@ bjb_note_view_constructed (GObject *obj)
   BjbNoteViewPrivate     *priv = self->priv;
   BjbSettings            *settings;
   GtkWidget              *scroll;
-  ClutterActor           *vbox;
+  ClutterActor           *text_actor, *overlay;
   ClutterConstraint      *constraint;
-  ClutterLayoutManager   *full, *box, *bin;
+  ClutterLayoutManager   *full, *bin;
   gchar                  *default_font;
 
   /* view new from note deserializes the note-content. */
@@ -542,31 +271,20 @@ bjb_note_view_constructed (GObject *obj)
 
   /* Start packing ui */
   gtk_container_add (GTK_CONTAINER (priv->parent), GTK_WIDGET (self));
-  gtk_widget_show_all (priv->parent);
   priv->embed = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED (self));
 
   full = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
                                  CLUTTER_BIN_ALIGNMENT_CENTER);
 
-  clutter_actor_set_layout_manager (priv->embed,full);
-
-  vbox = clutter_actor_new();
-  box = clutter_box_layout_new();
-  clutter_box_layout_set_orientation(CLUTTER_BOX_LAYOUT(box),
-                                     CLUTTER_ORIENTATION_VERTICAL);
-  clutter_actor_set_layout_manager (vbox,box);
-  clutter_actor_add_child (priv->embed,vbox);
-
-  /* Main Toolbar  */
-  bjb_note_main_toolbar_new (self, vbox, priv->note);
+  clutter_actor_set_layout_manager (priv->embed, full);
 
   /* Overlay contains Text and EditToolbar */
-  ClutterActor *overlay = clutter_actor_new ();
+  overlay = clutter_actor_new ();
   bin = clutter_bin_layout_new (CLUTTER_BIN_ALIGNMENT_CENTER,
                                 CLUTTER_BIN_ALIGNMENT_CENTER);
 
   clutter_actor_set_layout_manager (overlay,bin);
-  clutter_actor_add_child (vbox,overlay);
+  clutter_actor_add_child (priv->embed, overlay);
   clutter_actor_set_x_expand (overlay,TRUE);
   clutter_actor_set_y_expand (overlay,TRUE);
 
@@ -587,7 +305,7 @@ bjb_note_view_constructed (GObject *obj)
   gtk_container_add (GTK_CONTAINER (scroll), GTK_WIDGET(priv->view));
   gtk_widget_show (GTK_WIDGET (priv->view));
 
-  ClutterActor *text_actor = gtk_clutter_actor_new_with_contents (scroll);
+  text_actor = gtk_clutter_actor_new_with_contents (scroll);
   clutter_actor_add_child(overlay,text_actor);
 
   clutter_actor_set_x_expand(text_actor,TRUE);
diff --git a/src/bjb-window-base.c b/src/bjb-window-base.c
index 61cd32e..19ab10a 100644
--- a/src/bjb-window-base.c
+++ b/src/bjb-window-base.c
@@ -7,6 +7,7 @@
 
 #include "bjb-bijiben.h"
 #include "bjb-window-base.h"
+#include "bjb-main-toolbar.h"
 #include "bjb-main-view.h"
 #include "bjb-note-view.h"
 
@@ -17,6 +18,13 @@
 
 #define BJB_DEFAULT_FONT "Serif 10"
 
+enum {
+  BJB_WIN_BASE_VIEW_CHANGED,
+  BJB_WIN_BASE_SIGNALS
+};
+
+static guint bjb_win_base_signals [BJB_WIN_BASE_SIGNALS] = { 0 };
+
 /* As the main window remains, it owns the data */
 struct _BjbWindowBasePriv
 {
@@ -27,11 +35,13 @@ struct _BjbWindowBasePriv
   /* UI
    * The Notebook always has a main view.
    * When editing a note, it _also_ has a note view */
+  GtkWidget            *vbox;
   GdStack              *stack;
   GtkWidget            *spinner; // this spinner takes the whole place
                                  // and only shows on startup
   BjbWindowViewType     current_view;
   BjbMainView          *view;
+  BjbMainToolbar       *main_toolbar;
   gchar                *entry;
 
   /* when a note is opened */
@@ -126,16 +136,6 @@ bjb_window_base_constructed (GObject *obj)
   priv->entry = NULL ;
   priv->font = pango_font_description_from_string (BJB_DEFAULT_FONT);
 
-  /* UI : basic notebook */
-  priv->stack = GD_STACK (gd_stack_new ());
-  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->stack));
-
-  priv->spinner = gtk_spinner_new ();
-  gd_stack_add_named (priv->stack, priv->spinner, "spinner");
-  gd_stack_set_visible_child_name (priv->stack, "spinner");
-  gtk_widget_show (priv->spinner);
-  gtk_spinner_start (GTK_SPINNER (priv->spinner));
-
   /* Signals */
   g_signal_connect(GTK_WIDGET(self),"destroy",
                    G_CALLBACK(bjb_window_base_destroy),self);
@@ -144,12 +144,17 @@ bjb_window_base_constructed (GObject *obj)
 static void
 bjb_window_base_init (BjbWindowBase *self)
 {
-  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
-                                            BJB_TYPE_WINDOW_BASE,
-                                            BjbWindowBasePriv);
+  BjbWindowBasePriv *priv;
+  priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
+                                      BJB_TYPE_WINDOW_BASE,
+                                      BjbWindowBasePriv);
+  self->priv = priv;
 
   /* Default window has no note opened */
-  self->priv->note_view = NULL;
+  priv->note_view = NULL;
+
+  priv->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+  gtk_container_add (GTK_CONTAINER (self), priv->vbox);
 }
 
 static void
@@ -162,6 +167,16 @@ bjb_window_base_class_init (BjbWindowBaseClass *klass)
   gobject_class->finalize = bjb_window_base_finalize ;
 
   g_type_class_add_private (klass, sizeof (BjbWindowBasePriv));
+
+  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);
 }
 
 GtkWindow *
@@ -183,7 +198,21 @@ bjb_window_base_new(void)
     (bijiben_get_book (BIJIBEN_APPLICATION(g_application_get_default())),
      priv->entry );
 
+  /* Shared toolbar */
   priv->view = bjb_main_view_new (GTK_WIDGET (retval), priv->controller);
+  priv->main_toolbar = bjb_main_toolbar_new (priv->view, priv->controller);
+  gtk_box_pack_start (GTK_BOX (priv->vbox), GTK_WIDGET (priv->main_toolbar), FALSE, FALSE, 0);
+
+  /* UI : stack for different views */
+  priv->stack = GD_STACK (gd_stack_new ());
+  gtk_box_pack_start (GTK_BOX (priv->vbox), GTK_WIDGET (priv->stack), TRUE, TRUE, 0);
+
+  priv->spinner = gtk_spinner_new ();
+  gd_stack_add_named (priv->stack, priv->spinner, "spinner");
+  gd_stack_set_visible_child_name (priv->stack, "spinner");
+  gtk_widget_show (priv->spinner);
+  gtk_spinner_start (GTK_SPINNER (priv->spinner));
+
   gd_stack_add_named (priv->stack, GTK_WIDGET (priv->view), "main-view");
   gtk_widget_show_all (GTK_WIDGET (retval));
 
@@ -203,14 +232,6 @@ window_base_get_font(GtkWidget *window)
   return b->priv->font ;
 }
 
-void
-bjb_window_base_set_note (BjbWindowBase *self, BijiNoteObj *note)
-{
-  g_return_if_fail (BJB_IS_WINDOW_BASE (self));
-
-  self->priv->note = note;
-}
-
 BijiNoteObj *
 bjb_window_base_get_note (BjbWindowBase *self)
 {
@@ -232,11 +253,12 @@ void
 bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type)
 {
   BjbWindowBasePriv *priv = bwb->priv;
+  priv->current_view = type;
 
   /* Precise the window does not display any specific note
    * Refresh the model
    * Ensure the main view receives the proper signals */
-  if (type == BJB_MAIN_VIEW)
+  if (type == BJB_WINDOW_BASE_MAIN_VIEW)
   {
     priv->note = NULL;
     bjb_main_view_connect_signals (priv->view);
@@ -250,6 +272,8 @@ bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type)
     gtk_widget_show_all (GTK_WIDGET (priv->note_overlay));
     gd_stack_set_visible_child_name (priv->stack, "note-view");
   }
+
+  g_signal_emit (G_OBJECT (bwb), bjb_win_base_signals[BJB_WIN_BASE_VIEW_CHANGED],0);
 }
 
 void
@@ -262,16 +286,23 @@ bjb_window_base_switch_to_note (BjbWindowBase *bwb, BijiNoteObj *note)
 
   priv->note = note;
   priv->note_overlay = gtk_overlay_new ();
+
   gd_stack_add_named (priv->stack, priv->note_overlay, "note-view");
   priv->note_view = bjb_note_view_new (w, priv->note_overlay, note);
+
   g_object_add_weak_pointer (G_OBJECT (priv->note_view),
                              (gpointer *) &priv->note_view);
 
-  bjb_window_base_set_note (bwb, priv->note);
-  bjb_window_base_switch_to (bwb, BJB_NOTE_VIEW);
+  bjb_window_base_switch_to (bwb, BJB_WINDOW_BASE_NOTE_VIEW);
   gtk_widget_show_all (w);
 }
 
+BjbWindowViewType
+bjb_window_base_get_view_type (BjbWindowBase *win)
+{
+  return win->priv->current_view;
+}
+
 BijiNoteBook *
 bjb_window_base_get_book(GtkWidget * win)
 {
diff --git a/src/bjb-window-base.h b/src/bjb-window-base.h
index 93c1881..6d6d4ac 100644
--- a/src/bjb-window-base.h
+++ b/src/bjb-window-base.h
@@ -32,9 +32,9 @@ struct _BjbWindowBase
 };
 
 typedef enum {
-  BJB_MAIN_VIEW,
-  BJB_NOTE_VIEW,
-  BJB_NO_VIEW
+  BJB_WINDOW_BASE_MAIN_VIEW,
+  BJB_WINDOW_BASE_NOTE_VIEW,
+  BJB_WINDOW_BASE_NO_VIEW
 } BjbWindowViewType;
 
 GType bjb_window_base_get_type (void);
@@ -51,6 +51,8 @@ void bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type);
 
 void bjb_window_base_switch_to_note (BjbWindowBase *bwb, BijiNoteObj *note);
 
+BjbWindowViewType bjb_window_base_get_view_type (BjbWindowBase *win);
+
 BijiNoteBook * bjb_window_base_get_book(GtkWidget * win);
 
 void bjb_window_base_set_entry(GtkWidget *win, gchar *search_entry) ;
@@ -63,8 +65,6 @@ gpointer bjb_window_base_get_main_view (BjbWindowBase *self);
 
 BijiNoteObj * bjb_window_base_get_note (BjbWindowBase *self);
 
-void bjb_window_base_set_note (BjbWindowBase *self, BijiNoteObj *note);
-
 gboolean switch_window_fullscreen();
 
 #endif /* _BJB_WINDOW_BASE_H */


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