Rember the user input that triggered the completion, add API to the

* gtk/gtkentry.c:
	* gtk/gtkentrycompletion.c:
	* gtk/gtkentrycompletion.h:
	* gtk/gtkentryprivate.h:

	Rember the user input that triggered the completion, add
	API to the retrieve it and reset the entry contents to it
	if the user cancels the tentative completion during
	the inline-selection.

svn path=/trunk/; revision=17666
This commit is contained in:
Xan Lopez 2007-04-28 07:47:08 +00:00
parent 61de24aa9a
commit c5ce76fda2
5 changed files with 143 additions and 76 deletions

View File

@ -1,3 +1,15 @@
2007-04-28 Xan Lopez <xan@gnome.org>
* gtk/gtkentry.c:
* gtk/gtkentrycompletion.c:
* gtk/gtkentrycompletion.h:
* gtk/gtkentryprivate.h:
Rember the user input that triggered the completion, add
API to the retrieve it and reset the entry contents to it
if the user cancels the tentative completion during
the inline-selection.
2007-04-27 Matthias Clasen <mclasen@redhat.com>
* gdk/x11/gdkgeometry-x11.c: Factor out window movement

View File

@ -5692,6 +5692,11 @@ gtk_entry_completion_key_press (GtkWidget *widget,
if (!gtk_tree_selection_get_selected (sel, &model, &iter))
return FALSE;
if (completion->priv->completion_prefix == NULL)
{
completion->priv->completion_prefix = g_strdup (gtk_entry_get_text (GTK_ENTRY (completion->priv->entry)));
}
g_signal_emit_by_name (completion, "cursor_on_match", model,
&iter, &entry_set);
}
@ -5720,10 +5725,23 @@ gtk_entry_completion_key_press (GtkWidget *widget,
if (completion->priv->inline_selection)
{
/* Escape rejects the tentative completion */
if (event->keyval == GDK_Escape)
gtk_editable_delete_selection (GTK_EDITABLE (widget));
/* Move the cursor to the end */
{
gtk_entry_set_text (GTK_ENTRY (completion->priv->entry), completion->priv->completion_prefix);
}
/* Move the cursor to the end for Right/Esc, to the
beginning for Left */
if (event->keyval == GDK_Right ||
event->keyval == GDK_KP_Right ||
event->keyval == GDK_Escape)
gtk_editable_set_position (GTK_EDITABLE (widget), -1);
else
gtk_editable_set_position (GTK_EDITABLE (widget), 0);
g_free (completion->priv->completion_prefix);
completion->priv->completion_prefix = NULL;
}
return TRUE;
@ -5738,6 +5756,12 @@ gtk_entry_completion_key_press (GtkWidget *widget,
_gtk_entry_reset_im_context (GTK_ENTRY (widget));
_gtk_entry_completion_popdown (completion);
if (completion->priv->completion_prefix)
{
g_free (completion->priv->completion_prefix);
completion->priv->completion_prefix = NULL;
}
gtk_widget_child_focus (gtk_widget_get_toplevel (widget), dir);
return TRUE;

View File

@ -141,6 +141,11 @@ static gboolean gtk_entry_completion_real_insert_prefix (GtkEntryCompletion *co
static gboolean gtk_entry_completion_cursor_on_match (GtkEntryCompletion *completion,
GtkTreeModel *model,
GtkTreeIter *iter);
static gboolean gtk_entry_completion_insert_completion (GtkEntryCompletion *completion,
GtkTreeModel *model,
GtkTreeIter *iter);
static void gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion,
const gchar *text);
static guint entry_completion_signals[LAST_SIGNAL] = { 0 };
@ -1631,13 +1636,34 @@ gtk_entry_completion_real_insert_prefix (GtkEntryCompletion *completion,
return TRUE;
}
void
/**
* gtk_entry_completion_get_completion_prefix:
* @completion: a #GtkEntryCompletion
*
* Get the original text entered by the user that triggered
* the completion or NULL if there's no completion ongoing.
*
* Since: 2.12
**/
const gchar*
gtk_entry_completion_get_completion_prefix (GtkEntryCompletion *completion)
{
g_return_val_if_fail (GTK_IS_ENTRY_COMPLETION (completion), NULL);
return completion->priv->completion_prefix;
}
static void
gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion,
const gchar *text)
{
GtkEntryCompletionPrivate *priv = completion->priv;
gchar *needle;
gint len;
priv = completion->priv;
if (priv->changed_id > 0)
{
g_signal_handler_block (priv->entry,
@ -1650,9 +1676,15 @@ gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion,
completion->priv->insert_text_id);
}
gtk_editable_get_selection_bounds (GTK_EDITABLE (priv->entry), &len, NULL);
gtk_entry_set_text (GTK_ENTRY (priv->entry), text);
gtk_editable_select_region (GTK_EDITABLE (priv->entry), len, -1);
needle = g_strstr_len (text, -1, completion->priv->completion_prefix);
if (needle)
{
len = g_utf8_strlen (text, -1) - g_utf8_strlen (needle, -1)
+ g_utf8_strlen (priv->completion_prefix, -1);
gtk_editable_select_region (GTK_EDITABLE (priv->entry),
len, -1);
}
if (priv->changed_id > 0)
{
@ -1667,15 +1699,13 @@ gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion,
}
}
gboolean
static gboolean
gtk_entry_completion_insert_completion (GtkEntryCompletion *completion,
GtkTreeModel *model,
GtkTreeIter *iter)
{
gchar *str = NULL;
g_return_val_if_fail (GTK_IS_TREE_MODEL (model), FALSE);
if (completion->priv->text_column < 0)
return FALSE;

View File

@ -119,8 +119,7 @@ void gtk_entry_completion_set_popup_single_match (GtkEntryComplet
gboolean popup_single_match);
gboolean gtk_entry_completion_get_popup_single_match (GtkEntryCompletion *completion);
void gtk_entry_completion_insert_completion_text (GtkEntryCompletion *completion,
const gchar *text);
const gchar *gtk_entry_completion_get_completion_prefix (GtkEntryCompletion *completion);
/* convenience */
void gtk_entry_completion_set_text_column (GtkEntryCompletion *completion,
gint column);

View File

@ -66,6 +66,8 @@ struct _GtkEntryCompletionPrivate
guint popup_single_match : 1;
guint inline_selection : 1;
gchar *completion_prefix;
GSource *check_completion_idle;
};