SF.net SVN: geany-plugins:[1922] trunk/geany-plugins/treebrowser

dimitrov-adrian at users.sourceforge.net dimitrov-adrian at xxxxx
Fri Feb 11 22:39:15 UTC 2011


Revision: 1922
          http://geany-plugins.svn.sourceforge.net/geany-plugins/?rev=1922&view=rev
Author:   dimitrov-adrian
Date:     2011-02-11 22:39:15 +0000 (Fri, 11 Feb 2011)

Log Message:
-----------
Added close children, Bugfix with file endings with ~ and check_hidden replacement

Modified Paths:
--------------
    trunk/geany-plugins/treebrowser/ChangeLog
    trunk/geany-plugins/treebrowser/README
    trunk/geany-plugins/treebrowser/src/treebrowser.c

Modified: trunk/geany-plugins/treebrowser/ChangeLog
===================================================================
--- trunk/geany-plugins/treebrowser/ChangeLog	2011-02-11 20:28:34 UTC (rev 1921)
+++ trunk/geany-plugins/treebrowser/ChangeLog	2011-02-11 22:39:15 UTC (rev 1922)
@@ -35,11 +35,20 @@
 +-------------------------------+
 
 
+10-02-2011 	Adrian Dimitrov 		<dimitrov.adrian at gmail.com>
+
+	* src/treebrowser.c
+		Added function to close directory childrens (patch by Oliver Marks (#3175562), thanks)
+		Replaced TreeBrowser`s hidden file check with the native filebrowser check (thanks to geany`s team),
+			this may be fixing the bug #3157070 (Treebrowser plugin crashes Geany with files ending in ~)
+
+
 14-12-2010 	Adrian Dimitrov 		<dimitrov.adrian at gmail.com>
 
 	* src/treebrowser.c
 		Fixed nighty compilation error (reported by Enrico Tröger)
 
+
 10-12-2010 	Adrian Dimitrov 		<dimitrov.adrian at gmail.com>
 
 	* ChangeLog

Modified: trunk/geany-plugins/treebrowser/README
===================================================================
--- trunk/geany-plugins/treebrowser/README	2011-02-11 20:28:34 UTC (rev 1921)
+++ trunk/geany-plugins/treebrowser/README	2011-02-11 22:39:15 UTC (rev 1922)
@@ -1,6 +1,6 @@
 .. |(version)| replace:: 0.20
 
-Treebrowser plugin
+TreeBrowser plugin
 ==================
 
 .. contents::
@@ -9,18 +9,17 @@
 About
 =====
 
-The TreeBrowser plugin for Geany provides an alternate way to browse through
-your files. It displays files and directories in a tree view and has more
-features than the file browser plugin delivered with Geany itself.
-
-
 .. image:: http://img43.imageshack.us/img43/9053/screenshotsmallq.png
    :width: 400
    :alt: treebrowser plugin
    :align: right
    :target: http://img828.imageshack.us/img828/1351/screenshot1fq.png
 
+The TreeBrowser plugin for Geany provides an alternate way to browse through
+your files. It displays files and directories in a tree view and has more
+features than the file browser plugin delivered with Geany itself.
 
+
 Features
 ========
 
@@ -46,6 +45,14 @@
 Tools->Plugin Manager and set checkbox at TreeBrowser plugin
 
 
+FAQ
+===
+
+* My base directory is not remember
+	Yes it isn`t saved, and I don`t think that it have to be saved while We have in Geany "Startup path", and "Load from the last session"
+	These settings are useful and the plugin take care about them, use them and the problem with the last directory remembering will be solved.
+
+
 Download Source
 ===============
 
@@ -57,13 +64,9 @@
 Installation
 ============
 
- * Ubuntu/Debian
-    `sudo apt-get install geany-plugin-treebrowser`
+ The plugin is part from the geany-plugins projects, you can see the plugin`s install page at http://plugins.geany.org/install.html
 
- * Fedora
-    `yum install geany-plugins-treebrowser`
 
-
 License
 =======
 

Modified: trunk/geany-plugins/treebrowser/src/treebrowser.c
===================================================================
--- trunk/geany-plugins/treebrowser/src/treebrowser.c	2011-02-11 20:28:34 UTC (rev 1921)
+++ trunk/geany-plugins/treebrowser/src/treebrowser.c	2011-02-11 22:39:15 UTC (rev 1922)
@@ -18,6 +18,9 @@
 # include <gio/gio.h>
 #endif
 
+#ifdef G_OS_WIN32
+# include <windows.h>
+#endif
 
 /* These items are set by Geany before plugin_init() is called. */
 GeanyPlugin 				*geany_plugin;
@@ -216,13 +219,14 @@
 #endif
 }
 
+/* Return: FALSE - if file is filtered and not shown, and TRUE - if file isn`t filtered, and have to be shown */
 static gboolean
 check_filtered(const gchar *base_name)
 {
 	gchar		**filters;
 	guint 		i;
 	gboolean 	temporary_reverse 	= FALSE;
-	const gchar *exts[] 			= {".o", ".obj", ".so", ".dll", ".a", ".lib"};
+	const gchar *exts[] 			= {".o", ".obj", ".so", ".dll", ".a", ".lib", ".la", ".lo", ".pyc"};
 	guint exts_len;
 	const gchar *ext;
 	gboolean	filtered;
@@ -265,66 +269,47 @@
 	return filtered;
 }
 
+#ifdef G_OS_WIN32
 static gboolean
-check_hidden(const gchar *uri)
+win32_check_hidden(const gchar *filename)
 {
-	gboolean is_visible = TRUE;
-	gchar *base_name;
+	DWORD attrs;
+	static wchar_t w_filename[MAX_PATH];
+	MultiByteToWideChar(CP_UTF8, 0, filename, -1, w_filename, sizeof(w_filename));
+	attrs = GetFileAttributesW(w_filename);
+	if (attrs != INVALID_FILE_ATTRIBUTES && attrs & FILE_ATTRIBUTE_HIDDEN)
+		return TRUE;
+	return FALSE;
+}
+#endif
 
-#ifdef G_OS_WIN32
-# ifdef HAVE_GIO
-	GFile *file;
-	GFileInfo *info;
+/* Returns: whether name should be hidden. */
+static gboolean
+check_hidden(const gchar *filename)
+{
+	const gchar *base_name = NULL;
+	base_name = g_path_get_basename(filename);
+	gsize len;
 
-	if (CONFIG_SHOW_HIDDEN_FILES)
-	{
-		g_object_unref(info);
-		g_object_unref(file);
-		g_free(base_name);
-		return TRUE;
-	}
-
-	if (uri[strlen(uri) - 1] == '~')
-	{
-		g_object_unref(info);
-		g_object_unref(file);
-		g_free(base_name);
+	if (! NZV(base_name))
 		return FALSE;
-	}
 
-	file = g_file_new_for_path(uri);
-	info = g_file_query_info(file, G_FILE_ATTRIBUTE_STANDARD_IS_HIDDEN, 0, NULL, NULL);
-	if (info)
-	{
-		if (g_file_info_get_is_hidden(info))
-			is_visible = FALSE;
-		g_object_unref(info);
-	}
-	g_object_unref(file);
-# endif /* HAVE_GIO */
-#else /* G_OS_WIN32 */
-
-	if (CONFIG_SHOW_HIDDEN_FILES)
-	{
-		g_free(base_name);
+#ifdef G_OS_WIN32
+	if (win32_check_hidden(filename))
 		return TRUE;
-	}
-
-	if (uri[strlen(uri) - 1] == '~')
-	{
-		g_free(base_name);
-		return FALSE;
-	}
-
-	base_name = g_path_get_basename(uri);
+#else
 	if (base_name[0] == '.')
-		is_visible = FALSE;
-	g_free(base_name);
+		return TRUE;
 #endif
 
-	return is_visible;
+	len = strlen(base_name);
+	if (base_name[len - 1] == '~')
+		return TRUE;
+
+	return FALSE;
 }
 
+
 static gchar*
 get_default_dir()
 {
@@ -460,7 +445,7 @@
 			is_dir 		= g_file_test (uri, G_FILE_TEST_IS_DIR);
 			utf8_name 	= utils_get_utf8_from_locale(fname);
 
-			if (check_hidden(uri))
+			if (!check_hidden(uri))
 			{
 				GdkPixbuf *icon = NULL;
 
@@ -1036,6 +1021,27 @@
 }
 
 static void
+on_menu_close_children(GtkMenuItem *menuitem, gchar *uri)
+{
+	guint nb_documents = geany->documents_array->len;
+	int i;
+	int uri_len=strlen(uri);
+	for(i=0; i<GEANY(documents_array)->len; i++)
+	{
+		if(documents[i]->is_valid)
+		{
+			/* the docuemnt filename shoudl always be longer than the uri when closing children
+			 * Compare the beginingin of the filename string to see if it matchs the uri*/
+			if(strlen(documents[i]->file_name)>uri_len)
+			{
+				if(strncmp(uri,documents[i]->file_name,uri_len)==0)
+					document_close(documents[i]);
+			}
+		}
+	}
+}
+
+static void
 on_menu_copy_uri(GtkMenuItem *menuitem, gchar *uri)
 {
 	GtkClipboard *cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
@@ -1128,6 +1134,11 @@
 	g_signal_connect(item, "activate", G_CALLBACK(on_menu_close), uri);
 	gtk_widget_set_sensitive(item, is_document);
 
+	item = ui_image_menu_item_new(GTK_STOCK_CLOSE, g_strdup_printf(_("Close Child Documents ")));
+	gtk_container_add(GTK_CONTAINER(menu), item);
+	g_signal_connect(item, "activate", G_CALLBACK(on_menu_close_children), uri);
+	gtk_widget_set_sensitive(item, is_dir);
+
 	item = ui_image_menu_item_new(GTK_STOCK_COPY, _("Copy full path to clipboard"));
 	gtk_container_add(GTK_CONTAINER(menu), item);
 	g_signal_connect(item, "activate", G_CALLBACK(on_menu_copy_uri), uri);


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Plugins-Commits mailing list