gtk+ r22177 - in trunk: . gtk
- From: federico svn gnome org
- To: svn-commits-list gnome org
- Subject: gtk+ r22177 - in trunk: . gtk
- Date: Fri, 23 Jan 2009 00:53:23 +0000 (UTC)
Author: federico
Date: Fri Jan 23 00:53:23 2009
New Revision: 22177
URL: http://svn.gnome.org/viewvc/gtk+?rev=22177&view=rev
Log:
Return an error code when refreshing the entry from the user's input
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.
Signed-off-by: Federico Mena Quintero <federico novell com>
Modified:
trunk/ChangeLog
trunk/gtk/gtkfilechooserentry.c
Modified: trunk/gtk/gtkfilechooserentry.c
==============================================================================
--- trunk/gtk/gtkfilechooserentry.c (original)
+++ trunk/gtk/gtkfilechooserentry.c Fri Jan 23 00:53:23 2009
@@ -50,6 +50,15 @@
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;
@@ -144,7 +153,7 @@
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);
@@ -1102,6 +1111,7 @@
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)
@@ -1203,6 +1213,7 @@
GTK_ENTRY (chooser_entry)->text_length);
}
+ /* FMQ: get result from the function below */
refresh_current_folder_and_file_part (chooser_entry, REFRESH_WHOLE_TEXT);
}
@@ -1438,7 +1449,7 @@
start_loading_current_folder (chooser_entry);
}
-static void
+static RefreshStatus
refresh_current_folder_and_file_part (GtkFileChooserEntry *chooser_entry,
RefreshMode refresh_mode)
{
@@ -1450,6 +1461,7 @@
gsize total_len, file_part_len;
gint file_part_pos;
GError *error;
+ RefreshStatus result;
editable = GTK_EDITABLE (chooser_entry);
@@ -1465,7 +1477,7 @@
default:
g_assert_not_reached ();
- return;
+ return REFRESH_INVALID_INPUT;
}
text = gtk_editable_get_chars (editable, 0, end_pos);
@@ -1478,9 +1490,19 @@
&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);
@@ -1496,6 +1518,8 @@
file_part_pos = g_utf8_strlen (text, total_len - file_part_len);
else
file_part_pos = 0;
+
+ result = REFRESH_OK;
}
g_free (text);
@@ -1505,10 +1529,13 @@
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
@@ -1524,6 +1551,7 @@
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)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]