diff options
author | Benjamin Otte <otte@redhat.com> | 2011-11-07 03:22:26 +0100 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-12-16 20:09:13 +0100 |
commit | c9b220275a49461088baa86d117c86791fa28cc9 (patch) | |
tree | a731c359aa4baa0696a77885514558fb55fe0291 /gtk/gtkfilechooserentry.c | |
parent | d3fd759f779e10419f8b2aa5e9b43393178ca67b (diff) | |
download | gtk+-c9b220275a49461088baa86d117c86791fa28cc9.tar.gz |
filechooserentry: Use completion for completion
Reduce the amount of code even more by using the entry completion to
query the prefix.
Diffstat (limited to 'gtk/gtkfilechooserentry.c')
-rw-r--r-- | gtk/gtkfilechooserentry.c | 175 |
1 files changed, 22 insertions, 153 deletions
diff --git a/gtk/gtkfilechooserentry.c b/gtk/gtkfilechooserentry.c index 65968f8ba6..693c8d7a57 100644 --- a/gtk/gtkfilechooserentry.c +++ b/gtk/gtkfilechooserentry.c @@ -504,170 +504,39 @@ gtk_file_chooser_entry_parse (GtkFileChooserEntry *chooser_entry, return result; } -/* Determines if the completion model has entries with a common prefix relative - * to the current contents of the entry. Also, if there's one and only one such - * path, stores it in unique_path_ret. - */ -static gboolean -find_common_prefix (GtkFileChooserEntry *chooser_entry, - gchar **common_prefix_ret, - GFile **unique_file_ret, - gboolean *is_complete_not_unique_ret, - gboolean *prefix_expands_the_file_part_ret, - GError **error) -{ - GtkTreeIter iter; - gboolean parsed; - gboolean valid; - char *text_up_to_cursor; - GFile *parsed_folder_file; - char *parsed_file_part; - - *common_prefix_ret = NULL; - *unique_file_ret = NULL; - *is_complete_not_unique_ret = FALSE; - *prefix_expands_the_file_part_ret = FALSE; - - text_up_to_cursor = gtk_file_chooser_entry_get_completion_text (chooser_entry); - - parsed = gtk_file_chooser_entry_parse (chooser_entry, - text_up_to_cursor, - &parsed_folder_file, - &parsed_file_part, - error); - - g_free (text_up_to_cursor); - - if (!parsed) - return FALSE; - - g_assert (parsed_folder_file != NULL - && g_file_equal (parsed_folder_file, chooser_entry->current_folder_file)); - - g_object_unref (parsed_folder_file); - - /* First pass: find the common prefix */ - - valid = gtk_tree_model_get_iter_first (chooser_entry->completion_store, &iter); - - while (valid) - { - gchar *display_name; - GFile *file; - - gtk_tree_model_get (chooser_entry->completion_store, - &iter, - DISPLAY_NAME_COLUMN, &display_name, - FILE_COLUMN, &file, - -1); - - if (g_str_has_prefix (display_name, parsed_file_part)) - { - if (!*common_prefix_ret) - { - *common_prefix_ret = g_strdup (display_name); - *unique_file_ret = g_object_ref (file); - } - else - { - gchar *p = *common_prefix_ret; - const gchar *q = display_name; - - while (*p && *p == *q) - { - p++; - q++; - } - - *p = '\0'; - - if (*unique_file_ret) - { - g_object_unref (*unique_file_ret); - *unique_file_ret = NULL; - } - } - } - - g_free (display_name); - g_object_unref (file); - valid = gtk_tree_model_iter_next (chooser_entry->completion_store, &iter); - } - - /* Second pass: see if the prefix we found is a complete match */ - - if (*common_prefix_ret != NULL) - { - valid = gtk_tree_model_get_iter_first (chooser_entry->completion_store, &iter); - - while (valid) - { - gchar *display_name; - int len; - - gtk_tree_model_get (chooser_entry->completion_store, - &iter, - DISPLAY_NAME_COLUMN, &display_name, - -1); - len = strlen (display_name); - g_assert (len > 0); - - if (G_IS_DIR_SEPARATOR (display_name[len - 1])) - len--; - - if (*unique_file_ret == NULL && strncmp (*common_prefix_ret, display_name, len) == 0) - *is_complete_not_unique_ret = TRUE; - - g_free (display_name); - valid = gtk_tree_model_iter_next (chooser_entry->completion_store, &iter); - } - - /* Finally: Did we generate a new completion, or was the user's input already completed as far as it could go? */ - - *prefix_expands_the_file_part_ret = g_utf8_strlen (*common_prefix_ret, -1) > g_utf8_strlen (parsed_file_part, -1); - } - - g_free (parsed_file_part); - - return TRUE; -} - /* Finds a common prefix based on the contents of the entry * and mandatorily appends it */ static void explicitly_complete (GtkFileChooserEntry *chooser_entry) { - gchar *common_prefix; - GFile *unique_file; - gboolean is_complete_not_unique; - gboolean prefix_expands_the_file_part; - gint cursor_pos; - gint pos; - clear_completions (chooser_entry); - if (chooser_entry->completion_store == NULL - || !find_common_prefix (chooser_entry, &common_prefix, &unique_file, &is_complete_not_unique, &prefix_expands_the_file_part, NULL) - || !common_prefix - || !prefix_expands_the_file_part) + if (chooser_entry->completion_store) { - beep (chooser_entry); - return; - } - - cursor_pos = gtk_editable_get_position (GTK_EDITABLE (chooser_entry)); - pos = chooser_entry->file_part_pos; + char *completion, *text; + gsize completion_len, text_len; + + text = gtk_file_chooser_entry_get_completion_text (chooser_entry); + text_len = strlen (text); + completion = gtk_entry_completion_compute_prefix (gtk_entry_get_completion (GTK_ENTRY (chooser_entry)), text); + completion_len = completion ? strlen (completion) : 0; - chooser_entry->in_change = TRUE; - gtk_editable_delete_text (GTK_EDITABLE (chooser_entry), - pos, cursor_pos); - gtk_editable_insert_text (GTK_EDITABLE (chooser_entry), - common_prefix, -1, - &pos); - chooser_entry->in_change = FALSE; + if (completion_len > text_len) + { + GtkEditable *editable = GTK_EDITABLE (chooser_entry); + int pos = gtk_editable_get_position (editable); + + gtk_editable_insert_text (editable, + completion + text_len, + completion_len - text_len, + &pos); + gtk_editable_set_position (editable, pos); + return; + } + } - gtk_editable_set_position (GTK_EDITABLE (chooser_entry), pos); + beep (chooser_entry); } static void |