filechooserentry: Simplify code

Use all the clever functions we invented in recent refactorings to
compute the file and dir part and the current folder.

This also fixes the bug where "./" was not taken as the current
directory but interpreted as a file named "./".
This commit is contained in:
Benjamin Otte 2011-11-07 04:20:28 +01:00
parent d27d73f885
commit 5607cd9170

View File

@ -51,15 +51,6 @@ typedef enum {
LOAD_COMPLETE_EXPLICIT_COMPLETION
} LoadCompleteAction;
typedef enum
{
REFRESH_OK,
REFRESH_INVALID_INPUT,
REFRESH_INCOMPLETE_HOSTNAME,
REFRESH_NONEXISTENT,
REFRESH_NOT_LOCAL
} RefreshStatus;
struct _GtkFileChooserEntry
{
GtkEntry parent_instance;
@ -70,7 +61,6 @@ struct _GtkFileChooserEntry
GFile *current_folder_file;
gchar *dir_part;
gchar *file_part;
gint file_part_pos;
LoadCompleteAction load_complete_action;
@ -413,73 +403,6 @@ gtk_file_chooser_get_directory_for_text (GtkFileChooserEntry *chooser_entry,
return parent;
}
static gboolean
gtk_file_chooser_entry_parse (GtkFileChooserEntry *chooser_entry,
const gchar *str,
GFile **folder,
gchar **file_part,
GError **error)
{
GFile *file;
gboolean result = FALSE;
gboolean is_dir = FALSE;
gchar *last_slash = NULL;
if (str && *str)
is_dir = (str [strlen (str) - 1] == G_DIR_SEPARATOR);
last_slash = strrchr (str, G_DIR_SEPARATOR);
file = gtk_file_chooser_get_file_for_text (chooser_entry, str);
if (g_file_equal (chooser_entry->base_folder, file))
{
/* this is when user types '.', could be the
* beginning of a hidden file, ./ or ../
*/
*folder = g_object_ref (file);
*file_part = g_strdup (str);
result = TRUE;
}
else if (is_dir)
{
/* it's a dir, or at least it ends with the dir separator */
*folder = g_object_ref (file);
*file_part = g_strdup ("");
result = TRUE;
}
else
{
GFile *parent_file;
parent_file = g_file_get_parent (file);
if (!parent_file)
{
g_set_error (error,
GTK_FILE_CHOOSER_ERROR,
GTK_FILE_CHOOSER_ERROR_NONEXISTENT,
"Could not get parent file");
*folder = NULL;
*file_part = NULL;
}
else
{
*folder = parent_file;
result = TRUE;
if (last_slash)
*file_part = g_strdup (last_slash + 1);
else
*file_part = g_strdup (str);
}
}
g_object_unref (file);
return result;
}
/* Finds a common prefix based on the contents of the entry
* and mandatorily appends it
*/
@ -755,62 +678,27 @@ static void
refresh_current_folder_and_file_part (GtkFileChooserEntry *chooser_entry)
{
GFile *folder_file;
gchar *file_part;
gsize total_len, file_part_len;
gint file_part_pos;
GError *error;
RefreshStatus result;
char *text;
text = gtk_file_chooser_entry_get_completion_text (chooser_entry);
error = NULL;
if (!gtk_file_chooser_entry_parse (chooser_entry,
text, &folder_file, &file_part, &error))
{
folder_file = g_object_ref (chooser_entry->base_folder);
if (g_error_matches (error, GTK_FILE_CHOOSER_ERROR, GTK_FILE_CHOOSER_ERROR_NONEXISTENT))
result = REFRESH_NONEXISTENT;
else
result = REFRESH_INVALID_INPUT;
if (error)
g_error_free (error);
file_part = g_strdup ("");
file_part_pos = -1;
}
else
{
g_assert (folder_file != NULL);
file_part_len = strlen (file_part);
total_len = strlen (text);
if (total_len > file_part_len)
file_part_pos = g_utf8_strlen (text, total_len - file_part_len);
else
file_part_pos = 0;
result = REFRESH_OK;
}
char *text, *last_slash;
g_free (chooser_entry->file_part);
g_free (chooser_entry->dir_part);
chooser_entry->dir_part = file_part_pos > 0 ? g_strndup (text, file_part_pos) : g_strdup ("");
chooser_entry->file_part = file_part;
chooser_entry->file_part_pos = file_part_pos;
text = gtk_file_chooser_entry_get_completion_text (chooser_entry);
if (result == REFRESH_OK)
last_slash = strrchr (text, G_DIR_SEPARATOR);
if (last_slash)
{
set_completion_folder (chooser_entry, folder_file);
chooser_entry->dir_part = g_strndup (text, last_slash - text + 1);
chooser_entry->file_part = g_strdup (last_slash + 1);
}
else
{
set_completion_folder (chooser_entry, NULL);
chooser_entry->dir_part = g_strdup ("");
chooser_entry->file_part = g_strdup (text);
}
folder_file = gtk_file_chooser_get_directory_for_text (chooser_entry, text);
set_completion_folder (chooser_entry, folder_file);
if (folder_file)
g_object_unref (folder_file);