SF.net SVN: geany: [1485] trunk

ntrel at users.sourceforge.net ntrel at xxxxx
Sun Apr 29 12:03:26 UTC 2007


Revision: 1485
          http://svn.sourceforge.net/geany/?rev=1485&view=rev
Author:   ntrel
Date:     2007-04-29 05:03:25 -0700 (Sun, 29 Apr 2007)

Log Message:
-----------
Add ui_path_box_new() for creating a path text entry with an open
button, which runs a file chooser to set the text entry.
Add ui_setup_open_button_callback() for setting up a button callback
that behaves like the open button in ui_path_box_new().
Use ui_path_box_new() in FIF dialog setup.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/search.c
    trunk/src/ui_utils.c
    trunk/src/ui_utils.h

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-04-29 11:35:23 UTC (rev 1484)
+++ trunk/ChangeLog	2007-04-29 12:03:25 UTC (rev 1485)
@@ -2,6 +2,12 @@
 
  * src/interface.c, geany.glade:
    Rename 'tabulators' 'tabs'.
+ * src/ui_utils.h, src/search.c, src/ui_utils.c:
+   Add ui_path_box_new() for creating a path text entry with an open
+   button, which runs a file chooser to set the text entry.
+   Add ui_setup_open_button_callback() for setting up a button callback
+   that behaves like the open button in ui_path_box_new().
+   Use ui_path_box_new() in FIF dialog setup.
 
 
 2007-04-29  Enrico Tröger  <enrico.troeger at uvena.de>

Modified: trunk/src/search.c
===================================================================
--- trunk/src/search.c	2007-04-29 11:35:23 UTC (rev 1484)
+++ trunk/src/search.c	2007-04-29 12:03:25 UTC (rev 1485)
@@ -108,9 +108,7 @@
 static gboolean
 search_find_in_files(const gchar *search_text, const gchar *dir, const gchar *opts);
 
-static void on_open_dir_dialog_clicked(GtkButton *button, gpointer user_data);
 
-
 void search_init()
 {
 	widgets.find_dialog		= NULL;
@@ -543,7 +541,6 @@
 	static GtkWidget *combo = NULL;
 	static GtkWidget *dir_combo;
 	GtkWidget *entry; // the child GtkEntry of combo (or dir_combo)
-	GtkWidget *dirbtn, *openimg;
 	gint idx = document_get_cur_idx();
 	gchar *sel = NULL;
 	gchar *cur_dir;
@@ -554,7 +551,7 @@
 	{
 		GtkWidget *label, *label1, *checkbox1, *checkbox2, *check_wholeword,
 			*check_recursive, *check_extra, *entry_extra;
-		GtkWidget *dbox, *sbox, *cbox, *rbox, *rbtn, *hbox, *vbox, *box;
+		GtkWidget *dbox, *sbox, *cbox, *rbox, *rbtn, *hbox, *vbox;
 		GtkSizeGroup *size_group;
 		GtkTooltips *tooltips = GTK_TOOLTIPS(lookup_widget(app->window, "tooltips"));
 
@@ -578,20 +575,8 @@
 		g_object_set_data_full(G_OBJECT(widgets.find_in_files_dialog), "dir_combo",
 						gtk_widget_ref(dir_combo), (GDestroyNotify)gtk_widget_unref);
 
-		// prevent dir_combo being vertically stretched to the height of dirbtn
-		box = gtk_vbox_new(FALSE, 0);
-		gtk_box_pack_start(GTK_BOX(box), dir_combo, TRUE, FALSE, 0);
-
-		dirbtn = gtk_button_new();
-		openimg = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON);
-		gtk_container_add(GTK_CONTAINER(dirbtn), openimg);
-		g_signal_connect(G_OBJECT(dirbtn), "clicked", G_CALLBACK(on_open_dir_dialog_clicked),
-			NULL);
-
-		dbox = gtk_hbox_new(FALSE, 6);
+		dbox = ui_path_box_new(GTK_ENTRY(entry), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
 		gtk_box_pack_start(GTK_BOX(dbox), label1, FALSE, FALSE, 0);
-		gtk_box_pack_start(GTK_BOX(dbox), box, TRUE, TRUE, 0);
-		gtk_box_pack_start(GTK_BOX(dbox), dirbtn, FALSE, FALSE, 0);
 
 		label = gtk_label_new(_("Search for:"));
 		gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
@@ -735,37 +720,6 @@
 }
 
 
-static void on_open_dir_dialog_clicked(GtkButton *button, gpointer user_data)
-{
-	GtkWidget *dialog = gtk_file_chooser_dialog_new(_("Select folder"),
-		GTK_WINDOW(app->window), GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
-		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-		GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
-	GtkWidget *dir_combo =
-		lookup_widget(widgets.find_in_files_dialog, "dir_combo");
-	GtkWidget *entry_dir = gtk_bin_get_child(GTK_BIN(dir_combo));
-	gchar *dir_locale;
-	const gchar *entry_text;
-
-	entry_text = gtk_entry_get_text(GTK_ENTRY(entry_dir));
-	dir_locale = utils_get_locale_from_utf8(entry_text);
-	if (g_path_is_absolute(dir_locale) && g_file_test(dir_locale, G_FILE_TEST_IS_DIR))
-		gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), dir_locale);
-	g_free(dir_locale);
-
-	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
-	{
-		gchar *dir_utf8;
-		dir_locale = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog));
-		dir_utf8 = utils_get_utf8_from_locale(dir_locale);
-		g_free(dir_locale);
-		gtk_entry_set_text(GTK_ENTRY(entry_dir), dir_utf8);
-		g_free(dir_utf8);
-	}
-	gtk_widget_destroy(dialog);
-}
-
-
 static void
 on_find_replace_checkbutton_toggled(GtkToggleButton *togglebutton, gpointer user_data)
 {

Modified: trunk/src/ui_utils.c
===================================================================
--- trunk/src/ui_utils.c	2007-04-29 11:35:23 UTC (rev 1484)
+++ trunk/src/ui_utils.c	2007-04-29 12:03:25 UTC (rev 1485)
@@ -958,8 +958,10 @@
 
 const gint BUTTON_BOX_BORDER = 5;
 
-/* common convenience function for getting a fixed border for dialogs
- * that doesn't increase the button box border */
+/* Convenience function for getting a fixed border for dialogs that doesn't
+ * increase the button box border.
+ * dialog is the parent container for the vbox.
+ * Returns: the vbox. */
 GtkWidget *ui_dialog_vbox_new(GtkDialog *dialog)
 {
 	GtkWidget *vbox = gtk_vbox_new(FALSE, 12);	// need child vbox to set a separate border.
@@ -1119,3 +1121,95 @@
 }
 
 
+/* Creates a GtkHBox with entry packed into it and an open button which runs a
+ * file chooser, replacing entry text if successful.
+ * entry can be the child of an unparented widget, such as GtkComboBoxEntry.
+ * action is the GtkFileChooser mode to use. */
+GtkWidget *ui_path_box_new(GtkEntry *entry, GtkFileChooserAction action)
+{
+	GtkWidget *vbox, *dirbtn, *openimg, *hbox, *path_entry;
+
+	hbox = gtk_hbox_new(FALSE, 6);
+	path_entry = GTK_WIDGET(entry);
+
+	// prevent path_entry being vertically stretched to the height of dirbtn
+	vbox = gtk_vbox_new(FALSE, 0);
+	if (gtk_widget_get_parent(path_entry))	// entry->parent may be a GtkComboBoxEntry
+	{
+		GtkWidget *parent = gtk_widget_get_parent(path_entry);
+
+		gtk_box_pack_start(GTK_BOX(vbox), parent, TRUE, FALSE, 0);
+	}
+	else
+		gtk_box_pack_start(GTK_BOX(vbox), path_entry, TRUE, FALSE, 0);
+
+	dirbtn = gtk_button_new();
+	openimg = gtk_image_new_from_stock(GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON);
+	gtk_container_add(GTK_CONTAINER(dirbtn), openimg);
+	ui_setup_open_button_callback(dirbtn, entry, action);
+
+	gtk_box_pack_end(GTK_BOX(hbox), dirbtn, FALSE, FALSE, 0);
+	gtk_box_pack_end(GTK_BOX(hbox), vbox, TRUE, TRUE, 0);
+	return hbox;
+}
+
+
+static void ui_path_box_open_clicked(GtkButton *button, gpointer user_data);
+
+
+/* Setup a GtkButton to run a GtkFileChooser, setting entry text if successful.
+ * action is the file chooser mode to use. */
+void ui_setup_open_button_callback(GtkWidget *open_btn, GtkEntry *entry,
+		GtkFileChooserAction action)
+{
+	GtkWidget *path_entry = GTK_WIDGET(entry);
+
+	g_object_set_data_full(G_OBJECT(open_btn), "entry",
+					gtk_widget_ref(path_entry), (GDestroyNotify)gtk_widget_unref);
+	g_object_set_data(G_OBJECT(open_btn), "action", (gpointer) action);
+	g_signal_connect(G_OBJECT(open_btn), "clicked",
+		G_CALLBACK(ui_path_box_open_clicked), open_btn);
+}
+
+
+static void ui_path_box_open_clicked(GtkButton *button, gpointer user_data)
+{
+	GtkWidget *path_box = GTK_WIDGET(user_data);
+	GtkFileChooserAction action =
+		(GtkFileChooserAction) g_object_get_data(G_OBJECT(path_box), "action");
+	GtkEntry *entry =
+		(GtkEntry *) g_object_get_data(G_OBJECT(path_box), "entry");
+	const gchar *title = (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER) ?
+		_("Select Folder") : _("Select File");
+	GtkWidget *dialog = gtk_file_chooser_dialog_new(title,
+		GTK_WINDOW(app->window), action,
+		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+		GTK_STOCK_OPEN, GTK_RESPONSE_OK, NULL);
+	gchar *locale_path;
+	const gchar *utf8_path;
+
+	// TODO: extend for other actions
+	g_return_if_fail(action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER);
+
+	utf8_path = gtk_entry_get_text(GTK_ENTRY(entry));
+	locale_path = utils_get_locale_from_utf8(utf8_path);
+	if (action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
+	{
+		if (g_path_is_absolute(locale_path) && g_file_test(locale_path, G_FILE_TEST_IS_DIR))
+			gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), locale_path);
+	}
+	g_free(locale_path);
+
+	if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
+	{
+		gchar *dir_utf8, *dir_locale;
+		dir_locale = gtk_file_chooser_get_current_folder(GTK_FILE_CHOOSER(dialog));
+		dir_utf8 = utils_get_utf8_from_locale(dir_locale);
+		gtk_entry_set_text(GTK_ENTRY(entry), dir_utf8);
+		g_free(dir_utf8);
+		g_free(dir_locale);
+	}
+	gtk_widget_destroy(dialog);
+}
+
+

Modified: trunk/src/ui_utils.h
===================================================================
--- trunk/src/ui_utils.h	2007-04-29 11:35:23 UTC (rev 1484)
+++ trunk/src/ui_utils.h	2007-04-29 12:03:25 UTC (rev 1485)
@@ -99,7 +99,12 @@
 
 void ui_combo_box_add_to_history(GtkComboBox *combo, const gchar *text);
 
+GtkWidget *ui_path_box_new(GtkEntry *entry, GtkFileChooserAction action);
 
+void ui_setup_open_button_callback(GtkWidget *open_btn, GtkEntry *entry,
+		GtkFileChooserAction action);
+
+
 void ui_update_tab_status(gint idx);
 
 


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