aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog14
-rw-r--r--lib/widgets/ephy-location-entry.c35
-rw-r--r--lib/widgets/ephy-location-entry.h3
-rw-r--r--src/ephy-completion-model.c28
-rw-r--r--src/ephy-completion-model.h1
-rw-r--r--src/ephy-location-action.c3
6 files changed, 81 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index cb70924ae..fb5dea87c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2007-05-01 Xan Lopez <xan@gnome.org>
+
+ * lib/widgets/ephy-location-entry.c:
+ * lib/widgets/ephy-location-entry.h:
+ * src/ephy-completion-model.c:
+ * src/ephy-completion-model.h:
+ * src/ephy-location-action.c:
+
+ Copy the items on the completion list as the user moves through
+ them. The original input can be restored pressing Esc. The tentative
+ completion can be made definitive pressing Left or Right.
+
+ Fixes #409291, #102528
+
2007-04-24 Diego Escalante Urrelo <diegoe@gnome.org>
* src/popup-commands.c:
diff --git a/lib/widgets/ephy-location-entry.c b/lib/widgets/ephy-location-entry.c
index 235eb56ab..084234935 100644
--- a/lib/widgets/ephy-location-entry.c
+++ b/lib/widgets/ephy-location-entry.c
@@ -53,6 +53,7 @@
#include <gtk/gtkseparatormenuitem.h>
#include <gtk/gtkalignment.h>
#include <gtk/gtkclipboard.h>
+#include <gtk/gtkversion.h>
#include <string.h>
@@ -78,6 +79,7 @@ struct _EphyLocationEntryPrivate
guint relevance_col;
guint extra_col;
guint favicon_col;
+ guint url_col;
guint hash;
@@ -994,6 +996,29 @@ sort_func (GtkTreeModel *model,
return valueb - valuea;
}
+#if GTK_CHECK_VERSION (2, 11, 0)
+static gboolean
+cursor_on_match_cb (GtkEntryCompletion *completion,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ EphyLocationEntry *le)
+{
+ char *item = NULL;
+ GtkWidget *entry;
+
+ gtk_tree_model_get (model, iter,
+ le->priv->url_col,
+ &item, -1);
+
+ entry = gtk_entry_completion_get_entry (completion);
+ gtk_entry_set_text (GTK_ENTRY (entry), item);
+
+ g_free (item);
+
+ return TRUE;
+}
+#endif /* GTK+ 2.11.0 */
+
void
ephy_location_entry_set_completion (EphyLocationEntry *le,
GtkTreeModel *model,
@@ -1002,7 +1027,8 @@ ephy_location_entry_set_completion (EphyLocationEntry *le,
guint keywords_col,
guint relevance_col,
guint extra_col,
- guint favicon_col)
+ guint favicon_col,
+ guint url_col)
{
EphyLocationEntryPrivate *priv = le->priv;
GtkTreeModel *sort_model;
@@ -1015,6 +1041,7 @@ ephy_location_entry_set_completion (EphyLocationEntry *le,
le->priv->relevance_col = relevance_col;
le->priv->extra_col = extra_col;
le->priv->favicon_col = favicon_col;
+ le->priv->url_col = url_col;
sort_model = gtk_tree_model_sort_new_with_model (model);
g_object_unref (model);
@@ -1062,6 +1089,12 @@ ephy_location_entry_set_completion (EphyLocationEntry *le,
gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (completion),
extracell, "text", extra_col);
+#if GTK_CHECK_VERSION (2, 11, 0)
+ g_object_set (completion, "inline-selection", TRUE, NULL);
+ g_signal_connect (completion, "cursor-on-match",
+ G_CALLBACK (cursor_on_match_cb), le);
+#endif
+
gtk_entry_set_completion (GTK_ENTRY (priv->icon_entry->entry), completion);
g_object_unref (completion);
}
diff --git a/lib/widgets/ephy-location-entry.h b/lib/widgets/ephy-location-entry.h
index 262a9cfd3..549416c23 100644
--- a/lib/widgets/ephy-location-entry.h
+++ b/lib/widgets/ephy-location-entry.h
@@ -73,7 +73,8 @@ void ephy_location_entry_set_completion (EphyLocationEntry *le,
guint keywords_col,
guint relevance_col,
guint extra_col,
- guint favicon_col);
+ guint favicon_col,
+ guint url_col);
void ephy_location_entry_set_location (EphyLocationEntry *le,
const char *address,
diff --git a/src/ephy-completion-model.c b/src/ephy-completion-model.c
index 566cc4a0d..c2699ccac 100644
--- a/src/ephy-completion-model.c
+++ b/src/ephy-completion-model.c
@@ -1,3 +1,4 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright © 2002 Jorn Baayen <jorn@nl.linux.org>
*
@@ -444,6 +445,29 @@ init_relevance_col (GValue *value, EphyNode *node, int group)
}
static void
+init_url_col (GValue *value, EphyNode *node, int group)
+{
+ const char *url = NULL;
+
+ if (group == BOOKMARKS_GROUP)
+ {
+ url = ephy_node_get_property_string
+ (node, EPHY_NODE_BMK_PROP_LOCATION);
+ }
+ else if (group == HISTORY_GROUP)
+ {
+ url = ephy_node_get_property_string
+ (node, EPHY_NODE_PAGE_PROP_LOCATION);
+ }
+ else
+ {
+ url = "";
+ }
+
+ g_value_set_string (value, url);
+}
+
+static void
ephy_completion_model_get_value (GtkTreeModel *tree_model,
GtkTreeIter *iter,
int column,
@@ -494,6 +518,10 @@ ephy_completion_model_get_value (GtkTreeModel *tree_model,
g_value_init (value, G_TYPE_INT);
init_relevance_col (value, node, group);
break;
+ case EPHY_COMPLETION_URL_COL:
+ g_value_init (value, G_TYPE_STRING);
+ init_url_col (value, node, group);
+ break;
}
}
diff --git a/src/ephy-completion-model.h b/src/ephy-completion-model.h
index a264ad2fd..6df64d288 100644
--- a/src/ephy-completion-model.h
+++ b/src/ephy-completion-model.h
@@ -42,6 +42,7 @@ typedef enum
EPHY_COMPLETION_RELEVANCE_COL,
EPHY_COMPLETION_EXTRA_COL,
EPHY_COMPLETION_FAVICON_COL,
+ EPHY_COMPLETION_URL_COL,
N_COL
} EphyCompletionColumn;
diff --git a/src/ephy-location-action.c b/src/ephy-location-action.c
index 59aa51573..9c30f0dc6 100644
--- a/src/ephy-location-action.c
+++ b/src/ephy-location-action.c
@@ -370,7 +370,8 @@ connect_proxy (GtkAction *action, GtkWidget *proxy)
EPHY_COMPLETION_KEYWORDS_COL,
EPHY_COMPLETION_RELEVANCE_COL,
EPHY_COMPLETION_EXTRA_COL,
- EPHY_COMPLETION_FAVICON_COL);
+ EPHY_COMPLETION_FAVICON_COL,
+ EPHY_COMPLETION_URL_COL);
add_completion_actions (action, proxy);