#include "midori-viewable.h"
#include "sokoke.h"
+#include "gtkiconentry.h"
#include <glib/gi18n.h>
#include <string.h>
#include <gdk/gdkkeysyms.h>
+#define COMPLETION_DELAY 200
+
gboolean
midori_browser_edit_bookmark_dialog_new (MidoriBrowser* browser,
KatzeItem* bookmark,
GtkWidget* treeview;
MidoriApp* app;
KatzeArray* array;
+
+ gint filter_timeout;
+ gchar* filter;
};
struct _MidoriBookmarksClass
static KatzeArray*
midori_bookmarks_read_from_db (MidoriBookmarks* bookmarks,
- const gchar* folder)
+ const gchar* folder,
+ const gchar* keyword)
{
sqlite3* db;
sqlite3_stmt* statement;
db = g_object_get_data (G_OBJECT (bookmarks->array), "db");
- sqlcmd = "SELECT uri, title, app, toolbar, folder from bookmarks where folder = ?"
- " ORDER BY uri DESC";
- result = sqlite3_prepare_v2 (db, sqlcmd, -1, &statement, NULL);
- sqlite3_bind_text (statement, 1, g_strdup(folder), -1, g_free);
+ if (keyword && *keyword)
+ {
+ gchar* filterstr;
+ sqlcmd = "SELECT uri, title, app, toolbar, folder from bookmarks where "
+ " title like ? ORDER BY uri DESC";
+ result = sqlite3_prepare_v2 (db, sqlcmd, -1, &statement, NULL);
+ filterstr = g_strdup_printf ("%%%s%%", keyword);
+ sqlite3_bind_text (statement, 1, g_strdup (filterstr), -1, g_free);
+ g_free (filterstr);
+ }
+ else
+ {
+ if (!folder)
+ folder = "";
+ sqlcmd = "SELECT uri, title, app, toolbar, folder from bookmarks where "
+ " folder = ? ORDER BY uri DESC";
+ result = sqlite3_prepare_v2 (db, sqlcmd, -1, &statement, NULL);
+ sqlite3_bind_text (statement, 1, g_strdup (folder), -1, g_free);
+ }
if (result != SQLITE_OK)
return NULL;
midori_bookmarks_read_from_db_to_model (MidoriBookmarks* bookmarks,
GtkTreeStore* model,
GtkTreeIter* parent,
- const gchar* folder)
+ const gchar* folder,
+ const gchar* keyword)
{
KatzeArray* array;
gint last;
+ KatzeItem* item;
GtkTreeIter child;
- array = midori_bookmarks_read_from_db (bookmarks, folder);
+ array = midori_bookmarks_read_from_db (bookmarks, folder, keyword);
katze_bookmark_populate_tree_view (array, model, parent);
/* Remove invisible dummy row */
last = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (model), parent);
+ if (!last)
+ return;
gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (model), &child, parent, last - 1);
- gtk_tree_store_remove (model, &child);
+ gtk_tree_model_get (GTK_TREE_MODEL (model), &child, 0, &item, -1);
+ if (KATZE_ITEM_IS_SEPARATOR (item))
+ gtk_tree_store_remove (model, &child);
+ g_object_unref (item);
}
void
g_object_set_data (G_OBJECT (bookmarks->array), "treeview", bookmarks->treeview);
#if HAVE_SQLITE
- midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model), NULL, "");
+ midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model), NULL, "", NULL);
g_signal_connect_after (model, "row-changed",
G_CALLBACK (midori_bookmarks_row_changed_cb),
bookmarks);
KatzeArray* array;
guint i = 0;
- array = midori_bookmarks_read_from_db (bookmarks, katze_item_get_name (item));
+ array = midori_bookmarks_read_from_db (bookmarks, katze_item_get_name (item), NULL);
g_return_if_fail (KATZE_IS_ARRAY (array));
while ((child = katze_array_get_nth_item (KATZE_ARRAY (array), i)))
{
gtk_tree_model_get (model, iter, 0, &item, -1);
#if HAVE_SQLITE
midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model),
- iter, katze_item_get_name (item));
+ iter, katze_item_get_name (item), NULL);
#endif
g_object_unref (item);
}
0, 0, NULL, -1);
}
+static gboolean
+midori_bookmarks_filter_timeout_cb (gpointer data)
+{
+ MidoriBookmarks* bookmarks = data;
+ GtkTreeModel* model;
+ GtkTreeStore* treestore;
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview));
+ treestore = GTK_TREE_STORE (model);
+
+ gtk_tree_store_clear (treestore);
+ midori_bookmarks_read_from_db_to_model (bookmarks,
+ treestore, NULL, NULL, bookmarks->filter);
+
+ return FALSE;
+}
+
+static void
+midori_bookmarks_filter_entry_changed_cb (GtkEntry* entry,
+ MidoriBookmarks* bookmarks)
+{
+ if (bookmarks->filter_timeout)
+ g_source_remove (bookmarks->filter_timeout);
+ katze_assign (bookmarks->filter, g_strdup (gtk_entry_get_text (entry)));
+ bookmarks->filter_timeout = g_timeout_add (COMPLETION_DELAY,
+ midori_bookmarks_filter_timeout_cb, bookmarks);
+}
+
+static void
+midori_bookmarks_filter_entry_clear_cb (GtkEntry* entry,
+ gint icon_pos,
+ gint button,
+ MidoriBookmarks* bookmarks)
+{
+ if (icon_pos == GTK_ICON_ENTRY_SECONDARY)
+ gtk_entry_set_text (entry, "");
+}
+
static void
midori_bookmarks_init (MidoriBookmarks* bookmarks)
{
+ GtkWidget* entry;
+ GtkWidget* box;
GtkTreeStore* model;
GtkWidget* treeview;
GtkTreeViewColumn* column;
GtkCellRenderer* renderer_pixbuf;
GtkCellRenderer* renderer_text;
+ /* Create the filter entry */
+ entry = gtk_icon_entry_new ();
+ gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry),
+ GTK_ICON_ENTRY_PRIMARY,
+ GTK_STOCK_FIND);
+ gtk_icon_entry_set_icon_from_stock (GTK_ICON_ENTRY (entry),
+ GTK_ICON_ENTRY_SECONDARY,
+ GTK_STOCK_CLEAR);
+ gtk_icon_entry_set_icon_highlight (GTK_ICON_ENTRY (entry),
+ GTK_ICON_ENTRY_SECONDARY, TRUE);
+ g_signal_connect (entry, "icon-release",
+ G_CALLBACK (midori_bookmarks_filter_entry_clear_cb), bookmarks);
+ #if HAVE_SQLITE
+ g_signal_connect (entry, "changed",
+ G_CALLBACK (midori_bookmarks_filter_entry_changed_cb), bookmarks);
+ #endif
+ box = gtk_hbox_new (FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (box), entry, TRUE, TRUE, 3);
+ gtk_widget_show_all (box);
+ gtk_box_pack_start (GTK_BOX (bookmarks), box, FALSE, FALSE, 5);
+
/* Create the treeview */
model = gtk_tree_store_new (1, KATZE_TYPE_ITEM);
treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));