SF.net SVN: geany: [1612] trunk

eht16 at users.sourceforge.net eht16 at xxxxx
Tue Jun 12 16:45:25 UTC 2007


Revision: 1612
          http://svn.sourceforge.net/geany/?rev=1612&view=rev
Author:   eht16
Date:     2007-06-12 09:45:24 -0700 (Tue, 12 Jun 2007)

Log Message:
-----------
Add "Open file in a new tab" and "Rename file" to the "Save as" dialog for more control over saved file.

Modified Paths:
--------------
    trunk/ChangeLog
    trunk/src/callbacks.c
    trunk/src/dialogs.c

Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2007-06-12 15:16:17 UTC (rev 1611)
+++ trunk/ChangeLog	2007-06-12 16:45:24 UTC (rev 1612)
@@ -1,3 +1,10 @@
+2007-06-12  Enrico Tröger  <enrico.troeger at uvena.de>
+
+ * src/callbacks.c, src/dialogs.c:
+   Add "Open file in a new tab" and "Rename file" to the "Save as"
+   dialog for more control over saved file.
+
+
 2007-06-12  Nick Treleaven  <nick.treleaven at btinternet.com>
 
  * src/interface.c, src/sciwrappers.c, src/sciwrappers.h, src/prefs.c,

Modified: trunk/src/callbacks.c
===================================================================
--- trunk/src/callbacks.c	2007-06-12 15:16:17 UTC (rev 1611)
+++ trunk/src/callbacks.c	2007-06-12 16:45:24 UTC (rev 1612)
@@ -32,6 +32,7 @@
 #include <unistd.h>
 #include <string.h>
 #include <gdk/gdkkeysyms.h>
+#include <glib/gstdio.h>
 #include <time.h>
 
 #include "callbacks.h"
@@ -849,34 +850,82 @@
 	{
 		gint idx = document_get_cur_idx();
 		gchar *new_filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(app->save_filesel));
+		gchar *utf8_filename;
+		gboolean open_new_tab = gtk_toggle_button_get_active(
+				GTK_TOGGLE_BUTTON(lookup_widget(app->save_filesel, "check_open_new_tab")));
+		gboolean rename_file = gtk_toggle_button_get_active(
+				GTK_TOGGLE_BUTTON(lookup_widget(app->save_filesel, "check_rename")));
 
+		utf8_filename = utils_get_utf8_from_locale(new_filename);
+
 		// check if file exists and ask whether to overwrite or not
 		if (g_file_test(new_filename, G_FILE_TEST_EXISTS))
 		{
 			if (dialogs_show_question(
-						_("The file '%s' already exists. Do you want to overwrite it?"),
-						new_filename) == FALSE) return;
+				_("The file '%s' already exists. Do you want to overwrite it?"),
+				utf8_filename) == FALSE)
+				return;
 		}
-		gtk_widget_hide(app->save_filesel);
 
-		if (doc_list[idx].file_name)
-		{	// create a new tm_source_file object otherwise tagmanager won't work correctly
-			tm_workspace_remove_object(doc_list[idx].tm_file, TRUE);
-			doc_list[idx].tm_file = NULL;
-			g_free(doc_list[idx].file_name);
+		if (open_new_tab)
+		{	// "open" the saved file in a new tab
+			// (actually create a new file and copy file content and properties)
+			gint len, old_idx;
+			gchar *data;
+
+			old_idx = idx;
+
+			// use old file type (or maybe NULL for auto detect would be better?)
+			idx = document_new_file(utf8_filename, doc_list[idx].file_type);
+
+			len = sci_get_length(doc_list[old_idx].sci) + 1;
+			data = (gchar*) g_malloc(len);
+			sci_get_text(doc_list[old_idx].sci, len, data);
+
+			sci_set_text(doc_list[idx].sci, data);
+
+			// copy file properties
+			doc_list[idx].line_breaking = doc_list[old_idx].line_breaking;
+			doc_list[idx].readonly = doc_list[old_idx].readonly;
+			doc_list[idx].has_bom = doc_list[old_idx].has_bom;
+			document_set_encoding(idx, doc_list[old_idx].encoding);
+			sci_set_lines_wrapped(doc_list[idx].sci, doc_list[idx].line_breaking);
+			sci_set_readonly(doc_list[idx].sci, doc_list[idx].readonly);
+
+			ui_document_show_hide(idx);
+
+			g_free(data);
+			g_free(utf8_filename);
 		}
-		doc_list[idx].file_name = utils_get_utf8_from_locale(new_filename);
-		g_free(new_filename);
+		else
+		{
+			if (rename_file)
+			{	// delete the previous file name
+				gchar *old_filename = utils_get_locale_from_utf8(doc_list[idx].file_name);
+				g_unlink(old_filename);
+				g_free(old_filename);
+			}
 
+			if (doc_list[idx].file_name != NULL)
+			{	// create a new tm_source_file object otherwise tagmanager won't work correctly
+				tm_workspace_remove_object(doc_list[idx].tm_file, TRUE);
+				doc_list[idx].tm_file = NULL;
+				g_free(doc_list[idx].file_name);
+			}
+			doc_list[idx].file_name = utf8_filename;
+		}
 		utils_replace_filename(idx);
 		document_save_file(idx, TRUE);
 
-		build_menu_update(idx);
+		if (! open_new_tab)
+			build_menu_update(idx);
 
 		// finally add current file to recent files menu
 		ui_add_recent_file(doc_list[idx].file_name);
+
+		g_free(new_filename);
 	}
-	else gtk_widget_hide(app->save_filesel);
+	gtk_widget_hide(app->save_filesel);
 }
 
 

Modified: trunk/src/dialogs.c
===================================================================
--- trunk/src/dialogs.c	2007-06-12 15:16:17 UTC (rev 1611)
+++ trunk/src/dialogs.c	2007-06-12 16:45:24 UTC (rev 1612)
@@ -57,6 +57,7 @@
 #if ! GEANY_USE_WIN32_DIALOG
 static GtkWidget *add_file_open_extra_widget();
 #endif
+static void on_save_as_new_tab_toggled(GtkToggleButton *togglebutton, gpointer user_data);
 
 
 /* This shows the file selection dialog to open a file. */
@@ -275,6 +276,8 @@
 
 	if (app->save_filesel == NULL)
 	{
+		GtkWidget *vbox, *check_open_new_tab, *check_rename;
+
 		app->save_filesel = gtk_file_chooser_dialog_new(_("Save File"), GTK_WINDOW(app->window),
 					GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 					GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
@@ -285,6 +288,25 @@
 		gtk_dialog_set_default_response(GTK_DIALOG(app->save_filesel), GTK_RESPONSE_ACCEPT);
 		gtk_widget_set_name(app->save_filesel, "GeanyDialog");
 
+		vbox = gtk_vbox_new(FALSE, 0);
+		check_open_new_tab = gtk_check_button_new_with_mnemonic("_Open file in a new tab");
+		check_rename = gtk_check_button_new_with_mnemonic("R_ename file");
+		gtk_box_pack_start(GTK_BOX(vbox), check_open_new_tab, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(vbox), check_rename, FALSE, TRUE, 0);
+		gtk_widget_show_all(vbox);
+		gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(app->save_filesel), vbox);
+
+		g_signal_connect(check_open_new_tab, "toggled",
+					G_CALLBACK(on_save_as_new_tab_toggled), check_rename);
+
+		g_signal_connect(check_rename, "toggled",
+					G_CALLBACK(on_save_as_new_tab_toggled), check_open_new_tab);
+
+		g_object_set_data_full(G_OBJECT(app->save_filesel), "check_open_new_tab",
+					gtk_widget_ref(check_open_new_tab), (GDestroyNotify) gtk_widget_unref);
+		g_object_set_data_full(G_OBJECT(app->save_filesel), "check_rename",
+					gtk_widget_ref(check_rename), (GDestroyNotify) gtk_widget_unref);
+
 		g_signal_connect((gpointer) app->save_filesel, "delete_event",
 			G_CALLBACK(gtk_widget_hide_on_delete), NULL);
 		g_signal_connect((gpointer) app->save_filesel, "response",
@@ -1099,3 +1121,8 @@
 }
 
 
+static void on_save_as_new_tab_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+	if (gtk_toggle_button_get_active(togglebutton))
+		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(user_data), 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