[epiphany] Replace smart bookmarks feature with search engine manager



commit cdf7fc59720231e338b8eaa4fde09d3c4959f6cc
Author: cedlemo <cedlemo gmx com>
Date:   Wed Feb 15 16:08:37 2017 +0100

    Replace smart bookmarks feature with search engine manager
    
    https://bugzilla.gnome.org/show_bug.cgi?id=776738

 lib/ephy-profile-utils.h                     |    2 +-
 lib/ephy-search-engine-manager.c             |   28 ++++
 src/Makefile.am                              |    2 -
 src/bookmarks/ephy-bookmark.c                |   35 -----
 src/bookmarks/ephy-bookmark.h                |    4 -
 src/bookmarks/ephy-bookmarks-list-model.c    |  193 ------------------------
 src/bookmarks/ephy-bookmarks-list-model.h    |   36 -----
 src/bookmarks/ephy-bookmarks-manager.c       |   97 ++++++++-----
 src/bookmarks/ephy-bookmarks-manager.h       |    1 -
 src/bookmarks/ephy-bookmarks-popover.c       |   42 +-----
 src/ephy-completion-model.c                  |    5 +-
 src/ephy-location-controller.c               |  205 +++++++++++---------------
 src/profile-migrator/ephy-profile-migrator.c |   58 +++++++
 13 files changed, 238 insertions(+), 470 deletions(-)
---
diff --git a/lib/ephy-profile-utils.h b/lib/ephy-profile-utils.h
index 80a368a..dd8943d 100644
--- a/lib/ephy-profile-utils.h
+++ b/lib/ephy-profile-utils.h
@@ -24,7 +24,7 @@
 
 G_BEGIN_DECLS
 
-#define EPHY_PROFILE_MIGRATION_VERSION 16
+#define EPHY_PROFILE_MIGRATION_VERSION 17
 #define EPHY_INSECURE_PASSWORDS_MIGRATION_VERSION 11
 #define EPHY_SETTINGS_MIGRATION_VERSION 16
 
diff --git a/lib/ephy-search-engine-manager.c b/lib/ephy-search-engine-manager.c
index d8c6b74..3357f83 100644
--- a/lib/ephy-search-engine-manager.c
+++ b/lib/ephy-search-engine-manager.c
@@ -27,6 +27,13 @@
 #include "ephy-settings.h"
 #include "ephy-prefs.h"
 
+enum {
+  SEARCH_ENGINES_CHANGED,
+  LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
+
 struct _EphySearchEngineManager
 {
   GObject parent_instance;
@@ -61,6 +68,16 @@ ephy_search_engine_info_new (const char *address,
 }
 
 static void
+search_engines_changed_cb (GSettings *settings,
+                           char      *key,
+                           gpointer   user_data)
+{
+
+  g_signal_emit (EPHY_SEARCH_ENGINE_MANAGER (user_data),
+                 signals[SEARCH_ENGINES_CHANGED], 0);
+}
+
+static void
 ephy_search_engine_manager_init (EphySearchEngineManager *manager)
 {
   const char *address;
@@ -81,6 +98,10 @@ ephy_search_engine_manager_init (EphySearchEngineManager *manager)
                          ephy_search_engine_info_new (address,
                                                       bang));
   }
+
+  g_signal_connect (EPHY_SETTINGS_MAIN,
+                    "changed::search-engines",
+                    G_CALLBACK (search_engines_changed_cb), manager);
 }
 
 static void
@@ -99,6 +120,13 @@ ephy_search_engine_manager_class_init (EphySearchEngineManagerClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
   object_class->dispose = ephy_search_engine_manager_dispose;
+
+  signals[SEARCH_ENGINES_CHANGED] = g_signal_new ("changed",
+                                                  EPHY_TYPE_SEARCH_ENGINE_MANAGER,
+                                                  G_SIGNAL_RUN_LAST,
+                                                  0,
+                                                  NULL, NULL, NULL,
+                                                  G_TYPE_NONE, 0);
 }
 
 EphySearchEngineManager *
diff --git a/src/Makefile.am b/src/Makefile.am
index 9230a3f..b2dc1e6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -34,8 +34,6 @@ libephymain_la_SOURCES = \
        bookmarks/ephy-bookmarks-export.h       \
        bookmarks/ephy-bookmarks-import.c       \
        bookmarks/ephy-bookmarks-import.h       \
-       bookmarks/ephy-bookmarks-list-model.c   \
-       bookmarks/ephy-bookmarks-list-model.h   \
        bookmarks/ephy-bookmarks-manager.c      \
        bookmarks/ephy-bookmarks-manager.h      \
        bookmarks/ephy-bookmarks-popover.c      \
diff --git a/src/bookmarks/ephy-bookmark.c b/src/bookmarks/ephy-bookmark.c
index 80431a8..509276c 100644
--- a/src/bookmarks/ephy-bookmark.c
+++ b/src/bookmarks/ephy-bookmark.c
@@ -615,38 +615,3 @@ out:
   return bookmark;
 }
 #endif
-
-gboolean
-ephy_bookmark_is_smart (EphyBookmark *bookmark)
-{
-  g_return_val_if_fail (EPHY_IS_BOOKMARK (bookmark), FALSE);
-
-  return !!strstr (bookmark->url, "%s");
-}
-
-char *
-ephy_bookmark_resolve_smart_url (EphyBookmark *bookmark,
-                                 const char   *search_term)
-{
-  GString *url;
-  const char *original_url;
-  char *result;
-  gssize pos;
-
-  g_return_val_if_fail (EPHY_IS_BOOKMARK (bookmark), FALSE);
-  g_return_val_if_fail (ephy_bookmark_is_smart (bookmark), FALSE);
-  g_return_val_if_fail (search_term != NULL, FALSE);
-  g_return_val_if_fail (search_term[0] != '\0', FALSE);
-
-  original_url = ephy_bookmark_get_url (bookmark);
-  url = g_string_new (original_url);
-  pos = (gssize)(strstr (original_url, "%s") - original_url);
-  g_assert (pos > 0);
-
-  g_string_erase (url, pos, 2);
-  g_string_insert (url, pos, search_term);
-
-  result = url->str;
-  g_string_free (url, FALSE);
-  return result;
-}
diff --git a/src/bookmarks/ephy-bookmark.h b/src/bookmarks/ephy-bookmark.h
index 7f159e3..8ce771e 100644
--- a/src/bookmarks/ephy-bookmark.h
+++ b/src/bookmarks/ephy-bookmark.h
@@ -75,8 +75,4 @@ char                *ephy_bookmark_to_bso                (EphyBookmark *self);
 EphyBookmark        *ephy_bookmark_from_bso              (JsonObject *bso);
 #endif
 
-gboolean             ephy_bookmark_is_smart              (EphyBookmark *self);
-char                *ephy_bookmark_resolve_smart_url     (EphyBookmark *self,
-                                                          const char   *search_term);
-
 G_END_DECLS
diff --git a/src/bookmarks/ephy-bookmarks-manager.c b/src/bookmarks/ephy-bookmarks-manager.c
index c10006b..a71e921 100644
--- a/src/bookmarks/ephy-bookmarks-manager.c
+++ b/src/bookmarks/ephy-bookmarks-manager.c
@@ -40,7 +40,10 @@ struct _EphyBookmarksManager {
   gchar      *gvdb_filename;
 };
 
-G_DEFINE_TYPE (EphyBookmarksManager, ephy_bookmarks_manager, G_TYPE_OBJECT)
+static void list_model_iface_init     (GListModelInterface *iface);
+
+G_DEFINE_TYPE_EXTENDED (EphyBookmarksManager, ephy_bookmarks_manager, G_TYPE_OBJECT, 0,
+                        G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, list_model_iface_init))
 
 enum {
   BOOKMARK_ADDED,
@@ -185,6 +188,40 @@ ephy_bookmarks_manager_init (EphyBookmarksManager *self)
   ephy_bookmarks_manager_load_from_file (self);
 }
 
+static GType
+ephy_bookmarks_manager_list_model_get_item_type (GListModel *model)
+{
+  return EPHY_TYPE_BOOKMARK;
+}
+
+static guint
+ephy_bookmarks_manager_list_model_get_n_items (GListModel *model)
+{
+  EphyBookmarksManager *self = EPHY_BOOKMARKS_MANAGER (model);
+
+  return g_sequence_get_length (self->bookmarks);
+}
+
+static gpointer
+ephy_bookmarks_manager_list_model_get_item (GListModel *model,
+                                            guint       position)
+{
+  EphyBookmarksManager *self = EPHY_BOOKMARKS_MANAGER (model);
+  GSequenceIter *iter;
+
+  iter = g_sequence_get_iter_at_pos (self->bookmarks, position);
+
+  return g_object_ref (g_sequence_get (iter));
+}
+
+static void
+list_model_iface_init (GListModelInterface *iface)
+{
+  iface->get_item_type = ephy_bookmarks_manager_list_model_get_item_type;
+  iface->get_n_items = ephy_bookmarks_manager_list_model_get_n_items;
+  iface->get_item = ephy_bookmarks_manager_list_model_get_item;
+}
+
 static void
 bookmark_title_changed_cb (EphyBookmark         *bookmark,
                            GParamSpec           *pspec,
@@ -238,12 +275,23 @@ ephy_bookmarks_manager_watch_bookmark (EphyBookmarksManager *self,
                            G_CALLBACK (bookmark_tag_removed_cb), self, 0);
 }
 
+static void
+ephy_bookmarks_manager_unwatch_bookmark (EphyBookmarksManager *self,
+                                         EphyBookmark         *bookmark)
+{
+  g_signal_handlers_disconnect_by_func (bookmark, bookmark_title_changed_cb, self);
+  g_signal_handlers_disconnect_by_func (bookmark, bookmark_url_changed_cb, self);
+  g_signal_handlers_disconnect_by_func (bookmark, bookmark_tag_added_cb, self);
+  g_signal_handlers_disconnect_by_func (bookmark, bookmark_tag_removed_cb, self);
+}
+
 void
 ephy_bookmarks_manager_add_bookmark (EphyBookmarksManager *self,
                                      EphyBookmark         *bookmark)
 {
   GSequenceIter *iter;
   GSequenceIter *prev_iter;
+  gint position;
 
   g_return_if_fail (EPHY_IS_BOOKMARKS_MANAGER (self));
   g_return_if_fail (EPHY_IS_BOOKMARK (bookmark));
@@ -257,6 +305,11 @@ ephy_bookmarks_manager_add_bookmark (EphyBookmarksManager *self,
   if (g_sequence_iter_is_end (prev_iter)
       || ephy_bookmark_get_time_added (g_sequence_get (prev_iter)) != ephy_bookmark_get_time_added 
(bookmark)) {
     g_sequence_insert_before (iter, bookmark);
+
+    /* Update list */
+    position = g_sequence_iter_get_position (iter);
+    g_list_model_items_changed (G_LIST_MODEL (self), position - 1, 0, 1);
+
     g_signal_emit (self, signals[BOOKMARK_ADDED], 0, bookmark);
 
     ephy_bookmarks_manager_save_to_file_async (self, NULL,
@@ -304,6 +357,7 @@ ephy_bookmarks_manager_remove_bookmark (EphyBookmarksManager *self,
                                         EphyBookmark         *bookmark)
 {
   GSequenceIter *iter;
+  gint position;
 
   g_return_if_fail (EPHY_IS_BOOKMARKS_MANAGER (self));
   g_return_if_fail (EPHY_IS_BOOKMARK (bookmark));
@@ -315,13 +369,16 @@ ephy_bookmarks_manager_remove_bookmark (EphyBookmarksManager *self,
                    ephy_bookmark_get_url (bookmark)) == 0)
       break;
   }
+  g_assert (!g_sequence_iter_is_end (iter));
 
   /* Ensure the bookmark is removed from our list before the signal is emitted,
    * because this is the bookmark REMOVED signal after all, so callers expect
    * it to be already gone.
    */
   g_object_ref (bookmark);
+  position = g_sequence_iter_get_position (iter);
   g_sequence_remove (iter);
+  g_list_model_items_changed (G_LIST_MODEL (self), position, 1, 0);
   g_signal_emit (self, signals[BOOKMARK_REMOVED], 0, bookmark);
   g_object_unref (bookmark);
 
@@ -329,10 +386,7 @@ ephy_bookmarks_manager_remove_bookmark (EphyBookmarksManager *self,
                                              
(GAsyncReadyCallback)ephy_bookmarks_manager_save_to_file_warn_on_error_cb,
                                              NULL);
 
-  g_signal_handlers_disconnect_by_func (bookmark, bookmark_title_changed_cb, self);
-  g_signal_handlers_disconnect_by_func (bookmark, bookmark_url_changed_cb, self);
-  g_signal_handlers_disconnect_by_func (bookmark, bookmark_tag_added_cb, self);
-  g_signal_handlers_disconnect_by_func (bookmark, bookmark_tag_removed_cb, self);
+  ephy_bookmarks_manager_unwatch_bookmark (self, bookmark);
 }
 
 EphyBookmark *
@@ -492,39 +546,6 @@ ephy_bookmarks_manager_get_bookmarks_with_tag (EphyBookmarksManager *self,
   return bookmarks;
 }
 
-static int
-compare_smart_bookmarks (EphyBookmark *a,
-                         EphyBookmark *b)
-{
-  return g_utf8_collate (ephy_bookmark_get_title (a), ephy_bookmark_get_title (b));
-}
-
-GSequence *
-ephy_bookmarks_manager_get_smart_bookmarks (EphyBookmarksManager *self)
-{
-  GSequence *bookmarks;
-  GSequenceIter *iter;
-
-  g_return_val_if_fail (EPHY_IS_BOOKMARKS_MANAGER (self), NULL);
-
-  bookmarks = g_sequence_new (g_object_unref);
-
-  for (iter = g_sequence_get_begin_iter (self->bookmarks);
-       !g_sequence_iter_is_end (iter);
-       iter = g_sequence_iter_next (iter)) {
-    EphyBookmark *bookmark = g_sequence_get (iter);
-
-    if (ephy_bookmark_is_smart (bookmark)) {
-      g_sequence_insert_sorted (bookmarks,
-                                g_object_ref (bookmark),
-                                (GCompareDataFunc)compare_smart_bookmarks,
-                                NULL);
-    }
-  }
-
-  return bookmarks;
-}
-
 GSequence *
 ephy_bookmarks_manager_get_tags (EphyBookmarksManager *self)
 {
diff --git a/src/bookmarks/ephy-bookmarks-manager.h b/src/bookmarks/ephy-bookmarks-manager.h
index 6d3b042..c35ed28 100644
--- a/src/bookmarks/ephy-bookmarks-manager.h
+++ b/src/bookmarks/ephy-bookmarks-manager.h
@@ -56,7 +56,6 @@ gboolean     ephy_bookmarks_manager_tag_exists                    (EphyBookmarks
 GSequence   *ephy_bookmarks_manager_get_bookmarks                 (EphyBookmarksManager *self);
 GSequence   *ephy_bookmarks_manager_get_bookmarks_with_tag        (EphyBookmarksManager *self,
                                                                    const char           *tag);
-GSequence   *ephy_bookmarks_manager_get_smart_bookmarks           (EphyBookmarksManager *self);
 GSequence   *ephy_bookmarks_manager_get_tags                      (EphyBookmarksManager *self);
 
 void        ephy_bookmarks_manager_save_to_file_async             (EphyBookmarksManager *self,
diff --git a/src/bookmarks/ephy-bookmarks-popover.c b/src/bookmarks/ephy-bookmarks-popover.c
index f74a2a1..afb8fdf 100644
--- a/src/bookmarks/ephy-bookmarks-popover.c
+++ b/src/bookmarks/ephy-bookmarks-popover.c
@@ -24,7 +24,6 @@
 
 #include "ephy-bookmark.h"
 #include "ephy-bookmark-row.h"
-#include "ephy-bookmarks-list-model.h"
 #include "ephy-bookmarks-manager.h"
 #include "ephy-debug.h"
 #include "ephy-shell.h"
@@ -42,9 +41,8 @@ struct _EphyBookmarksPopover {
   GtkWidget             *tag_detail_label;
   char                  *tag_detail_tag;
 
-  EphyBookmarksManager   *manager;
-  EphyBookmarksListModel *list_model;
-  EphyWindow             *window;
+  EphyBookmarksManager  *manager;
+  EphyWindow            *window;
 };
 
 G_DEFINE_TYPE (EphyBookmarksPopover, ephy_bookmarks_popover, GTK_TYPE_POPOVER)
@@ -71,9 +69,6 @@ ephy_bookmarks_popover_bookmark_tag_added_cb (EphyBookmarksPopover *self,
   g_assert (EPHY_IS_BOOKMARK (bookmark));
   g_assert (EPHY_IS_BOOKMARKS_POPOVER (self));
 
-  if (ephy_bookmark_is_smart (bookmark))
-    return;
-
   /* If the bookmark no longer has 0 tags, we remove it from the tags list box */
   if (g_sequence_get_length (ephy_bookmark_get_tags (bookmark)) == 1) {
     GList *children;
@@ -116,9 +111,6 @@ ephy_bookmarks_popover_bookmark_tag_removed_cb (EphyBookmarksPopover *self,
   g_assert (EPHY_IS_BOOKMARK (bookmark));
   g_assert (EPHY_IS_BOOKMARKS_POPOVER (self));
 
-  if (ephy_bookmark_is_smart (bookmark))
-    return;
-
   /* If the bookmark has 0 tags after removing one, we add it to the tags list
    * box */
   if (g_sequence_is_empty (ephy_bookmark_get_tags (bookmark))) {
@@ -173,8 +165,6 @@ create_bookmark_row (gpointer item,
   EphyBookmark *bookmark = EPHY_BOOKMARK (item);
   GtkWidget *row;
 
-  g_assert (!ephy_bookmark_is_smart (bookmark));
-
   row = ephy_bookmark_row_new (bookmark);
   g_object_set_data_full (G_OBJECT (row), "type",
                           g_strdup (EPHY_LIST_BOX_ROW_TYPE_BOOKMARK),
@@ -237,9 +227,6 @@ ephy_bookmarks_popover_bookmark_added_cb (EphyBookmarksPopover *self,
   g_assert (EPHY_IS_BOOKMARK (bookmark));
   g_assert (EPHY_IS_BOOKMARKS_MANAGER (manager));
 
-  if (ephy_bookmark_is_smart (bookmark))
-    return;
-
   if (g_sequence_is_empty (ephy_bookmark_get_tags (bookmark))) {
     row = create_bookmark_row (bookmark, self);
     gtk_container_add (GTK_CONTAINER (self->tags_list_box), row);
@@ -263,9 +250,6 @@ ephy_bookmarks_popover_bookmark_removed_cb (EphyBookmarksPopover *self,
   g_assert (EPHY_IS_BOOKMARK (bookmark));
   g_assert (EPHY_IS_BOOKMARKS_MANAGER (manager));
 
-  if (ephy_bookmark_is_smart (bookmark))
-    return;
-
   children = gtk_container_get_children (GTK_CONTAINER (self->tags_list_box));
   for (l = children; l != NULL; l = l->next) {
     const char *type;
@@ -302,7 +286,7 @@ ephy_bookmarks_popover_bookmark_removed_cb (EphyBookmarksPopover *self,
   if (found)
     gtk_container_remove (GTK_CONTAINER (self->tag_detail_list_box), row);
 
-  if (g_list_model_get_n_items (G_LIST_MODEL (self->list_model)) == 0) {
+  if (g_list_model_get_n_items (G_LIST_MODEL (self->manager)) == 0) {
     gtk_stack_set_visible_child_name (GTK_STACK (self->toplevel_stack), "empty-state");
   } else if (g_strcmp0 (gtk_stack_get_visible_child_name (GTK_STACK (self->toplevel_stack)), "tag_detail") 
== 0 &&
              g_sequence_is_empty (ephy_bookmarks_manager_get_bookmarks_with_tag (self->manager, 
self->tag_detail_tag))) {
@@ -419,8 +403,6 @@ ephy_bookmarks_popover_show_tag_detail (EphyBookmarksPopover *self,
     EphyBookmark *bookmark = g_sequence_get (iter);
     GtkWidget *row;
 
-    if (ephy_bookmark_is_smart (bookmark))
-      continue;
     row = create_bookmark_row (bookmark, self);
     gtk_container_add (GTK_CONTAINER (self->tag_detail_list_box), row);
   }
@@ -469,16 +451,6 @@ ephy_bookmarks_popover_list_box_row_activated_cb (EphyBookmarksPopover   *self,
 }
 
 static void
-ephy_bookmarks_popover_dispose (GObject *object)
-{
-  EphyBookmarksPopover *self = EPHY_BOOKMARKS_POPOVER (object);
-
-  g_clear_object (&self->list_model);
-
-  G_OBJECT_CLASS (ephy_bookmarks_popover_parent_class)->dispose (object);
-}
-
-static void
 ephy_bookmarks_popover_finalize (GObject *object)
 {
   EphyBookmarksPopover *self = EPHY_BOOKMARKS_POPOVER (object);
@@ -511,7 +483,6 @@ ephy_bookmarks_popover_class_init (EphyBookmarksPopoverClass *klass)
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  object_class->dispose = ephy_bookmarks_popover_dispose;
   object_class->finalize = ephy_bookmarks_popover_finalize;
   object_class->set_property = ephy_bookmarks_popover_set_property;
 
@@ -548,7 +519,6 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
   gtk_widget_init_template (GTK_WIDGET (self));
 
   self->manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
-  self->list_model = ephy_bookmarks_list_model_new (self->manager);
 
   group = g_simple_action_group_new ();
   g_action_map_add_action_entries (G_ACTION_MAP (group), entries,
@@ -558,11 +528,11 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
   g_object_unref (group);
 
   gtk_list_box_bind_model (GTK_LIST_BOX (self->bookmarks_list_box),
-                           G_LIST_MODEL (self->list_model),
+                           G_LIST_MODEL (self->manager),
                            create_bookmark_row,
                            self, NULL);
 
-  if (g_list_model_get_n_items (G_LIST_MODEL (self->list_model)) == 0)
+  if (g_list_model_get_n_items (G_LIST_MODEL (self->manager)) == 0)
     gtk_stack_set_visible_child_name (GTK_STACK (self->toplevel_stack), "empty-state");
 
   gtk_list_box_set_sort_func (GTK_LIST_BOX (self->tags_list_box),
@@ -590,8 +560,6 @@ ephy_bookmarks_popover_init (EphyBookmarksPopover *self)
     EphyBookmark *bookmark = g_sequence_get (iter);
     GtkWidget *bookmark_row;
 
-    if (ephy_bookmark_is_smart (bookmark))
-      continue;
     bookmark_row = create_bookmark_row (bookmark, self);
     gtk_widget_show_all (bookmark_row);
     gtk_container_add (GTK_CONTAINER (self->tags_list_box), bookmark_row);
diff --git a/src/ephy-completion-model.c b/src/ephy-completion-model.c
index 8459ef0..f22a645 100644
--- a/src/ephy-completion-model.c
+++ b/src/ephy-completion-model.c
@@ -429,10 +429,9 @@ query_completed_cb (EphyHistoryService *service,
     url = ephy_bookmark_get_url (bookmark);
     title = ephy_bookmark_get_title (bookmark);
 
-    if (!ephy_bookmark_is_smart (bookmark) &&
-        should_add_bookmark_to_model (model, user_data->search_string, title, url)) {
+    if (should_add_bookmark_to_model (model, user_data->search_string,
+                                      title, url))
       list = add_to_potential_rows (list, title, url, NULL, 0, TRUE, FALSE);
-    }
   }
 
   /* History */
diff --git a/src/ephy-location-controller.c b/src/ephy-location-controller.c
index 49b603a..7dd274e 100644
--- a/src/ephy-location-controller.c
+++ b/src/ephy-location-controller.c
@@ -22,19 +22,16 @@
 #include "config.h"
 #include "ephy-location-controller.h"
 
-#include "ephy-bookmark.h"
-#include "ephy-bookmarks-list-model.h"
-#include "ephy-bookmarks-manager.h"
+#include "ephy-widgets-type-builtins.h"
 #include "ephy-completion-model.h"
 #include "ephy-debug.h"
-#include "ephy-dnd.h"
 #include "ephy-embed-container.h"
 #include "ephy-embed-utils.h"
 #include "ephy-link.h"
 #include "ephy-location-entry.h"
+#include "ephy-dnd.h"
 #include "ephy-shell.h"
 #include "ephy-title-widget.h"
-#include "ephy-widgets-type-builtins.h"
 
 #include <gdk/gdkkeysyms.h>
 #include <gtk/gtk.h>
@@ -52,12 +49,11 @@ struct _EphyLocationController {
 
   EphyWindow *window;
   EphyTitleWidget *title_widget;
-  EphyBookmarksManager *bookmarks_manager;
-  EphyBookmarksListModel *list_model;
-  GSequence *smart_bookmarks;
   char *address;
   guint editable : 1;
   gboolean sync_address_is_blocked;
+  EphySearchEngineManager *search_engine_manager;
+  guint num_search_engines_actions;
 };
 
 static void ephy_location_controller_finalize (GObject *object);
@@ -92,35 +88,6 @@ match_func (GtkEntryCompletion *completion,
 }
 
 static void
-action_activated_cb (GtkEntryCompletion     *completion,
-                     int                     index,
-                     EphyLocationController *controller)
-{
-  GtkWidget *entry;
-  char *content;
-  char *url;
-  GSequenceIter *iter;
-  EphyBookmark *bookmark;
-
-  entry = gtk_entry_completion_get_entry (completion);
-  content = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
-
-  if (content == NULL)
-    return;
-
-  iter = g_sequence_get_iter_at_pos (controller->smart_bookmarks, index);
-  g_assert (!g_sequence_iter_is_end (iter));
-  bookmark = g_sequence_get (iter);
-  url = ephy_bookmark_resolve_smart_url (bookmark, content);
-
-  ephy_link_open (EPHY_LINK (controller), url, NULL,
-                  ephy_link_flags_from_current_event () | EPHY_LINK_TYPED);
-
-  g_free (content);
-  g_free (url);
-}
-
-static void
 entry_drag_data_received_cb (GtkWidget *widget,
                              GdkDragContext *context,
                              gint x, gint y,
@@ -183,11 +150,9 @@ entry_activate_cb (GtkEntry               *entry,
   }
 
   content = gtk_entry_get_text (entry);
-  if (content == NULL || content[0] == '\0')
-    return;
+  if (content == NULL || content[0] == '\0') return;
 
   address = g_strdup (content);
-
   effective_address = ephy_embed_utils_normalize_or_autosearch_address (g_strstrip (address));
   g_free (address);
 #if 0
@@ -279,75 +244,6 @@ get_title_cb (EphyLocationEntry      *entry,
   return g_strdup (ephy_embed_get_title (embed));
 }
 
-static void
-remove_completion_actions (EphyLocationController *controller,
-                           EphyLocationEntry      *lentry)
-{
-  GtkEntryCompletion *completion;
-  gint num_actions;
-
-  completion = gtk_entry_get_completion (GTK_ENTRY (lentry));
-  num_actions = g_sequence_get_length (controller->smart_bookmarks);
-
-  for (int i = 0; i < num_actions; i++)
-    gtk_entry_completion_delete_action (completion, 0);
-
-  g_signal_handlers_disconnect_by_func (completion,
-                                        G_CALLBACK (action_activated_cb),
-                                        controller);
-}
-
-static void
-refresh_smart_bookmarks (EphyLocationController *controller)
-{
-  if (controller->smart_bookmarks != NULL)
-    g_sequence_free (controller->smart_bookmarks);
-
-  controller->smart_bookmarks = ephy_bookmarks_manager_get_smart_bookmarks (controller->bookmarks_manager);
-}
-
-static void
-add_completion_actions (EphyLocationController *controller,
-                        EphyLocationEntry      *lentry)
-{
-  GtkEntryCompletion *completion = gtk_entry_get_completion (GTK_ENTRY (lentry));
-  GSequenceIter *iter;
-  int i = 0;
-
-  for (iter = g_sequence_get_begin_iter (controller->smart_bookmarks);
-       !g_sequence_iter_is_end (iter);
-       iter = g_sequence_iter_next (iter), i++) {
-    EphyBookmark *bookmark;
-    const char *title;
-
-    bookmark = g_sequence_get (iter);
-    title = ephy_bookmark_get_title (bookmark);
-    gtk_entry_completion_insert_action_text (completion, i, title);
-  }
-
-  g_signal_connect (completion, "action_activated",
-                    G_CALLBACK (action_activated_cb), controller);
-}
-
-static void
-update_actions_list (EphyLocationController *controller)
-{
-  g_assert (EPHY_IS_LOCATION_ENTRY (controller->title_widget));
-
-  remove_completion_actions (controller, EPHY_LOCATION_ENTRY (controller->title_widget));
-  refresh_smart_bookmarks (controller);
-  add_completion_actions (controller, EPHY_LOCATION_ENTRY (controller->title_widget));
-}
-
-static void
-bookmark_modified_cb (EphyBookmarksManager   *manager,
-                      EphyBookmark           *bookmark,
-                      EphyLocationController *controller)
-{
-  if (ephy_bookmark_is_smart (bookmark))
-    update_actions_list (controller);
-}
-
 static gboolean
 focus_in_event_cb (GtkWidget              *entry,
                    GdkEventFocus          *event,
@@ -392,6 +288,80 @@ switch_page_cb (GtkNotebook            *notebook,
 }
 
 static void
+action_activated_cb (GtkEntryCompletion     *completion,
+                     int                     index,
+                     EphyLocationController *controller)
+{
+  GtkWidget *entry;
+  char *content;
+  char *url;
+  char **engine_names;
+
+  entry = gtk_entry_completion_get_entry (completion);
+  content = gtk_editable_get_chars (GTK_EDITABLE (entry), 0, -1);
+  if (content == NULL)
+    return;
+
+  engine_names = ephy_search_engine_manager_get_names (controller->search_engine_manager);
+  url = ephy_search_engine_manager_build_search_address (controller->search_engine_manager,
+                                                         engine_names[index],
+                                                         content);
+
+  g_strfreev (engine_names);
+
+  ephy_link_open (EPHY_LINK (controller), url, NULL,
+                  ephy_link_flags_from_current_event ());
+  g_free (content);
+  g_free (url);
+}
+
+static void
+fill_entry_completion_with_actions (GtkEntryCompletion     *completion,
+                                    EphyLocationController *controller)
+{
+  char **engine_names;
+
+  engine_names = ephy_search_engine_manager_get_names (controller->search_engine_manager);
+
+  controller->num_search_engines_actions = 0;
+
+  for (guint i = 0; engine_names[i] != NULL; i++) {
+    gtk_entry_completion_insert_action_text (completion, i, engine_names[i]);
+    controller->num_search_engines_actions++;
+  }
+
+  g_strfreev (engine_names);
+}
+
+static void
+add_completion_actions (EphyLocationController *controller,
+                        EphyLocationEntry      *lentry)
+{
+  GtkEntryCompletion *completion = gtk_entry_get_completion (GTK_ENTRY (lentry));
+
+  fill_entry_completion_with_actions (completion, controller);
+  g_signal_connect (completion, "action_activated",
+                    G_CALLBACK (action_activated_cb), controller);
+}
+
+static void
+search_engines_changed_cb (EphySearchEngineManager *manager,
+                           gpointer  data)
+{
+  EphyLocationController *controller;
+  GtkEntryCompletion *completion;
+
+  controller = EPHY_LOCATION_CONTROLLER (data);
+  completion = gtk_entry_get_completion (GTK_ENTRY (controller->title_widget));
+
+  for (guint i = 0; i < controller->num_search_engines_actions; i++) {
+    gtk_entry_completion_delete_action (completion, 0);
+  }
+
+  fill_entry_completion_with_actions (completion, controller);
+}
+
+static void
 ephy_location_controller_constructed (GObject *object)
 {
   EphyLocationController *controller = EPHY_LOCATION_CONTROLLER (object);
@@ -434,17 +404,10 @@ ephy_location_controller_constructed (GObject *object)
                                       controller->title_widget,
                                       NULL);
 
-  refresh_smart_bookmarks (controller);
   add_completion_actions (controller, EPHY_LOCATION_ENTRY (controller->title_widget));
 
-  g_signal_connect_object (controller->bookmarks_manager, "bookmark-added",
-                           G_CALLBACK (bookmark_modified_cb), controller, 0);
-  g_signal_connect_object (controller->bookmarks_manager, "bookmark-removed",
-                           G_CALLBACK (bookmark_modified_cb), controller, 0);
-  g_signal_connect_object (controller->bookmarks_manager, "bookmark-title-changed",
-                           G_CALLBACK (bookmark_modified_cb), controller, 0);
-  g_signal_connect_object (controller->bookmarks_manager, "bookmark-url-changed",
-                           G_CALLBACK (bookmark_modified_cb), controller, 0);
+  g_signal_connect (controller->search_engine_manager, "changed",
+                    G_CALLBACK (search_engines_changed_cb), controller);
 
   g_object_bind_property (controller, "editable",
                           controller->title_widget, "editable",
@@ -605,10 +568,13 @@ ephy_location_controller_class_init (EphyLocationControllerClass *class)
 static void
 ephy_location_controller_init (EphyLocationController *controller)
 {
+  EphyEmbedShell *shell;
+
   controller->address = g_strdup ("");
   controller->editable = TRUE;
-  controller->bookmarks_manager = ephy_shell_get_bookmarks_manager (ephy_shell_get_default ());
   controller->sync_address_is_blocked = FALSE;
+  shell = ephy_embed_shell_get_default ();
+  controller->search_engine_manager = ephy_embed_shell_get_search_engine_manager (shell);
 }
 
 static void
@@ -616,7 +582,6 @@ ephy_location_controller_finalize (GObject *object)
 {
   EphyLocationController *controller = EPHY_LOCATION_CONTROLLER (object);
 
-  g_sequence_free (controller->smart_bookmarks);
   g_free (controller->address);
 
   G_OBJECT_CLASS (ephy_location_controller_parent_class)->finalize (object);
diff --git a/src/profile-migrator/ephy-profile-migrator.c b/src/profile-migrator/ephy-profile-migrator.c
index cbf8e59..0dcf135 100644
--- a/src/profile-migrator/ephy-profile-migrator.c
+++ b/src/profile-migrator/ephy-profile-migrator.c
@@ -38,6 +38,7 @@
 #include "ephy-history-service.h"
 #include "ephy-prefs.h"
 #include "ephy-profile-utils.h"
+#include "ephy-search-engine-manager.h"
 #include "ephy-settings.h"
 #include "ephy-sqlite-connection.h"
 #include "ephy-uri-tester-shared.h"
@@ -912,6 +913,62 @@ migrate_settings (void)
 }
 
 static void
+migrate_search_engines (void)
+{
+  EphyBookmarksManager *bookmarks_manager;
+  EphySearchEngineManager *search_engine_manager;
+  GSequence *bookmarks;
+  GSequenceIter *iter;
+  GList *smart_bookmarks = NULL;
+  const char *address;
+  const char *title;
+  char *default_search_engine_address;
+  const char *default_search_engine_name = _("Search the Web");
+
+  bookmarks_manager = ephy_bookmarks_manager_new ();
+  search_engine_manager = ephy_search_engine_manager_new ();
+
+  default_search_engine_address = g_settings_get_string (EPHY_SETTINGS_MAIN,
+                                                         EPHY_PREFS_KEYWORD_SEARCH_URL);
+  if (default_search_engine_address != NULL) {
+      ephy_search_engine_manager_add_engine (search_engine_manager,
+                                             default_search_engine_name,
+                                             default_search_engine_address,
+                                             "");
+      ephy_search_engine_manager_set_default_engine (search_engine_manager,
+                                                     default_search_engine_name);
+      g_free (default_search_engine_address);
+  }
+
+  bookmarks = ephy_bookmarks_manager_get_bookmarks (bookmarks_manager);
+  for (iter = g_sequence_get_begin_iter (bookmarks);
+       !g_sequence_iter_is_end (iter);
+       iter = g_sequence_iter_next (iter)) {
+    EphyBookmark *bookmark;
+
+    bookmark = g_sequence_get (iter);
+    address = ephy_bookmark_get_url (bookmark);
+
+    if (strstr (address, "%s") != NULL) {
+      title = ephy_bookmark_get_title (bookmark);
+      ephy_search_engine_manager_add_engine (search_engine_manager,
+                                             title,
+                                             address,
+                                             "");
+      smart_bookmarks = g_list_append (smart_bookmarks, bookmark);
+   }
+  }
+
+  for (GList *l = smart_bookmarks; l != NULL; l = l->next)
+    ephy_bookmarks_manager_remove_bookmark (bookmarks_manager,
+                                            (EphyBookmark *)(l->data));
+
+  g_list_free (smart_bookmarks);
+  g_object_unref (bookmarks_manager);
+  g_object_unref (search_engine_manager);
+}
+
+static void
 migrate_nothing (void)
 {
   /* Used to replace migrators that have been removed. Only remove migrators
@@ -941,6 +998,7 @@ const EphyProfileMigrator migrators[] = {
   /* 14 */ migrate_initial_state,
   /* 15 */ migrate_permissions,
   /* 16 */ migrate_settings,
+  /* 17 */ migrate_search_engines,
 };
 
 static gboolean


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