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