SF.net SVN: geany: [1469] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Sat Apr 21 16:27:39 UTC 2007
Revision: 1469
http://svn.sourceforge.net/geany/?rev=1469&view=rev
Author: ntrel
Date: 2007-04-21 09:27:38 -0700 (Sat, 21 Apr 2007)
Log Message:
-----------
Fix no response with Project dialogs when the user enters invalid
information (oops).
Modified Paths:
--------------
trunk/ChangeLog
trunk/src/project.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-04-21 12:25:17 UTC (rev 1468)
+++ trunk/ChangeLog 2007-04-21 16:27:38 UTC (rev 1469)
@@ -2,6 +2,9 @@
* src/project.c, src/project.h, src/keyfile.c, src/main.c:
Restore the current project when restarting Geany.
+ * src/project.c:
+ Fix no response with Project dialogs when the user enters invalid
+ information (oops).
2007-04-20 Nick Treleaven <nick.treleaven at btinternet.com>
Modified: trunk/src/project.c
===================================================================
--- trunk/src/project.c 2007-04-21 12:25:17 UTC (rev 1468)
+++ trunk/src/project.c 2007-04-21 16:27:38 UTC (rev 1469)
@@ -60,14 +60,10 @@
-static void on_properties_dialog_response(GtkDialog *dialog, gint response,
- PropertyDialogElements *e);
+static gboolean update_config(const PropertyDialogElements *e);
static void on_file_save_button_clicked(GtkButton *button, GtkWidget *entry);
static void on_folder_open_button_clicked(GtkButton *button, GtkWidget *entry);
static void on_file_open_button_clicked(GtkButton *button, GtkWidget *entry);
-#ifndef G_OS_WIN32
-static void on_open_dialog_response(GtkDialog *dialog, gint response, gpointer user_data);
-#endif
static gboolean close_open_project();
static gboolean load_config(const gchar *filename);
static gboolean write_config();
@@ -186,11 +182,47 @@
g_signal_connect((gpointer) e->base_path, "changed", G_CALLBACK(on_entries_changed), e);
gtk_widget_show_all(e->dialog);
+
+ retry:
response = gtk_dialog_run(GTK_DIALOG(e->dialog));
- on_properties_dialog_response(GTK_DIALOG(e->dialog), response, e);
+ if (response == GTK_RESPONSE_OK)
+ if (! update_config(e))
+ goto retry;
+
+ gtk_widget_destroy(e->dialog);
+ g_free(e);
}
+#ifndef G_OS_WIN32
+static void run_open_dialog(GtkDialog *dialog)
+{
+ gint response;
+
+ retry:
+ response = gtk_dialog_run(dialog);
+
+ if (response == GTK_RESPONSE_ACCEPT)
+ {
+ gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+
+ // try to load the config
+ if (! project_load_file(filename))
+ {
+ gchar *utf8_filename = utils_get_utf8_from_locale(filename);
+
+ SHOW_ERR(_("Project file \"%s\" could not be loaded."), utf8_filename);
+ gtk_widget_grab_focus(GTK_WIDGET(dialog));
+ g_free(utf8_filename);
+ g_free(filename);
+ goto retry;
+ }
+ g_free(filename);
+ }
+}
+#endif
+
+
void project_open()
{
gchar *dir = g_strconcat(GEANY_HOME_DIR, G_DIR_SEPARATOR_S, PROJECT_DIR, NULL);
@@ -199,7 +231,6 @@
#else
GtkWidget *dialog;
GtkFileFilter *filter;
- gint response;
#endif
if (! close_open_project()) return;
@@ -239,8 +270,8 @@
gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir);
gtk_widget_show_all(dialog);
- response = gtk_dialog_run(GTK_DIALOG(dialog));
- on_open_dialog_response(GTK_DIALOG(dialog), response, NULL);
+ run_open_dialog(GTK_DIALOG(dialog));
+ gtk_widget_destroy(GTK_WIDGET(dialog));
#endif
g_free(dir);
@@ -432,8 +463,15 @@
gtk_entry_set_text(GTK_ENTRY(e->run_cmd), p->run_cmd);
gtk_widget_show_all(e->dialog);
+
+ retry:
response = gtk_dialog_run(GTK_DIALOG(e->dialog));
- on_properties_dialog_response(GTK_DIALOG(e->dialog), response, e);
+ if (response == GTK_RESPONSE_OK)
+ if (! update_config(e))
+ goto retry;
+
+ gtk_widget_destroy(e->dialog);
+ g_free(e);
}
@@ -461,125 +499,123 @@
}
-/* Also used for New Project dialog response. */
-static void on_properties_dialog_response(GtkDialog *dialog, gint response,
- PropertyDialogElements *e)
+/* Verifies data for New & Properties dialogs.
+ * Returns: FALSE if the user needs to change any data. */
+static gboolean update_config(const PropertyDialogElements *e)
{
- if (response == GTK_RESPONSE_OK && e != NULL)
+ const gchar *name, *file_name, *base_path;
+ gint name_len;
+ gboolean new_project = FALSE;
+ GeanyProject *p;
+
+ g_return_val_if_fail(e != NULL, TRUE);
+
+ name = gtk_entry_get_text(GTK_ENTRY(e->name));
+ name_len = strlen(name);
+ if (name_len == 0)
{
- const gchar *name, *file_name, *base_path;
- gint name_len;
- gboolean new_project = FALSE;
- GeanyProject *p;
+ SHOW_ERR(_("The specified project name is too short."));
+ gtk_widget_grab_focus(e->name);
+ return FALSE;
+ }
+ else if (name_len > MAX_NAME_LEN)
+ {
+ SHOW_ERR(_("The specified project name is too long (max. %d characters)."), MAX_NAME_LEN);
+ gtk_widget_grab_focus(e->name);
+ return FALSE;
+ }
- name = gtk_entry_get_text(GTK_ENTRY(e->name));
- name_len = strlen(name);
- if (name_len == 0)
- {
- SHOW_ERR(_("The specified project name is too short."));
- gtk_widget_grab_focus(e->name);
- return;
- }
- else if (name_len > MAX_NAME_LEN)
- {
- SHOW_ERR(_("The specified project name is too long (max. %d characters)."), MAX_NAME_LEN);
- gtk_widget_grab_focus(e->name);
- return;
- }
+ file_name = gtk_entry_get_text(GTK_ENTRY(e->file_name));
+ if (strlen(file_name) == 0)
+ {
+ SHOW_ERR(_("You have specified an invalid project filename."));
+ gtk_widget_grab_focus(e->file_name);
+ return FALSE;
+ }
- file_name = gtk_entry_get_text(GTK_ENTRY(e->file_name));
- if (strlen(file_name) == 0)
+ base_path = gtk_entry_get_text(GTK_ENTRY(e->base_path));
+ if (strlen(base_path) == 0)
+ {
+ SHOW_ERR(_("You have specified an invalid project base path."));
+ gtk_widget_grab_focus(e->base_path);
+ return FALSE;
+ }
+ else
+ { // check whether the given directory actually exists
+ gchar *locale_path = utils_get_locale_from_utf8(base_path);
+ if (! g_file_test(locale_path, G_FILE_TEST_IS_DIR))
{
- SHOW_ERR(_("You have specified an invalid project filename."));
- gtk_widget_grab_focus(e->file_name);
- return;
- }
-
- base_path = gtk_entry_get_text(GTK_ENTRY(e->base_path));
- if (strlen(base_path) == 0)
- {
- SHOW_ERR(_("You have specified an invalid project base path."));
- gtk_widget_grab_focus(e->base_path);
- return;
- }
- else
- { // check whether the given directory actually exists
- gchar *locale_path = utils_get_locale_from_utf8(base_path);
- if (! g_file_test(locale_path, G_FILE_TEST_IS_DIR))
+ if (dialogs_show_question(
+ _("The specified project base path does not exist. Should it be created?")))
{
- if (dialogs_show_question(
- _("The specified project base path does not exist. Should it be created?")))
- {
- utils_mkdir(locale_path, TRUE);
- }
- else
- {
- g_free(locale_path);
- gtk_widget_grab_focus(e->base_path);
- return;
- }
+ utils_mkdir(locale_path, TRUE);
}
- g_free(locale_path);
+ else
+ {
+ g_free(locale_path);
+ gtk_widget_grab_focus(e->base_path);
+ return FALSE;
+ }
}
+ g_free(locale_path);
+ }
- // finally test whether the given project file can be written
- if (utils_write_file(file_name, "") != 0)
- {
- SHOW_ERR(_("Project file could not be written."));
- gtk_widget_grab_focus(e->file_name);
- return;
- }
+ // finally test whether the given project file can be written
+ if (utils_write_file(file_name, "") != 0)
+ {
+ SHOW_ERR(_("Project file could not be written."));
+ gtk_widget_grab_focus(e->file_name);
+ return FALSE;
+ }
- if (app->project == NULL)
- {
- app->project = g_new0(GeanyProject, 1);
- new_project = TRUE;
- }
- p = app->project;
+ if (app->project == NULL)
+ {
+ app->project = g_new0(GeanyProject, 1);
+ new_project = TRUE;
+ }
+ p = app->project;
- if (p->name != NULL) g_free(p->name);
- p->name = g_strdup(name);
+ if (p->name != NULL) g_free(p->name);
+ p->name = g_strdup(name);
- if (p->file_name != NULL) g_free(p->file_name);
- p->file_name = g_strdup(file_name);
+ if (p->file_name != NULL) g_free(p->file_name);
+ p->file_name = g_strdup(file_name);
- if (p->base_path != NULL) g_free(p->base_path);
- p->base_path = g_strdup(base_path);
+ if (p->base_path != NULL) g_free(p->base_path);
+ p->base_path = g_strdup(base_path);
- if (! new_project) // save properties specific fields
- {
- GtkTextIter start, end;
- gchar *tmp;
- GtkTextBuffer *buffer;
+ if (! new_project) // save properties specific fields
+ {
+ GtkTextIter start, end;
+ gchar *tmp;
+ GtkTextBuffer *buffer;
- if (p->run_cmd != NULL) g_free(p->run_cmd);
- p->run_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(e->run_cmd)));
+ if (p->run_cmd != NULL) g_free(p->run_cmd);
+ p->run_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(e->run_cmd)));
- // get and set the project description
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(e->description));
- gtk_text_buffer_get_start_iter(buffer, &start);
- gtk_text_buffer_get_end_iter(buffer, &end);
- g_free(p->description);
- p->description = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
+ // get and set the project description
+ buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(e->description));
+ gtk_text_buffer_get_start_iter(buffer, &start);
+ gtk_text_buffer_get_end_iter(buffer, &end);
+ g_free(p->description);
+ p->description = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
- // get and set the project file patterns
- buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(e->patterns));
- gtk_text_buffer_get_start_iter(buffer, &start);
- gtk_text_buffer_get_end_iter(buffer, &end);
- tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
- g_strfreev(p->file_patterns);
- p->file_patterns = g_strsplit(tmp, "\n", -1);
- g_free(tmp);
- }
- write_config();
- if (new_project)
- msgwin_status_add(_("Project \"%s\" created."), p->name);
- else
- msgwin_status_add(_("Project \"%s\" saved."), p->name);
+ // get and set the project file patterns
+ buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(e->patterns));
+ gtk_text_buffer_get_start_iter(buffer, &start);
+ gtk_text_buffer_get_end_iter(buffer, &end);
+ tmp = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
+ g_strfreev(p->file_patterns);
+ p->file_patterns = g_strsplit(tmp, "\n", -1);
+ g_free(tmp);
}
+ write_config();
+ if (new_project)
+ msgwin_status_add(_("Project \"%s\" created."), p->name);
+ else
+ msgwin_status_add(_("Project \"%s\" saved."), p->name);
- gtk_widget_destroy(GTK_WIDGET(dialog));
- g_free(e);
+ return TRUE;
}
@@ -747,34 +783,6 @@
}
-#ifndef G_OS_WIN32
-static void on_open_dialog_response(GtkDialog *dialog, gint response, gpointer user_data)
-{
- if (response == GTK_RESPONSE_ACCEPT)
- {
- gchar *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
-
- // try to load the config
- if (project_load_file(filename))
- {
- gtk_widget_destroy(GTK_WIDGET(dialog));
- }
- else
- {
- gchar *utf8_filename = utils_get_utf8_from_locale(filename);
-
- SHOW_ERR(_("Project file \"%s\" could not be loaded."), utf8_filename);
- gtk_widget_grab_focus(GTK_WIDGET(dialog));
- g_free(utf8_filename);
- }
- g_free(filename);
- }
- else
- gtk_widget_destroy(GTK_WIDGET(dialog));
-}
-#endif
-
-
gboolean project_load_file(const gchar *locale_file_name)
{
g_return_val_if_fail(locale_file_name != NULL, FALSE);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list