[bijiben] Archive view: initial (useless) view



commit 536d13e95196bb684a0f4b9e74d44b8b88451055
Author: Pierre-Yves Luyten <py luyten fr>
Date:   Thu Nov 21 22:01:48 2013 +0100

    Archive view: initial (useless) view
    
    Trash bin can be viewed but no operation can be done.
    This is just an initial feature.

 po/POTFILES.in                                 |    1 +
 src/Makefile.am                                |    2 +
 src/bjb-app-menu.c                             |   19 ++-
 src/bjb-controller.c                           |  132 ++++++++++++---
 src/bjb-controller.h                           |    6 +
 src/bjb-main-toolbar.c                         |  155 ++++++++++++++++--
 src/bjb-selection-toolbar.c                    |  182 +++++++++++++++-----
 src/bjb-trash-bar.c                            |  213 ++++++++++++++++++++++++
 src/bjb-trash-bar.h                            |   73 ++++++++
 src/bjb-window-base.c                          |   17 ++-
 src/bjb-window-base.h                          |    3 +-
 src/libbiji/biji-manager.c                     |  146 +++++++++++++----
 src/libbiji/biji-manager.h                     |   25 +++-
 src/libbiji/biji-marshalers.list               |    3 +-
 src/libbiji/biji-tracker.c                     |    5 +-
 src/libbiji/biji-tracker.h                     |    1 +
 src/libbiji/provider/biji-import-provider.c    |    4 +-
 src/libbiji/provider/biji-local-provider.c     |  123 +++++++++++---
 src/libbiji/provider/biji-own-cloud-provider.c |   16 ++-
 src/libbiji/provider/biji-provider.c           |   48 +++++-
 src/libbiji/provider/biji-provider.h           |   38 ++++-
 src/resources/app-menu.ui                      |    4 +
 22 files changed, 1044 insertions(+), 172 deletions(-)
---
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 02aa792..d338b12 100755
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -16,6 +16,7 @@ src/bjb-rename-note.c
 src/bjb-selection-toolbar.c
 src/bjb-settings.c
 src/bjb-settings-dialog.c
+src/bjb-trash-bar.c
 src/bjb-window-base.c
 src/libbiji/biji-date-time.c
 src/libbiji/provider/biji-local-provider.c
diff --git a/src/Makefile.am b/src/Makefile.am
index 72fa3d2..8148e7f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -87,6 +87,8 @@ bijiben_SOURCES = \
        bjb-settings-dialog.h \
        bjb-share.c \
        bjb-share.h \
+       bjb-trash-bar.c \
+       bjb-trash-bar.h \
        bjb-window-base.c \
        bjb-window-base.h
 
diff --git a/src/bjb-app-menu.c b/src/bjb-app-menu.c
index 23f41f6..e3838a7 100644
--- a/src/bjb-app-menu.c
+++ b/src/bjb-app-menu.c
@@ -40,7 +40,7 @@ void show_about_dialog(GtkApplication *app)
     "William Jon McCann <jmccann redhat com>",
     NULL
   };
-  
+
   gtk_show_about_dialog( g_list_nth_data (windows, 0),
   "program-name", _("Notes"),
   "comments", _("Simple notebook for GNOME"),
@@ -104,6 +104,20 @@ external_activated (GSimpleAction *action,
 
 
 static void
+trash_activated (GSimpleAction *action,
+                 GVariant      *param,
+                 gpointer       user_data)
+{
+  GList *l;
+
+  l = gtk_application_get_windows (GTK_APPLICATION (user_data));
+  bjb_controller_set_group (
+    bjb_window_base_get_controller (BJB_WINDOW_BASE (l->data)),
+    BIJI_ARCHIVED_ITEMS);
+}
+
+
+static void
 preferences_activated (GSimpleAction *action,
                        GVariant      *parameter,
                        gpointer       user_data)
@@ -150,6 +164,7 @@ quit_activated (GSimpleAction *action,
 static GActionEntry app_entries[] = {
            { "new", new_activated, NULL, NULL, NULL },
            { "external", external_activated, NULL, NULL, NULL },
+           { "trash", trash_activated, NULL, NULL, NULL },
            { "preferences", preferences_activated, NULL, NULL, NULL },
            { "about", about_activated, NULL, NULL, NULL },
            { "help", help_activated, NULL, NULL, NULL },
@@ -165,7 +180,7 @@ void bjb_app_menu_set(GApplication *application)
                                    app_entries,
                                    G_N_ELEMENTS (app_entries),
                                    application);
-    
+
   builder = gtk_builder_new ();
   gtk_builder_add_from_resource (builder, "/org/gnome/bijiben/app-menu.ui", NULL);
 
diff --git a/src/bjb-controller.c b/src/bjb-controller.c
index a3a4ea3..b60ded5 100644
--- a/src/bjb-controller.c
+++ b/src/bjb-controller.c
@@ -24,6 +24,7 @@
 
 #include <libgd/gd.h>
 
+#include "bjb-bijiben.h"
 #include "bjb-controller.h"
 #include "bjb-main-view.h"
 #include "bjb-window-base.h"
@@ -41,10 +42,12 @@
 
 struct _BjbControllerPrivate
 {
-  BijiManager   *manager ;
-  gchar          *needle ;
-  BijiNotebook *notebook;
-  GtkTreeModel   *model ;
+  /* needle, notebook and group define what the controller shows */
+  BijiManager    *manager;
+  gchar          *needle;
+  BijiNotebook   *notebook;
+  BijiItemsGroup  group;
+  GtkTreeModel   *model;
 
   BjbWindowBase  *window;
 
@@ -110,6 +113,7 @@ bjb_controller_init (BjbController *self)
   priv->n_items_to_show = BJB_ITEMS_SLICE;
   priv->needle = NULL;
   priv->notebook = NULL;
+  priv->group = BIJI_LIVING_ITEMS;
   priv->connected = FALSE;
 
 }
@@ -388,12 +392,16 @@ void
 bjb_controller_update_view (BjbController *self)
 {
   GList *items, *l;
+  BjbWindowViewType type;
+
 
   /* Do not update if nothing to show */
-  if (bjb_window_base_get_view_type (self->priv->window) != BJB_WINDOW_BASE_MAIN_VIEW)
+  type = bjb_window_base_get_view_type (self->priv->window);
+  if (! (type == BJB_WINDOW_BASE_MAIN_VIEW
+         || type == BJB_WINDOW_BASE_ARCHIVE_VIEW))
     return;
 
-  items = self->priv->items_to_show ;
+  items = self->priv->items_to_show;
   free_items_store (self);
 
   sort_items (&items);
@@ -418,11 +426,19 @@ notify_displayed_items_changed (BjbController *self)
 static void
 update (BjbController *self)
 {
+  BjbWindowViewType type;
+
   /* If the user already edits a note, he does not want the view
    * to go back */
-  if (bjb_window_base_get_view_type (self->priv->window) !=
-      BJB_WINDOW_BASE_NOTE_VIEW)
-    bjb_window_base_switch_to (self->priv->window, BJB_WINDOW_BASE_MAIN_VIEW);
+  if (bjb_window_base_get_view_type (self->priv->window) != BJB_WINDOW_BASE_NOTE_VIEW)
+  {
+    if (self->priv->group == BIJI_LIVING_ITEMS)
+      type = BJB_WINDOW_BASE_MAIN_VIEW;
+    else
+      type = BJB_WINDOW_BASE_ARCHIVE_VIEW;
+
+    bjb_window_base_switch_to (self->priv->window, type);
+  }
 
 
   bjb_controller_update_view (self);
@@ -443,12 +459,25 @@ update_controller_callback (GList *result,
   priv = self->priv;
   priv->remaining_items = FALSE;
 
+
+
   if (!result)
   {
     bjb_window_base_switch_to (priv->window, BJB_WINDOW_BASE_NO_RESULT);
     return;
   }
 
+  switch (self->priv->group)
+  {
+    case BIJI_ARCHIVED_ITEMS:
+      bjb_window_base_switch_to (priv->window, BJB_WINDOW_BASE_ARCHIVE_VIEW);
+      break;
+
+    default:
+      break;
+  }
+
+
   sort_items (&result);
   i = 0;
 
@@ -474,12 +503,16 @@ update_controller_callback (GList *result,
   update (self);
 }
 
+
+
+
+
 void
 bjb_controller_apply_needle (BjbController *self)
 {
+  GList *result;
   BjbControllerPrivate *priv = self->priv;
   gchar *needle;
-  GList *all_notes;
 
   needle = priv->needle;
   g_clear_pointer (&priv->items_to_show, g_list_free);
@@ -487,22 +520,19 @@ bjb_controller_apply_needle (BjbController *self)
   /* Show all notes */
   if (needle == NULL || g_strcmp0 (needle,"") == 0)
   {
-    all_notes = biji_manager_get_items (self->priv->manager);
+    result = biji_manager_get_items (self->priv->manager, self->priv->group);
 
-    /* If there are no note, report this */
-    if (all_notes == NULL)
-    {
+    if (result == NULL)
       bjb_window_base_switch_to (self->priv->window, BJB_WINDOW_BASE_NO_NOTE);
-      return;
-    }
 
-    /* Otherwise do show existing notes */
-    update_controller_callback (all_notes, self);
+    else
+      update_controller_callback (result, self);
+
     return;
   }
 
   /* There is a research, apply lookup */
-  biji_get_items_matching_async (self->priv->manager, needle, update_controller_callback, self);
+  biji_get_items_matching_async (self->priv->manager, self->priv->group, needle, update_controller_callback, 
self);
 }
 
 static void
@@ -516,18 +546,30 @@ on_needle_changed (BjbController *self)
 /* Depending on the change at data level,
  * the view has to be totaly refreshed or just amended */
 static void
-on_manager_changed (BijiManager           *manager,
-                 BijiManagerChangeFlag  flag,
-                 gpointer               *biji_item,
-                 BjbController          *self)
+on_manager_changed (BijiManager            *manager,
+                    BijiItemsGroup          group,
+                    BijiManagerChangeFlag   flag,
+                    gpointer               *biji_item,
+                    BjbController          *self)
 {
   BjbControllerPrivate *priv = self->priv;
   BijiItem    *item = BIJI_ITEM (biji_item);
   GtkTreeIter iter;
   GtkTreeIter *p_iter = &iter;
 
+
+
+
+  if (group != self->priv->group)
+  {
+    g_debug ("Controller received signal for group %i while %i",
+             group, self->priv->group);
+    return;
+  }
+
   g_mutex_lock (&priv->mutex);
 
+
   switch (flag)
   {
     /* If this is a *new* item, per def prepend */
@@ -595,7 +637,7 @@ static void
 bjb_controller_connect (BjbController *self)
 {
   BjbControllerPrivate *priv = self->priv;
-  
+
   if (!priv->connected)
   {
     priv->manager_change = g_signal_connect (self->priv->manager, "changed",
@@ -702,7 +744,7 @@ bjb_controller_new (BijiManager  *manager,
               "manager", manager,
               "window", window,
               "needle", needle,
-              NULL); 
+              NULL);
 }
 
 void
@@ -752,7 +794,7 @@ bjb_controller_get_notebook (BjbController *self)
 
 void
 bjb_controller_set_notebook (BjbController *self,
-                               BijiNotebook *coll)
+                             BijiNotebook *coll)
 {
   /* Going back from a notebook */
   if (!coll)
@@ -780,6 +822,44 @@ bjb_controller_set_notebook (BjbController *self,
 }
 
 
+
+BijiItemsGroup
+bjb_controller_get_group (BjbController *self)
+{
+  return self->priv->group;
+}
+
+
+
+void
+bjb_controller_set_group (BjbController   *self,
+                          BijiItemsGroup   group)
+{
+  if (self->priv->group == group)
+    return;
+
+  g_clear_pointer (&self->priv->items_to_show, g_list_free);
+  self->priv->group = group;
+
+  /* Living group : refresh the ui */
+  if (group == BIJI_LIVING_ITEMS)
+  {
+    if (self->priv->notebook != NULL)
+      bjb_controller_set_notebook (self, self->priv->notebook);
+
+    else
+      bjb_controller_apply_needle (self);
+    //bjb_window_base_switch_to (self->priv->window, group);
+    return;
+  }
+
+
+  /* Archives : ping the manager */
+  biji_manager_load_archives (self->priv->manager);
+}
+
+
+
 void
 bjb_controller_show_more (BjbController *self)
 {
diff --git a/src/bjb-controller.h b/src/bjb-controller.h
index e8c2d3d..142c5cb 100644
--- a/src/bjb-controller.h
+++ b/src/bjb-controller.h
@@ -77,6 +77,12 @@ BijiNotebook * bjb_controller_get_notebook (BjbController *self);
 void bjb_controller_set_notebook (BjbController *self, BijiNotebook *coll);
 
 
+BijiItemsGroup bjb_controller_get_group (BjbController *controller);
+
+
+void bjb_controller_set_group (BjbController   *self,
+                               BijiItemsGroup   group);
+
 void bjb_controller_show_more (BjbController *controller);
 
 G_END_DECLS
diff --git a/src/bjb-main-toolbar.c b/src/bjb-main-toolbar.c
index 05eaad0..8617a30 100644
--- a/src/bjb-main-toolbar.c
+++ b/src/bjb-main-toolbar.c
@@ -33,6 +33,9 @@ typedef enum
   BJB_TOOLBAR_STD_LIST,
   BJB_TOOLBAR_STD_ICON,
   BJB_TOOLBAR_SELECT,
+  BJB_TOOLBAR_TRASH_LIST,
+  BJB_TOOLBAR_TRASH_ICON,
+  BJB_TOOLBAR_TRASH_SELECT,
   BJB_TOOLBAR_NOTE_VIEW,
   BJB_TOOLBAR_NUM
 } BjbToolbarType;
@@ -372,7 +375,18 @@ connect_main_view_handlers (BjbMainToolbar *self)
 static void
 on_back_button_clicked (BjbMainToolbar *self)
 {
-  bjb_controller_set_notebook (self->priv->controller, NULL);
+  BijiItemsGroup group;
+
+  group = bjb_controller_get_group (self->priv->controller);
+
+  /* Back to main view from trash bin */
+  if (group == BIJI_ARCHIVED_ITEMS)
+    bjb_controller_set_group (self->priv->controller, BIJI_LIVING_ITEMS);
+
+
+  /* Back to main view */
+  else
+    bjb_controller_set_notebook (self->priv->controller, NULL);
 }
 
 static void
@@ -444,13 +458,66 @@ populate_bar_for_standard(BjbMainToolbar *self)
   connect_main_view_handlers (self);
 }
 
+
+
 static void
-populate_bar_for_icon_view(BjbMainToolbar *self)
+populate_bar_for_trash (BjbMainToolbar *self)
 {
-  BjbMainToolbarPrivate *priv = self->priv;
+  BjbMainToolbarPrivate *priv;
+  gboolean rtl;
+  GtkWidget *select_image;
+  GtkSizeGroup *size;
+
+  priv = self->priv;
+
+  rtl = (gtk_widget_get_default_direction () == GTK_TEXT_DIR_RTL);
+  gtk_header_bar_set_title (GTK_HEADER_BAR (self), _("Trash"));
+  gtk_header_bar_set_subtitle (GTK_HEADER_BAR (self), NULL);
+
+
+  priv->back = gtk_button_new_from_icon_name (rtl ? "go-previous-rtl-symbolic" : "go-previous-symbolic",
+                                              GTK_ICON_SIZE_MENU);
+  gtk_widget_set_valign (priv->back, GTK_ALIGN_CENTER);
+  gtk_header_bar_pack_start (GTK_HEADER_BAR (self), priv->back);
+
+  g_signal_connect_swapped (priv->back, "clicked",
+                            G_CALLBACK (on_back_button_clicked), self);
+
+  /* Go to selection mode */
+  priv->select = gtk_button_new ();
+  select_image = gtk_image_new_from_icon_name ("object-select-symbolic", GTK_ICON_SIZE_MENU);
+  gtk_button_set_image (GTK_BUTTON (priv->select), select_image);
+  gtk_widget_set_valign (priv->select, GTK_ALIGN_CENTER);
+  gtk_style_context_add_class (gtk_widget_get_style_context (priv->select),
+                               "image-button");
+  gtk_header_bar_pack_end (GTK_HEADER_BAR (self), priv->select);
+  gtk_widget_set_tooltip_text (priv->select, _("Selection mode"));
+
+  g_signal_connect (priv->select,"clicked",
+                    G_CALLBACK(on_selection_mode_clicked),self);
+
+  /* Align buttons */
+  size = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
+  gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->select);
+  gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->back);
+  g_object_unref (size);
+
+  /* Show close button */
+  gtk_header_bar_set_show_close_button (GTK_HEADER_BAR (self), TRUE);
+
+  /* Watch for main view changing */
+  connect_main_view_handlers (self);
+}
+
+
+
+static void
+add_list_button (BjbMainToolbar *self)
+{
+  BjbMainToolbarPrivate *priv;
   GtkWidget *list_image;
 
-  /* Switch to list */
+  priv = self->priv;
   priv->grid = NULL;
   priv->list = gtk_button_new ();
   list_image = gtk_image_new_from_icon_name ("view-list-symbolic", GTK_ICON_SIZE_MENU);
@@ -461,20 +528,20 @@ populate_bar_for_icon_view(BjbMainToolbar *self)
   gtk_header_bar_pack_end (GTK_HEADER_BAR (self), priv->list);
   gtk_widget_set_tooltip_text (priv->list,
                                _("View notes and notebooks in a list"));
-
   g_signal_connect (priv->list, "clicked",
                     G_CALLBACK(on_view_mode_clicked),self);
-
-  populate_bar_for_standard(self);
 }
 
+
+
 static void
-populate_bar_for_list_view(BjbMainToolbar *self)
+add_grid_button (BjbMainToolbar *self)
 {
-  BjbMainToolbarPrivate *priv = self->priv;
+  BjbMainToolbarPrivate *priv;
   GtkWidget *grid_image;
 
-  /* Switch to icon view */
+
+  priv = self->priv;
   priv->list = NULL;
   priv->grid = gtk_button_new ();
   grid_image = gtk_image_new_from_icon_name ("view-grid-symbolic", GTK_ICON_SIZE_MENU);
@@ -488,10 +555,39 @@ populate_bar_for_list_view(BjbMainToolbar *self)
 
   g_signal_connect (priv->grid, "clicked",
                     G_CALLBACK(on_view_mode_clicked),self);
+}
+
 
+static void
+populate_bar_for_icon_view(BjbMainToolbar *self)
+{
+  add_list_button (self);
   populate_bar_for_standard(self);
 }
 
+static void
+populate_bar_for_list_view(BjbMainToolbar *self)
+{
+  add_grid_button (self);
+  populate_bar_for_standard(self);
+}
+
+
+static void
+populate_bar_for_trash_icon_view (BjbMainToolbar *self)
+{
+  add_list_button (self);
+  populate_bar_for_trash (self);
+}
+
+
+static void
+populate_bar_for_trash_list_view (BjbMainToolbar *self)
+{
+  add_grid_button (self);
+  populate_bar_for_trash (self);
+}
+
 
 static void
 disconnect_note_handlers (BjbMainToolbarPrivate *priv)
@@ -594,7 +690,7 @@ action_view_tags_callback (GtkWidget *item, gpointer user_data)
 }
 
 static void
-delete_item_callback (GtkWidget *item, gpointer user_data)
+trash_item_callback (GtkWidget *item, gpointer user_data)
 {
   BjbMainToolbar *self = BJB_MAIN_TOOLBAR (user_data);
 
@@ -669,10 +765,10 @@ bjb_note_menu_new (BjbMainToolbar *self)
   }
 
   /* Delete Note */
-  item = gtk_menu_item_new_with_label(_("Delete this Note"));
+  item = gtk_menu_item_new_with_label(_("Move to Trash"));
   gtk_menu_shell_append(GTK_MENU_SHELL(result),item);
   g_signal_connect(item,"activate",
-                   G_CALLBACK(delete_item_callback),self);
+                   G_CALLBACK(trash_item_callback),self);
 
   gtk_widget_show_all (result);
   return result;
@@ -705,7 +801,7 @@ populate_bar_for_note_view (BjbMainToolbar *self)
                                               GTK_ICON_SIZE_MENU);
   gtk_widget_set_valign (priv->back, GTK_ALIGN_CENTER);
   gtk_header_bar_pack_start (bar, priv->back);
- 
+
   g_signal_connect_swapped (priv->back, "clicked",
                             G_CALLBACK (just_switch_to_main_view), self);
   gtk_widget_add_accelerator (priv->back, "activate", self->priv->accel,
@@ -797,6 +893,7 @@ populate_bar_switch (BjbMainToolbar *self)
   switch (priv->type)
   {
     case BJB_TOOLBAR_SELECT:
+    case BJB_TOOLBAR_TRASH_SELECT:
       populate_bar_for_selection (self);
       break;
 
@@ -818,6 +915,17 @@ populate_bar_switch (BjbMainToolbar *self)
                                 self->priv);
       break;
 
+
+    case BJB_TOOLBAR_TRASH_ICON:
+      //add_search_button (self); TODO (handle callback)
+      populate_bar_for_trash_icon_view (self);
+      break;
+
+    case BJB_TOOLBAR_TRASH_LIST:
+      //add_search_button (self); TODO (handle callback)
+      populate_bar_for_trash_list_view (self);
+      break;
+
     case BJB_TOOLBAR_NOTE_VIEW:
       populate_bar_for_note_view (self);
       break;
@@ -861,6 +969,23 @@ populate_main_toolbar(BjbMainToolbar *self)
 
       break;
 
+
+    case BJB_WINDOW_BASE_ARCHIVE_VIEW:
+
+      if (bjb_main_view_get_selection_mode (priv->parent) == TRUE)
+        to_be = BJB_TOOLBAR_TRASH_SELECT;
+
+      else if (bjb_main_view_get_view_type (priv->parent) == GD_MAIN_VIEW_ICON)
+        to_be = BJB_TOOLBAR_TRASH_ICON;
+
+      else if (bjb_main_view_get_view_type (priv->parent) == GD_MAIN_VIEW_LIST)
+        to_be = BJB_TOOLBAR_TRASH_LIST;
+
+
+      break;
+
+
+
     /* Not really a toolbar,
      * still used for Spinner */
     default:
@@ -876,7 +1001,7 @@ populate_main_toolbar(BjbMainToolbar *self)
 
     priv->type = to_be;
     bjb_main_toolbar_clear (self);
-    
+
 
     if (priv->search_handler != 0)
     {
diff --git a/src/bjb-selection-toolbar.c b/src/bjb-selection-toolbar.c
index 0dfa8bf..016864b 100644
--- a/src/bjb-selection-toolbar.c
+++ b/src/bjb-selection-toolbar.c
@@ -28,6 +28,8 @@
 #include "bjb-main-view.h"
 #include "bjb-organize-dialog.h"
 #include "bjb-selection-toolbar.h"
+#include "bjb-share.h"
+#include "bjb-trash-bar.h"
 #include "bjb-window-base.h"
 
 enum
@@ -40,20 +42,26 @@ enum
 
 static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
 
+
+/* Selection toolbar
+ * it uses two widgets
+ * header bar for classic view -> only show when selection
+ * toolbar for archive view -> always show bar for trash bin
+ */
+
 struct _BjbSelectionToolbarPrivate
 {
   GtkHeaderBar       *bar;
-
-  GtkWidget          *toolbar_trash;
-  GtkWidget          *toolbar_color;
-  GtkWidget          *toolbar_tag;
-
-  /* sure */
   BjbMainView        *view ;
+  BjbTrashBar        *trash_bar;
   GtkWidget          *widget ;
   GdMainView         *selection ;
 
-  /* misc gtk */
+  /* Header bar members. Classic view */
+  GtkWidget          *toolbar_trash;
+  GtkWidget          *toolbar_color;
+  GtkWidget          *toolbar_tag;
+  GtkWidget          *toolbar_share;
   GtkToolItem        *left_group;
   GtkToolItem        *right_group;
   GtkToolItem        *separator;
@@ -132,6 +140,22 @@ action_delete_selected_items (GtkWidget *w, BjbSelectionToolbar *self)
 
 
 static void
+action_share_item_callback (GtkWidget *w, BjbSelectionToolbar *self)
+{
+  GList *l, *selection;
+
+  selection = bjb_main_view_get_selected_items (self->priv->view);
+
+  for (l=selection; l!= NULL; l=l->next)
+  {
+     on_email_note_callback (w, l->data);
+  }
+
+  g_list_free (selection);
+}
+
+
+static void
 bjb_selection_toolbar_fade_in (BjbSelectionToolbar *self)
 {
   gtk_revealer_set_reveal_child (GTK_REVEALER (self), TRUE);
@@ -151,6 +175,7 @@ bjb_selection_toolbar_set_item_visibility (BjbSelectionToolbar *self)
   BjbSelectionToolbarPrivate *priv;
   GList *l, *selection;
   GdkRGBA color;
+  gboolean can_tag, can_color, can_share;
 
   g_return_if_fail (BJB_IS_SELECTION_TOOLBAR (self));
 
@@ -158,52 +183,80 @@ bjb_selection_toolbar_set_item_visibility (BjbSelectionToolbar *self)
   selection = bjb_main_view_get_selected_items (priv->view);
 
 
-  /* Color */
-  gtk_widget_set_sensitive (priv->toolbar_color, FALSE);
+  /* Default */
+  can_color = TRUE;
+  can_tag = TRUE;
+  can_share = TRUE;
 
 
+  /* Adapt */
   for (l=selection; l !=NULL; l=l->next)
   {
-    if (!biji_item_has_color (l->data))
+    if (can_tag == TRUE) /* tag is default. check if still applies */
     {
-      gtk_widget_set_sensitive (priv->toolbar_color, FALSE);
-      break;
+      if (!biji_item_is_collectable (l->data))
+        can_tag = FALSE;
     }
 
-    else if (BIJI_IS_NOTE_OBJ (l->data))
-    {
-      if (biji_note_obj_get_rgba (BIJI_NOTE_OBJ (l->data), &color))
-      {
-        gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->toolbar_color), &color);
-        gtk_widget_set_sensitive (priv->toolbar_color, TRUE);
-        break;
-      }
-    }
-  }
 
+    if (can_color == TRUE) /* color is default. check */
+    {
+      if (!BIJI_IS_NOTE_OBJ (l->data)
+          || !biji_item_has_color (l->data)
+          || !biji_note_obj_get_rgba (BIJI_NOTE_OBJ (l->data), &color))
+        can_color = FALSE;
 
-  /* Organize */
-  gtk_widget_set_sensitive (priv->toolbar_tag, TRUE);
+     else
+       gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (priv->toolbar_color), &color);
+    }
 
-  for (l=selection; l!=NULL; l=l->next)
-  {
-    if (!biji_item_is_collectable (l->data))
+    if (can_share == TRUE) /* share is default. check. */
     {
-      gtk_widget_set_sensitive (priv->toolbar_tag, FALSE);
-      break;
+      if (!BIJI_IS_NOTE_OBJ (l->data))
+        can_share = FALSE;
     }
   }
 
+
+  gtk_widget_set_sensitive (priv->toolbar_color, can_color);
+  gtk_widget_set_sensitive (priv->toolbar_tag, can_tag);
+  gtk_widget_set_sensitive (priv->toolbar_share, can_share);
+
   g_list_free (selection);
 }
 
 static void
 bjb_selection_toolbar_selection_changed (GdMainView *view, gpointer user_data)
 {
-  
-  BjbSelectionToolbar *self = BJB_SELECTION_TOOLBAR (user_data);
+
+  BjbSelectionToolbar *self;
+  BjbSelectionToolbarPrivate *priv;
   GList *selection;
+  BijiItemsGroup group;
+
+  self = BJB_SELECTION_TOOLBAR (user_data);
+  priv = self->priv;
+  group = bjb_controller_get_group (
+            bjb_window_base_get_controller (
+              BJB_WINDOW_BASE (
+                bjb_main_view_get_window (self->priv->view))));
+
+
+  /* always show bar for archive view */
+  if (group  == BIJI_ARCHIVED_ITEMS)
+  {
+    priv->bar = g_object_ref (priv->bar);
+    bjb_selection_toolbar_fade_in (self);
+    gtk_container_remove (GTK_CONTAINER (self), GTK_WIDGET (priv->bar));
+    gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->trash_bar));
+    bjb_trash_bar_set_visibility (priv->trash_bar);
+    return;
+  }
+
 
+  priv->trash_bar = g_object_ref (priv->trash_bar);
+  gtk_container_remove (GTK_CONTAINER (self), GTK_WIDGET (priv->trash_bar));
+  gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->bar));
   selection = gd_main_view_get_selection(view);
 
   if (g_list_length (selection) > 0)
@@ -211,7 +264,7 @@ bjb_selection_toolbar_selection_changed (GdMainView *view, gpointer user_data)
     bjb_selection_toolbar_set_item_visibility (self);
     bjb_selection_toolbar_fade_in (self);
   }
-  
+
   else
     bjb_selection_toolbar_fade_out (self);
 }
@@ -227,8 +280,8 @@ static void
 bjb_selection_toolbar_init (BjbSelectionToolbar *self)
 {
   BjbSelectionToolbarPrivate *priv;
-  GtkWidget                  *widget;
-  
+  GtkWidget                  *widget, *share;
+  GtkSizeGroup *size;
 
   self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, BJB_TYPE_SELECTION_TOOLBAR, BjbSelectionToolbarPrivate);
   priv = self->priv;
@@ -240,10 +293,12 @@ bjb_selection_toolbar_init (BjbSelectionToolbar *self)
   priv->bar = GTK_HEADER_BAR (gtk_header_bar_new ());
   gtk_container_add (GTK_CONTAINER (self), GTK_WIDGET (priv->bar));
 
-  /* Trash notes */
-  priv->toolbar_trash = gtk_button_new_with_label (_("Delete"));
-  gtk_widget_set_valign (priv->toolbar_trash, GTK_ALIGN_CENTER);
-  gtk_header_bar_pack_start (priv->bar, priv->toolbar_trash);
+
+  /* Notes tags */
+  priv->toolbar_tag = gtk_button_new_with_label (_("Notebooks"));
+  gtk_widget_set_valign (priv->toolbar_tag, GTK_ALIGN_CENTER);
+  gtk_header_bar_pack_start (priv->bar, priv->toolbar_tag);
+
 
 
   /* Notes color */
@@ -251,13 +306,35 @@ bjb_selection_toolbar_init (BjbSelectionToolbar *self)
   gtk_widget_set_tooltip_text (GTK_WIDGET (priv->toolbar_color),
                                _("Note color"));
   gtk_widget_set_valign (priv->toolbar_color, GTK_ALIGN_CENTER);
-  gtk_header_bar_pack_end (priv->bar, priv->toolbar_color);
+  gtk_header_bar_pack_start (priv->bar, priv->toolbar_color);
 
 
-  /* Notes tags */
-  priv->toolbar_tag = gtk_button_new_with_label (_("Notebooks"));
-  gtk_widget_set_valign (priv->toolbar_tag, GTK_ALIGN_CENTER);
-  gtk_header_bar_pack_end (priv->bar, priv->toolbar_tag);
+  /* Share */
+  priv->toolbar_share = gtk_button_new ();
+  share = gtk_image_new_from_icon_name ("send-to-symbolic", GTK_ICON_SIZE_MENU);
+  gtk_button_set_image (GTK_BUTTON (priv->toolbar_share), share);
+  gtk_widget_set_valign (share, GTK_ALIGN_CENTER);
+  gtk_style_context_add_class (gtk_widget_get_style_context (priv->toolbar_share),
+                               "image-button");
+  gtk_widget_set_tooltip_text (priv->toolbar_share, _("Share note"));
+  gtk_header_bar_pack_start (priv->bar, priv->toolbar_share);
+
+
+  /* Trash notes */
+  priv->toolbar_trash = gtk_button_new_with_label (_("Move to Trash"));
+  gtk_widget_set_valign (priv->toolbar_trash, GTK_ALIGN_CENTER);
+  gtk_header_bar_pack_end (priv->bar, priv->toolbar_trash);
+
+
+
+  /* Align buttons */
+  size = gtk_size_group_new (GTK_SIZE_GROUP_VERTICAL);
+  gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->toolbar_tag);
+  gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->toolbar_color);
+  gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->toolbar_share);
+  gtk_size_group_add_widget (GTK_SIZE_GROUP (size), priv->toolbar_trash);
+  g_object_unref (size);
+
 
 
   gtk_widget_show_all (widget);
@@ -310,23 +387,34 @@ bjb_selection_toolbar_constructed(GObject *obj)
 {
   BjbSelectionToolbar *self = BJB_SELECTION_TOOLBAR(obj);
   BjbSelectionToolbarPrivate *priv = self->priv ;
-  
+
   G_OBJECT_CLASS (bjb_selection_toolbar_parent_class)->constructed (obj);
 
-  /* item(s) selected --> fade in */
+
+  priv->trash_bar = bjb_trash_bar_new (
+          bjb_window_base_get_controller (
+                BJB_WINDOW_BASE (
+                  bjb_main_view_get_window (self->priv->view))),
+          self->priv->selection);
+
+
+
   g_signal_connect (self->priv->selection,
                     "view-selection-changed", 
                     G_CALLBACK(bjb_selection_toolbar_selection_changed),
                     self);
 
+  g_signal_connect (priv->toolbar_tag,"clicked",
+                    G_CALLBACK (action_tag_selected_items), self);
+
   g_signal_connect_swapped (priv->toolbar_color,"clicked",
                     G_CALLBACK (hide_self), self);
 
   g_signal_connect (priv->toolbar_color,"color-set",
                     G_CALLBACK (action_color_selected_items), self);
 
-  g_signal_connect (priv->toolbar_tag,"clicked",
-                    G_CALLBACK (action_tag_selected_items), self);
+  g_signal_connect (priv->toolbar_share, "clicked",
+                    G_CALLBACK (action_share_item_callback), self);
 
   g_signal_connect (priv->toolbar_trash,"clicked",
                     G_CALLBACK (action_delete_selected_items), self);
diff --git a/src/bjb-trash-bar.c b/src/bjb-trash-bar.c
new file mode 100644
index 0000000..1b8bdbd
--- /dev/null
+++ b/src/bjb-trash-bar.c
@@ -0,0 +1,213 @@
+/* bjb-trash-bar.c
+ * Copyright (C) Pierre-Yves LUYTEN 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
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * bijiben 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/>.
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <libgd/gd.h>
+
+#include "bjb-main-view.h"
+#include "bjb-selection-toolbar.h"
+#include "bjb-trash-bar.h"
+#include "bjb-window-base.h"
+
+
+enum
+{
+  PROP_0,
+  PROP_BJB_SELECTION,
+  PROP_BJB_CONTROLLER,
+  NUM_PROPERTIES
+};
+
+
+
+static GParamSpec *properties[NUM_PROPERTIES] = { NULL, };
+
+
+struct BjbTrashBarPrivate_
+{
+  GtkWidget     *bar;
+  BjbController *controller;
+  GdMainView    *selection;
+
+  GtkWidget     *restore;
+  GtkWidget     *delete;
+  GtkWidget     *empty_bin;
+};
+
+
+
+
+G_DEFINE_TYPE (BjbTrashBar, bjb_trash_bar, GTK_TYPE_BOX)
+
+
+void
+bjb_trash_bar_set_visibility      (BjbTrashBar *self)
+{
+/*
+  BjbTrashBarPrivate *priv;
+  GList *items;
+
+  priv = self->priv;
+  items = gd_main_view_get_selection (priv->selection);
+
+  if (items != NULL)
+    gtk_widget_hide (priv->empty_bin);
+
+  else
+    gtk_widget_show (priv->empty_bin);
+
+  g_list_free (items);
+*/
+}
+
+void
+bjb_trash_bar_fade_in             (BjbTrashBar *self)
+{
+}
+
+
+void
+bjb_trash_bar_fade_out            (BjbTrashBar *self)
+{
+}
+
+static void
+bjb_trash_bar_dispose (GObject *obj)
+{
+  G_OBJECT_CLASS (bjb_trash_bar_parent_class)->dispose (obj);
+}
+
+
+static void
+bjb_trash_bar_get_property (GObject  *object,
+                            guint     property_id,
+                            GValue   *value,
+                            GParamSpec *pspec)
+{
+  BjbTrashBar *self = BJB_TRASH_BAR (object);
+
+  switch (property_id)
+  {
+    case PROP_BJB_SELECTION:
+      g_value_set_object(value, self->priv->selection);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+  }
+}
+
+
+static void
+bjb_trash_bar_set_property (GObject  *object,
+                            guint     property_id,
+                            const GValue *value,
+                            GParamSpec *pspec)
+{
+  BjbTrashBar *self = BJB_TRASH_BAR (object);
+
+  switch (property_id)
+  {
+    case PROP_BJB_SELECTION:
+      self->priv->selection = g_value_get_object (value);
+      break;
+
+    case PROP_BJB_CONTROLLER:
+      self->priv->controller = g_value_get_object (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+  }
+}
+
+
+static void
+bjb_trash_bar_constructed (GObject *obj)
+{
+  BjbTrashBar *self;
+  BjbTrashBarPrivate *priv;
+
+  G_OBJECT_CLASS (bjb_trash_bar_parent_class)->constructed (obj);
+
+  self = BJB_TRASH_BAR (obj);
+  priv = self->priv;
+
+  priv->empty_bin = gtk_label_new (_("Empty"));
+  //gtk_container_add (GTK_CONTAINER (self), priv->empty_bin);
+  gtk_widget_show_all (GTK_WIDGET (self));
+}
+
+
+
+static void
+bjb_trash_bar_class_init (BjbTrashBarClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->dispose = bjb_trash_bar_dispose;
+  object_class->get_property = bjb_trash_bar_get_property;
+  object_class->set_property = bjb_trash_bar_set_property;
+  object_class->constructed = bjb_trash_bar_constructed;
+
+  properties[PROP_BJB_SELECTION] = g_param_spec_object ("selection",
+                                                        "Selection",
+                                                        "SelectionController",
+                                                        GD_TYPE_MAIN_VIEW,
+                                                        G_PARAM_READWRITE |
+                                                        G_PARAM_CONSTRUCT |
+                                                        G_PARAM_STATIC_STRINGS);
+
+
+  properties[PROP_BJB_CONTROLLER] = g_param_spec_object ("controller",
+                                                         "Controller",
+                                                         "Window Controller",
+                                                         BJB_TYPE_CONTROLLER,
+                                                         G_PARAM_READWRITE  |
+                                                         G_PARAM_CONSTRUCT |
+                                                         G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
+
+  g_type_class_add_private ((gpointer)klass, sizeof (BjbTrashBarPrivate));
+}
+
+
+
+static void
+bjb_trash_bar_init (BjbTrashBar *self)
+{
+  self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, BJB_TYPE_TRASH_BAR, BjbTrashBarPrivate);
+}
+
+
+BjbTrashBar *
+bjb_trash_bar_new (BjbController *controller,
+                   GdMainView *view)
+{
+  return g_object_new (BJB_TYPE_TRASH_BAR,
+                       "orientation", GTK_ORIENTATION_HORIZONTAL,
+                       "spacing", 2,
+                       "controller", controller,
+                       "selection", view,
+                        NULL);
+}
diff --git a/src/bjb-trash-bar.h b/src/bjb-trash-bar.h
new file mode 100644
index 0000000..3a8a3be
--- /dev/null
+++ b/src/bjb-trash-bar.h
@@ -0,0 +1,73 @@
+/* bjb-trash-bar.h
+ * Copyright (C) Pierre-Yves LUYTEN 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
+ * Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * bijiben 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/>.
+ */
+
+
+#ifndef BJB_TRASH_BAR_H_
+#define BJB_TRASH_BAR_H_ 1
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include <libgd/gd.h>
+
+#include "bjb-controller.h"
+
+G_BEGIN_DECLS
+
+
+#define BJB_TYPE_TRASH_BAR             (bjb_trash_bar_get_type ())
+#define BJB_TRASH_BAR(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BJB_TYPE_TRASH_BAR, BjbTrashBar))
+#define BJB_TRASH_BAR_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BJB_TYPE_TRASH_BAR, 
BjbTrashBarClass))
+#define BJB_IS_TRASH_BAR(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), BJB_TYPE_TRASH_BAR))
+#define BJB_IS_TRASH_BAR_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), BJB_TYPE_TRASH_BAR))
+#define BJB_TRASH_BAR_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), BJB_TYPE_TRASH_BAR, 
BjbTrashBarClass))
+
+typedef struct BjbTrashBar_         BjbTrashBar;
+typedef struct BjbTrashBarClass_    BjbTrashBarClass;
+typedef struct BjbTrashBarPrivate_  BjbTrashBarPrivate;
+
+struct BjbTrashBar_
+{
+  GtkBox parent;
+  BjbTrashBarPrivate *priv;
+};
+
+struct BjbTrashBarClass_
+{
+  GtkBoxClass parent_class;
+};
+
+
+GType                 bjb_trash_bar_get_type            (void);
+
+
+BjbTrashBar *         bjb_trash_bar_new                 (BjbController *controller,
+                                                         GdMainView    *selection);
+
+
+void                  bjb_trash_bar_set_visibility      (BjbTrashBar *self);
+
+
+void                  bjb_trash_bar_fade_in             (BjbTrashBar *self);
+
+
+void                  bjb_trash_bar_fade_out            (BjbTrashBar *self);
+
+
+G_END_DECLS
+
+#endif /* BJB_TRASH_BAR_H_ */
diff --git a/src/bjb-window-base.c b/src/bjb-window-base.c
index ff9e2b0..434131d 100644
--- a/src/bjb-window-base.c
+++ b/src/bjb-window-base.c
@@ -126,13 +126,13 @@ bjb_window_base_constructed (GObject *obj)
 
   bjb = gdk_pixbuf_new_from_file (full_path, &error);
   g_free (full_path);
-    
+
   if ( error )
   {
     g_message("%s", error->message);
     g_error_free(error);
   }
-    
+
   icons = g_list_prepend(icons,bjb);
   gtk_window_set_default_icon_list(icons);
   g_list_foreach (icons, (GFunc) g_object_unref, NULL);
@@ -256,6 +256,9 @@ bjb_window_base_get_note (BjbWindowBase *self)
   return self->priv->note;
 }
 
+
+
+
 static void
 destroy_note_if_needed (BjbWindowBase *bwb)
 {
@@ -279,7 +282,10 @@ bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type)
 
     /* Precise the window does not display any specific note
      * Refresh the model
-     * Ensure the main view receives the proper signals */
+     * Ensure the main view receives the proper signals
+     *
+     * main view & archive view are the same widget
+     */
 
     case BJB_WINDOW_BASE_MAIN_VIEW:
       bjb_search_toolbar_connect (priv->search_bar);
@@ -287,6 +293,11 @@ bjb_window_base_switch_to (BjbWindowBase *bwb, BjbWindowViewType type)
       gtk_stack_set_visible_child_name (priv->stack, "main-view");
       break;
 
+   case BJB_WINDOW_BASE_ARCHIVE_VIEW:
+      bjb_search_toolbar_connect (priv->search_bar);
+      bjb_main_view_connect_signals (priv->view);
+      gtk_stack_set_visible_child_name (priv->stack, "main-view");
+      break;
 
     case BJB_WINDOW_BASE_SPINNER_VIEW:
       gtk_stack_set_visible_child_name (priv->stack, "spinner");
diff --git a/src/bjb-window-base.h b/src/bjb-window-base.h
index e225b74..74ad300 100644
--- a/src/bjb-window-base.h
+++ b/src/bjb-window-base.h
@@ -31,6 +31,7 @@ struct _BjbWindowBase
 };
 
 typedef enum {
+  BJB_WINDOW_BASE_ARCHIVE_VIEW,
   BJB_WINDOW_BASE_MAIN_VIEW,
   BJB_WINDOW_BASE_SPINNER_VIEW,
   BJB_WINDOW_BASE_NOTE_VIEW,
@@ -44,7 +45,7 @@ GType bjb_window_base_get_type (void);
 
 GtkWindow * bjb_window_base_new(void);
 
-// Accessor 
+// Accessor
 
 BjbController * bjb_window_base_get_controller ( BjbWindowBase *window ) ;
 
diff --git a/src/libbiji/biji-manager.c b/src/libbiji/biji-manager.c
index f021219..c01c2ed 100644
--- a/src/libbiji/biji-manager.c
+++ b/src/libbiji/biji-manager.c
@@ -34,6 +34,7 @@ struct _BijiManagerPrivate
    * Keep a direct pointer to local provider for convenience. */
 
   GHashTable *items;
+  GHashTable *archives;
   GHashTable *providers;
   BijiProvider *local_provider;
 
@@ -97,6 +98,10 @@ biji_manager_init (BijiManager *self)
                                        NULL,
                                        g_object_unref);
 
+  priv->archives = g_hash_table_new_full (g_str_hash,
+                                          g_str_equal,
+                                          NULL,
+                                          g_object_unref);
   /*
    * Providers are the different notes storage
    * the hash table use an id
@@ -153,6 +158,8 @@ biji_manager_finalize (GObject *object)
 
   g_clear_object (&manager->priv->location);
   g_hash_table_destroy (manager->priv->items);
+  g_hash_table_destroy (manager->priv->archives);
+
 
   G_OBJECT_CLASS (biji_manager_parent_class)->finalize (object);
 }
@@ -267,13 +274,15 @@ biji_manager_get_unique_title (BijiManager *manager, const gchar *title)
 
 void
 biji_manager_notify_changed (BijiManager            *manager,
-                               BijiManagerChangeFlag   flag,
-                               BijiItem                *item)
+                             BijiItemsGroup          group,
+                             BijiManagerChangeFlag   flag,
+                             BijiItem               *item)
 {
   g_debug ("manager: notify changed, %i", flag);
   g_signal_emit (manager,
                  biji_manager_signals[BOOK_AMENDED],
                  0,
+                 group,
                  flag,
                  item);
 }
@@ -283,18 +292,27 @@ biji_manager_notify_changed (BijiManager            *manager,
 void
 manager_on_note_changed_cb (BijiNoteObj *note, BijiManager *manager)
 {
-  biji_manager_notify_changed (manager, BIJI_MANAGER_NOTE_AMENDED, BIJI_ITEM (note));
+  biji_manager_notify_changed (manager,
+                               BIJI_LIVING_ITEMS,
+                               BIJI_MANAGER_NOTE_AMENDED,
+                               BIJI_ITEM (note));
 }
 
 static void
 manager_on_item_icon_changed_cb (BijiNoteObj *note, BijiManager *manager)
 {
-  biji_manager_notify_changed (manager, BIJI_MANAGER_ITEM_ICON_CHANGED, BIJI_ITEM (note));
+  biji_manager_notify_changed (manager,
+                               BIJI_LIVING_ITEMS,
+                               BIJI_MANAGER_ITEM_ICON_CHANGED,
+                               BIJI_ITEM (note));
 }
 
 
 gboolean
-biji_manager_add_item (BijiManager *manager, BijiItem *item, gboolean notify)
+biji_manager_add_item (BijiManager *manager,
+                       BijiItem *item,
+                       BijiItemsGroup group,
+                       gboolean notify)
 {
   const gchar *uid;
   gboolean retval;
@@ -305,17 +323,34 @@ biji_manager_add_item (BijiManager *manager, BijiItem *item, gboolean notify)
   retval = TRUE;
   uid = biji_item_get_uuid (item);
 
-  if (uid != NULL &&
-      g_hash_table_lookup (manager->priv->items, uid))
-    retval = FALSE;
+  /* Check if item is not already there */
+  if (uid != NULL)
+  {
+    if (group == BIJI_LIVING_ITEMS &&
+        g_hash_table_lookup (manager->priv->items, uid))
+      retval = FALSE;
 
+    if (group == BIJI_ARCHIVED_ITEMS &&
+        g_hash_table_lookup (manager->priv->archives, uid))
+      retval = FALSE;
+  }
 
-  else
-  {
-    g_hash_table_insert (manager->priv->items,
-                         (gpointer) biji_item_get_uuid (item), item);
 
+  /* Fail because UUID is null */
+  else
+    retval = FALSE;
 
+  if (retval == TRUE)
+  {
+    /* Add the item*/
+    if (group == BIJI_LIVING_ITEMS)
+      g_hash_table_insert (manager->priv->items,
+                           (gpointer) biji_item_get_uuid (item), item);
+    else if (group == BIJI_ARCHIVED_ITEMS)
+      g_hash_table_insert (manager->priv->archives,
+                           (gpointer) biji_item_get_uuid (item), item);
+
+    /* Connect */
     if (BIJI_IS_NOTE_OBJ (item))
     {
       g_signal_connect (item, "changed", G_CALLBACK (manager_on_note_changed_cb), manager);
@@ -330,7 +365,7 @@ biji_manager_add_item (BijiManager *manager, BijiItem *item, gboolean notify)
   }
 
   if (retval && notify)
-    biji_manager_notify_changed (manager, BIJI_MANAGER_ITEM_ADDED, item);
+    biji_manager_notify_changed (manager, group, BIJI_MANAGER_ITEM_ADDED, item);
 
   return retval;
 }
@@ -341,31 +376,40 @@ biji_manager_add_item (BijiManager *manager, BijiItem *item, gboolean notify)
 static void
 on_provider_loaded_cb (BijiProvider *provider,
                        GList *items,
+                       BijiItemsGroup  group,
                        BijiManager *manager)
 {
-  BijiItem *item = NULL;
   GList *l;
-  gint i = 0;
 
 
-  for (l=items; l!=NULL; l=l->next)
+  switch (group)
   {
-    if (BIJI_IS_ITEM (l->data))
-    {
-      biji_manager_add_item (manager, l->data, FALSE);
-      i++;
-    }
-  }
+    case BIJI_LIVING_ITEMS:
+      for (l=items; l!=NULL; l=l->next)
+      {
+        if (BIJI_IS_ITEM (l->data))
+          biji_manager_add_item (manager, l->data, BIJI_LIVING_ITEMS, FALSE);
+      }
+      break;
 
+    case BIJI_ARCHIVED_ITEMS:
+      for (l=items; l!= NULL; l=l->next)
+      {
+        if (BIJI_IS_ITEM (l->data))
+          biji_manager_add_item (manager, l->data, BIJI_ARCHIVED_ITEMS, FALSE);
+      }
+      break;
 
-  g_debug ("on provider loaded: %i", i);
+   default:
+     break;
+  }
 
 
   /* More cautious to ask to fully rebuild the model
    * because this might be the first provider.
    * See #708458
    * There are more performant fixes but not worth it */
-  biji_manager_notify_changed (manager, BIJI_MANAGER_MASS_CHANGE, item);
+  biji_manager_notify_changed (manager, group, BIJI_MANAGER_MASS_CHANGE, NULL);
 }
 
 
@@ -476,8 +520,8 @@ biji_manager_class_init (BijiManagerClass *klass)
   biji_manager_signals[BOOK_AMENDED] =
     g_signal_new ("changed", G_OBJECT_CLASS_TYPE (klass), G_SIGNAL_RUN_LAST,
                   0, NULL, NULL,                         /* offset & accumulator */
-                  _biji_marshal_VOID__ENUM_POINTER,
-                  G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_POINTER);
+                  _biji_marshal_VOID__ENUM_ENUM_POINTER,
+                  G_TYPE_NONE, 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_POINTER);
 
   properties[PROP_LOCATION] =
     g_param_spec_object ("location",
@@ -517,7 +561,7 @@ biji_manager_get_default_color (BijiManager *manager, GdkRGBA *color)
 }
 
 
-gboolean 
+gboolean
 biji_manager_remove_item (BijiManager *manager, BijiItem *item)
 {
   g_return_val_if_fail (BIJI_IS_MANAGER (manager), FALSE);
@@ -534,7 +578,7 @@ biji_manager_remove_item (BijiManager *manager, BijiItem *item)
   {
     /* Signal before doing anything here. So the note is still
      * fully available for signal receiver. */
-    biji_manager_notify_changed (manager, BIJI_MANAGER_ITEM_TRASHED, to_delete);
+    biji_manager_notify_changed (manager, BIJI_LIVING_ITEMS, BIJI_MANAGER_ITEM_TRASHED, to_delete);
     biji_item_trash (item);
     g_hash_table_remove (manager->priv->items, path);
 
@@ -545,12 +589,46 @@ biji_manager_remove_item (BijiManager *manager, BijiItem *item)
 }
 
 
+
 GList *
-biji_manager_get_items (BijiManager *manager)
+biji_manager_get_items             (BijiManager         *manager,
+                                    BijiItemsGroup       group)
+{
+  GList *list;
+
+
+  switch (group)
+  {
+    case BIJI_LIVING_ITEMS:
+      list = g_hash_table_get_values (manager->priv->items);
+      break;
+
+    case BIJI_ARCHIVED_ITEMS:
+      list = g_hash_table_get_values (manager->priv->archives);
+      break;
+
+    default:
+      list = NULL;
+      g_warning ("invalid BijiItemsGroup:%i", group);
+  }
+
+  return list;
+}
+
+
+void
+biji_manager_load_archives          (BijiManager        *manager)
 {
-  return g_hash_table_get_values (manager->priv->items);
+  GList *l, *ll;
+
+  l = g_hash_table_get_values (manager->priv->providers);
+  for (ll=l; ll!= NULL; ll=ll->next)
+    biji_provider_load_archives (BIJI_PROVIDER (ll->data));
+  g_list_free (l);
 }
 
+
+
 BijiItem *
 biji_manager_get_item_at_path (BijiManager *manager, const gchar *path)
 {
@@ -657,7 +735,7 @@ biji_manager_local_note_new           (BijiManager *manager, gchar *str)
   }
 
   biji_note_obj_save_note (ret);
-  biji_manager_add_item (manager, BIJI_ITEM (ret), TRUE);
+  biji_manager_add_item (manager, BIJI_ITEM (ret), TRUE, BIJI_LIVING_ITEMS);
 
   return ret;
 }
@@ -677,7 +755,7 @@ biji_manager_import_uri (BijiManager *manager,
   ret = biji_import_provider_new (manager, target_provider_id, uri);
   g_signal_connect (ret, "loaded", 
                     G_CALLBACK (on_provider_loaded_cb), manager);
-  
+
 }
 
 /* 
@@ -707,11 +785,11 @@ biji_manager_note_new            (BijiManager *manager,
   retval = BIJI_PROVIDER_GET_CLASS (provider)->create_new_note (provider, str);
   // do not save. up to the provider implementation to save it or not
   // at creation.
-  biji_manager_add_item (manager, BIJI_ITEM (retval), TRUE);
+  biji_manager_add_item (manager, BIJI_ITEM (retval), TRUE, BIJI_LIVING_ITEMS);
 
   return retval;
 }
-                                    
+
 
 
 
diff --git a/src/libbiji/biji-manager.h b/src/libbiji/biji-manager.h
index 3a4d434..55b6b86 100644
--- a/src/libbiji/biji-manager.h
+++ b/src/libbiji/biji-manager.h
@@ -27,6 +27,14 @@ typedef enum
   BIJI_MANAGER_NOTE_AMENDED,       // Single note amended (title, content)
 } BijiManagerChangeFlag;
 
+
+typedef enum
+{
+  BIJI_LIVING_ITEMS,
+  BIJI_ARCHIVED_ITEMS
+} BijiItemsGroup;
+
+
 #define BIJI_TYPE_MANAGER             (biji_manager_get_type ())
 #define BIJI_MANAGER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), BIJI_TYPE_MANAGER, BijiManager))
 #define BIJI_MANAGER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), BIJI_TYPE_MANAGER, 
BijiManagerClass))
@@ -89,14 +97,16 @@ gchar           *biji_manager_get_unique_title      (BijiManager *manager,
                                                        const gchar *title);
 
 
-gboolean         biji_manager_add_item              (BijiManager *manager,
+gboolean         biji_manager_add_item                (BijiManager *manager,
                                                        BijiItem *item,
+                                                       BijiItemsGroup group,
                                                        gboolean notify);
 
 
 void             biji_manager_notify_changed        (BijiManager           *manager,
-                                                       BijiManagerChangeFlag  flag,
-                                                       BijiItem               *item);
+                                                     BijiItemsGroup         group,
+                                                     BijiManagerChangeFlag  flag,
+                                                     BijiItem              *item);
 
 
 gboolean         biji_manager_remove_item           (BijiManager *manager,
@@ -109,7 +119,14 @@ BijiItem        *biji_manager_get_item_at_path      (BijiManager *manager,
 
 /* Get all items, either notes or notebooks
  * Free the GList, not its content */
-GList           *biji_manager_get_items             (BijiManager *manager);
+
+
+GList           *biji_manager_get_items             (BijiManager         *manager,
+                                                     BijiItemsGroup       group);
+
+
+
+void             biji_manager_load_archives          (BijiManager        *manager);
 
 
 
diff --git a/src/libbiji/biji-marshalers.list b/src/libbiji/biji-marshalers.list
index 118a52f..19d678e 100644
--- a/src/libbiji/biji-marshalers.list
+++ b/src/libbiji/biji-marshalers.list
@@ -1,2 +1,3 @@
-VOID:ENUM,POINTER
+VOID:ENUM,ENUM,POINTER
 VOID:BOOLEAN,BOOLEAN
+VOID:POINTER,ENUM
diff --git a/src/libbiji/biji-tracker.c b/src/libbiji/biji-tracker.c
index ec2ce04..4b10e49 100644
--- a/src/libbiji/biji-tracker.c
+++ b/src/libbiji/biji-tracker.c
@@ -364,7 +364,8 @@ biji_get_items_with_notebook_async (BijiManager          *manager,
 
 
 void
-biji_get_items_matching_async (BijiManager          *manager,
+biji_get_items_matching_async (BijiManager           *manager,
+                               BijiItemsGroup         group,
                                gchar                 *needle,
                                BijiItemsListCallback  list_cb,
                                gpointer               user_data)
@@ -459,7 +460,7 @@ on_new_notebook_query_executed (GObject *source_object, GAsyncResult *res, gpoin
                        urn,
                        finisher->str,
                        g_get_real_time () / G_USEC_PER_SEC);
-    biji_manager_add_item (finisher->manager, BIJI_ITEM (notebook), TRUE);
+    biji_manager_add_item (finisher->manager, BIJI_ITEM (notebook), TRUE, BIJI_LIVING_ITEMS);
   }
 
   /* Run the callback from the caller */
diff --git a/src/libbiji/biji-tracker.h b/src/libbiji/biji-tracker.h
index 2883d1c..e9dcc2f 100644
--- a/src/libbiji/biji-tracker.h
+++ b/src/libbiji/biji-tracker.h
@@ -55,6 +55,7 @@ void        biji_get_items_with_notebook_async       (BijiManager *manager,
 
 
 void        biji_get_items_matching_async              (BijiManager *manager,
+                                                        BijiItemsGroup group,
                                                         gchar *needle,
                                                         BijiItemsListCallback cb,
                                                         gpointer user_data);
diff --git a/src/libbiji/provider/biji-import-provider.c b/src/libbiji/provider/biji-import-provider.c
index f3b3c3a..ff201eb 100644
--- a/src/libbiji/provider/biji-import-provider.c
+++ b/src/libbiji/provider/biji-import-provider.c
@@ -91,7 +91,6 @@ instanciate_note (BijiImportProvider *self, GFileInfo *info, GFile *container)
   BijiInfoSet *set;
   gchar *html = NULL;
   GList *notebooks = NULL;
-  
 
   biji_tomboy_reader_read   (path,
                              &error,
@@ -181,7 +180,8 @@ go_through_notes_cb (GObject *object, GAsyncResult *res, gpointer data)
 
   g_list_free_full (notes_info, g_object_unref);
   BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self),
-                                                 g_hash_table_get_values (self->priv->items));
+                                                 g_hash_table_get_values (self->priv->items),
+                                                 BIJI_LIVING_ITEMS);
 
 
 
diff --git a/src/libbiji/provider/biji-local-provider.c b/src/libbiji/provider/biji-local-provider.c
index 82cf93b..b725396 100644
--- a/src/libbiji/provider/biji-local-provider.c
+++ b/src/libbiji/provider/biji-local-provider.c
@@ -40,8 +40,13 @@ struct BijiLocalProviderPrivate_
   BijiProviderInfo    info;
 
   GFile               *location;
+  GFile               *trash_file;
   GHashTable          *items;
+  GHashTable          *archives;
   GCancellable        *load_cancellable;
+
+  BijiProviderHelper  *living_helper;
+  BijiProviderHelper  *archives_helper;
 };
 
 
@@ -60,7 +65,7 @@ enum {
 static GParamSpec *properties[BIJI_LOCAL_PROP] = { NULL, };
 
 
-#define ATTRIBUTES_FOR_NOTEBOOK "standard::content-type,standard::name"
+#define ATTRIBUTES_FOR_LOCATION "standard::content-type,standard::name"
 
 
 static void
@@ -68,7 +73,6 @@ load_location_error (GFile *location,
                      GError *error)
 {
   gchar *path;
-  
 
   path = g_file_get_path (location);
   g_printerr ("Unable to load location %s: %s", path, error->message);
@@ -89,17 +93,25 @@ release_enum_cb (GObject *source, GAsyncResult *res, gpointer user_data)
 
 static void
 create_notebook_if_needed (gpointer key,
-                             gpointer value,
-                             gpointer user_data)
+                           gpointer value,
+                           gpointer user_data)
 {
   BijiLocalProvider *self;
+  BijiProviderHelper *helper;
   BijiInfoSet *set;
   BijiNotebook *notebook;
   BijiManager *manager;
 
+  helper = user_data;
+
+  /* hmm. rather not load notebooks for archives
+   * this is the work for the restore task
+   * to handle notebooks. */
+  if (helper->group == BIJI_ARCHIVED_ITEMS)
+    return;
 
-  self = user_data;
   set = value;
+  self = BIJI_LOCAL_PROVIDER (helper->provider);
   notebook = g_hash_table_lookup (self->priv->items, key);
   manager = biji_provider_get_manager (BIJI_PROVIDER (self));
 
@@ -121,17 +133,24 @@ local_provider_finish (GHashTable *notebooks,
                        gpointer user_data)
 {
   BijiLocalProvider *self;
+  BijiProviderHelper *helper;
   GList *list;
 
+  helper = user_data;
+  self = BIJI_LOCAL_PROVIDER (helper->provider);
 
-  self = user_data;
-  g_hash_table_foreach (notebooks, create_notebook_if_needed, user_data);
-  g_hash_table_destroy (notebooks);
+  if (helper->group == BIJI_LIVING_ITEMS)
+    g_hash_table_foreach (notebooks, create_notebook_if_needed, user_data);
 
+  g_hash_table_destroy (notebooks);
 
   /* Now simply provide data to controller */
-  list = g_hash_table_get_values (self->priv->items);
-  BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self), list);
+  if (helper->group == BIJI_LIVING_ITEMS)
+    list = g_hash_table_get_values (self->priv->items);
+  else
+    list = g_hash_table_get_values (self->priv->archives);
+
+  BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self), list, helper->group);
   g_list_free (list);
 }
 
@@ -143,13 +162,15 @@ enumerate_next_files_ready_cb (GObject *source,
 {
   GFileEnumerator *enumerator;
   BijiLocalProvider *self;
+  BijiProviderHelper *helper;
   GList *files, *l;
   GError *error;
   gchar *base_path;
 
 
   enumerator = G_FILE_ENUMERATOR (source);
-  self = user_data;
+  helper = user_data;
+  self = BIJI_LOCAL_PROVIDER (helper->provider);
   error = NULL;
   files = g_file_enumerator_next_files_finish (enumerator, res, &error);
   g_file_enumerator_close_async (enumerator, G_PRIORITY_DEFAULT, NULL,
@@ -162,7 +183,10 @@ enumerate_next_files_ready_cb (GObject *source,
   }
 
 
-  base_path = g_file_get_path (self->priv->location);
+  if (helper->group == BIJI_LIVING_ITEMS)
+    base_path = g_file_get_path (self->priv->location);
+  else
+    base_path = g_file_get_path (self->priv->trash_file);
 
   for (l = files; l != NULL; l = l->next)
     {
@@ -170,6 +194,7 @@ enumerate_next_files_ready_cb (GObject *source,
       const gchar *name;
       BijiNoteObj *note;
       BijiInfoSet info;
+      GHashTable *target;
 
       file = l->data;
       name = g_file_info_get_name (file);
@@ -188,9 +213,12 @@ enumerate_next_files_ready_cb (GObject *source,
                                             &info);
       biji_lazy_deserialize (note);
 
+      if (helper->group == BIJI_LIVING_ITEMS)
+        target = self->priv->items;
+      else
+        target = self->priv->archives;
 
-      g_hash_table_replace (self->priv->items,
-                            info.url, note);
+      g_hash_table_replace (target, info.url, note);
 
     }
 
@@ -200,8 +228,8 @@ enumerate_next_files_ready_cb (GObject *source,
   /* Now we have all notes,
    * load the notebooks and we're good to notify loading done */
   biji_get_all_notebooks_async (biji_provider_get_manager (BIJI_PROVIDER (self)),
-                                  local_provider_finish,
-                                  self);
+                                local_provider_finish,
+                                helper);
 }
 
 static void
@@ -213,10 +241,12 @@ enumerate_children_ready_cb (GObject *source,
   GFileEnumerator *enumerator;
   GError *error;
   BijiLocalProvider *self;
+  BijiProviderHelper *helper;
 
 
   location = G_FILE (source);
-  self = user_data;
+  helper = user_data;
+  self = BIJI_LOCAL_PROVIDER (helper->provider);
   error = NULL;
   enumerator = g_file_enumerate_children_finish (location,
                                                  res, &error);
@@ -232,7 +262,7 @@ enumerate_children_ready_cb (GObject *source,
                                       G_PRIORITY_DEFAULT,
                                       self->priv->load_cancellable,
                                       enumerate_next_files_ready_cb,
-                                      self);
+                                      helper);
 }
 
 
@@ -240,14 +270,33 @@ enumerate_children_ready_cb (GObject *source,
 
 
 static void
-load_from_location (BijiLocalProvider *self)
+load_from_location (BijiProviderHelper *helper)
 {
-  g_file_enumerate_children_async (self->priv->location,
-                                   ATTRIBUTES_FOR_NOTEBOOK, 0,
+  GFile *file;
+  GCancellable *cancel;
+  BijiLocalProvider *self;
+
+  self = BIJI_LOCAL_PROVIDER (helper->provider);
+
+  if (helper->group == BIJI_LIVING_ITEMS)
+  {
+    file = self->priv->location;
+    cancel = self->priv->load_cancellable;
+  }
+
+  else /* BIJI_ARCHIVED_ITEMS */
+  {
+    file = self->priv->trash_file;
+    cancel = NULL;
+  }
+
+
+  g_file_enumerate_children_async (file,
+                                   ATTRIBUTES_FOR_LOCATION, 0,
                                    G_PRIORITY_DEFAULT,
-                                   self->priv->load_cancellable,
+                                   cancel,
                                    enumerate_children_ready_cb,
-                                   self);
+                                   helper);
 }
 
 
@@ -259,7 +308,9 @@ biji_local_provider_constructed (GObject *object)
   g_return_if_fail (BIJI_IS_LOCAL_PROVIDER (object));
   self = BIJI_LOCAL_PROVIDER (object);
 
-  load_from_location (self);
+
+  self->priv->trash_file = g_file_get_child (self->priv->location, ".Trash");
+  load_from_location (self->priv->living_helper);
 }
 
 
@@ -277,6 +328,11 @@ biji_local_provider_finalize (GObject *object)
 
   g_object_unref (self->priv->load_cancellable);
   g_object_unref (self->priv->info.icon);
+  g_object_unref (self->priv->location);
+  g_object_unref (self->priv->trash_file);
+
+  biji_provider_helper_free (self->priv->living_helper);
+  biji_provider_helper_free (self->priv->archives_helper);
 
   G_OBJECT_CLASS (biji_local_provider_parent_class)->finalize (object);
 }
@@ -290,6 +346,7 @@ biji_local_provider_init (BijiLocalProvider *self)
   priv = self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, BIJI_TYPE_LOCAL_PROVIDER, BijiLocalProviderPrivate);
   priv->load_cancellable = g_cancellable_new ();
   priv->items = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
+  priv->archives = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
 
   /* Info */
   priv->info.unique_id = "local";
@@ -301,6 +358,11 @@ biji_local_provider_init (BijiLocalProvider *self)
   gtk_image_set_pixel_size (GTK_IMAGE (priv->info.icon), 48);
   g_object_ref (priv->info.icon);
 
+  /* Helpers */
+  priv->living_helper = biji_provider_helper_new (BIJI_PROVIDER (self),
+                                                  BIJI_LIVING_ITEMS);
+  priv->archives_helper = biji_provider_helper_new (BIJI_PROVIDER (self),
+                                                   BIJI_ARCHIVED_ITEMS);
 }
 
 
@@ -340,6 +402,18 @@ local_prov_create_note_full (BijiProvider *provider,
 
 
 static void
+local_prov_load_archives (BijiProvider *prov)
+{
+  BijiLocalProvider *self;
+
+  g_return_if_fail (BIJI_IS_LOCAL_PROVIDER (prov));
+
+  self = BIJI_LOCAL_PROVIDER (prov);
+  load_from_location (self->priv->archives_helper);
+}
+
+
+static void
 biji_local_provider_set_property (GObject      *object,
                                   guint         property_id,
                                   const GValue *value,
@@ -406,6 +480,7 @@ biji_local_provider_class_init (BijiLocalProviderClass *klass)
   provider_class->get_info = local_provider_get_info;
   // provider_class->create_new_note = local_prov_create_new_note;
   provider_class->create_note_full = local_prov_create_note_full;
+  provider_class->load_archives = local_prov_load_archives;
 
   properties[PROP_LOCATION] =
     g_param_spec_object ("location",
diff --git a/src/libbiji/provider/biji-own-cloud-provider.c b/src/libbiji/provider/biji-own-cloud-provider.c
index fbe262b..5edea4a 100644
--- a/src/libbiji/provider/biji-own-cloud-provider.c
+++ b/src/libbiji/provider/biji-own-cloud-provider.c
@@ -62,6 +62,7 @@ struct BijiOwnCloudProviderPrivate_
   GoaAccount       *account;
 
   GHashTable       *notes;
+  GHashTable       *archives;
   GHashTable       *tracker;
   GQueue           *queue;
 
@@ -316,7 +317,7 @@ handle_next_item (BijiOwnCloudProvider *self)
 
     /* Now simply provide data to controller */
     list = g_hash_table_get_values (self->priv->notes);
-    BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self), list);
+    BIJI_PROVIDER_GET_CLASS (self)->notify_loaded (BIJI_PROVIDER (self), list, BIJI_LIVING_ITEMS);
     g_list_free (list);
   }
 }
@@ -620,7 +621,7 @@ biji_own_cloud_provider_constructed (GObject *obj)
 
   self = BIJI_OWN_CLOUD_PROVIDER (obj);
   priv = self->priv;
-  
+
 
   if (!GOA_IS_OBJECT (priv->object))
     return;
@@ -659,6 +660,13 @@ biji_own_cloud_provider_constructed (GObject *obj)
 }
 
 
+/* ownCloud has no archive at the moment */
+static void
+ocloud_prov_load_archives (BijiProvider *provider)
+{
+  return;
+}
+
 
 static void
 biji_own_cloud_provider_init (BijiOwnCloudProvider *self)
@@ -775,7 +783,7 @@ own_cloud_create_full (BijiProvider *provider,
 
   biji_manager_get_default_color (manager, &override_color);
   biji_note_obj_set_rgba (retval, &override_color);
-  
+
   return retval;
 }
 
@@ -805,7 +813,7 @@ biji_own_cloud_provider_class_init (BijiOwnCloudProviderClass *klass)
   provider_class->get_info = own_cloud_get_info;
   provider_class->create_new_note = own_cloud_create_note;
   provider_class->create_note_full = own_cloud_create_full;
-
+  provider_class->load_archives = ocloud_prov_load_archives;
 
   properties[PROP_GOA_OBJECT] =
     g_param_spec_object("goa",
diff --git a/src/libbiji/provider/biji-provider.c b/src/libbiji/provider/biji-provider.c
index 1967c22..5f50b03 100644
--- a/src/libbiji/provider/biji-provider.c
+++ b/src/libbiji/provider/biji-provider.c
@@ -27,6 +27,8 @@
  * 
  */
 
+#include "../biji-marshalers.h"
+
 #include "biji-provider.h"
 
 
@@ -57,6 +59,31 @@ struct BijiProviderPrivate_
 G_DEFINE_TYPE (BijiProvider, biji_provider, G_TYPE_OBJECT)
 
 
+
+
+BijiProviderHelper *
+biji_provider_helper_new           (BijiProvider *provider,
+                                    BijiItemsGroup group)
+{
+  BijiProviderHelper *retval;
+
+  retval = g_slice_new (BijiProviderHelper);
+  retval->provider = provider;
+  retval->group = group;
+
+  return retval;
+}
+
+
+void
+biji_provider_helper_free          (BijiProviderHelper *helper)
+{
+  g_slice_free (BijiProviderHelper, helper);
+}
+
+
+
+
 BijiManager *
 biji_provider_get_manager                (BijiProvider *provider)
 {
@@ -71,6 +98,14 @@ biji_provider_get_info                (BijiProvider *provider)
 }
 
 
+
+void
+biji_provider_load_archives        (BijiProvider *provider)
+{
+  return BIJI_PROVIDER_GET_CLASS (provider)->load_archives (provider);
+}
+
+
 static void
 biji_provider_finalize (GObject *object)
 {
@@ -94,12 +129,14 @@ biji_provider_init (BijiProvider *self)
 
 static void
 biji_provider_notify_loaded (BijiProvider *self,
-                             GList *items)
+                             GList *items,
+                             BijiItemsGroup group)
 {
   g_signal_emit (self,
                  biji_provider_signals[PROVIDER_LOADED],
                  0,
-                 items);
+                 items,
+                 group);
 }
 
 
@@ -162,10 +199,11 @@ biji_provider_class_init (BijiProviderClass *klass)
                   G_OBJECT_CLASS_TYPE (klass),
                   G_SIGNAL_RUN_LAST,
                   0, NULL, NULL,
-                  g_cclosure_marshal_VOID__POINTER,
+                  _biji_marshal_VOID__POINTER_ENUM,
                   G_TYPE_NONE,
-                  1,
-                  G_TYPE_POINTER);
+                  2,
+                  G_TYPE_POINTER,
+                  G_TYPE_INT);
 
 
   properties[PROP_BOOK] =
diff --git a/src/libbiji/provider/biji-provider.h b/src/libbiji/provider/biji-provider.h
index ccf7125..05356db 100644
--- a/src/libbiji/provider/biji-provider.h
+++ b/src/libbiji/provider/biji-provider.h
@@ -71,12 +71,23 @@ struct BijiProviderClass_
  * ie. persistent data source */
 
   const BijiProviderInfo*    (*get_info)              (BijiProvider *provider);
-  
+
 
   /* When a provider is loaded, notify the manager to transmit the items */
 
   void                       (*notify_loaded)         (BijiProvider *provider,
-                                                       GList *loaded_items);
+                                                       GList *loaded_items,
+                                                       BijiItemsGroup group);
+
+
+  /* When created, the provider is supposed to load the items.
+   * Loading archives might or might not happen at creation time.
+   * This function ensures the provider loads its archived items.
+   * The provider will notify when done */
+
+  void                       (*load_archives)        (BijiProvider *provider);
+
+
 
 
   /* Create a single note and let the provider handle things.
@@ -117,11 +128,34 @@ struct BijiProviderClass_
 
 
 
+/* BijiProviderHelper is for convenience for callbacks
+   atm it is used by local provider
+ */
+
+
+typedef struct
+{
+  BijiProvider *provider;
+  BijiItemsGroup group;
+} BijiProviderHelper;
 
 
 GType                      biji_provider_get_type             (void);
 
 
+
+BijiProviderHelper*        biji_provider_helper_new           (BijiProvider *provider,
+                                                               BijiItemsGroup group);
+
+
+void                       biji_provider_helper_free          (BijiProviderHelper *helper);
+
+
+
+void                       biji_provider_load_archives        (BijiProvider *provider);
+
+
+
 BijiManager              *biji_provider_get_manager             (BijiProvider *provider);
 
 
diff --git a/src/resources/app-menu.ui b/src/resources/app-menu.ui
index ac159cf..2d12aad 100644
--- a/src/resources/app-menu.ui
+++ b/src/resources/app-menu.ui
@@ -10,6 +10,10 @@
         <attribute name="label" translatable="yes">_Import Notes</attribute>
         <attribute name="action">app.external</attribute>
       </item>
+      <item>
+        <attribute name="label" translatable="yes">_View Trash</attribute>
+        <attribute name="action">app.trash</attribute>
+      </item>
     </section>
     <section>
       <item>


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