+2009-01-22 Federico Mena Quintero <federico@novell.com>
+
+ Return an error code when refreshing the entry from the user's
+ input. We use this in the completion code to know when completion
+ can't happen due to (for example) having a non-local URI in a file
+ chooser that is local_only=TRUE.
+
+ Also, we start maintaining an invariant that
+ chooser_entry->current_folder_file != NULL implies that:
+
+ * what the user entered is valid
+
+ * we are loading that folder (chooser_entry->load_folder_cancellable != NULL)
+
+ * or we are done loading that folder, or we have a handle
+ to it at least (chooser_entry->current_folder != NULL)
+
+ The invariant also says that all of the above are NULL (and
+ chooser_entry->current_folder_file == NULL) implies that the user
+ typed something invalid. This makes
+ _gtk_file_chooser_entry_get_current_folder() not able to return
+ an invalid folder.
+
+ * gtk/gtkfilechooserentry.c (RefreshStatus): New enum.
+ (refresh_current_folder_and_file_part): Return a RefreshStatus.
+ We filter out incomplete hostnames here (typing
+ "sftp://incompl[tab]" will error out), as well as completely
+ unparsable input.
+
2009-01-22 Matthew Barnes <mbarnes@redhat.com>
Bug 568334 – Constructor properties for GtkAction
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;
REFRESH_WHOLE_TEXT
} RefreshMode;
-static void refresh_current_folder_and_file_part (GtkFileChooserEntry *chooser_entry,
+static RefreshStatus refresh_current_folder_and_file_part (GtkFileChooserEntry *chooser_entry,
RefreshMode refresh_mode);
static void finished_loading_cb (GtkFolder *folder,
gpointer data);
static void
start_explicit_completion (GtkFileChooserEntry *chooser_entry)
{
+ /* FMQ: get result from the function below */
refresh_current_folder_and_file_part (chooser_entry, REFRESH_UP_TO_CURSOR_POSITION);
if (!chooser_entry->current_folder_file)
GTK_ENTRY (chooser_entry)->text_length);
}
+ /* FMQ: get result from the function below */
refresh_current_folder_and_file_part (chooser_entry, REFRESH_WHOLE_TEXT);
}
start_loading_current_folder (chooser_entry);
}
-static void
+static RefreshStatus
refresh_current_folder_and_file_part (GtkFileChooserEntry *chooser_entry,
RefreshMode refresh_mode)
{
gsize total_len, file_part_len;
gint file_part_pos;
GError *error;
+ RefreshStatus result;
editable = GTK_EDITABLE (chooser_entry);
default:
g_assert_not_reached ();
- return;
+ return REFRESH_INVALID_INPUT;
}
text = gtk_editable_get_chars (editable, 0, end_pos);
&folder_file, &file_part, &error))
{
if (g_error_matches (error, GTK_FILE_CHOOSER_ERROR, GTK_FILE_CHOOSER_ERROR_INCOMPLETE_HOSTNAME))
- folder_file = NULL;
+ {
+ folder_file = NULL;
+ result = REFRESH_INCOMPLETE_HOSTNAME;
+ }
else
- folder_file = (chooser_entry->base_folder) ? g_object_ref (chooser_entry->base_folder) : NULL;
+ {
+ folder_file = (chooser_entry->base_folder) ? g_object_ref (chooser_entry->base_folder) : NULL;
+
+ 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_pos = g_utf8_strlen (text, total_len - file_part_len);
else
file_part_pos = 0;
+
+ result = REFRESH_OK;
}
g_free (text);
chooser_entry->file_part = file_part;
chooser_entry->file_part_pos = file_part_pos;
+ /* FMQ: this needs to return an error if the folder is not local */
reload_current_folder (chooser_entry, folder_file, file_part_pos == -1);
if (folder_file)
g_object_unref (folder_file);
+
+ return result;
}
static void
static void
start_autocompletion (GtkFileChooserEntry *chooser_entry)
{
+ /* FMQ: get result from the function below */
refresh_current_folder_and_file_part (chooser_entry, REFRESH_UP_TO_CURSOR_POSITION);
if (!chooser_entry->current_folder)